You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio fequencies. Here is a step by step guide to start listening in on those saucy radio channels:
Equip yourself with a multi-tool
Use the multitool on each machine, that is the broadcaster, receiver and the relay.
Turn all the machines on, it has already been configured for you to listen on.
Simple as that. Now to listen to the private channels, you'll have to configure the intercoms, located on the front desk. Here is a list of frequencies for you to listen on.
The Captain assures me that there's nothing to worry about, but I find it hard to take a man who's paranoid of a powered shower door seriously.
- Comms Officer Vostok";
+ name = "personal log";
+ pixel_x = 26;
+ pixel_y = 4
+ },
+/obj/structure/computerframe{
+ desc = "This computer is a husk of what it once was. Time and decay has worn its cheap circuitry to dust.";
+ name = "decrepit computer"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"aA" = (
+/obj/structure/table/reinforced,
+/obj/item/ashtray/bronze,
+/turf/simulated/floor/plasteel{
+ dir = 5;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"aB" = (
+/obj/machinery/computer/crew,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"aC" = (
+/obj/structure/computerframe{
+ desc = "This computer is a husk of what it once was. Time and decay has worn its cheap circuitry to dust.";
+ name = "decrepit computer"
+ },
+/obj/item/shard,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"aD" = (
+/obj/structure/closet/emcloset,
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 5;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"aE" = (
+/obj/structure/sign/nuke,
+/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
+/area/derelict/bridge)
+"aF" = (
+/obj/item/twohanded/required/kirbyplants,
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/bridge)
+"aG" = (
+/obj/structure/safe/floor,
+/obj/item/paper/djstation{
+ name = "love letter";
+ pixel_x = -5;
+ pixel_y = -3;
+ layer = 2.9;
+ info = "To my darling Sergei,
I will never forget those nights we spent on Cygni, or all the times you took me around in your 2452 Vincent. The way you looked at me that one night, that was the night I knew that you and I were of the same soul.
I know they made you sell your Vincent when you were reassigned, but I could not let such a beautiful thing go to rust. I have made arrangements and it is here, waiting for you.
I have enclosed the keys. Please, let them serve as a reminder always of our love and a reason to return. I beg of you, do not let our love go softly into the night."
+ },
+/obj/item/key{
+ name = "Vincent '52 Key";
+ pixel_x = 0;
+ pixel_y = 0
+ },
+/obj/item/trash/tapetrash{
+ desc = "A bundle of severely yellowed and highly pretentious looking documents. Unfortunately they appear to be written in cyrillic and encrypted with a cypher.";
+ icon = 'icons/obj/bureaucracy.dmi';
+ icon_state = "docs_generic";
+ name = "USSP//NOFORN//TOP SECRET"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/bridge)
+"aH" = (
+/obj/structure/coatrack,
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/bridge)
+"aI" = (
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (WEST)";
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"aJ" = (
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/bridge)
+"aK" = (
+/obj/structure/chair/office/dark{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/bridge)
+"aL" = (
+/obj/structure/table/reinforced,
+/obj/item/phone{
+ desc = "An old Russian phone. The dial tone is still humming.";
+ name = "spin-dial phone"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"aM" = (
+/obj/structure/chair/comfy/red{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/bridge)
+"aN" = (
+/obj/effect/landmark/damageturf,
+/obj/effect/landmark/burnturf,
+/obj/item/shard{
+ icon_state = "small"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/bridge)
+"aO" = (
+/obj/structure/table/reinforced,
+/obj/item/fan,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"aP" = (
+/obj/structure/chair/office/dark{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/bridge)
+"aQ" = (
+/obj/effect/landmark/damageturf,
+/obj/effect/decal/remains/human{
+ desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
+ icon_state = "remains";
+ name = "Human remains"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/bridge)
+"aR" = (
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (EAST)";
+ icon_state = "tube1";
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"aS" = (
+/obj/machinery/vending/cigarette/free{
+ slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.")
+ },
+/turf/simulated/floor/plasteel{
+ dir = 9;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"aT" = (
+/obj/machinery/vending/sovietsoda,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"aU" = (
+/obj/machinery/photocopier,
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (NORTH)";
+ icon_state = "tube1";
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 5;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"aV" = (
+/turf/simulated/wall/mineral/titanium/nodecon,
+/area/derelict/crew_quarters)
+"aW" = (
+/turf/simulated/wall/mineral/titanium/nodecon,
+/area/derelict/arrival)
+"aX" = (
+/obj/structure/closet{
+ icon_closed = "cabinet_closed";
+ icon_opened = "cabinet_open";
+ icon_state = "cabinet_closed"
+ },
+/obj/item/clothing/head/helmet/space/syndicate/blue{
+ desc = "This spacesuit is emblazoned with the emblem of the USSP. Glory to Space Russia!";
+ name = "Cosmonaut Command Helmet"
+ },
+/obj/item/clothing/suit/space/syndicate/blue{
+ desc = "This spacesuit is emblazoned with the emblem of the USSP. Glory to Space Russia!";
+ name = "Cosmonaut Command Suit"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/bridge)
+"aY" = (
+/obj/structure/rack,
+/obj/item/gun/energy/e_gun/old{
+ desc = "A rudimentary energy weapon co-opted by the USSP from a TSF experimental prototype. There are two firing modes."
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/bridge)
+"aZ" = (
+/obj/structure/table/wood,
+/obj/item/trash/can{
+ desc = "A miniature ship in a bottle. I wonder how they got it in there?";
+ icon = 'icons/obj/lavaland/artefacts.dmi';
+ icon_state = "ship_bottle";
+ name = "ship in a bottle"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/bridge)
+"ba" = (
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/bridge)
+"bb" = (
+/turf/simulated/floor/carpet,
+/area/derelict/bridge)
+"bc" = (
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"bd" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/bridge)
+"be" = (
+/turf/simulated/floor/plasteel{
+ dir = 10;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"bf" = (
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"bg" = (
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"bh" = (
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"bi" = (
+/turf/simulated/floor/plasteel{
+ dir = 5;
+ icon_state = "dark";
+ tag = "icon-vault (NORTHEAST)"
+ },
+/area/derelict/bridge)
+"bj" = (
+/obj/item/paper/djstation{
+ info = "The note is stained with ink-smudges, the forceful and shaky handwriting scrawled across it is barely legible.
Vostok stopped banging on the door an hour ago. he must be looking for something to try and force it. I am still unsure what's happened, but it's been six hours now.
My hands won't stop shaking, not even the cigarettes are helping.
Vostok, if you manage to get in and I am no longer concious, my medication is in the freezer next to my desk. Please. I'm counting on you.";
+ name = "shaky note"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"bk" = (
+/obj/item/cigbutt{
+ pixel_x = 6;
+ pixel_y = 3
+ },
+/obj/item/cigbutt{
+ pixel_x = 8;
+ pixel_y = 9
+ },
+/obj/item/cigbutt,
+/obj/item/lighter{
+ pixel_x = -6;
+ pixel_y = 5
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"bl" = (
+/obj/effect/decal/remains/human{
+ desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
+ icon_state = "remains";
+ name = "Human remains"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/vomit,
+/turf/simulated/floor/plasteel{
+ dir = 5;
+ icon_state = "darkblue"
+ },
+/area/derelict/bridge)
+"bm" = (
+/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
+/area/derelict/crew_quarters)
+"bn" = (
+/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
+/area/derelict/arrival)
+"bo" = (
+/obj/structure/cable{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/obj/machinery/power/apc/noalarm{
+ dir = 8;
+ pixel_x = -24
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/bridge)
+"bp" = (
+/obj/structure/chair/comfy/red{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/bridge)
+"bq" = (
+/obj/structure/table/wood,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/item/paper/djstation{
+ info = "This damned shower is going to be the death of me. I can see the way Vostok looks at me when I speak of it, the way his eyes sneer with amusement. Just this morning, I swear the damn thing tried to lock me in! I had to break the manual release just to get out, Vostok nearly shit himself he was laughing so hard.
I recognize the nature of this request my seem strange, but please, hear me out. Comrade Blyatski, though he is but a wee bot, is like iron fist of Commissar Grigor himself! Just the other day he chased that useless bastard Totstoi clean out of brig, you should have seen the way that drunkard whimpered! Like a dog with his tail between his legs.
Anyways, I digress! If any one is worth of recognition, it is our ever-vigilant and beloved Blyatski, true champion of USSP.
If you wish to, perhaps, see his vigilance and dedication in person, well! You need only come to inspect armoury.
Comrade Blyatski awaits your decision.";
+ name = "recommendation for commendation"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"dD" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced,
+/obj/machinery/door_control{
+ id = "ruslockcom";
+ name = "Bridge Lockdown"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"dE" = (
+/obj/structure/table/reinforced,
+/obj/item/paper_bin,
+/obj/item/pen,
+/obj/structure/window/reinforced,
+/obj/machinery/newscaster{
+ desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. Strange that it's on a Russian station.";
+ layer = 3.3;
+ pixel_x = 27
+ },
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"dF" = (
+/obj/structure/grille,
+/obj/structure/window/full/shuttle,
+/obj/machinery/door/poddoor/impassable{
+ id_tag = "ruslocksec";
+ layer = 2.9;
+ name = "Security Wing Lockdown"
+ },
+/turf/simulated/floor/plating,
+/area/derelict/arrival)
+"dG" = (
+/obj/structure/grille{
+ density = 0;
+ icon_state = "brokengrille"
+ },
+/obj/item/shard{
+ icon_state = "small"
+ },
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "floorscorched2"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"dH" = (
+/obj/structure/grille,
+/obj/structure/window/full/shuttle,
+/turf/simulated/floor/plating,
+/area/derelict/crew_quarters)
+"dI" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Dormitories"
+ },
+/turf/simulated/floor/plasteel,
+/area/derelict/crew_quarters)
+"dJ" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel,
+/area/derelict/crew_quarters)
+"dK" = (
+/obj/structure/table/reinforced,
+/obj/structure/bedsheetbin,
+/obj/structure/sign/poster/contraband/random{
+ pixel_y = 32
+ },
+/turf/simulated/floor/plasteel,
+/area/derelict/crew_quarters)
+"dL" = (
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"dM" = (
+/obj/structure/rack,
+/obj/item/crowbar,
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"dN" = (
+/obj/structure/closet,
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (EAST)";
+ icon_state = "tube1";
+ dir = 4
+ },
+/obj/item/clothing/head/ushanka,
+/obj/item/clothing/head/ushanka,
+/obj/item/clothing/head/ushanka,
+/obj/item/clothing/under/soviet,
+/obj/item/clothing/under/soviet,
+/obj/item/clothing/under/soviet,
+/obj/item/clothing/under/soviet,
+/obj/item/clothing/head/ushanka,
+/obj/item/clothing/head/ushanka,
+/obj/item/clothing/under/soviet,
+/turf/simulated/floor/plasteel,
+/area/derelict/crew_quarters)
+"dO" = (
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "darkredfull"
+ },
+/turf/simulated/wall/mineral/titanium/nodecon/tileblend{
+ icon_state = "4-i"
+ },
+/area/derelict/arrival)
+"dP" = (
+/obj/item/clothing/under/retro/security,
+/obj/item/clothing/under/retro/security,
+/obj/structure/closet,
+/obj/item/clothing/gloves/combat,
+/obj/item/clothing/gloves/combat,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ d2 = 2;
+ icon_state = "0-2";
+ pixel_y = 0
+ },
+/obj/machinery/power/apc/noalarm{
+ dir = 1;
+ pixel_y = 24
+ },
+/turf/simulated/floor/plasteel{
+ dir = 9;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"dQ" = (
+/obj/machinery/recharger,
+/obj/structure/table/reinforced,
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (NORTH)";
+ icon_state = "tube1";
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"dR" = (
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"dS" = (
+/turf/simulated/wall/mineral/titanium/interior,
+/area/derelict/arrival)
+"dT" = (
+/obj/structure/closet,
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/item/clothing/shoes/jackboots,
+/obj/item/clothing/shoes/jackboots,
+/obj/item/clothing/shoes/jackboots,
+/obj/item/clothing/shoes/jackboots,
+/obj/item/clothing/shoes/jackboots,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/clothing/head/panzer{
+ desc = "An oldschool military softcap.";
+ name = "old military cap"
+ },
+/obj/item/clothing/head/panzer{
+ desc = "An oldschool military softcap.";
+ name = "old military cap"
+ },
+/turf/simulated/floor/plasteel,
+/area/derelict/crew_quarters)
+"dU" = (
+/turf/simulated/floor/plasteel{
+ dir = 9;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"dV" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/arrival)
+"dW" = (
+/turf/simulated/wall/mineral/titanium/nodecon,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"dX" = (
+/obj/structure/sign/securearea,
+/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"dY" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/door/poddoor/impassable{
+ id_tag = "ruslock";
+ layer = 3;
+ name = "Central Annex Lockdown"
+ },
+/obj/machinery/door/airlock/command/glass{
+ name = "Command Wing"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"dZ" = (
+/obj/structure/closet/crate/can,
+/obj/item/paper/crumpled{
+ info = "I KNOW IT WAS YOU WHO THREW AWAY MY LUCKY UNDERWEAR THIS TIME. I SWEAR, IF I SEE YOUR SKINNY RAT NECK AROUND I AM GOING TO WRING IT UNTIL YOU GO PURPLE!
I know it's you who's been feeding my cats alcohol, I do not care what your reasons are but you are getting in the way of important research. This is the fifth cat that I've had to replace this month because of your crude sense of humour, and I will be speaking with Chief Borachov if you don't stop.
- Nikolai Kartov, Deputy Researcher";
+ name = "Desist at once!"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "caution"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fu" = (
+/obj/machinery/portable_atmospherics/scrubber,
+/obj/machinery/atmospherics/unary/portables_connector{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ icon_state = "caution";
+ dir = 5
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fv" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood,
+/obj/effect/decal/remains/human{
+ desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
+ icon_state = "remains";
+ name = "Human remains"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/crew_quarters)
+"fw" = (
+/obj/structure/chair/wood{
+ dir = 4
+ },
+/turf/simulated/floor/wood{
+ tag = "icon-wood-broken3";
+ icon_state = "wood-broken3"
+ },
+/area/derelict/crew_quarters)
+"fx" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/structure/table/wood,
+/obj/item/trash/candle,
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/crew_quarters)
+"fy" = (
+/obj/effect/decal/cleanable/vomit,
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/crew_quarters)
+"fz" = (
+/obj/structure/mopbucket,
+/turf/simulated/floor/wood{
+ tag = "icon-wood-broken6";
+ icon_state = "wood-broken6"
+ },
+/area/derelict/crew_quarters)
+"fA" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"fB" = (
+/obj/item/trash/spentcasing{
+ icon_state = "762-casing"
+ },
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4";
+ tag = ""
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/arrival)
+"fC" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/arrival)
+"fD" = (
+/obj/item/trash/spentcasing,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8";
+ tag = ""
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/arrival)
+"fE" = (
+/obj/structure/chair/office/dark,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/splatter,
+/obj/effect/decal/remains/human{
+ desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
+ icon_state = "remains";
+ name = "Human remains"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/arrival)
+"fF" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/computerframe{
+ desc = "This computer is a husk of what it once was. Time and decay has worn its cheap circuitry to dust.";
+ name = "decrepit computer"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"fG" = (
+/obj/structure/grille,
+/obj/structure/window/full/shuttle,
+/turf/simulated/floor/plating,
+/area/derelict/arrival)
+"fH" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/simulated/floor/plasteel{
+ dir = 5;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fI" = (
+/obj/structure/table/tray,
+/obj/item/circular_saw{
+ pixel_y = 10
+ },
+/turf/simulated/floor/plasteel,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fJ" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/simulated/floor/plasteel,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fK" = (
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fL" = (
+/obj/structure/sign/nosmoking_1,
+/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fM" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "darkblue"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fN" = (
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fO" = (
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "darkblue"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fP" = (
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (WEST)";
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "caution"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fQ" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/turf/simulated/floor/plasteel,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fR" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fS" = (
+/obj/structure/computerframe{
+ desc = "This computer is a husk of what it once was. Time and decay has worn its cheap circuitry to dust.";
+ name = "decrepit computer"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ icon_state = "caution";
+ dir = 5
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"fT" = (
+/obj/machinery/door_control{
+ id = "ruslock";
+ layer = 2.1;
+ name = "suspicious button"
+ },
+/obj/machinery/vending/cigarette/free{
+ slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.")
+ },
+/turf/simulated/floor/wood{
+ broken = 1;
+ icon_state = "wood-broken"
+ },
+/area/derelict/crew_quarters)
+"fU" = (
+/obj/item/trash/spentcasing,
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/crew_quarters)
+"fV" = (
+/obj/structure/chair/stool/bar,
+/obj/item/trash/spentcasing{
+ icon_state = "762-casing"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/crew_quarters)
+"fW" = (
+/obj/structure/chair/stool/bar,
+/obj/effect/decal/remains/human{
+ desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
+ icon_state = "remains";
+ name = "Human remains"
+ },
+/obj/effect/decal/cleanable/blood,
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/crew_quarters)
+"fX" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/arrival)
+"fY" = (
+/obj/structure/table/reinforced,
+/obj/item/paper/djstation{
+ info = "August 21 - Most Excellent Commissar Grigor August 22 - Nobody August 23 - Nobody August 24 - Nobody August 25 - Why do I even bother? August 26 - Nobody August 27 -";
+ name = "visitor log"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/arrival)
+"fZ" = (
+/obj/structure/table/reinforced,
+/obj/item/paper_bin,
+/obj/item/pen,
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"ga" = (
+/obj/effect/decal/remains/human{
+ desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
+ icon_state = "remains";
+ name = "gnawed bones"
+ },
+/obj/effect/decal/cleanable/blood/splatter,
+/obj/effect/decal/cleanable/blood/splatter,
+/mob/living/simple_animal/hostile/feral_cat{
+ faction = list("cat","carp");
+ name = "Experiment 432-A"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "purplecorner"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gb" = (
+/obj/machinery/door/window/eastleft{
+ locked = 1
+ },
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gc" = (
+/obj/structure/rack,
+/obj/item/clothing/gloves/color/latex/nitrile,
+/obj/item/clothing/gloves/color/latex/nitrile,
+/turf/simulated/floor/plasteel,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gd" = (
+/obj/structure/closet,
+/obj/item/clothing/under/retro/science,
+/obj/item/clothing/under/retro/science,
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"ge" = (
+/obj/effect/decal/cleanable/fungus,
+/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gf" = (
+/obj/structure/chair/wood{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ dir = 10;
+ icon_state = "darkblue"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gg" = (
+/obj/structure/table/wood,
+/obj/item/ashtray/plastic,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "darkblue"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gh" = (
+/obj/structure/chair/wood{
+ dir = 8
+ },
+/obj/structure/sign/poster/contraband/random{
+ pixel_x = 32
+ },
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "darkblue"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gi" = (
+/obj/machinery/floodlight,
+/turf/simulated/floor/plasteel{
+ dir = 10;
+ icon_state = "caution"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gj" = (
+/obj/machinery/power/solar_control{
+ id = "russolar";
+ track = 2
+ },
+/obj/structure/cable{
+ icon_state = "0-2";
+ pixel_y = 1;
+ d2 = 2
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "caution";
+ dir = 4
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gk" = (
+/obj/structure/sign/poster/contraband/random,
+/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gl" = (
+/obj/structure/chair/wood,
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/crew_quarters)
+"gm" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/crew_quarters)
+"gn" = (
+/obj/structure/chair/stool/bar,
+/turf/simulated/floor/wood{
+ tag = "icon-wood-broken7";
+ icon_state = "wood-broken7"
+ },
+/area/derelict/crew_quarters)
+"go" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/plasteel{
+ icon_state = "grimy"
+ },
+/area/derelict/crew_quarters)
+"gp" = (
+/obj/structure/table/reinforced,
+/obj/item/ashtray/bronze,
+/obj/item/cigbutt,
+/turf/simulated/floor/plasteel{
+ icon_state = "grimy"
+ },
+/area/derelict/crew_quarters)
+"gq" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ dir = 9;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"gr" = (
+/obj/item/trash/spentcasing,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/arrival)
+"gs" = (
+/obj/structure/chair/stool,
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"gt" = (
+/obj/structure/window/reinforced,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/simulated/floor/plasteel{
+ dir = 10;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gu" = (
+/obj/structure/window/reinforced,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gv" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced,
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gw" = (
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gx" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/machinery/shower{
+ tag = "icon-shower (WEST)";
+ icon_state = "shower";
+ dir = 8
+ },
+/obj/structure/curtain/open/shower,
+/turf/simulated/floor/plasteel{
+ icon_state = "showroomfloor"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gy" = (
+/obj/effect/landmark/burnturf,
+/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gz" = (
+/obj/machinery/recharge_station,
+/obj/effect/decal/cleanable/blood/oil,
+/turf/simulated/floor/plasteel{
+ dir = 10;
+ icon_state = "caution"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gA" = (
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "caution"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gB" = (
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/plasteel,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gC" = (
+/obj/structure/cable{
+ icon_state = "0-2";
+ pixel_y = 1;
+ d2 = 2
+ },
+/obj/machinery/power/apc/noalarm{
+ dir = 1;
+ pixel_y = 24
+ },
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "caution"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gD" = (
+/obj/structure/rack,
+/obj/item/t_scanner,
+/obj/item/stack/cable_coil,
+/obj/item/stack/cable_coil,
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (NORTH)";
+ icon_state = "tube1";
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "caution";
+ dir = 5
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gE" = (
+/obj/structure/table/wood,
+/obj/item/ashtray/bronze,
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/crew_quarters)
+"gF" = (
+/obj/structure/chair/wood{
+ dir = 8
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/crew_quarters)
+"gG" = (
+/obj/structure/chair/stool/bar,
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/crew_quarters)
+"gH" = (
+/obj/item/trash/spentcasing,
+/turf/simulated/floor/plasteel{
+ icon_state = "grimy"
+ },
+/area/derelict/crew_quarters)
+"gI" = (
+/obj/structure/closet/secure_closet/bar,
+/obj/item/reagent_containers/food/drinks/bottle/vodka,
+/obj/item/reagent_containers/food/drinks/bottle/vodka,
+/obj/item/reagent_containers/food/drinks/bottle/vodka,
+/obj/item/reagent_containers/food/drinks/bottle/rum,
+/obj/item/reagent_containers/food/drinks/bottle/kahlua,
+/turf/simulated/floor/plasteel{
+ icon_state = "grimy"
+ },
+/area/derelict/crew_quarters)
+"gJ" = (
+/obj/effect/decal/cleanable/fungus,
+/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
+/area/derelict/arrival)
+"gK" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"gL" = (
+/obj/effect/decal/cleanable/blood,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/arrival)
+"gM" = (
+/obj/item/trash/spentcasing{
+ icon_state = "762-casing"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/arrival)
+"gN" = (
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"gO" = (
+/obj/structure/reagent_dispensers/fueltank,
+/obj/effect/decal/cleanable/blood/oil,
+/turf/simulated/floor/plasteel{
+ dir = 9;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gP" = (
+/obj/structure/table,
+/obj/item/storage/box/syringes,
+/turf/simulated/floor/plasteel,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gQ" = (
+/obj/structure/table,
+/obj/item/disk/data/demo{
+ pixel_x = -14;
+ pixel_y = -1
+ },
+/obj/item/paper/djstation{
+ info = "We have finally hit upon it, no more shall Katerina look past me in favor of other company! Experiment 432-A shows an incredible rate of cellular regeneration, and I posit that we have finally breaken down the great boundary between life and death--true biological immortality!
Of course, the aggressive behaviour is an undue side-effect, but it is only cat after all. I am certain a few sedative-laced cat treats will suffice to prep for autopsy.";
+ name = "Experiment 432-A"
+ },
+/turf/simulated/floor/plasteel,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gR" = (
+/mob/living/simple_animal/hostile/carp,
+/turf/template_noop,
+/area/space/nearstation)
+"gS" = (
+/obj/effect/landmark/damageturf,
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "caution"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gT" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/turf/simulated/floor/plasteel,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gU" = (
+/obj/item/clothing/under/retro/engineering,
+/obj/item/clothing/under/retro/engineering,
+/obj/structure/closet,
+/turf/simulated/floor/plasteel{
+ icon_state = "caution";
+ dir = 5
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"gV" = (
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/glass/rag,
+/turf/simulated/floor/plasteel{
+ icon_state = "grimy"
+ },
+/area/derelict/crew_quarters)
+"gW" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood{
+ amount = 0
+ },
+/obj/effect/decal/remains/human{
+ desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
+ icon_state = "remains";
+ name = "Human remains"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "grimy"
+ },
+/area/derelict/crew_quarters)
+"gX" = (
+/obj/structure/table/reinforced,
+/obj/item/wrench,
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (EAST)";
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "grimy"
+ },
+/area/derelict/crew_quarters)
+"gY" = (
+/obj/machinery/power/solar{
+ id = "russolar"
+ },
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "solarpanel"
+ },
+/area/derelict/solar_control)
+"gZ" = (
+/obj/machinery/power/solar{
+ id = "russolar"
+ },
+/obj/structure/cable{
+ icon_state = "0-2";
+ pixel_y = 1;
+ d2 = 2
+ },
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "solarpanel"
+ },
+/area/derelict/solar_control)
+"ha" = (
+/obj/item/twohanded/required/kirbyplants,
+/turf/simulated/floor/plasteel{
+ dir = 10;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"hb" = (
+/obj/machinery/light/spot,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/arrival)
+"hc" = (
+/obj/item/storage/box/cups,
+/obj/structure/table,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"hd" = (
+/obj/structure/reagent_dispensers/water_cooler,
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "darkred"
+ },
+/area/derelict/arrival)
+"he" = (
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"hf" = (
+/obj/structure/chair/office/light{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"hg" = (
+/obj/structure/computerframe,
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"hh" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "whiteredfull"
+ },
+/turf/simulated/wall/mineral/titanium/nodecon/tileblend{
+ fixed_underlay = list("icon" = 'icons/turf/floors.dmi', "icon_state" = "whiteredfull");
+ icon_state = "4-i"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"hi" = (
+/obj/effect/landmark/burnturf,
+/obj/structure/table/reinforced,
+/obj/item/stack/sheet/metal/fifty,
+/obj/item/stack/sheet/glass,
+/turf/simulated/floor/plasteel{
+ dir = 10;
+ icon_state = "caution"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"hj" = (
+/obj/structure/table/reinforced,
+/obj/item/paper/djstation{
+ info = "This is the fifth time this month I've had to replace the cabling to the damn lockdown circuit. It's bad enough the condensor is constantly on the fritz and the damn systems take nearly a week to cycle and reboot, but now I've got the captain breathing down my neck over his stupid shower and Commissar Grigor. Mikail was telling me the man's face went so red when the lights popped that you could see him glowing in the dark.
If he thought that was bad, well, if I hadn't installed an override in the mess hall we would have been sitting in the dark for the week.
You will have to forgive me, but I am unable to get your order for one of those 'veil shifters' like you asked. I am admittedly unsure what you planned to do with it, the business of the clergy is not mine, but Vostok was quick to put the kaibosh on your order after we lost the last shipment.
The boys are still reeling from the headaches from last time, and Khoma complains that he sees the blue lights whenever he closes his eyes.
I am not one to question a man of God but I beg of you, please do not try to order any more of these artifacts. They are cursed, and all manner of demons seem to follow in their wake.
- Andrei Vostovich, Supply Technician";
+ name = "My apologies, father"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/crew_quarters)
+"hW" = (
+/obj/structure/table,
+/obj/item/flashlight/lamp,
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/crew_quarters)
+"hX" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "brown"
+ },
+/area/derelict/arrival)
+"hY" = (
+/turf/simulated/floor/plasteel,
+/area/derelict/arrival)
+"hZ" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/item/trash/spentcasing,
+/turf/simulated/floor/plasteel,
+/area/derelict/arrival)
+"ia" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/sign/poster/contraband/random{
+ pixel_x = 32
+ },
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "brown"
+ },
+/area/derelict/arrival)
+"ib" = (
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (WEST)";
+ icon_state = "tube1";
+ dir = 8
+ },
+/obj/structure/closet/l3closet/scientist,
+/obj/item/clothing/glasses/science,
+/turf/simulated/floor/plasteel{
+ dir = 9;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"ic" = (
+/obj/structure/table/reinforced,
+/obj/item/clipboard,
+/turf/simulated/floor/plasteel,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"id" = (
+/obj/structure/chair/office/light,
+/turf/simulated/floor/plasteel,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"ie" = (
+/obj/structure/closet/secure_closet/chemical,
+/obj/item/paper/djstation{
+ info = "A primitive rendition of a crying egg being stomped on by a boot has been scribbled in the right-hand margin of the paper.
Wahwahwah! True egghead! I do not give two shits about your cats or 'syence,' if you write to Chief I will tell that bitch Katerina about your baby boy crush.
Also, why you sign name on paper? I am next door, fuckhead, I know baby man note is yours as soon as I see it. You write girly letter like I am your lover, maybe if you spend less time in corner with cat you would be real man? Of course, you would still look like camel shit stuck to Totstoi's boot!";
+ name = "dear baby man"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"if" = (
+/obj/structure/grille,
+/obj/structure/window/full/shuttle,
+/turf/simulated/floor/plating,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"ig" = (
+/obj/effect/landmark/damageturf,
+/obj/structure/flora/rock/pile,
+/turf/simulated/floor/plating/airless,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"ih" = (
+/obj/item/stack/ore/iron,
+/turf/template_noop,
+/area/space/nearstation)
+"ii" = (
+/turf/template_noop,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"ij" = (
+/obj/structure/closet/secure_closet/engineering_welding,
+/turf/simulated/floor/plasteel{
+ dir = 10;
+ icon_state = "caution"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"ik" = (
+/obj/structure/rack,
+/obj/item/clothing/head/helmet/space/syndicate/black/engie{
+ desc = "This spacesuit is emblazoned with the emblem of the USSP. Glory to Space Russia!";
+ name = "Cosmonaut Engineering Helmet"
+ },
+/obj/item/clothing/suit/space/syndicate/black/engie{
+ desc = "This spacesuit is emblazoned with the emblem of the USSP. Glory to Space Russia!";
+ name = "Cosmonaut Engineering Suit"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "caution";
+ dir = 5
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"il" = (
+/obj/structure/sign/poster/contraband/communist_state,
+/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
+/area/derelict/crew_quarters)
+"im" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "chapel"
+ },
+/area/derelict/crew_quarters)
+"in" = (
+/obj/item/trash/spentcasing{
+ icon_state = "s-casing"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "chapel"
+ },
+/area/derelict/crew_quarters)
+"io" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "chapel"
+ },
+/area/derelict/crew_quarters)
+"ip" = (
+/obj/structure/table,
+/obj/item/storage/fancy/candle_box,
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "chapel"
+ },
+/area/derelict/crew_quarters)
+"iq" = (
+/obj/item/stack/tile,
+/turf/template_noop,
+/area/space/nearstation)
+"ir" = (
+/obj/structure/grille,
+/obj/structure/shuttle/window{
+ tag = "icon-window5_end";
+ icon = 'icons/turf/shuttle.dmi';
+ icon_state = "window5_end";
+ dir = 2
+ },
+/turf/simulated/floor/plating,
+/area/derelict/arrival)
+"is" = (
+/obj/structure/grille,
+/obj/structure/shuttle/window{
+ tag = "icon-window5_mid";
+ icon = 'icons/turf/shuttle.dmi';
+ icon_state = "window5_mid";
+ dir = 2
+ },
+/turf/simulated/floor/plating,
+/area/derelict/arrival)
+"it" = (
+/obj/structure/grille,
+/obj/structure/shuttle/window{
+ tag = "icon-window5_end (NORTH)";
+ icon = 'icons/turf/shuttle.dmi';
+ icon_state = "window5_end";
+ dir = 1
+ },
+/turf/simulated/floor/plating,
+/area/derelict/arrival)
+"iu" = (
+/turf/template_noop,
+/turf/simulated/shuttle/wall{
+ dir = 8;
+ icon_state = "diagonalWall3"
+ },
+/area/derelict/arrival)
+"iv" = (
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "brown"
+ },
+/area/derelict/arrival)
+"iw" = (
+/obj/effect/decal/cleanable/blood/drip,
+/turf/simulated/floor/plasteel,
+/area/derelict/arrival)
+"ix" = (
+/obj/effect/decal/cleanable/blood/splatter,
+/obj/item/trash/spentcasing{
+ icon_state = "s-casing"
+ },
+/turf/simulated/floor/plasteel,
+/area/derelict/arrival)
+"iy" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/plasteel,
+/area/derelict/arrival)
+"iz" = (
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (EAST)";
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "brown"
+ },
+/area/derelict/arrival)
+"iA" = (
+/obj/structure/closet/crate/can,
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/item/paper/crumpled{
+ info = "This note has been crossed out so many times it's hard to make out its contents. Katerina,
Your eyes are like diamonds, Forged in the very fire of Cygni-A. My heart yearns for you, For your soft beauty Fuckfucknothat'sbad.
Your voice is like liquid gold, Smothering me in its delicate contours. Never before had I known, The touch, The touch! The touch of an angel's voice
note to self: stick to science, poetry is not my forte.";
+ name = "love poem"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 10;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"iB" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/fancy/vials,
+/obj/item/reagent_containers/glass/beaker{
+ pixel_x = 28
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"iC" = (
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/glass/beaker{
+ pixel_x = 7;
+ pixel_y = 3
+ },
+/obj/item/reagent_containers/dropper{
+ pixel_y = 8
+ },
+/obj/structure/sign/poster/contraband/random{
+ pixel_y = -32
+ },
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"iD" = (
+/turf/simulated/floor/engine{
+ name = "vacuum floor";
+ nitrogen = 0.01;
+ oxygen = 0.01
+ },
+/turf/simulated/wall/mineral/titanium/nodecon/tileblend{
+ fixed_underlay = list("icon" = 'icons/turf/floors.dmi', "icon_state" = "engine");
+ icon_state = "4-i"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"iE" = (
+/turf/simulated/floor/engine{
+ name = "vacuum floor";
+ nitrogen = 0.01;
+ oxygen = 0.01
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"iF" = (
+/turf/template_noop,
+/turf/simulated/shuttle/wall{
+ dir = 1;
+ icon_state = "diagonalWall3"
+ },
+/area/derelict/arrival)
+"iG" = (
+/obj/item/shard{
+ icon_state = "medium"
+ },
+/turf/template_noop,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"iH" = (
+/obj/machinery/vending/assist,
+/turf/simulated/floor/plasteel{
+ dir = 10;
+ icon_state = "caution"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"iI" = (
+/obj/structure/closet/firecloset,
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "caution"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"iJ" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "chapel"
+ },
+/area/derelict/crew_quarters)
+"iK" = (
+/turf/simulated/floor/plasteel{
+ icon_state = "chapel"
+ },
+/area/derelict/crew_quarters)
+"iL" = (
+/obj/item/trash/spentcasing,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/crew_quarters)
+"iM" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "chapel"
+ },
+/area/derelict/crew_quarters)
+"iN" = (
+/obj/machinery/atmospherics/unary/portables_connector,
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plasteel{
+ icon_state = "chapel"
+ },
+/area/derelict/crew_quarters)
+"iO" = (
+/turf/simulated/shuttle/wall{
+ dir = 4;
+ icon_state = "wall3"
+ },
+/area/derelict/arrival)
+"iP" = (
+/obj/structure/computerframe,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/derelict/arrival)
+"iQ" = (
+/obj/effect/decal/remains/human{
+ desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
+ icon_state = "remains";
+ name = "Human remains"
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/derelict/arrival)
+"iR" = (
+/obj/structure/table,
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/item/clothing/head/soft/solgov,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/derelict/arrival)
+"iS" = (
+/obj/structure/closet/crate,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
+ },
+/obj/structure/sign/poster/contraband/communist_state{
+ pixel_x = -32
+ },
+/turf/simulated/floor/plasteel{
+ dir = 9;
+ icon_state = "brown"
+ },
+/area/derelict/arrival)
+"iT" = (
+/obj/structure/closet/crate/trashcart,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "brown"
+ },
+/area/derelict/arrival)
+"iU" = (
+/obj/effect/landmark/burnturf,
+/turf/simulated/floor/plasteel,
+/area/derelict/arrival)
+"iV" = (
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "brown"
+ },
+/area/derelict/arrival)
+"iW" = (
+/obj/machinery/door/airlock/science{
+ name = "Science Wing"
+ },
+/obj/machinery/door/poddoor/impassable{
+ id_tag = "ruslock";
+ layer = 3;
+ name = "Central Annex Lockdown"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"iX" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/science{
+ name = "Science Wing"
+ },
+/obj/machinery/door/poddoor/impassable{
+ id_tag = "ruslock";
+ layer = 3;
+ name = "Central Annex Lockdown"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "purple"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"iY" = (
+/obj/structure/lattice,
+/obj/item/stack/ore/iron,
+/turf/template_noop,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"iZ" = (
+/obj/effect/landmark/damageturf,
+/obj/effect/decal/remains/human{
+ desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
+ icon_state = "remains";
+ name = "Human remains"
+ },
+/turf/simulated/floor/plating/airless,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"ja" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"jb" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/engineering{
+ name = "Engineering Wing"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "caution"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"jc" = (
+/obj/machinery/door/airlock/engineering{
+ name = "Engineering Wing"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "caution";
+ dir = 4
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"jd" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/structure/chair/wood{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/crew_quarters)
+"je" = (
+/obj/structure/chair/wood{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/crew_quarters)
+"jf" = (
+/obj/effect/decal/cleanable/blood,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/derelict/crew_quarters)
+"jg" = (
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (EAST)";
+ icon_state = "tube1";
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/warning_stripes/southeastcorner,
+/turf/simulated/floor/plasteel{
+ icon_state = "wood"
+ },
+/area/derelict/crew_quarters)
+"jh" = (
+/turf/template_noop,
+/turf/simulated/wall/mineral/titanium/nodecon/nosmooth{
+ icon_state = "swall_f10"
+ },
+/area/derelict/eva{
+ name = "Derelict Annex"
+ })
+"ji" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/derelict/arrival)
+"jj" = (
+/obj/item/paper/djstation{
+ info = "Fuck. Fuckfuckfuck. I knew this mission was a mistake, that idiot Thomas got himself killed by some angry Russian security bot in the armoury, and the Lt. ran into the annex like a moron and got himself trapped. Now I'm just sitting on my god damn hands because this shuttle won't bloody move. Stupid USSP piece of shit docking arm must be jammed and I don't have the kit to go out and fix it.
The Captain assures me that there's nothing to worry about, but I find it hard to take a man who's paranoid of a powered shower door seriously.
- Comms Officer Vostok";
- name = "personal log";
- pixel_x = 26;
- pixel_y = 4
- },
-/obj/structure/computerframe{
- desc = "This computer is a husk of what it once was. Time and decay has worn its cheap circuitry to dust.";
- name = "decrepit computer"
- },
-/turf/simulated/floor/plasteel{
- dir = 1;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bh" = (
-/obj/effect/landmark/burnturf,
-/obj/structure/computerframe{
- desc = "This computer is a husk of what it once was. Time and decay has worn its cheap circuitry to dust.";
- name = "decrepit computer"
- },
-/turf/simulated/floor/plasteel{
- dir = 1;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bi" = (
-/obj/machinery/computer/crew,
-/turf/simulated/floor/plasteel{
- dir = 1;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bj" = (
-/obj/structure/grille,
-/turf/space,
-/area/space/nearstation)
-"bk" = (
-/obj/structure/table/reinforced,
-/obj/item/ashtray/bronze,
-/turf/simulated/floor/plasteel{
- dir = 5;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bl" = (
-/obj/structure/closet/emcloset,
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- dir = 5;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bm" = (
-/obj/structure/computerframe{
- desc = "This computer is a husk of what it once was. Time and decay has worn its cheap circuitry to dust.";
- name = "decrepit computer"
- },
-/obj/item/shard,
-/turf/simulated/floor/plasteel{
- dir = 1;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bn" = (
-/turf/simulated/wall/mineral/titanium/nodecon,
-/area/derelict/crew_quarters)
-"bo" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/turf/simulated/wall/mineral/titanium/interior,
-/area/djstation)
-"bp" = (
-/obj/structure/cable{
- icon_state = "0-2";
- d2 = 2
- },
-/obj/machinery/power/smes/magical{
- desc = "A high-capacity superconducting magnetic energy storage (SMES) unit.";
- name = "power storage unit"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "vault";
- dir = 8
- },
-/area/djstation)
-"bq" = (
-/turf/space,
-/area/djstation/solars)
-"br" = (
-/obj/item/twohanded/required/kirbyplants,
-/turf/simulated/floor/plasteel{
- icon_state = "wood"
- },
-/area/derelict/bridge)
-"bs" = (
-/obj/structure/lattice,
-/obj/structure/grille,
-/turf/space,
-/area/space/nearstation)
-"bt" = (
-/turf/simulated/wall/mineral/titanium/nodecon,
-/area/derelict/arrival)
-"bu" = (
-/obj/structure/coatrack,
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- icon_state = "wood"
- },
-/area/derelict/bridge)
-"bv" = (
-/obj/machinery/door/airlock/external{
- frequency = 1479;
- icon_state = "door_locked";
- id_tag = "dj_station_inner";
- locked = 1;
- name = "DJ Station Interior Access";
- req_access = null;
- req_access_txt = "0"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/turf/simulated/floor/plating,
-/area/djstation)
-"bw" = (
-/obj/structure/safe/floor,
-/obj/item/paper/djstation{
- name = "love letter";
- pixel_x = -5;
- pixel_y = -3;
- layer = 2.9;
- info = "To my darling Sergei,
I will never forget those nights we spent on Cygni, or all the times you took me around in your 2452 Vincent. The way you looked at me that one night, that was the night I knew that you and I were of the same soul.
I know they made you sell your Vincent when you were reassigned, but I could not let such a beautiful thing go to rust. I have made arrangements and it is here, waiting for you.
I have enclosed the keys. Please, let them serve as a reminder always of our love and a reason to return. I beg of you, do not let our love go softly into the night."
- },
-/obj/item/key{
- name = "Vincent '52 Key";
- pixel_x = 0;
- pixel_y = 0
- },
-/obj/item/trash/tapetrash{
- desc = "A bundle of severely yellowed and highly pretentious looking documents. Unfortunately they appear to be written in cyrillic and encrypted with a cypher.";
- icon = 'icons/obj/bureaucracy.dmi';
- icon_state = "docs_generic";
- name = "USSP//NOFORN//TOP SECRET"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "wood"
- },
-/area/derelict/bridge)
-"bx" = (
-/obj/machinery/light/spot{
- tag = "icon-tube1 (WEST)";
- icon_state = "tube1";
- dir = 8
- },
-/turf/simulated/floor/plasteel{
- dir = 8;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"by" = (
-/obj/machinery/atmospherics/unary/vent_pump/high_volume{
- dir = 1;
- frequency = 1479;
- id_tag = "dj_station_pump"
- },
-/obj/machinery/airlock_sensor{
- frequency = 1479;
- id_tag = "dj_station_sensor";
- pixel_x = 25;
- pixel_y = -5
- },
-/obj/machinery/embedded_controller/radio/airlock/airlock_controller{
- frequency = 1479;
- id_tag = "dj_station_airlock";
- pixel_x = -25;
- req_access_txt = "0";
- tag_airpump = "dj_station_pump";
- tag_chamber_sensor = "dj_station_sensor";
- tag_exterior_door = "dj_station_outer";
- tag_interior_door = "dj_station_inner"
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/simulated/floor/plating,
-/area/djstation)
-"bz" = (
-/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
-/area/derelict/crew_quarters)
-"bA" = (
-/obj/machinery/door/airlock/external{
- frequency = 1479;
- icon_state = "door_locked";
- id_tag = "dj_station_outer";
- locked = 1;
- name = "DJ Station External Access";
- req_access = null;
- req_access_txt = "0"
- },
-/turf/simulated/floor/plating,
-/area/djstation)
-"bB" = (
-/obj/structure/chair/office/dark{
- dir = 1
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/derelict/bridge)
-"bC" = (
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/derelict/bridge)
-"bD" = (
-/obj/structure/table/reinforced,
-/obj/item/phone{
- desc = "An old Russian phone. The dial tone is still humming.";
- name = "spin-dial phone"
- },
-/turf/simulated/floor/plasteel{
- dir = 8;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bE" = (
-/obj/effect/landmark/damageturf,
-/obj/effect/landmark/burnturf,
-/obj/item/shard{
- icon_state = "small"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/derelict/bridge)
-"bF" = (
-/obj/structure/chair/comfy/red{
- dir = 1
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/derelict/bridge)
-"bG" = (
-/obj/structure/chair/office/dark{
- dir = 4
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/derelict/bridge)
-"bH" = (
-/obj/structure/table/reinforced,
-/obj/item/fan,
-/turf/simulated/floor/plasteel{
- dir = 4;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bI" = (
-/obj/machinery/light/spot{
- tag = "icon-tube1 (EAST)";
- icon_state = "tube1";
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- dir = 4;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bJ" = (
-/obj/effect/landmark/damageturf,
-/obj/effect/decal/remains/human{
- desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
- icon_state = "remains";
- name = "Human remains"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/derelict/bridge)
-"bK" = (
-/obj/machinery/vending/cigarette/free{
- product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism."
- },
-/turf/simulated/floor/plasteel{
- dir = 9;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bL" = (
-/obj/machinery/photocopier,
-/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
- icon_state = "tube1";
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- dir = 5;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bM" = (
-/obj/machinery/vending/sovietsoda,
-/turf/simulated/floor/plasteel{
- dir = 1;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bN" = (
-/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
-/area/derelict/arrival)
-"bO" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/structure/dresser,
-/turf/simulated/floor/plasteel{
- dir = 9;
- icon_state = "blue"
- },
-/area/derelict/crew_quarters)
-"bP" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- d1 = 2;
- d2 = 4;
- icon_state = "2-4"
- },
-/turf/simulated/floor/plating,
-/area/djstation)
-"bQ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/plating,
-/area/djstation)
-"bR" = (
-/obj/structure/grille,
-/obj/structure/window/full/shuttle,
-/obj/structure/cable{
- d1 = 1;
- d2 = 4;
- icon_state = "1-4"
- },
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/plating,
-/area/djstation)
-"bS" = (
-/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
- icon_state = "tube1";
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants,
-/turf/simulated/floor/plasteel{
- dir = 5;
- icon_state = "darkblue"
- },
-/area/derelict/eva{
- name = "Derelict Annex"
- })
-"bT" = (
-/obj/structure/rack,
-/obj/item/gun/energy/e_gun/old{
- desc = "A rudimentary energy weapon co-opted by the USSP from a TSF experimental prototype. There are two firing modes."
- },
-/turf/simulated/floor/plasteel{
- icon_state = "wood"
- },
-/area/derelict/bridge)
-"bU" = (
-/obj/structure/closet{
- icon_closed = "cabinet_closed";
- icon_opened = "cabinet_open";
- icon_state = "cabinet_closed"
- },
-/obj/item/clothing/head/helmet/space/syndicate/blue{
- desc = "This spacesuit is emblazoned with the emblem of the USSP. Glory to Space Russia!";
- name = "Cosmonaut Command Helmet"
- },
-/obj/item/clothing/suit/space/syndicate/blue{
- desc = "This spacesuit is emblazoned with the emblem of the USSP. Glory to Space Russia!";
- name = "Cosmonaut Command Suit"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "wood"
- },
-/area/derelict/bridge)
-"bV" = (
-/turf/simulated/floor/plasteel{
- icon_state = "wood"
- },
-/area/derelict/bridge)
-"bW" = (
-/obj/structure/table/wood,
-/obj/item/trash/can{
- desc = "A miniature ship in a bottle. I wonder how they got it in there?";
- icon = 'icons/obj/lavaland/artefacts.dmi';
- icon_state = "ship_bottle";
- name = "ship in a bottle"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "wood"
- },
-/area/derelict/bridge)
-"bX" = (
-/turf/simulated/floor/carpet,
-/area/derelict/bridge)
-"bY" = (
-/obj/effect/decal/remains/human{
- desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
- icon_state = "remains";
- name = "Human remains"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/vomit,
-/turf/simulated/floor/plasteel{
- dir = 5;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"bZ" = (
-/turf/simulated/floor/plasteel{
- dir = 8;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"ca" = (
-/obj/structure/table,
-/turf/simulated/floor/plasteel{
- dir = 5;
- icon_state = "blue"
- },
-/area/derelict/crew_quarters)
-"cb" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/derelict/bridge)
-"cc" = (
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"cd" = (
-/turf/simulated/floor/plasteel{
- dir = 10;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"ce" = (
-/turf/simulated/floor/plasteel{
- dir = 6;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"cf" = (
-/turf/simulated/floor/plasteel{
- dir = 4;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"cg" = (
-/turf/simulated/floor/plasteel{
- dir = 5;
- icon_state = "dark";
- tag = "icon-vault (NORTHEAST)"
- },
-/area/derelict/bridge)
-"ch" = (
-/obj/item/cigbutt{
- pixel_x = 6;
- pixel_y = 3
- },
-/obj/item/cigbutt{
- pixel_x = 8;
- pixel_y = 9
- },
-/obj/item/cigbutt,
-/obj/item/lighter{
- pixel_x = -6;
- pixel_y = 5
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- dir = 1;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"ci" = (
-/obj/item/paper/djstation{
- info = "The note is stained with ink-smudges, the forceful and shaky handwriting scrawled across it is barely legible.
Vostok stopped banging on the door an hour ago. he must be looking for something to try and force it. I am still unsure what's happened, but it's been six hours now.
My hands won't stop shaking, not even the cigarettes are helping.
Vostok, if you manage to get in and I am no longer concious, my medication is in the freezer next to my desk. Please. I'm counting on you.";
- name = "shaky note"
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- dir = 1;
- icon_state = "darkblue"
- },
-/area/derelict/bridge)
-"cj" = (
-/obj/structure/sign/mech,
-/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
-/area/derelict/arrival)
-"ck" = (
-/obj/structure/cable{
- d2 = 4;
- icon_state = "0-4"
- },
-/obj/machinery/power/apc/noalarm{
- dir = 8;
- pixel_x = -24
- },
-/turf/simulated/floor/plasteel{
- icon_state = "wood"
- },
-/area/derelict/bridge)
-"cl" = (
-/obj/structure/cable{
- icon_state = "0-4";
- d2 = 4
- },
-/obj/machinery/power/apc/noalarm{
- dir = 0;
- name = "Worn-out APC";
- pixel_y = -24
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plating,
-/area/djstation)
-"cm" = (
-/obj/structure/grille,
-/obj/structure/window/full/shuttle,
-/turf/simulated/floor/plating,
-/area/djstation)
-"cn" = (
-/obj/structure/rack,
-/obj/item/clothing/suit/space/syndicate/orange{
- desc = "This spacesuit is emblazoned with the emblem of the USSP. Glory to Space Russia!";
- name = "Cosmonaut Security Suit"
- },
-/obj/item/clothing/head/helmet/space/syndicate/orange{
- desc = "This spacesuit is emblazoned with the emblem of the USSP. Glory to Space Russia!";
- name = "Cosmonaut Security Helmet"
- },
-/obj/item/clothing/mask/breath,
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plating,
-/area/djstation)
-"co" = (
-/obj/machinery/light_switch{
- pixel_y = -28
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plating,
-/area/djstation)
-"cp" = (
-/obj/structure/sign/securearea,
-/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
-/area/derelict/arrival)
-"cq" = (
-/obj/effect/decal/cleanable/fungus,
-/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
-/area/derelict/crew_quarters)
-"cr" = (
-/obj/structure/chair/comfy/red{
- dir = 4
- },
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "wood"
- },
-/area/derelict/bridge)
-"cs" = (
-/obj/item/clothing/under/retro/security,
-/obj/item/clothing/under/retro/security,
-/obj/structure/closet,
-/obj/item/clothing/gloves/combat,
-/obj/item/clothing/gloves/combat,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- d2 = 2;
- icon_state = "0-2";
- pixel_y = 0
- },
-/obj/machinery/power/apc/noalarm{
- dir = 1;
- pixel_y = 24
- },
-/turf/simulated/floor/plasteel{
- dir = 9;
- icon_state = "darkred"
- },
-/area/derelict/arrival)
-"ct" = (
-/obj/structure/chair/stool,
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- icon_state = "wood"
- },
-/area/derelict/bridge)
-"cu" = (
-/obj/structure/table/wood,
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/item/paper/djstation{
- info = "This damned shower is going to be the death of me. I can see the way Vostok looks at me when I speak of it, the way his eyes sneer with amusement. Just this morning, I swear the damn thing tried to lock me in! I had to break the manual release just to get out, Vostok nearly shit himself he was laughing so hard.
You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio fequencies. Here is a step by step guide to start listening in on those saucy radio channels:
Equip yourself with a multi-tool
Use the multitool on each machine, that is the broadcaster, receiver and the relay.
Turn all the machines on, it has already been configured for you to listen on.
Simple as that. Now to listen to the private channels, you'll have to configure the intercoms, located on the front desk. Here is a list of frequencies for you to listen on.
I recognize the nature of this request my seem strange, but please, hear me out. Comrade Blyatski, though he is but a wee bot, is like iron fist of Commissar Grigor himself! Just the other day he chased that useless bastard Totstoi clean out of brig, you should have seen the way that drunkard whimpered! Like a dog with his tail between his legs.
Anyways, I digress! If any one is worth of recognition, it is our ever-vigilant and beloved Blyatski, true champion of USSP.
If you wish to, perhaps, see his vigilance and dedication in person, well! You need only come to inspect armoury.
Comrade Blyatski awaits your decision.";
- name = "recommendation for commendation"
- },
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "darkred"
- },
-/area/derelict/arrival)
-"gk" = (
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/turf/simulated/wall/mineral/titanium/nodecon/tileblend{
- fixed_underlay = list("icon" = 'icons/turf/floors.dmi', "icon_state" = "dark");
- icon_state = "4-i"
- },
-/area/derelict/arrival)
-"gl" = (
-/obj/structure/table/reinforced,
-/obj/item/paper_bin,
-/obj/item/pen,
-/obj/structure/window/reinforced,
-/obj/machinery/newscaster{
- desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. Strange that it's on a Russian station.";
- layer = 3.3;
- pixel_x = 27
- },
-/turf/simulated/floor/plasteel{
- dir = 6;
- icon_state = "darkred"
- },
-/area/derelict/arrival)
-"gm" = (
-/obj/structure/grille,
-/obj/structure/window/full/shuttle,
-/obj/machinery/door/poddoor/impassable{
- id_tag = "ruslocksec";
- layer = 2.9;
- name = "Security Wing Lockdown"
- },
-/turf/simulated/floor/plating,
-/area/derelict/arrival)
-"gn" = (
-/obj/effect/landmark/damageturf,
-/obj/effect/decal/remains/human{
- desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
- icon_state = "remains";
- name = "Human remains"
- },
-/turf/simulated/floor/plating/airless,
-/area/derelict/eva{
- name = "Derelict Annex"
- })
-"go" = (
-/turf/space,
-/turf/simulated/wall/mineral/titanium/nodecon/nosmooth{
- icon_state = "swall_f10"
- },
-/area/derelict/eva{
- name = "Derelict Annex"
- })
-"gp" = (
-/obj/effect/landmark/damageturf,
-/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
-/area/derelict/arrival)
-"gq" = (
-/obj/effect/landmark/burnturf,
-/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
-/area/derelict/arrival)
-"gr" = (
-/obj/structure/grille,
-/obj/structure/window/full/shuttle,
-/turf/simulated/floor/plating,
-/area/derelict/crew_quarters)
-"gs" = (
-/obj/machinery/door/airlock/shuttle{
- name = "Dormitories"
- },
-/turf/simulated/floor/plasteel,
-/area/derelict/crew_quarters)
-"gt" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel,
-/area/derelict/crew_quarters)
-"gu" = (
-/obj/structure/table/reinforced,
-/obj/structure/bedsheetbin,
-/obj/structure/sign/poster/contraband/random{
- pixel_y = 32
- },
-/turf/simulated/floor/plasteel,
-/area/derelict/crew_quarters)
-"gv" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
-/area/derelict/arrival)
-"gw" = (
-/turf/simulated/floor/plasteel{
- dir = 8;
- icon_state = "darkred"
- },
-/area/derelict/arrival)
-"gx" = (
-/obj/structure/rack,
-/obj/item/crowbar,
-/turf/simulated/floor/plasteel{
- dir = 6;
- icon_state = "darkred"
- },
-/area/derelict/arrival)
-"gy" = (
-/turf/simulated/floor/plasteel{
- icon_state = "chapel"
- },
-/area/derelict/crew_quarters)
-"gz" = (
-/obj/structure/closet/medical_wall,
-/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
-/area/derelict/arrival)
-"gA" = (
-/obj/structure/closet,
-/obj/machinery/light/spot{
- tag = "icon-tube1 (EAST)";
- icon_state = "tube1";
- dir = 4
- },
-/obj/item/clothing/head/ushanka,
-/obj/item/clothing/head/ushanka,
-/obj/item/clothing/head/ushanka,
-/obj/item/clothing/under/soviet,
-/obj/item/clothing/under/soviet,
-/obj/item/clothing/under/soviet,
-/obj/item/clothing/under/soviet,
-/obj/item/clothing/head/ushanka,
-/obj/item/clothing/head/ushanka,
-/obj/item/clothing/under/soviet,
-/turf/simulated/floor/plasteel,
-/area/derelict/crew_quarters)
-"gB" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen";
- opened = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/item/stack/packageWrap,
-/obj/item/stack/packageWrap,
-/obj/item/destTagger,
-/turf/simulated/floor/plasteel{
- dir = 9;
- icon_state = "brown"
- },
-/area/derelict/arrival)
-"gC" = (
-/obj/machinery/recharger,
-/obj/structure/table/reinforced,
-/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
- icon_state = "tube1";
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- dir = 1;
- icon_state = "darkred"
- },
-/area/derelict/arrival)
-"gD" = (
-/obj/item/trash/spentcasing,
-/turf/simulated/floor/plasteel{
- icon_state = "wood"
- },
-/area/derelict/crew_quarters)
-"gE" = (
-/obj/effect/landmark/damageturf,
-/turf/simulated/floor/plating/airless,
-/area/derelict/eva{
- name = "Derelict Annex"
- })
-"gF" = (
-/turf/simulated/floor/plasteel{
- dir = 6;
- icon_state = "darkred"
- },
-/area/derelict/arrival)
-"gG" = (
-/obj/structure/closet,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/shoes/jackboots,
-/obj/item/clothing/shoes/jackboots,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/clothing/head/panzer{
- desc = "An oldschool military softcap.";
- name = "old military cap"
- },
-/obj/item/clothing/head/panzer{
- desc = "An oldschool military softcap.";
- name = "old military cap"
- },
-/turf/simulated/floor/plasteel,
-/area/derelict/crew_quarters)
-"gH" = (
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/turf/simulated/wall/mineral/titanium/nodecon/tileblend{
- fixed_underlay = list("icon" = 'icons/turf/floors.dmi', "icon_state" = "dark");
- icon_state = "4-i"
- },
-/area/djstation)
-"gI" = (
-/turf/space,
-/area/djstation)
-"gJ" = (
-/turf/simulated/floor/plasteel{
- dir = 9;
- icon_state = "darkred"
- },
-/area/derelict/arrival)
-"gK" = (
-/obj/structure/sign/greencross,
-/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
-/area/derelict/arrival)
-"gL" = (
-/obj/structure/sign/vacuum,
-/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
-/area/derelict/arrival)
-"gM" = (
-/obj/structure/chair/stool/bar,
-/obj/item/trash/spentcasing{
- icon_state = "762-casing"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "wood"
- },
-/area/derelict/crew_quarters)
-"gN" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/door/poddoor/impassable{
- id_tag = "ruslock";
- layer = 3;
- name = "Central Annex Lockdown"
- },
-/obj/machinery/door/airlock/command/glass{
- name = "Command Wing"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/derelict/eva{
- name = "Derelict Annex"
- })
-"gO" = (
-/obj/item/trash/spentcasing,
-/turf/simulated/floor/plasteel{
- icon_state = "grimy"
- },
-/area/derelict/crew_quarters)
-"gP" = (
-/obj/structure/closet/crate/can,
-/obj/item/paper/crumpled{
- info = "I KNOW IT WAS YOU WHO THREW AWAY MY LUCKY UNDERWEAR THIS TIME. I SWEAR, IF I SEE YOUR SKINNY RAT NECK AROUND I AM GOING TO WRING IT UNTIL YOU GO PURPLE!
I know it's you who's been feeding my cats alcohol, I do not care what your reasons are but you are getting in the way of important research. This is the fifth cat that I've had to replace this month because of your crude sense of humour, and I will be speaking with Chief Borachov if you don't stop.
Of course, the aggressive behaviour is an undue side-effect, but it is only cat after all. I am certain a few sedative-laced cat treats will suffice to prep for autopsy.";
- name = "Experiment 432-A"
- },
-/turf/simulated/floor/plasteel,
-/area/derelict/eva{
- name = "Derelict Annex"
- })
-"jW" = (
-/turf/simulated/floor/plasteel{
- dir = 4;
- icon_state = "orange"
- },
-/area/derelict/crew_quarters)
-"jX" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/paper/djstation{
- info = "Father Gregor,
You will have to forgive me, but I am unable to get your order for one of those 'veil shifters' like you asked. I am admittedly unsure what you planned to do with it, the business of the clergy is not mine, but Vostok was quick to put the kaibosh on your order after we lost the last shipment.
The boys are still reeling from the headaches from last time, and Khoma complains that he sees the blue lights whenever he closes his eyes.
I am not one to question a man of God but I beg of you, please do not try to order any more of these artifacts. They are cursed, and all manner of demons seem to follow in their wake.
- Andrei Vostovich, Supply Technician";
- name = "My apologies, father"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/derelict/crew_quarters)
-"jY" = (
-/obj/item/trash/spentcasing{
- icon_state = "762-casing"
- },
-/turf/simulated/floor/plasteel,
-/area/derelict/arrival)
-"jZ" = (
-/obj/item/beach_ball/holoball,
-/turf/simulated/floor/plasteel{
- dir = 8;
- icon_state = "orange"
- },
-/area/derelict/crew_quarters)
-"ka" = (
-/obj/effect/landmark/damageturf,
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- dir = 8;
- icon_state = "caution"
- },
-/area/derelict/eva{
- name = "Derelict Annex"
- })
-"kb" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 8;
- icon_state = "1-8"
- },
-/obj/structure/cable{
- d1 = 2;
- d2 = 8;
- icon_state = "2-8"
- },
-/turf/simulated/floor/plasteel,
-/area/derelict/eva{
- name = "Derelict Annex"
- })
-"kc" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- dir = 9;
- icon_state = "redblue"
- },
-/area/derelict/eva{
- name = "Derelict Annex"
- })
-"kd" = (
-/obj/structure/table/reinforced,
-/obj/item/reagent_containers/glass/rag,
-/turf/simulated/floor/plasteel{
- icon_state = "grimy"
- },
-/area/derelict/crew_quarters)
-"ke" = (
-/obj/structure/table/reinforced,
-/obj/item/wrench,
-/obj/machinery/light/spot{
- tag = "icon-tube1 (EAST)";
- icon_state = "tube1";
- dir = 4
- },
-/turf/simulated/floor/plasteel{
- icon_state = "grimy"
- },
-/area/derelict/crew_quarters)
-"kf" = (
-/obj/effect/decal/cleanable/blood/drip,
-/obj/effect/decal/cleanable/blood{
- amount = 0
- },
-/obj/effect/decal/remains/human{
- desc = "This guy seemed to have died in terrible way! Half his remains are dust.";
- icon_state = "remains";
- name = "Human remains"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "grimy"
- },
-/area/derelict/crew_quarters)
-"kg" = (
-/obj/machinery/power/solar{
- id = "russolar"
- },
-/turf/simulated/floor/plasteel/airless{
- icon_state = "solarpanel"
- },
-/area/derelict/solar_control)
-"kh" = (
-/obj/machinery/power/solar{
- id = "russolar"
- },
-/obj/structure/cable{
- icon_state = "0-2";
- pixel_y = 1;
- d2 = 2
- },
-/turf/simulated/floor/plasteel/airless{
- icon_state = "solarpanel"
- },
-/area/derelict/solar_control)
-"ki" = (
-/obj/item/twohanded/required/kirbyplants,
-/turf/simulated/floor/plasteel{
- dir = 10;
- icon_state = "darkred"
- },
-/area/derelict/arrival)
-"kj" = (
-/obj/machinery/light/spot,
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/derelict/arrival)
-"kk" = (
-/obj/item/storage/box/cups,
-/obj/structure/table,
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "darkred"
- },
-/area/derelict/arrival)
-"kl" = (
-/obj/structure/reagent_dispensers/water_cooler,
-/turf/simulated/floor/plasteel{
- dir = 6;
- icon_state = "darkred"
- },
-/area/derelict/arrival)
-"km" = (
-/obj/structure/cable{
- d1 = 2;
- d2 = 4;
- icon_state = "2-4"
- },
-/turf/simulated/floor/plasteel{
- dir = 8;
- icon_state = "purple"
- },
-/area/derelict/eva{
- name = "Derelict Annex"
- })
-"kn" = (
-/obj/structure/chair/office/light{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel,
-/area/derelict/eva{
- name = "Derelict Annex"
- })
-"ko" = (
-/obj/structure/computerframe,
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- dir = 6;
- icon_state = "purple"
- },
-/area/derelict/eva{
- name = "Derelict Annex"
- })
-"kp" = (
-/obj/item/stack/ore/uranium,
-/turf/space,
-/area/space/nearstation)
-"kq" = (
-/obj/structure/table/reinforced,
-/obj/item/paper/djstation{
- info = "This is the fifth time this month I've had to replace the cabling to the damn lockdown circuit. It's bad enough the condensor is constantly on the fritz and the damn systems take nearly a week to cycle and reboot, but now I've got the captain breathing down my neck over his stupid shower and Commissar Grigor. Mikail was telling me the man's face went so red when the lights popped that you could see him glowing in the dark.
If he thought that was bad, well, if I hadn't installed an override in the mess hall we would have been sitting in the dark for the week.
Wahwahwah! True egghead! I do not give two shits about your cats or 'syence,' if you write to Chief I will tell that bitch Katerina about your baby boy crush.
Now who is laugh, cyka blyats? You idiots pissing yourselves in dark, but Totstoi clever and make escape. I have key to space, EVA gear. While you soil pants, I kiss your dumb asses goodbye!
Goodbyegoodbyegoodbyegoodbye, fuck you, and goodnight!";
- name = "I PISS ON YOU!"
- },
-/turf/space,
-/area/space/nearstation)
-"yo" = (
-/obj/structure/chair/comfy/brown{
- dir = 8
- },
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "redfull";
- tag = "icon-redfull (NORTHWEST)"
- },
-/area/derelict/arrival)
-"yp" = (
-/turf/simulated/floor/plasteel{
- dir = 10;
- icon_state = "red"
- },
-/area/derelict/arrival)
-"yq" = (
-/obj/item/twohanded/required/kirbyplants,
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "redfull";
- tag = "icon-redfull (NORTHWEST)"
- },
-/area/derelict/arrival)
-"yt" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- dir = 6;
- icon_state = "red"
- },
-/area/derelict/arrival)
-"yu" = (
-/obj/structure/table,
-/obj/item/flashlight/lamp,
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "redfull";
- tag = "icon-redfull (NORTHWEST)"
- },
-/area/derelict/arrival)
-"yw" = (
-/turf/simulated/floor/plasteel{
- icon_state = "red"
- },
-/area/derelict/arrival)
-"yx" = (
-/turf/simulated/floor/plasteel{
- dir = 6;
- icon_state = "red"
- },
-/area/derelict/arrival)
-"yy" = (
-/obj/structure/table/wood/poker,
-/obj/item/deck/cards,
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "redfull";
- tag = "icon-redfull (NORTHWEST)"
- },
-/area/derelict/arrival)
-"yz" = (
-/obj/structure/chair{
- dir = 4
- },
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "redfull";
- tag = "icon-redfull (NORTHWEST)"
- },
-/area/derelict/arrival)
-"yB" = (
-/obj/structure/chair{
- dir = 8
- },
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "redfull";
- tag = "icon-redfull (NORTHWEST)"
- },
-/area/derelict/arrival)
-"yC" = (
-/obj/structure/closet/crate/can,
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/obj/item/trash/popcorn,
-/obj/item/trash/semki,
-/obj/item/paper/crumpled{
- info = "That idiot bastard Totstoi found my button. Stupid drunk was trying to put change into the free cigarette machine and dropped it. Lo' and behold, dumbass decides to look under the machine for his precious rubles.
Thankfully that green-livered swine cares more about drink than anything else, managed to buy him off. Will have to move the switch somewhere else now, but where?";
- name = "worn paper"
- },
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "redfull";
- tag = "icon-redfull (NORTHWEST)"
- },
-/area/derelict/arrival)
-"yD" = (
-/obj/structure/window/reinforced{
- dir = 1;
- layer = 2.9
- },
-/obj/structure/flora/ausbushes/leafybush,
-/turf/simulated/floor/grass,
-/area/derelict/arrival)
-"yE" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/structure/window/reinforced{
- dir = 1;
- layer = 2.9
- },
-/obj/structure/flora/ausbushes/fullgrass,
-/obj/structure/flora/ausbushes/ppflowers,
-/turf/simulated/floor/grass,
-/area/derelict/arrival)
-"yF" = (
-/obj/structure/sign/poster/contraband/communist_state{
- pixel_y = -32
- },
-/obj/machinery/atmospherics/unary/portables_connector{
- dir = 4
- },
-/obj/machinery/portable_atmospherics/canister/air,
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "redfull";
- tag = "icon-redfull (NORTHWEST)"
- },
-/area/derelict/arrival)
-"yG" = (
-/obj/structure/window/reinforced{
- dir = 1;
- layer = 2.9
- },
-/obj/structure/window/reinforced{
- tag = "icon-rwindow (EAST)";
- icon_state = "rwindow";
- dir = 4
- },
-/obj/structure/flora/ausbushes/ppflowers,
-/obj/structure/flora/ausbushes/sparsegrass,
-/turf/simulated/floor/grass,
-/area/derelict/arrival)
-"yL" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/sign/poster/contraband/communist_state{
- pixel_y = -32
- },
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "redfull";
- tag = "icon-redfull (NORTHWEST)"
- },
-/area/derelict/arrival)
-"yN" = (
-/obj/structure/window/reinforced{
- dir = 1;
- layer = 2.9
- },
-/obj/structure/flora/ausbushes/fullgrass,
-/turf/simulated/floor/grass,
-/area/derelict/arrival)
-"yO" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/structure/window/reinforced{
- dir = 1;
- layer = 2.9
- },
-/obj/structure/flora/ausbushes/ppflowers,
-/obj/structure/flora/ausbushes/leafybush,
-/turf/simulated/floor/grass,
-/area/derelict/arrival)
-"yP" = (
-/obj/structure/table,
-/obj/machinery/computer/library/public,
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "redfull";
- tag = "icon-redfull (NORTHWEST)"
- },
-/area/derelict/arrival)
-"yQ" = (
-/obj/structure/window/reinforced{
- tag = "icon-rwindow (EAST)";
- icon_state = "rwindow";
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 1;
- layer = 2.9
- },
-/obj/structure/flora/ausbushes/ywflowers,
-/turf/simulated/floor/grass,
-/area/derelict/arrival)
-"yR" = (
-/obj/item/stack/cable_coil{
- amount = 1;
- max_amount = 30
- },
-/turf/space,
-/area/space/nearstation)
-"yS" = (
-/obj/machinery/door/airlock/external{
- frequency = 1501;
- id_tag = "rus_inner_1";
- name = "External Airlock";
- req_access_txt = "0"
- },
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/turf/simulated/floor/plating,
-/area/derelict/arrival)
-"yU" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden,
-/obj/machinery/door/airlock/external{
- frequency = 1501;
- id_tag = "rus_inner_1";
- name = "External Airlock";
- req_access_txt = "0"
- },
-/turf/simulated/floor/plating,
-/area/derelict/arrival)
-"yX" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/light/small{
- tag = "icon-bulb1 (EAST)";
- icon_state = "bulb1";
- dir = 4
- },
-/obj/machinery/atmospherics/unary/vent_pump/high_volume{
- dir = 1;
- frequency = 1501;
- id_tag = "rus_pump_1"
- },
-/obj/machinery/airlock_sensor{
- frequency = 1501;
- id_tag = "rus_sensor_1";
- pixel_x = 25;
- pixel_y = -5
- },
-/obj/machinery/embedded_controller/radio/airlock/airlock_controller{
- frequency = 1501;
- id_tag = "rus_airlock_1";
- pixel_x = -25;
- req_access_txt = "0";
- tag_airpump = "rus_pump_1";
- tag_chamber_sensor = "rus_sensor_1";
- tag_exterior_door = "rus_outer_1";
- tag_interior_door = "rus_inner_1"
- },
-/turf/simulated/floor/plating,
-/area/derelict/arrival)
-"yZ" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/machinery/atmospherics/unary/vent_pump/high_volume{
- dir = 1;
- frequency = 1501;
- id_tag = "rus_pump_1"
- },
-/turf/simulated/floor/plating,
-/area/derelict/arrival)
-"za" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/door/airlock/external{
- frequency = 1501;
- id_tag = "rus_outer_1";
- locked = 1;
- name = "External Airlock";
- req_access_txt = "0"
- },
-/turf/simulated/floor/plating,
-/area/derelict/arrival)
-"zc" = (
-/obj/machinery/door/airlock/external{
- frequency = 1501;
- id_tag = "rus_outer_1";
- locked = 1;
- name = "External Airlock";
- req_access_txt = "0"
- },
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/turf/simulated/floor/plating,
-/area/derelict/arrival)
-"zf" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/machinery/access_button{
- command = "cycle_exterior";
- frequency = 1501;
- master_tag = "rus_airlock_1";
- name = "exterior access button";
- pixel_y = 25;
- req_access_txt = "0"
- },
-/turf/space,
-/area/derelict/arrival)
-"zk" = (
-/obj/item/shard,
-/turf/space,
-/area/derelict/solar_control)
-"zl" = (
-/turf/space,
-/area/derelict/solar_control)
-"zm" = (
-/obj/item/shard{
- icon_state = "medium"
- },
-/turf/space,
-/area/derelict/solar_control)
-"zn" = (
-/obj/machinery/power/solar/fake,
-/obj/structure/cable,
-/obj/structure/cable,
-/turf/simulated/floor/plasteel/airless{
- icon_state = "solarpanel"
- },
-/area/derelict/solar_control)
-"zo" = (
-/obj/structure/lattice,
-/turf/space,
-/area/derelict/solar_control)
-"zr" = (
-/obj/structure/cable,
-/obj/machinery/power/tracker,
-/obj/structure/cable,
-/turf/simulated/floor/plasteel/airless{
- icon_state = "solarpanel"
- },
-/area/derelict/solar_control)
-"zs" = (
-/obj/structure/lattice,
-/obj/item/shard{
- icon_state = "small"
- },
-/turf/space,
-/area/space/nearstation)
-"zt" = (
-/turf/simulated/wall,
-/area/derelict/teleporter)
-"zu" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced{
- dir = 5;
- max_integrity = 1e+007
- },
-/turf/simulated/floor/plating/airless,
-/area/derelict/teleporter)
-"zv" = (
-/obj/structure/grille{
- density = 0;
- icon_state = "brokengrille"
- },
-/turf/simulated/floor/plating/airless,
-/area/derelict/teleporter)
-"zw" = (
-/obj/structure/girder,
-/turf/simulated/floor/plating/airless,
-/area/derelict/teleporter)
-"zx" = (
-/turf/simulated/wall/rust,
-/area/derelict/teleporter)
-"zy" = (
-/obj/item/rack_parts,
-/turf/simulated/floor/plating/airless,
-/area/derelict/teleporter)
-"zz" = (
-/obj/effect/landmark/damageturf,
-/obj/item/shard{
- icon_state = "small"
- },
-/turf/simulated/floor/plasteel/airless{
- icon_state = "floorgrime"
- },
-/area/derelict/teleporter)
-"zA" = (
-/turf/simulated/floor/plasteel/airless{
- icon_state = "floorgrime"
- },
-/area/derelict/teleporter)
-"zB" = (
-/obj/machinery/light_construct/small{
- dir = 1
- },
-/obj/effect/landmark/damageturf,
-/obj/structure/filingcabinet/chestdrawer,
-/turf/simulated/floor/plasteel/airless{
- dir = 8;
- icon_state = "green"
- },
-/area/derelict/teleporter)
-"zC" = (
-/obj/machinery/light_construct/small{
- dir = 4
- },
-/obj/machinery/atmospherics/unary/portables_connector{
- layer = 2
- },
-/turf/simulated/floor/plasteel/airless{
- icon_state = "floorgrime"
- },
-/area/derelict/teleporter)
-"zD" = (
-/obj/structure/table,
-/obj/item/clipboard,
-/turf/simulated/floor/plasteel/airless{
- dir = 8;
- icon_state = "green"
- },
-/area/derelict/teleporter)
-"zE" = (
-/obj/machinery/computer/teleporter,
-/turf/simulated/floor/plasteel/airless{
- icon_state = "dark"
- },
-/area/derelict/teleporter)
-"zF" = (
-/obj/machinery/teleport/hub,
-/turf/simulated/floor/plasteel/airless{
- icon_state = "floorgrime"
- },
-/area/derelict/teleporter)
-"zG" = (
-/obj/machinery/teleport/station,
-/turf/simulated/floor/plasteel/airless{
- icon_state = "floorgrime"
- },
-/area/derelict/teleporter)
-"zH" = (
-/obj/machinery/atmospherics/pipe/simple/visible{
- dir = 5
- },
-/turf/simulated/floor/plating/airless,
-/area/derelict/teleporter)
-"zI" = (
-/obj/structure/door_assembly/door_assembly_ext{
- name = "Broken External Airlock"
- },
-/turf/simulated/floor/plating/airless,
-/area/derelict/teleporter)
-"zJ" = (
-/obj/structure/table,
-/obj/item/stock_parts/cell{
- charge = 100;
- maxcharge = 15000
- },
-/turf/simulated/floor/plasteel/airless{
- dir = 8;
- icon_state = "green"
- },
-/area/derelict/teleporter)
-"zK" = (
-/obj/effect/landmark/damageturf,
-/turf/simulated/floor/plasteel/airless{
- icon_state = "floorgrime"
- },
-/area/derelict/teleporter)
-"zM" = (
-/obj/structure/sign/vacuum,
-/turf/simulated/wall,
-/area/derelict/teleporter)
-"zN" = (
-/obj/machinery/power/apc/noalarm{
- dir = 0;
- name = "Worn-out APC";
- pixel_y = -24
- },
-/turf/simulated/floor/plasteel/airless{
- icon_state = "floorgrime"
- },
-/area/derelict/teleporter)
-"zO" = (
-/obj/machinery/light/small,
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/core)
-"zP" = (
-/obj/item/flag/chameleon{
- icon_state = "syndiflag";
- name = "Syndicate Flag";
- used = 1
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/core)
-"zQ" = (
-/turf/simulated/mineral/random/labormineral,
-/turf/simulated/shuttle/wall{
- tag = "icon-swall_f5";
- icon_state = "swall_f5";
- dir = 2
- },
-/area/space/nearstation)
-"zR" = (
-/obj/machinery/portable_atmospherics/canister/toxins,
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/core)
-"zS" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/light/small,
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/core)
-"BB" = (
-/obj/structure/falsewall,
-/obj/structure/fans/tiny,
-/turf/simulated/floor/plating/airless,
-/area/syndicate_depot/outer)
-"DH" = (
-/obj/machinery/light{
- dir = 1;
- on = 1
- },
-/obj/item/flag/chameleon{
- icon_state = "syndiflag";
- name = "Syndicate Flag";
- used = 1
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/core)
-"GF" = (
-/obj/item/flag/chameleon{
- icon_state = "syndiflag";
- name = "Syndicate Flag";
- used = 1
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/outer)
-"GH" = (
-/obj/effect/spawner/random_spawners/syndicate/turret,
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/outer)
-"Hg" = (
-/obj/structure/dispenser,
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/outer)
-"KK" = (
-/obj/machinery/door/airlock/external{
- id_tag = "sst_away";
- req_access_txt = "150"
- },
-/obj/structure/fans/tiny,
-/turf/unsimulated/floor{
- name = "plating"
- },
-/area/syndicate_depot/outer)
-"Mc" = (
-/obj/machinery/door/poddoor{
- id_tag = "syndi_depot_rear";
- name = "Sealed Doors";
- protected = 0
- },
-/obj/machinery/door/airlock/external{
- id_tag = "sst_away";
- req_access_txt = "150"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/outer)
-"OV" = (
-/obj/machinery/door/airlock/external{
- id_tag = "sst_away";
- req_access_txt = "150"
- },
-/obj/structure/fans/tiny,
-/turf/unsimulated/floor{
- name = "plating"
- },
-/area/syndicate_depot/core)
-"OX" = (
-/turf/simulated/wall/mineral/plastitanium/nodiagonal,
-/area/syndicate_depot/outer)
-"Pn" = (
-/obj/structure/table,
-/obj/effect/spawner/random_spawners/syndicate/loot/stetchkin,
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/outer)
-"Sv" = (
-/obj/effect/spawner/random_spawners/blood_maybe,
-/turf/simulated/floor/plating/asteroid/airless,
-/area/syndicate_depot/outer)
-"UB" = (
-/obj/item/candle,
-/obj/structure/table,
-/turf/simulated/floor/plating/asteroid/airless,
-/area/syndicate_depot/outer)
-"UM" = (
-/obj/machinery/door_control{
- active_power_usage = 0;
- id = "syndi_depot_rear";
- idle_power_usage = 0;
- name = "mysterious button";
- normaldoorcontrol = 0;
- pixel_x = 24;
- use_power = 0
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/outer)
-"Yh" = (
-/obj/machinery/light{
- dir = 1;
- on = 1
- },
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/outer)
-"YV" = (
-/obj/structure/chair{
- dir = 8
- },
-/turf/simulated/floor/plating/asteroid/airless,
-/area/syndicate_depot/outer)
-"ZQ" = (
-/obj/machinery/turretid/syndicate{
- name = "external turret controls";
- pixel_x = -32;
- pixel_y = 0;
- req_access = list(150)
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/outer)
-
-(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
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-mH
-mH
-mH
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-mH
-mH
-mH
-mH
-mH
-mH
-aa
-mH
-mH
-mH
-mH
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-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
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-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
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-mI
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-lu
-lE
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mI
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-lu
-mL
-lB
-lB
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mI
-mI
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-lt
-lw
-mp
-mP
-nb
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mI
-mI
-mI
-aa
-aa
-aa
-aa
-aa
-aa
-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
-lt
-lw
-mo
-az
-mQ
-mT
-mI
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mI
-mI
-aa
-aa
-aa
-aa
-aa
-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
-lt
-lw
-mq
-mP
-mQ
-mV
-mI
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-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
-lx
-mL
-lC
-lC
-lP
-mH
-mH
-mI
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mI
-mH
-aa
-aa
-aa
-aa
-aa
-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
-lx
-lO
-mH
-mH
-mH
-mI
-mI
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-aa
-aa
-aa
-aa
-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
-bj
-bj
-bj
-bj
-ai
-bj
-bj
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-mH
-aa
-aa
-aa
-lu
-mH
-mH
-na
-zQ
-mH
-mH
-mH
-mH
-mH
-mH
-mH
-aa
-aa
-aa
-aa
-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
-bj
-bj
-ae
-ae
-aa
-ae
-ae
-bj
-bj
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-mx
-mH
-mW
-az
-mx
-mH
-mH
-mH
-mH
-mI
-mH
-mH
-aa
-aa
-aa
-aa
-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
-bj
-au
-ae
-aE
-aa
-aE
-ae
-ae
-bj
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lu
-my
-mH
-nN
-nh
-np
-zQ
-mH
-mH
-mH
-mI
-mH
-mH
-aa
-aa
-aa
-aa
-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
-bj
-ae
-aE
-aQ
-aE
-aQ
-aE
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-mx
-mI
-nb
-nO
-az
-mY
-mx
-mH
-mH
-mH
-mI
-mI
-mI
-aa
-aa
-aa
-aa
-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
-bj
-ae
-aE
-aQ
-aE
-aQ
-aE
-aa
-ax
-cm
-cm
-cm
-ax
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-mx
-nj
-mX
-az
-mD
-nl
-mx
-mH
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ai
-ae
-ac
-aR
-ac
-aQ
-aE
-aa
-ax
-aB
-ej
-eJ
-ax
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-mL
-az
-az
-ng
-az
-az
-mL
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-aa
-aa
-aa
-bj
-aa
-ac
-aR
-ac
-aR
-aE
-aa
-ax
-dB
-aD
-eI
-ax
-ax
-ax
-ax
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-mL
-az
-az
-nc
-nj
-az
-mL
-mH
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aS
-aa
-aS
-ae
-aa
-ax
-dD
-aD
-aD
-dd
-fE
-fY
-ax
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-mx
-mU
-az
-az
-az
-nm
-mx
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bj
-bj
-aa
-bj
-ao
-bj
-aa
-aa
-aa
-aa
-aS
-aa
-aS
-ae
-ae
-ax
-dC
-aD
-aD
-ba
-fD
-fX
-dd
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-mx
-mU
-az
-nc
-az
-mU
-mx
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bj
-bj
-ae
-aa
-ae
-aa
-aa
-aa
-aa
-aw
-aG
-aG
-bo
-ay
-cm
-ax
-dd
-ag
-ek
-ag
-dd
-ax
-ga
-ax
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-mx
-mz
-nc
-az
-az
-mU
-mx
-mH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bj
-aa
-ae
-ac
-ac
-ac
-ac
-aa
-aa
-av
-aF
-ah
-am
-ah
-cl
-ax
-dc
-dE
-de
-eK
-fn
-gH
-ax
-ax
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-mx
-az
-az
-nc
-nc
-az
-mx
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ai
-aa
-ac
-an
-an
-an
-an
-ap
-as
-ay
-aF
-ah
-ah
-ah
-ar
-ax
-df
-dF
-em
-eM
-fo
-fF
-gc
-ax
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lx
-mG
-mG
-mG
-mG
-mG
-lO
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bj
-aa
-aa
-ac
-ac
-ac
-ac
-aa
-ae
-ax
-aH
-aj
-bp
-bP
-aq
-cK
-de
-df
-el
-eL
-fo
-de
-gb
-ax
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-mF
-ne
-ne
-ne
-nq
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bj
-aa
-ac
-an
-an
-an
-an
-ap
-as
-aA
-ah
-ak
-ah
-bQ
-co
-ax
-dh
-dH
-en
-eO
-fo
-de
-dd
-ax
-ax
-gI
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bj
-ae
-ae
-ac
-ac
-ac
-ac
-ae
-aa
-av
-ah
-aU
-aF
-bQ
-cn
-ax
-dg
-dG
-de
-eN
-fp
-fG
-bv
-by
-bA
-hl
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bj
-bj
-ae
-aa
-aa
-ae
-ae
-aa
-aa
-aC
-aG
-aG
-bo
-bR
-cm
-ax
-dd
-ag
-eo
-ag
-dd
-fH
-dd
-ax
-ax
-gI
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bj
-bj
-aa
-bj
-ai
-bj
-aa
-aa
-aa
-ae
-aS
-bq
-aS
-aa
-aa
-ax
-dI
-aO
-eP
-ax
-ax
-ax
-ae
-bs
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-aa
-ae
-ae
-aS
-bq
-aS
-aa
-aa
-ax
-dK
-aO
-eR
-ax
-aa
-aa
-bj
-bs
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-bj
-aa
-ac
-aT
-ac
-aT
-aE
-aa
-ax
-dJ
-aO
-eQ
-ax
-ae
-bs
-bs
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-aa
-ae
-bj
-aa
-ac
-aT
-ac
-aT
-aE
-aa
-ax
-dL
-aO
-aX
-ax
-bs
-bs
-ae
-aa
-aa
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-at
-ae
-aE
-aV
-aE
-aV
-aE
-aa
-ax
-cm
-cm
-cm
-ax
-aa
-ae
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bj
-ae
-aE
-aV
-aE
-aV
-aE
-aa
-aa
-aa
-aa
-ae
-ae
-aa
-aa
-aa
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bj
-ae
-ae
-aE
-aa
-aE
-ae
-ae
-bj
-aa
-aa
-aa
-ae
-ae
-aa
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bj
-bj
-aa
-aa
-aa
-ae
-ae
-bj
-bj
-aa
-aa
-aa
-aa
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bj
-bj
-bj
-bj
-bj
-bj
-bj
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-aa
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-ae
-zt
-zu
-zu
-zu
-zt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-zt
-zt
-zB
-zD
-zJ
-zx
-zt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-zs
-ae
-zt
-zy
-zA
-zA
-zK
-lL
-zt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-lL
-zu
-lL
-zA
-zE
-lL
-zN
-zt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-ae
-lL
-zv
-zA
-zA
-zG
-zA
-zA
-zt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fZ
-ae
-ae
-lL
-zv
-zz
-zA
-zF
-zA
-zA
-zt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-ae
-ae
-ae
-lL
-zx
-zA
-zA
-zA
-zA
-lL
-lL
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ed
-aa
-ae
-ae
-ae
-ae
-zw
-lL
-zC
-zH
-tj
-zt
-zw
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-ae
-ae
-aa
-ae
-lL
-lL
-zt
-zI
-zM
-zt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-aa
-aa
-ae
-lL
-ae
-ae
-lL
-zw
-aa
-aa
-aa
-ly
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-ae
-lL
-ae
-ae
-lL
-zw
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ed
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-al
-ae
-aa
-ae
-ae
-ae
-ae
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-ae
-aa
-ae
-ae
-aa
-aa
-al
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-ad
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ed
-aa
-aa
-ae
-ae
-ae
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-ae
-ae
-aa
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ed
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-al
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-gU
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-kZ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-al
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-fZ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ed
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-aa
-aa
-aa
-gU
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-iC
-jO
-jO
-jO
-jO
-jO
-jO
-qQ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-kZ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-yj
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-al
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-iD
-pS
-qr
-qT
-qT
-sl
-sD
-rs
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-iL
-pV
-qt
-qs
-qs
-qs
-sD
-rs
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ly
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-iW
-pU
-qs
-qU
-qU
-qs
-sE
-rs
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fZ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-jF
-jO
-qv
-jO
-jO
-qv
-jO
-sU
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bt
-bN
-qu
-bN
-bN
-sm
-bN
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-kZ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bN
-pX
-qx
-qX
-rO
-gf
-sG
-bN
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-bN
-bN
-bN
-pW
-gf
-qW
-rN
-sn
-sF
-bN
-bN
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-al
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-bN
-eb
-bN
-bN
-gB
-lj
-pl
-gf
-hX
-gY
-jf
-gf
-gf
-ta
-ts
-fr
-bN
-bN
-fr
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ed
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-bN
-bN
-aW
-ju
-jP
-ki
-ei
-kT
-gf
-pk
-gf
-gf
-qY
-rP
-so
-gf
-jY
-tr
-bN
-tR
-ui
-uv
-fr
-bN
-fr
-sb
-aa
-gU
-aa
-aa
-aa
-wz
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-yR
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-bN
-ie
-iB
-gw
-fz
-hd
-fJ
-kD
-kV
-gf
-gf
-pZ
-gf
-rb
-rS
-gf
-gf
-gf
-pk
-tG
-tS
-uk
-tS
-uE
-uY
-uw
-qG
-uJ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-bN
-bN
-bN
-ft
-fM
-fM
-fM
-fM
-kj
-bN
-kV
-gf
-hH
-gf
-gf
-iO
-rR
-qx
-pZ
-hH
-tt
-tF
-tS
-uj
-tT
-kG
-tS
-tS
-qK
-qS
-uJ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-aW
-gV
-hh
-db
-if
-hG
-iX
-iX
-iX
-iX
-kF
-kX
-hD
-ll
-ll
-qz
-rd
-rU
-ll
-ll
-ll
-ll
-tI
-tU
-tU
-tU
-uG
-tS
-kG
-vC
-vB
-uJ
-uJ
-qc
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-ed
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-aW
-gJ
-fM
-fM
-hE
-fM
-id
-fM
-fM
-gT
-kk
-bN
-kW
-lk
-po
-qa
-hZ
-rc
-rT
-sp
-qa
-po
-tu
-fw
-tT
-kz
-uw
-kI
-ql
-vl
-vB
-uJ
-uJ
-uJ
-qF
-uJ
-aa
-aa
-aa
-kZ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ed
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-aa
-aa
-aa
-bt
-bN
-cs
-eE
-eE
-eE
-fx
-eE
-iA
-iZ
-fM
-jS
-kl
-bN
-bN
-bN
-bN
-bN
-qA
-rf
-rV
-sq
-bN
-bN
-bN
-bN
-tV
-ul
-tS
-qh
-qq
-uJ
-vD
-vB
-vW
-uJ
-uJ
-uJ
-uJ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-bN
-bN
-bN
-gC
-fM
-fM
-dN
-cp
-ft
-iE
-iY
-jv
-aW
-bN
-bt
-aa
-aa
-aa
-bt
-bN
-re
-bN
-bN
-bt
-aa
-aa
-bt
-bN
-fr
-ux
-qi
-qB
-uJ
-uJ
-uJ
-uJ
-uJ
-uJ
-uJ
-uJ
-uJ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-bN
-fK
-gg
-gw
-fM
-fM
-fM
-hj
-bN
-ih
-iG
-bN
-iF
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-fb
-ik
-fb
-aa
-aa
-aa
-aa
-aa
-aa
-bt
-iF
-uJ
-uJ
-uJ
-uJ
-uJ
-uJ
-uJ
-vD
-uJ
-vB
-uJ
-vl
-uJ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-bN
-fq
-fJ
-fM
-fM
-fM
-fM
-gW
-hi
-bN
-bN
-iF
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fb
-rg
-fb
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-rL
-uJ
-vc
-uJ
-uJ
-uJ
-uJ
-vB
-uJ
-ws
-uJ
-uJ
-uJ
-ra
-sb
-aa
-aa
-ly
-jt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-bN
-cj
-ft
-fM
-fM
-fM
-fM
-fM
-gX
-hk
-bN
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fb
-rh
-fb
-aa
-aa
-aa
-aa
-aa
-aa
-ed
-aa
-aa
-uJ
-uJ
-uJ
-uJ
-uJ
-uJ
-vB
-qq
-kz
-wI
-uJ
-kz
-gq
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-bN
-bN
-bN
-fs
-fL
-gh
-fM
-fM
-gF
-aW
-gm
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fb
-iS
-fb
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fZ
-aa
-aa
-uJ
-uJ
-uJ
-uJ
-uJ
-vB
-vB
-tS
-uJ
-qS
-wZ
-gv
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bN
-dO
-er
-bN
-ft
-fN
-gj
-fM
-gF
-aW
-ez
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fb
-rg
-fb
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-kZ
-aa
-aa
-uJ
-uJ
-vW
-uJ
-kz
-kz
-qq
-wJ
-kz
-kz
-ws
-bt
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-gk
-dN
-eq
-cp
-eq
-fM
-gi
-gx
-aW
-ez
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fb
-rj
-fb
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-uJ
-uJ
-wj
-tT
-qV
-qh
-tS
-kz
-ri
-rq
-bt
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-gk
-dj
-dQ
-es
-eV
-es
-fP
-gl
-bN
-ez
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-cM
-rX
-cM
-cH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-kp
-aa
-aa
-aa
-gU
-aa
-sr
-bt
-wC
-tS
-tS
-kz
-qK
-xy
-tT
-bt
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bN
-cL
-di
-dP
-eq
-cp
-fu
-fO
-bN
-bt
-aa
-aa
-aa
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-cM
-cM
-cM
-kc
-rk
-tb
-cM
-cM
-cM
-cH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bt
-gp
-wK
-qZ
-tS
-tS
-xy
-tT
-jo
-bN
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-bt
-bN
-cN
-dk
-dR
-et
-bN
-fv
-fQ
-gm
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-cM
-cM
-jD
-pr
-cS
-lm
-sc
-te
-eU
-sI
-td
-cM
-dV
-qg
-jt
-aa
-ae
-aa
-aa
-aa
-ly
-aa
-aa
-aa
-ae
-bN
-wL
-tT
-tT
-tS
-xy
-tS
-jA
-gz
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lG
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lG
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lG
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lG
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-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
-ab
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aI
-aJ
-aJ
-aJ
-aJ
-aJ
-aJ
-aJ
-aJ
-aJ
-aI
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-hJ
-hs
-kH
-kY
-hM
-hM
-qd
-kc
-sV
-th
-uF
-sH
-tc
-ha
-tJ
-pY
-lD
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fZ
-aa
-ae
-bt
-bN
-bN
-vV
-vY
-xz
-xH
-bN
-gK
-bN
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-aY
-bU
-ck
-cP
-cQ
-aJ
-eu
-eX
-aJ
-aI
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-cM
-jU
-km
-ks
-ks
-ks
-ks
-qf
-mE
-iJ
-tx
-uH
-sK
-tf
-tw
-ha
-tX
-lD
-lD
-aa
-aa
-aa
-ed
-aa
-aa
-aa
-ae
-ae
-ae
-bt
-bN
-xc
-xp
-rf
-gf
-xY
-xt
-yq
-bN
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-aY
-bT
-cr
-cO
-dl
-dS
-bV
-eW
-aJ
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-hs
-jw
-jT
-ik
-hM
-hM
-ln
-ps
-cM
-nn
-hM
-tA
-cM
-sJ
-pG
-tv
-gE
-lD
-qg
-lD
-sw
-qH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-ae
-iF
-xb
-xo
-xA
-ll
-xX
-xI
-yp
-vP
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-cI
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aI
-bb
-bW
-cu
-cR
-bV
-aJ
-ev
-eY
-aJ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-cH
-hs
-jb
-jy
-jV
-ik
-hM
-hM
-lq
-pv
-cM
-qp
-rH
-sA
-cM
-sL
-ha
-sK
-lD
-lD
-lD
-lD
-lD
-lD
-qg
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-bt
-vP
-xr
-gf
-xI
-ya
-gd
-xI
-xt
-iF
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-wr
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lH
-lH
-lH
-lH
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-aY
-br
-bV
-ct
-cQ
-bV
-aJ
-aJ
-aJ
-aI
-aa
-aa
-aa
-aa
-ae
-aa
-ae
-cH
-cM
-iH
-ja
-jx
-ij
-iJ
-hM
-iK
-lo
-cM
-cM
-cM
-st
-cM
-cM
-cM
-tg
-pP
-qg
-lD
-lD
-lD
-qg
-ha
-rM
-sj
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-iF
-xq
-qx
-xI
-xZ
-gd
-xI
-xt
-iF
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lH
-lH
-lI
-lI
-lI
-lI
-lH
-lH
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-jt
-cI
-ae
-aa
-aa
-aY
-bw
-bV
-cw
-bV
-bV
-dX
-aY
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-hJ
-hL
-iI
-hM
-ij
-iJ
-iR
-kK
-hs
-hJ
-cH
-aa
-qE
-ro
-rZ
-aa
-go
-pL
-lD
-lD
-lD
-lD
-lD
-ha
-sK
-vo
-fb
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bt
-vP
-xC
-gf
-yb
-xI
-gf
-xq
-bN
-bt
-aa
-aa
-aa
-aa
-kA
-aa
-aa
-aa
-kA
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-al
-aa
-cI
-ad
-cI
-aa
-af
-ad
-cI
-aa
-aa
-aY
-bu
-bX
-cv
-bX
-cQ
-dW
-aY
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-hs
-ii
-hM
-ij
-iJ
-iR
-kn
-kJ
-hJ
-aa
-aa
-aa
-qD
-ro
-rY
-ed
-aa
-ae
-ty
-lD
-pY
-lD
-lD
-qw
-ve
-vn
-cH
-cH
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-iF
-xB
-xC
-rf
-gf
-gf
-xt
-yC
-bN
-aa
-aa
-aa
-kh
-vm
-sC
-aa
-kh
-vm
-sC
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lK
-lK
-lI
-lI
-lI
-lI
-lI
-lK
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ad
-aa
-aa
-aa
-aa
-ad
-cI
-aa
-aa
-aa
-aa
-aa
-aI
-aJ
-aJ
-aJ
-cy
-aJ
-aJ
-aJ
-aI
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cM
-hL
-hM
-ij
-iJ
-hM
-iK
-ko
-cM
-cH
-aa
-aa
-aa
-qE
-ro
-rZ
-aa
-aa
-aa
-aa
-lD
-lD
-qg
-lD
-qy
-ha
-vp
-vb
-cM
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bt
-bN
-xK
-yd
-gf
-gf
-xt
-yE
-iF
-aa
-aa
-aa
-kh
-vm
-sC
-aa
-kh
-vm
-sC
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lG
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lK
-mb
-mj
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-gU
-aa
-aa
-aa
-aa
-aa
-aa
-ed
-aa
-aa
-aJ
-aZ
-bx
-bZ
-cx
-bZ
-dm
-aY
-aa
-aa
-jt
-aa
-aa
-aa
-aa
-aa
-cH
-cM
-hK
-ij
-iJ
-hM
-jz
-hs
-hJ
-cH
-ae
-aa
-aa
-aa
-qE
-ro
-rZ
-gU
-ae
-aa
-aa
-aa
-lD
-qe
-qg
-ha
-tc
-sK
-vE
-cM
-cH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-iF
-xJ
-yc
-gf
-qx
-xt
-yD
-iF
-aa
-aa
-aa
-kh
-vm
-sC
-aa
-kh
-vm
-zn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lK
-lK
-mi
-lK
-mf
-lK
-lK
-mi
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lI
-lI
-lI
-lH
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ae
-ae
-aa
-aa
-ae
-aa
-aK
-bd
-bC
-cb
-cx
-bC
-do
-aY
-aa
-fa
-aa
-aa
-aa
-aa
-aa
-aa
-cM
-hn
-hM
-ik
-hM
-jd
-jB
-hJ
-aa
-aa
-aa
-aa
-aa
-cH
-cM
-rp
-pm
-lD
-aa
-aa
-ae
-aa
-ed
-fb
-uy
-tc
-sK
-vq
-tc
-vN
-cM
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-iF
-xM
-yc
-gf
-gf
-yp
-yG
-iF
-aa
-aa
-aa
-kh
-vm
-sC
-aa
-kh
-vm
-sC
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-mm
-mm
-mm
-mm
-mm
-mm
-mm
-nQ
-mm
-mm
-lA
-mm
-mi
-lK
-mf
-lK
-lI
-lI
-lI
-lI
-lI
-lH
-lH
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-fZ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aK
-bc
-bB
-bC
-cz
-bC
-dn
-aY
-aa
-aa
-aa
-gU
-aa
-aa
-aa
-aa
-cM
-hm
-hM
-ik
-iK
-eT
-cM
-cH
-aa
-aa
-ae
-aa
-cH
-cM
-lh
-pJ
-lD
-lD
-lD
-aa
-tz
-aa
-aa
-cH
-cM
-uM
-sH
-sH
-sH
-vM
-cM
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-iF
-xL
-ye
-gf
-gf
-yw
-yF
-bN
-aa
-aa
-aa
-kh
-vm
-sC
-aa
-kh
-vm
-sC
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-me
-me
-me
-lI
-mm
-mA
-mZ
-mm
-mA
-nF
-nK
-nP
-nT
-mm
-zO
-mm
-mm
-mm
-lK
-lK
-lK
-lI
-lI
-lI
-lH
-lH
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lG
-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
-aK
-bf
-bD
-cd
-cz
-bC
-dp
-aJ
-aJ
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-cM
-cS
-hO
-im
-dM
-dT
-cM
-aa
-aa
-aa
-ae
-cH
-cM
-lh
-pJ
-kC
-lD
-sw
-lD
-lD
-aa
-ly
-aa
-aa
-cM
-cM
-cM
-vj
-vt
-eU
-cM
-cH
-aa
-aa
-aa
-aa
-aa
-aa
-bt
-bN
-xp
-rf
-vF
-vF
-gf
-wd
-gL
-bN
-bt
-aa
-aa
-rm
-aa
-aa
-aa
-rm
-aa
-aa
-kA
-kA
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lW
-lX
-lX
-mr
-lX
-mJ
-mA
-zO
-mm
-mA
-mA
-mA
-mA
-nM
-mm
-mC
-oD
-mM
-mm
-ox
-lK
-lK
-lK
-lK
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-af
-ad
-aa
-ad
-aa
-aa
-aa
-aa
-ae
-aa
-jt
-aa
-aL
-be
-bC
-cc
-cz
-bC
-bC
-dY
-aJ
-ee
-eH
-eS
-fm
-ee
-ee
-cJ
-gZ
-eh
-hq
-il
-hN
-je
-cM
-aa
-aa
-aa
-aa
-cM
-lh
-pJ
-gE
-lD
-lD
-qg
-ha
-ti
-aa
-aa
-aa
-aa
-cM
-uK
-uO
-uO
-uO
-uW
-vX
-cM
-fb
-fb
-fb
-fb
-fb
-fb
-bN
-xt
-xN
-vx
-vG
-vU
-wc
-we
-yS
-yX
-za
-oS
-oS
-wl
-oS
-oS
-oS
-wl
-oS
-oS
-wl
-wp
-sC
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lU
-lX
-lX
-mr
-lX
-mA
-mA
-mA
-nt
-mA
-mA
-mA
-mA
-mA
-mB
-mA
-mA
-mA
-mm
-mm
-mm
-mm
-lK
-lK
-lK
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ad
-aa
-aa
-aa
-ad
-aa
-ad
-aa
-aa
-aa
-aa
-aJ
-bh
-bF
-cc
-cA
-cT
-cT
-ea
-ex
-fc
-fy
-fc
-fc
-fy
-fc
-gN
-hc
-eZ
-hr
-io
-iM
-jh
-hJ
-aa
-aa
-aa
-ae
-fb
-pJ
-qg
-lD
-lD
-gE
-sx
-pJ
-fb
-aa
-aa
-aa
-aa
-fb
-uL
-uO
-uS
-uU
-uZ
-ks
-vO
-wk
-wu
-ks
-wk
-wU
-ks
-xs
-xD
-ll
-vz
-vJ
-wa
-xo
-wf
-bN
-bN
-bN
-zf
-aa
-rJ
-aa
-aa
-aa
-rJ
-aa
-aa
-aa
-tE
-zr
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lY
-lX
-lX
-me
-lI
-mm
-lV
-mA
-nu
-mA
-mA
-mA
-mA
-mA
-mm
-mA
-nw
-mA
-mB
-mA
-nw
-mm
-mm
-lK
-lK
-lK
-lK
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ad
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aM
-bg
-bE
-cc
-bC
-bC
-bC
-dZ
-aJ
-ee
-ee
-ee
-ee
-ee
-ee
-cJ
-bS
-hb
-ht
-in
-hP
-jg
-cM
-aa
-aa
-jt
-aa
-fR
-pH
-lD
-ha
-lD
-sa
-pJ
-lh
-cM
-aa
-aa
-aa
-aa
-cM
-uN
-uP
-uT
-uO
-va
-hM
-cM
-fb
-fb
-fb
-fb
-fb
-fb
-bN
-xq
-xO
-yw
-vK
-wb
-xo
-wg
-yU
-yZ
-zc
-oS
-oS
-wm
-oS
-oS
-oS
-wm
-oS
-oS
-wm
-wq
-sC
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lG
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lX
-lX
-lX
-me
-lI
-mm
-mA
-mA
-mA
-mA
-mA
-ni
-mA
-nM
-mm
-os
-mA
-ni
-mm
-mA
-mA
-nx
-mm
-ox
-mb
-pd
-lK
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ae
-aa
-aa
-aa
-ae
-aa
-aa
-aP
-bk
-bH
-ce
-bC
-bC
-dr
-aJ
-aJ
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-cM
-cM
-hR
-iq
-cM
-cM
-cM
-aa
-aa
-aa
-kZ
-lD
-lD
-lD
-pJ
-lb
-pJ
-lh
-cM
-cH
-aa
-aa
-aa
-aa
-cM
-cM
-cM
-vr
-vA
-cM
-cM
-cH
-aa
-aa
-aa
-aa
-aa
-aa
-bt
-bN
-xr
-gf
-vT
-vT
-gf
-wi
-gL
-bN
-bt
-aa
-aa
-rm
-aa
-aa
-aa
-rm
-aa
-aa
-ky
-ky
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lI
-lH
-lH
-lH
-lJ
-lX
-lX
-lX
-me
-lI
-mm
-mZ
-zO
-mm
-mm
-mm
-mm
-mB
-mm
-mm
-mm
-mB
-oO
-mm
-mm
-lV
-pz
-mm
-lK
-lK
-lK
-lK
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-cI
-aa
-aa
-aa
-aN
-bi
-bG
-bC
-bC
-bC
-dq
-aY
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cM
-ho
-hQ
-ip
-iN
-ji
-dV
-cH
-aa
-gU
-aa
-ly
-pK
-gn
-hp
-rr
-lh
-cM
-cH
-aa
-aa
-aa
-aa
-cH
-cM
-tl
-sO
-vs
-sO
-vQ
-cM
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-iF
-xP
-xr
-gf
-gf
-yw
-yL
-bN
-aa
-aa
-aa
-kh
-wo
-sC
-aa
-kh
-wo
-sC
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lI
-lI
-lH
-lH
-lJ
-lX
-lX
-lX
-me
-lI
-mm
-mm
-mB
-mm
-mm
-mM
-mA
-mA
-nU
-of
-ot
-mA
-mA
-pb
-pi
-mA
-py
-mm
-lK
-lK
-lK
-lK
-lK
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ed
-aa
-cI
-aa
-aa
-aa
-aa
-aa
-aK
-bm
-bJ
-bC
-bC
-cV
-dt
-aY
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cM
-hv
-hT
-is
-hM
-hM
-jH
-hJ
-kp
-aa
-aa
-ed
-aa
-go
-cM
-ru
-cM
-cH
-aa
-ae
-ae
-ae
-aa
-hJ
-tl
-uQ
-sO
-vs
-sO
-vR
-cM
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-iF
-xR
-xq
-gf
-gf
-yx
-yO
-iF
-aa
-aa
-aa
-kh
-wo
-sC
-aa
-kh
-wo
-sC
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lH
-lI
-ma
-lX
-mk
-me
-lI
-mm
-nd
-mA
-mA
-mm
-mR
-mA
-mA
-mB
-mA
-mA
-mA
-mA
-nX
-mm
-mA
-mA
-mm
-lK
-lK
-lK
-mf
-lK
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-gU
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aJ
-bl
-bI
-cf
-bC
-cU
-ds
-aY
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-cY
-hS
-ir
-iP
-hM
-jG
-jj
-hJ
-cH
-aa
-ae
-gU
-aa
-qE
-rt
-rZ
-ae
-ae
-ae
-ae
-cH
-hJ
-cH
-sO
-sO
-tZ
-vs
-sM
-cM
-cH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-iF
-xQ
-xt
-gf
-gf
-xt
-yN
-iF
-aa
-aa
-aa
-kh
-wo
-sC
-aa
-kg
-zm
-zo
-aa
-ab
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lZ
-lY
-lX
-me
-lI
-mK
-nd
-nd
-mA
-mm
-nx
-mA
-nw
-mm
-lV
-mA
-mA
-mA
-pc
-mm
-mm
-mB
-mm
-mm
-lK
-lK
-lK
-lK
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-af
-aa
-aa
-ae
-aa
-aa
-aI
-aJ
-aJ
-aJ
-cB
-aJ
-aJ
-aJ
-aI
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-cM
-hV
-hM
-ir
-iP
-hM
-ka
-kr
-ep
-cH
-ae
-aa
-jt
-qD
-rt
-rY
-aa
-aa
-aa
-cH
-cM
-tY
-sO
-sO
-sO
-vg
-vv
-vI
-cM
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bt
-bN
-xK
-xp
-gf
-gf
-xt
-yQ
-iF
-aa
-aa
-ae
-kh
-wo
-sC
-aa
-zl
-zl
-zl
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lU
-lU
-ml
-me
-lI
-mm
-nf
-nd
-nd
-mm
-mm
-mB
-mm
-mm
-mt
-mA
-nW
-oQ
-mA
-mB
-mA
-mA
-pE
-mm
-lA
-mm
-ox
-lK
-lI
-lI
-lH
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-cI
-aa
-aa
-aa
-cI
-ad
-aa
-aa
-aa
-aY
-bK
-bZ
-cg
-bZ
-du
-ec
-aJ
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-cH
-hU
-it
-hM
-ir
-iP
-iR
-kq
-kL
-hJ
-aa
-aa
-aa
-qE
-rt
-rZ
-aa
-aa
-aa
-hJ
-tL
-tl
-sO
-sO
-uR
-vf
-vu
-vi
-cH
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-iF
-rQ
-xp
-gf
-gf
-gf
-xt
-yP
-bN
-aa
-aa
-aa
-kh
-wo
-sC
-aa
-zk
-zl
-zl
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-me
-me
-me
-lI
-mm
-mc
-nf
-mm
-mm
-mS
-mA
-nM
-mm
-og
-mA
-mA
-oh
-ou
-oy
-oH
-ou
-ou
-oy
-zS
-oy
-pe
-lK
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lG
-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
-cI
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cI
-aa
-aa
-aa
-aY
-bM
-cg
-cD
-cD
-cD
-ef
-aJ
-aI
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-hw
-hW
-iu
-iR
-hM
-jI
-iP
-hM
-kN
-hU
-hJ
-cH
-aa
-qE
-rt
-rZ
-aa
-cH
-hJ
-cH
-tl
-sO
-tk
-un
-up
-uA
-vw
-hJ
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-bt
-vP
-xp
-gf
-gf
-gf
-gf
-yz
-bN
-bt
-aa
-aa
-aa
-aa
-ky
-aa
-aa
-aa
-zl
-ae
-aa
-gU
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-mm
-mA
-nf
-mm
-nz
-mA
-mA
-mA
-nV
-ny
-ov
-nL
-oi
-ow
-mm
-mm
-mB
-mm
-mm
-mC
-mm
-mm
-lK
-lK
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ae
-aa
-aa
-aa
-aa
-aa
-aY
-bL
-cg
-cC
-cW
-dv
-cg
-eA
-aJ
-aI
-aa
-aa
-aa
-aa
-ae
-ae
-ae
-cH
-hU
-iQ
-jk
-iJ
-ik
-hM
-hM
-la
-lM
-cM
-cM
-cM
-rv
-cM
-cM
-cM
-tk
-sO
-sO
-tZ
-un
-up
-uA
-vh
-cM
-cH
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-iF
-xt
-gf
-gf
-gf
-gf
-ge
-yy
-iF
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-mb
-lK
-lI
-lI
-lI
-mm
-zP
-mA
-mB
-mA
-mA
-mA
-mA
-mm
-nr
-nB
-oE
-oR
-oE
-oz
-pb
-mA
-mA
-mm
-mA
-pI
-mm
-ox
-lK
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-aI
-aJ
-ci
-cF
-cX
-dw
-cg
-cg
-fe
-aY
-aa
-aa
-aa
-ae
-ae
-ae
-ae
-ae
-cH
-cM
-cM
-iV
-kb
-ks
-ks
-iP
-hM
-pM
-cM
-qN
-rW
-sW
-cM
-sN
-tl
-sO
-sO
-ub
-up
-uA
-uA
-cH
-cH
-ae
-ae
-aa
-ae
-ae
-aa
-aa
-aa
-bt
-vP
-xp
-gf
-gf
-gf
-gf
-qx
-yB
-iF
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lp
-lK
-lI
-lI
-lI
-mm
-mm
-mB
-mm
-mm
-mm
-mB
-mm
-mm
-mm
-nD
-oc
-oU
-pf
-nD
-nX
-mA
-mA
-mB
-mA
-mA
-mm
-lK
-lK
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lF
-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
-al
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aY
-ch
-cE
-cE
-cE
-cg
-cg
-fd
-aY
-ae
-ae
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-cH
-dU
-jJ
-hM
-hM
-hM
-ik
-hM
-jG
-cM
-pj
-ik
-tK
-cM
-sM
-sO
-tk
-tM
-ua
-uo
-uz
-cH
-cH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-iF
-xe
-xo
-gf
-gf
-gf
-gf
-yt
-vP
-bt
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lI
-lI
-lH
-lI
-lI
-lK
-mf
-mm
-mm
-mm
-mm
-mm
-mA
-nv
-nx
-mm
-mA
-mA
-nW
-mA
-nC
-oG
-oT
-mA
-oA
-nX
-mA
-mA
-mm
-mm
-mB
-mm
-lK
-lK
-lK
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lF
-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
-fZ
-aa
-aa
-aa
-aa
-aa
-af
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aY
-bY
-cG
-cZ
-dx
-cf
-eB
-ff
-aJ
-aI
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-hU
-fA
-kt
-kP
-ld
-ks
-ks
-qk
-pT
-rw
-tP
-sz
-sP
-tm
-tm
-tO
-ud
-uq
-cM
-cH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-ae
-bt
-bN
-xg
-xv
-qx
-gf
-yh
-yo
-yu
-bN
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lG
-lH
-lI
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lK
-lK
-mm
-ms
-mA
-mM
-mm
-mA
-mA
-nx
-nI
-mA
-mA
-nY
-oj
-nG
-oJ
-oW
-oj
-nG
-oI
-pA
-mA
-mB
-mA
-nw
-mm
-lK
-lK
-lK
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lF
-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
-bn
-bz
-bz
-bz
-bz
-bz
-bz
-bz
-bz
-bz
-bn
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-hJ
-hU
-kO
-lc
-hM
-hM
-qj
-qC
-ik
-tW
-sy
-sO
-sO
-tl
-tN
-uV
-hJ
-cH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-bn
-bz
-bz
-bz
-bz
-xF
-xS
-bz
-bz
-bz
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lK
-mg
-mm
-ms
-mA
-mM
-mm
-mA
-mA
-mA
-mm
-mA
-mA
-nX
-nX
-nE
-od
-oV
-mA
-nC
-mA
-nW
-mA
-mm
-mS
-mA
-mm
-lK
-mf
-lK
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ae
-gU
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-bz
-da
-dz
-eg
-bz
-fh
-fB
-fT
-gr
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-cM
-cM
-lN
-pN
-cM
-qI
-sY
-uc
-cM
-hu
-tn
-cM
-cM
-cH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-bz
-wN
-wW
-xh
-gt
-jC
-jm
-rG
-bz
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lI
-lH
-lH
-lI
-lI
-lI
-lI
-lK
-lK
-mm
-ms
-mA
-mN
-mm
-mw
-mA
-mA
-mm
-DH
-mA
-nZ
-ol
-nD
-oK
-oV
-mA
-nD
-pt
-mA
-mA
-mm
-nx
-mA
-mm
-mm
-lK
-lK
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-bz
-da
-dy
-dy
-eC
-fg
-fl
-fS
-bz
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-cM
-cM
-cM
-qJ
-ik
-um
-cM
-cM
-cM
-cH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-bz
-wM
-wV
-wQ
-gt
-fl
-jm
-rG
-bz
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lK
-lK
-mm
-mt
-mA
-mA
-mm
-mA
-nw
-mA
-mB
-mA
-mA
-nZ
-ok
-nH
-oE
-oX
-pg
-oC
-mm
-mB
-mm
-mm
-nx
-mA
-os
-mm
-lK
-lK
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-bn
-bz
-dA
-dA
-bz
-fj
-fl
-fU
-bz
-bn
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-cH
-cM
-rx
-cM
-cH
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-bn
-wE
-wP
-wV
-wQ
-fl
-fl
-rD
-bz
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lK
-lK
-mm
-mv
-mA
-mA
-mm
-mA
-mA
-mA
-mm
-mA
-mA
-mA
-mA
-mB
-mA
-oU
-mA
-nX
-mm
-mA
-nM
-mm
-mm
-mB
-mm
-mm
-ox
-lK
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ed
-aa
-aa
-aa
-aa
-aa
-bn
-bz
-bz
-bz
-fi
-fl
-fl
-gs
-fl
-bn
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fb
-ik
-fb
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-bn
-wv
-su
-wO
-wX
-xi
-fl
-xG
-bz
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lI
-lH
-lH
-lH
-lI
-lI
-lK
-lK
-mm
-mu
-mA
-mA
-mB
-mA
-nx
-nx
-mm
-mA
-nR
-oa
-om
-mm
-mA
-oY
-mA
-nX
-mm
-lV
-mA
-nx
-nx
-mA
-mA
-mm
-lK
-lK
-lI
-lI
-lI
-lH
-lI
-lH
-lH
-lH
-lF
-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
-bz
-bn
-bO
-fl
-fl
-fl
-gs
-fl
-fl
-bn
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fb
-ry
-fb
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-fI
-wn
-wv
-sB
-qb
-fl
-fl
-fl
-xG
-cq
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lI
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lK
-lK
-mm
-mm
-mB
-mm
-mm
-mB
-mm
-mm
-mm
-mB
-mm
-mm
-oo
-mm
-lV
-mA
-mA
-mA
-mB
-mA
-mA
-mA
-mA
-mA
-mA
-mm
-lK
-lK
-lI
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lF
-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
-bn
-bn
-ca
-fk
-fk
-fV
-bz
-fl
-gt
-gP
-bz
-gr
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fb
-ik
-fb
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-gr
-bz
-bz
-sk
-ss
-sQ
-wQ
-fl
-fl
-qR
-bn
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lK
-mg
-mm
-mR
-mA
-mB
-mA
-mA
-mA
-mC
-mA
-mA
-zP
-mm
-zR
-oo
-oL
-ns
-mA
-pn
-mm
-nf
-mA
-mA
-nw
-mA
-nM
-mm
-lK
-lK
-lI
-lI
-lH
-lI
-lH
-lH
-lH
-lH
-lF
-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
-bn
-bz
-bz
-bz
-bz
-bz
-fl
-fl
-gR
-bz
-hy
-bn
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fb
-ik
-fb
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-bn
-vS
-vZ
-bz
-jl
-lv
-pB
-fl
-fl
-wH
-bn
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lI
-lH
-lI
-lI
-lI
-lK
-lK
-lK
-mm
-mM
-mA
-mO
-mh
-mA
-mA
-mm
-mA
-mA
-mt
-mm
-oq
-mm
-mm
-mm
-mm
-mm
-mm
-mB
-mK
-mm
-mm
-mm
-mm
-mm
-ox
-lK
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-bn
-bz
-cq
-fW
-gt
-fl
-fl
-gQ
-bz
-hx
-hA
-bn
-gr
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-fb
-ry
-fb
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-gr
-bn
-ug
-ug
-ug
-wh
-jm
-jm
-fl
-fl
-fl
-cq
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lK
-mf
-mm
-mm
-mC
-mm
-nk
-ns
-mA
-nA
-lV
-mA
-nS
-mm
-op
-oB
-oM
-oZ
-ob
-mA
-pu
-mA
-mA
-mM
-mm
-lK
-lK
-lK
-mf
-lK
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lF
-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
-bn
-bz
-fW
-fl
-fl
-fl
-gQ
-he
-hA
-eF
-hA
-iT
-bz
-gr
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-fb
-rh
-fb
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-gr
-vd
-ug
-ug
-ug
-ug
-ug
-wh
-ic
-fl
-fl
-fl
-bn
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lG
-lH
-lI
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lK
-lK
-mn
-lA
-zO
-mm
-no
-mA
-zP
-mm
-zP
-mA
-mA
-ob
-or
-nJ
-oe
-pa
-mm
-nM
-mA
-mA
-mA
-mM
-mm
-lK
-lK
-lK
-ph
-lK
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lG
-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
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-bz
-gu
-fl
-gt
-gS
-bz
-hz
-hY
-iv
-hA
-jn
-jL
-bz
-bz
-bn
-aa
-aa
-aa
-bn
-bz
-rz
-bz
-bn
-aa
-aa
-aa
-bn
-bz
-bz
-uB
-jc
-jR
-jZ
-jR
-kM
-vH
-bz
-jC
-gt
-wH
-bn
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lK
-lK
-lK
-mm
-mm
-mm
-mm
-mm
-mm
-mm
-mm
-OV
-mm
-mm
-mm
-mm
-mm
-mm
-mm
-mm
-mm
-mm
-mm
-mm
-mm
-ox
-lK
-mb
-lK
-lI
-lI
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lF
-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
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-bn
-gA
-gG
-bz
-bz
-hC
-hA
-ix
-gD
-jp
-jM
-hA
-ku
-bz
-bz
-ew
-bz
-bz
-qo
-rB
-sd
-bz
-bz
-bz
-bz
-bz
-uf
-us
-ug
-jQ
-fl
-fl
-fl
-fl
-kB
-bz
-kE
-lR
-bz
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lK
-lK
-lK
-mf
-lK
-mn
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-mf
-mn
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lI
-lI
-lI
-lI
-lH
-lI
-lH
-lH
-lH
-lH
-lF
-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
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-bz
-bz
-bz
-ey
-hB
-ia
-iw
-ia
-ia
-ia
-hB
-ia
-kQ
-le
-lQ
-pO
-qm
-qm
-rA
-qo
-qo
-sR
-to
-tB
-bz
-ue
-ur
-ug
-jQ
-fl
-fl
-kB
-fl
-lr
-bz
-cq
-bz
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lI
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lK
-lI
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-bz
-hf
-hg
-hA
-hA
-hY
-jr
-iU
-iU
-iU
-kR
-lg
-hF
-gy
-qo
-qo
-rC
-qo
-qo
-lS
-tp
-lg
-tQ
-ug
-ug
-ut
-jQ
-fl
-fl
-fl
-fl
-ls
-bz
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-OX
-OX
-KK
-OX
-OX
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lH
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-bn
-bz
-bz
-ib
-iy
-gM
-jq
-jq
-kd
-kv
-eD
-lf
-lf
-lg
-qn
-lf
-rC
-jE
-lf
-lf
-lf
-lg
-bz
-ug
-ut
-ug
-jc
-jW
-jW
-jW
-kU
-vL
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-OX
-Hg
-lX
-lX
-OX
-lI
-lI
-lI
-lI
-OX
-OX
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lK
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-bn
-bn
-iz
-ig
-js
-gO
-kf
-gO
-kS
-lg
-lf
-hI
-hA
-qL
-sZ
-se
-hA
-lf
-lf
-lf
-tQ
-ug
-ug
-ug
-uX
-vk
-vy
-vd
-bz
-fC
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-OX
-Yh
-lX
-lX
-OX
-OX
-yg
-lK
-UB
-lK
-lK
-lI
-lI
-lI
-OX
-OX
-lK
-lK
-lK
-lK
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-bn
-gr
-gr
-bz
-jN
-ke
-kw
-bz
-jX
-lT
-pQ
-hA
-hA
-rE
-hY
-hA
-sS
-tq
-tC
-bz
-uh
-uu
-uC
-bz
-gr
-gr
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lI
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-OX
-Pn
-lX
-lX
-Mc
-ZQ
-BB
-lK
-YV
-Sv
-OX
-OX
-lI
-lI
-lI
-lK
-lI
-lK
-OX
-OX
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-bn
-bz
-bz
-bz
-bz
-li
-md
-pR
-on
-rl
-sg
-sX
-uD
-sT
-tp
-tD
-bz
-bz
-bz
-bz
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-OX
-GF
-lX
-UM
-OX
-OX
-lI
-Sv
-lK
-lK
-lI
-lK
-lK
-lK
-lK
-lK
-lH
-lH
-lH
-lH
-lH
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-bn
-bz
-gr
-gr
-bz
-qM
-eG
-sf
-bz
-gr
-gr
-bz
-bn
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-OX
-OX
-GH
-OX
-OX
-lI
-lI
-lK
-lK
-lI
-lI
-lK
-OX
-lI
-lK
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-bz
-qP
-bz
-si
-bz
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-OX
-OX
-OX
-lI
-lI
-lI
-lI
-lK
-lK
-lK
-lK
-OX
-lK
-lK
-OX
-lK
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lG
-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
-bn
-qO
-bz
-sv
-bn
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lK
-lK
-lK
-lK
-lK
-lI
-OX
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-rm
-rI
-rm
-aa
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lG
-lH
-lH
-lI
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-OX
-OX
-lH
-lK
-lK
-lK
-OX
-lI
-lK
-lK
-lK
-lK
-lK
-lK
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-kx
-kx
-kx
-kx
-kx
-aa
-rm
-aa
-rm
-ae
-kA
-kx
-kA
-kA
-kA
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lI
-lH
-lH
-OX
-lK
-lI
-OX
-lK
-lI
-lI
-lI
-lK
-lK
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-kg
-jK
-jK
-jK
-jK
-jK
-oS
-rn
-rJ
-tE
-oS
-uI
-uI
-uI
-uI
-uI
-sC
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lI
-lI
-lH
-lH
-lI
-lI
-lI
-lI
-lH
-lI
-lI
-lI
-lI
-lH
-lH
-lH
-lH
-lI
-OX
-lK
-lI
-lK
-lK
-lK
-lK
-lK
-lK
-OX
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ky
-ky
-ky
-ky
-ky
-aa
-rm
-aa
-rm
-aa
-ky
-ky
-ky
-ky
-ky
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lH
-lH
-lH
-lH
-lH
-lI
-lH
-lH
-lH
-lI
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lK
-lK
-lI
-lI
-lI
-OX
-OX
-lI
-lH
-OX
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-rm
-aa
-rm
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lK
-lH
-lH
-lI
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-kA
-kA
-kA
-kA
-kA
-aa
-rm
-aa
-rm
-aa
-kA
-kA
-kA
-kA
-kA
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-kh
-jK
-jK
-jK
-jK
-jK
-oS
-rn
-rJ
-tE
-oS
-uI
-uI
-uI
-uI
-uI
-sC
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-ky
-ky
-ky
-ky
-ky
-aa
-rm
-aa
-rm
-aa
-ky
-ky
-ky
-ky
-ky
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lH
-lF
-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
-rm
-aa
-rm
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-lF
-lF
-lF
-lF
-lF
-lG
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lG
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lG
-lF
-lF
-lF
-lF
-lF
-lF
-lG
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-lF
-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
-kh
-rn
-aa
-tE
-kg
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-kh
-rF
-sh
-tH
-sC
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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
-ky
-rK
-ky
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-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/generic/Lavaland.dmm b/_maps/map_files/generic/Lavaland.dmm
index 142bbcff5f7..e44b9f52458 100644
--- a/_maps/map_files/generic/Lavaland.dmm
+++ b/_maps/map_files/generic/Lavaland.dmm
@@ -924,6 +924,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/production)
"cn" = (
@@ -1008,6 +1009,11 @@
/obj/effect/turf_decal/tile/brown{
dir = 2
},
+/obj/machinery/camera{
+ c_tag = "Shuttle Docking Foyer North";
+ dir = 8;
+ network = list("Mining Outpost")
+ },
/turf/simulated/floor/plasteel,
/area/mine/production)
"cx" = (
@@ -1324,10 +1330,10 @@
/turf/simulated/floor/plasteel/dark,
/area/mine/maintenance)
"di" = (
-/obj/machinery/telecomms/relay/preset/mining,
/obj/machinery/light/small{
dir = 1
},
+/obj/machinery/tcomms/relay/mining,
/turf/simulated/floor/plasteel/dark,
/area/mine/maintenance)
"dj" = (
@@ -1428,11 +1434,6 @@
/obj/machinery/light{
dir = 4
},
-/obj/machinery/camera{
- c_tag = "Shuttle Docking Foyer";
- dir = 8;
- network = list("Mining Outpost")
- },
/obj/machinery/newscaster{
pixel_x = 30;
pixel_y = 1
@@ -1443,6 +1444,11 @@
/obj/effect/turf_decal/tile/brown{
dir = 2
},
+/obj/machinery/camera{
+ c_tag = "Shuttle Docking Foyer South";
+ dir = 8;
+ network = list("Mining Outpost")
+ },
/turf/simulated/floor/plasteel,
/area/mine/production)
"dw" = (
@@ -1897,6 +1903,7 @@
/obj/structure/cable{
icon_state = "1-4"
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/living_quarters)
"eu" = (
@@ -2019,6 +2026,7 @@
/obj/structure/cable{
icon_state = "2-8"
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/production)
"eD" = (
@@ -2396,6 +2404,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 1
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/living_quarters)
"fv" = (
@@ -2794,6 +2803,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/bar,
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/living_quarters)
"gj" = (
@@ -3056,6 +3066,7 @@
dir = 6
},
/obj/effect/baseturf_helper/lava_land/surface,
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel/dark,
/area/mine/maintenance)
"gJ" = (
@@ -4119,6 +4130,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/production)
"BD" = (
@@ -4266,6 +4278,10 @@
},
/turf/simulated/floor/plasteel,
/area/mine/production)
+"Ww" = (
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor/plasteel,
+/area/mine/eva)
"WO" = (
/obj/effect/spawner/window,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -20693,7 +20709,7 @@ ab
bg
bs
bY
-bY
+Ww
bU
cp
bf
diff --git a/_maps/map_files/generic/z6.dmm b/_maps/map_files/generic/space.dmm
similarity index 100%
rename from _maps/map_files/generic/z6.dmm
rename to _maps/map_files/generic/space.dmm
diff --git a/_maps/map_files/generic/z7.dmm b/_maps/map_files/generic/z7.dmm
deleted file mode 100644
index 75f69ec7fe6..00000000000
--- a/_maps/map_files/generic/z7.dmm
+++ /dev/null
@@ -1,65540 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"a" = (
-/turf/space,
-/area/space)
-
-(1,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(2,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(3,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(4,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(5,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(6,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(7,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(8,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(9,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(10,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(11,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(12,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(13,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(14,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(15,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(16,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(17,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(18,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(19,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(20,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(21,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(22,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(23,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(24,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(25,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(26,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(27,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(28,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(29,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(30,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(31,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(32,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(33,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(34,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(35,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(36,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(37,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(38,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(39,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(40,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(41,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(42,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(43,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(44,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(45,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(46,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(47,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(48,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(49,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(50,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(51,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(52,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(53,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(54,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(55,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(56,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(57,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(58,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(59,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(60,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(61,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(62,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(63,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(64,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(65,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(66,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(67,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(68,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(69,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(70,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(71,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(72,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(73,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(74,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(75,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(76,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(77,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(78,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(79,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(80,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(81,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(82,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(83,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(84,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(85,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(86,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(87,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(88,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(89,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(90,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(91,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(92,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(93,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(94,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(95,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(96,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(97,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(98,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(99,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(100,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(101,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(102,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(103,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(104,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(105,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(106,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(107,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(108,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(109,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(110,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(111,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(112,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(113,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(114,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(115,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(116,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(117,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(118,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(119,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(120,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(121,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(122,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(123,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(124,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(125,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(126,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(127,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(128,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(129,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(130,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(131,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(132,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(133,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(134,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(135,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(136,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(137,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(138,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(139,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(140,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(141,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(142,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(143,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(144,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(145,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(146,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(147,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(148,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(149,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(150,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(151,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(152,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(153,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(154,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(155,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(156,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(157,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(158,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(159,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(160,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(161,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(162,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(163,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(164,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(165,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(166,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(167,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(168,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(169,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(170,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(171,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(172,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(173,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(174,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(175,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(176,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(177,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(178,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(179,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(180,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(181,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(182,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(183,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(184,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(185,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(186,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(187,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(188,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(189,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(190,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(191,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(192,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(193,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(194,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(195,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(196,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(197,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(198,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(199,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(200,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(201,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(202,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(203,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(204,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(205,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(206,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(207,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(208,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(209,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(210,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(211,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(212,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(213,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(214,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(215,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(216,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(217,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(218,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(219,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(220,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(221,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(222,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(223,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(224,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(225,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(226,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(227,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(228,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(229,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(230,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(231,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(232,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(233,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(234,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(235,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(236,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(237,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(238,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(239,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(240,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(241,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(242,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(243,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(244,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(245,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(246,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(247,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(248,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(249,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(250,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(251,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(252,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(253,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(254,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(255,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-a
-"}
diff --git a/_maps/map_files/shuttles/emergency_cyb.dmm b/_maps/map_files/shuttles/emergency_cyb.dmm
index 995f5af74d2..baccd222187 100644
--- a/_maps/map_files/shuttles/emergency_cyb.dmm
+++ b/_maps/map_files/shuttles/emergency_cyb.dmm
@@ -17,72 +17,100 @@
"ad" = (
/turf/space,
/turf/simulated/shuttle/wall{
- tag = "icon-swall_f10";
icon_state = "swall_f10";
dir = 2
},
/area/shuttle/escape)
"ae" = (
-/turf/simulated/shuttle/wall{
- icon_state = "swallc4"
+/obj/structure/table/reinforced,
+/obj/item/paper_bin,
+/obj/item/pen,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "vault"
},
/area/shuttle/escape)
"af" = (
-/obj/machinery/computer/emergency_shuttle,
-/turf/simulated/shuttle/floor,
+/obj/structure/table/reinforced,
+/obj/item/folder/red,
+/obj/item/restraints/handcuffs,
+/obj/item/flash,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
/area/shuttle/escape)
"ag" = (
-/turf/simulated/shuttle/wall{
- icon_state = "swallc3"
+/obj/machinery/computer/robotics,
+/turf/simulated/floor/plasteel{
+ dir = 9;
+ icon_state = "darkblue"
},
/area/shuttle/escape)
"ah" = (
-/obj/machinery/computer/security{
- network = list("SS13","Telecomms","Research Outpost","Mining Outpost")
+/obj/machinery/computer/crew,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "darkblue"
},
-/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"ai" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 1
+/obj/machinery/computer/emergency_shuttle,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "darkblue"
},
-/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"aj" = (
/obj/machinery/computer/communications,
-/turf/simulated/shuttle/floor,
+/turf/simulated/floor/plasteel{
+ dir = 5;
+ icon_state = "darkblue"
+ },
/area/shuttle/escape)
"ak" = (
-/obj/machinery/computer/station_alert,
-/turf/simulated/shuttle/floor,
+/obj/structure/table/reinforced,
+/obj/item/storage/fancy/donut_box,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/shuttle/escape)
+"al" = (
+/obj/structure/table/reinforced,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/cell/high,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "vault"
+ },
/area/shuttle/escape)
"am" = (
-/turf/simulated/shuttle/floor,
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "vault"
+ },
/area/shuttle/escape)
"an" = (
-/obj/machinery/computer/crew,
-/obj/machinery/status_display{
- pixel_y = 30
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
},
-/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"ao" = (
-/obj/structure/closet/walllocker/emerglocker{
- pixel_x = -28
- },
/obj/structure/chair/comfy/shuttle{
dir = 1
},
-/turf/simulated/shuttle/floor,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
/area/shuttle/escape)
"ap" = (
-/obj/structure/closet/walllocker/emerglocker{
- pixel_x = 28
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/mechanical,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "vault"
},
-/obj/structure/chair/comfy/shuttle{
- dir = 1
- },
-/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"aq" = (
/turf/simulated/shuttle/wall{
@@ -91,24 +119,44 @@
},
/area/shuttle/escape)
"ar" = (
-/obj/machinery/computer/robotics,
-/turf/simulated/shuttle/floor,
+/obj/machinery/computer/security{
+ network = list("SS13","Research Outpost","Mining Outpost","Telecomms")
+ },
+/obj/structure/sign/poster/official/nanotrasen_logo{
+ pixel_x = -32;
+ pixel_y = 0
+ },
+/turf/simulated/floor/plasteel{
+ dir = 9;
+ icon_state = "darkred"
+ },
/area/shuttle/escape)
"as" = (
/obj/structure/chair/comfy/shuttle{
dir = 8
},
-/turf/simulated/shuttle/floor,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
/area/shuttle/escape)
"at" = (
-/obj/machinery/light/spot,
-/turf/simulated/shuttle/floor,
+/obj/item/radio/intercom{
+ dir = 4;
+ name = "Station Intercom (General)";
+ pixel_x = 29;
+ pixel_y = -60
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
/area/shuttle/escape)
"au" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
},
-/turf/simulated/shuttle/floor,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
/area/shuttle/escape)
"av" = (
/turf/simulated/shuttle/wall{
@@ -123,16 +171,21 @@
},
/area/shuttle/escape)
"ax" = (
-/obj/machinery/door/airlock/command/glass{
- name = "Escape Shuttle Cockpit";
- req_access_txt = "19"
+/obj/machinery/computer/station_alert,
+/obj/structure/sign/poster/official/nanotrasen_logo{
+ pixel_x = 32;
+ pixel_y = 0
+ },
+/turf/simulated/floor/plasteel{
+ dir = 5;
+ icon_state = "darkyellow"
},
-/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"ay" = (
-/turf/simulated/shuttle/wall{
- icon_state = "swall14";
- dir = 2
+/obj/machinery/computer/secure_data,
+/turf/simulated/floor/plasteel{
+ dir = 10;
+ icon_state = "darkred"
},
/area/shuttle/escape)
"az" = (
@@ -142,42 +195,35 @@
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"aA" = (
-/obj/machinery/status_display{
- pixel_y = 30
- },
-/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
- icon_state = "tube1";
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle,
-/turf/simulated/shuttle/floor4,
-/area/shuttle/escape)
-"aB" = (
-/obj/machinery/door/airlock/shuttle{
- aiControlDisabled = 1;
- hackProof = 1;
- id_tag = "s_docking_airlock";
- name = "Shuttle Hatch"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
- },
-/area/shuttle/escape)
-"aC" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
-"aD" = (
+/obj/machinery/light,
/obj/structure/chair/comfy/shuttle{
dir = 8
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/shuttle/escape)
+"aB" = (
+/obj/machinery/light,
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/shuttle/escape)
+"aC" = (
+/obj/machinery/computer/atmos_alert,
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "darkyellow"
+ },
+/area/shuttle/escape)
+"aD" = (
+/obj/machinery/status_display,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall12";
+ dir = 2
},
/area/shuttle/escape)
"aE" = (
@@ -188,39 +234,31 @@
/turf/simulated/floor/plating,
/area/shuttle/escape)
"aF" = (
-/obj/machinery/status_display{
- pixel_y = 30
+/obj/machinery/door/airlock/command/glass{
+ name = "Escape Shuttle Cockpit";
+ req_access_txt = "19"
},
-/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
- icon_state = "tube1";
- dir = 1
- },
-/turf/simulated/shuttle/floor,
+/turf/simulated/floor/plasteel,
/area/shuttle/escape)
"aG" = (
-/obj/structure/closet/walllocker/emerglocker{
- pixel_x = -28
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
+/obj/structure/table/reinforced,
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"aH" = (
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"aI" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Escape Shuttle Cell";
- req_access_txt = "2"
+/obj/machinery/light{
+ dir = 1;
+ on = 1
},
-/turf/simulated/floor/plating,
+/obj/structure/chair/comfy/shuttle,
+/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"aJ" = (
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
+/obj/structure/table/reinforced,
+/obj/item/storage/fancy/donut_box,
+/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"aK" = (
/obj/structure/grille,
@@ -230,24 +268,22 @@
/turf/simulated/floor/plating,
/area/shuttle/escape)
"aL" = (
-/obj/structure/closet/walllocker/emerglocker{
- pixel_x = 28
+/obj/structure/table/reinforced,
+/obj/item/storage/firstaid/regular,
+/obj/machinery/light{
+ dir = 1;
+ on = 1
},
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "redcorner"
},
/area/shuttle/escape)
"aM" = (
-/obj/machinery/door/airlock/shuttle{
- aiControlDisabled = 1;
- hackProof = 1;
- id_tag = "s_docking_airlock";
- name = "Shuttle Hatch"
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "blue"
},
-/turf/simulated/floor/plating,
/area/shuttle/escape)
"aN" = (
/obj/structure/chair/comfy/shuttle{
@@ -274,105 +310,81 @@
/turf/simulated/floor/plating,
/area/shuttle/escape)
"aR" = (
-/obj/docking_port/mobile/emergency{
+/obj/structure/closet/fireaxecabinet{
+ pixel_x = 32;
+ pixel_y = 0
+ },
+/obj/machinery/light{
+ dir = 1;
+ on = 1
+ },
+/obj/structure/chair/comfy/shuttle,
+/turf/simulated/floor/plasteel{
dir = 4;
- dwidth = 11;
- height = 13;
- timid = 1;
- width = 24
+ icon_state = "neutralcorner"
},
-/obj/machinery/door/airlock/shuttle{
- aiControlDisabled = 1;
- hackProof = 1;
- id_tag = "s_docking_airlock";
- name = "Shuttle Hatch"
- },
-/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"aS" = (
+/obj/item/storage/firstaid/o2,
+/obj/structure/table,
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"aT" = (
+/obj/machinery/light{
+ dir = 1;
+ on = 1
+ },
+/obj/structure/chair/comfy/shuttle,
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"aU" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"aV" = (
+/obj/structure/closet/crate/internals,
+/obj/item/clothing/mask/breath,
+/obj/item/clothing/mask/breath,
+/obj/item/clothing/mask/breath,
+/obj/item/clothing/mask/breath,
+/obj/item/tank/emergency_oxygen/engi,
+/obj/item/tank/emergency_oxygen/engi,
+/obj/item/tank/emergency_oxygen/engi,
+/obj/item/tank/emergency_oxygen/engi,
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"aW" = (
/obj/item/radio/intercom{
dir = 8;
name = "station intercom (General)";
pixel_x = -28
},
-/obj/machinery/light/spot{
- tag = "icon-tube1 (WEST)";
- icon_state = "tube1";
- dir = 8
- },
/obj/structure/chair/comfy/shuttle{
dir = 4
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
-"aT" = (
-/obj/structure/closet/walllocker/emerglocker{
- pixel_x = 28
- },
-/obj/machinery/light/spot{
- tag = "icon-tube1 (EAST)";
- icon_state = "tube1";
- dir = 4
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
-"aU" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/fire,
-/obj/item/storage/firstaid/regular{
- pixel_x = 2;
- pixel_y = 3
- },
-/obj/item/extinguisher,
-/obj/item/crowbar,
-/obj/machinery/light/spot{
- tag = "icon-tube1 (WEST)";
- icon_state = "tube1";
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
-"aV" = (
-/obj/machinery/door/airlock/shuttle{
- aiControlDisabled = 1;
- hackProof = 1;
- id_tag = "s_docking_airlock";
- name = "Shuttle Hatch"
- },
-/turf/simulated/shuttle/floor,
-/area/shuttle/escape)
-"aW" = (
-/obj/machinery/status_display{
- pixel_y = -30
- },
-/obj/machinery/light/spot,
-/turf/simulated/shuttle/floor,
+/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"aX" = (
-/obj/structure/noticeboard,
-/turf/simulated/shuttle/wall{
- icon_state = "swall12";
- dir = 2
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
},
+/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"aY" = (
-/obj/machinery/door/airlock/shuttle{
- aiControlDisabled = 1;
- hackProof = 1;
- id_tag = null;
- name = "Shuttle Cargo Hatch"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "redcorner"
},
/area/shuttle/escape)
"aZ" = (
@@ -383,12 +395,9 @@
},
/area/shuttle/escape)
"ba" = (
-/obj/structure/grille,
-/obj/structure/window/full/shuttle{
- icon_state = "15"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "neutralfull"
},
/area/shuttle/escape)
"bb" = (
@@ -406,124 +415,82 @@
/turf/simulated/floor/plating,
/area/shuttle/escape)
"bd" = (
-/obj/machinery/door/airlock/medical/glass{
- id_tag = null;
- name = "Escape Shuttle Infirmary";
- req_access_txt = "0"
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "neutralcorner"
},
-/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"be" = (
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
+/obj/machinery/door/airlock/shuttle/glass{
+ name = "Emergency Airlock Access";
+ req_one_access_txt = "2;19"
},
+/turf/simulated/floor/plasteel,
/area/shuttle/escape)
"bf" = (
-/obj/structure/closet/crate,
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
+/turf/simulated/floor/plasteel{
+ icon_state = "neutralcorner"
},
/area/shuttle/escape)
"bg" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/o2{
- layer = 2.8;
- pixel_x = 4;
- pixel_y = 6
- },
-/obj/item/storage/firstaid/regular{
- pixel_x = 2;
- pixel_y = 6
- },
-/obj/item/storage/firstaid/regular{
- pixel_x = -2;
- pixel_y = 4
- },
-/obj/item/bodybag{
- pixel_x = 5
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
+/turf/simulated/floor/plasteel{
+ icon_state = "neutral"
},
/area/shuttle/escape)
"bh" = (
-/obj/machinery/vending/wallmed{
- layer = 3.3;
- name = "Emergency NanoMed";
- pixel_x = 28;
- pixel_y = 0;
- req_access_txt = "0"
- },
-/obj/structure/bed/roller,
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "neutralcorner"
},
/area/shuttle/escape)
"bi" = (
-/obj/structure/closet/cardboard,
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
+/obj/machinery/door/airlock/external{
+ id_tag = "s_docking_airlock"
},
+/obj/structure/fans/tiny,
+/turf/simulated/floor/plasteel,
/area/shuttle/escape)
"bj" = (
-/obj/machinery/light/spot{
- tag = "icon-tube1 (EAST)";
- icon_state = "tube1";
- dir = 4
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
+/obj/machinery/door/airlock/security/glass{
+ name = "Escape Shuttle Cell";
+ req_access_txt = "2"
},
+/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"bk" = (
-/obj/machinery/status_display{
- pixel_x = -30;
- pixel_y = 0
- },
-/obj/machinery/light/spot{
- tag = "icon-tube1 (WEST)";
- icon_state = "tube1";
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "redcorner"
},
/area/shuttle/escape)
"bl" = (
-/obj/item/radio/intercom{
- dir = 4;
- name = "station intercom (General)";
- pixel_x = 28
- },
-/obj/structure/bed/roller,
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "neutral"
},
/area/shuttle/escape)
"bm" = (
-/obj/machinery/mech_bay_recharge_port,
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "neutralcorner"
},
/area/shuttle/escape)
"bn" = (
/turf/simulated/floor/mech_bay_recharge_floor,
/area/shuttle/escape)
"bo" = (
-/obj/machinery/recharge_station,
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
+/obj/machinery/door/airlock/shuttle{
+ aiControlDisabled = 1;
+ hackProof = 1;
+ id_tag = "s_docking_airlock";
+ name = "Shuttle Hatch"
},
+/turf/simulated/floor/plasteel,
/area/shuttle/escape)
"bp" = (
-/obj/machinery/sleeper{
- tag = "icon-sleeper (NORTH)";
- icon_state = "sleeper";
- dir = 1
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"bq" = (
/turf/space,
@@ -533,11 +500,11 @@
},
/area/shuttle/escape)
"br" = (
-/obj/structure/window/reinforced{
- dir = 1
+/obj/item/twohanded/required/kirbyplants,
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "redcorner"
},
-/obj/structure/shuttle/engine/heater,
-/turf/simulated/shuttle/plating,
/area/shuttle/escape)
"bs" = (
/turf/simulated/shuttle/wall{
@@ -569,6 +536,571 @@
/obj/structure/shuttle/engine/propulsion,
/turf/simulated/shuttle/plating,
/area/shuttle/escape)
+"bx" = (
+/obj/item/twohanded/required/kirbyplants,
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 28
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "neutralcorner"
+ },
+/area/shuttle/escape)
+"by" = (
+/obj/structure/table,
+/obj/item/storage/firstaid,
+/obj/effect/decal/warning_stripes/yellow/hollow,
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"bz" = (
+/obj/machinery/light,
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bA" = (
+/obj/machinery/status_display{
+ pixel_y = -32
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bB" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bC" = (
+/obj/machinery/door/airlock/command/glass{
+ name = "Escape Shuttle Cockpit";
+ req_access_txt = "0";
+ req_one_access_txt = "2;19"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "neutralfull"
+ },
+/area/shuttle/escape)
+"bD" = (
+/obj/machinery/door/airlock/shuttle{
+ aiControlDisabled = 1;
+ hackProof = 1;
+ id_tag = "s_docking_airlock";
+ name = "Shuttle Hatch"
+ },
+/obj/docking_port/mobile/emergency{
+ dir = 4;
+ dwidth = 11;
+ height = 18;
+ timid = 1;
+ width = 29
+ },
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"bE" = (
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"bF" = (
+/obj/machinery/light{
+ dir = 1;
+ on = 1
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "neutral"
+ },
+/area/shuttle/escape)
+"bG" = (
+/obj/machinery/mech_bay_recharge_port,
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bH" = (
+/obj/machinery/computer/mech_bay_power_console,
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"bI" = (
+/obj/structure/table,
+/obj/item/weldingtool/largetank{
+ pixel_x = 4;
+ pixel_y = -4
+ },
+/obj/item/clothing/glasses/welding{
+ pixel_y = 10
+ },
+/obj/machinery/light/small{
+ dir = 4;
+ pixel_y = 8
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bJ" = (
+/obj/item/twohanded/required/kirbyplants,
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"bK" = (
+/obj/item/twohanded/required/kirbyplants,
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"bL" = (
+/obj/structure/reagent_dispensers/fueltank/chem{
+ pixel_x = -32;
+ pixel_y = 0
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bM" = (
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "browncorner"
+ },
+/area/shuttle/escape)
+"bN" = (
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "browncorner"
+ },
+/area/shuttle/escape)
+"bO" = (
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bP" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bQ" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bR" = (
+/obj/structure/flora/ausbushes/grassybush,
+/obj/structure/flora/ausbushes/lavendergrass,
+/obj/structure/flora/ausbushes/ppflowers,
+/obj/structure/flora/ausbushes/sunnybush,
+/obj/structure/window/full/shuttle,
+/turf/simulated/floor/grass,
+/area/shuttle/escape)
+"bS" = (
+/obj/machinery/door/airlock/shuttle/glass{
+ name = "Shuttle Cargo Hatch"
+ },
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"bT" = (
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "brown"
+ },
+/area/shuttle/escape)
+"bU" = (
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "brown"
+ },
+/area/shuttle/escape)
+"bV" = (
+/obj/structure/reagent_dispensers/watertank,
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bW" = (
+/obj/machinery/status_display,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall3";
+ dir = 2
+ },
+/area/shuttle/escape)
+"bX" = (
+/obj/machinery/ai_status_display,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall3";
+ dir = 2
+ },
+/area/shuttle/escape)
+"bY" = (
+/obj/structure/flora/ausbushes/grassybush,
+/obj/structure/flora/ausbushes/lavendergrass,
+/obj/structure/flora/ausbushes/ywflowers,
+/obj/structure/flora/ausbushes/fernybush,
+/obj/structure/window/full/shuttle,
+/turf/simulated/floor/grass,
+/area/shuttle/escape)
+"bZ" = (
+/obj/structure/table,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/cell/high,
+/obj/machinery/light/small{
+ tag = "icon-bulb1 (WEST)";
+ icon_state = "bulb1";
+ dir = 8
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"ca" = (
+/obj/structure/closet/crate,
+/obj/item/storage/toolbox/emergency,
+/obj/item/storage/toolbox/emergency,
+/obj/item/flashlight/flare,
+/obj/item/flashlight/flare,
+/obj/item/crowbar,
+/obj/item/wrench,
+/obj/item/radio,
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"cb" = (
+/obj/item/twohanded/required/kirbyplants,
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"cc" = (
+/obj/structure/extinguisher_cabinet,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall3";
+ dir = 2
+ },
+/area/shuttle/escape)
+"cd" = (
+/obj/item/radio/intercom{
+ dir = 8;
+ name = "station intercom (General)";
+ pixel_x = -28
+ },
+/obj/machinery/recharge_station,
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"ce" = (
+/obj/structure/closet/crate/engineering,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = -4;
+ pixel_y = 4
+ },
+/obj/item/storage/toolbox/emergency,
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = 4;
+ pixel_y = -4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"cf" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -28
+ },
+/obj/machinery/recharge_station,
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"cg" = (
+/turf/simulated/floor/plasteel{
+ tag = "icon-browncorner (EAST)";
+ icon_state = "browncorner";
+ dir = 4
+ },
+/area/shuttle/escape)
+"ch" = (
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "browncorner";
+ tag = "icon-browncorner (EAST)"
+ },
+/area/shuttle/escape)
+"ci" = (
+/obj/structure/closet/crate/medical,
+/obj/item/storage/firstaid/regular,
+/obj/item/storage/firstaid/o2{
+ pixel_x = 2;
+ pixel_y = -2
+ },
+/obj/item/storage/firstaid/toxin{
+ pixel_x = -2;
+ pixel_y = 4
+ },
+/obj/machinery/light/small,
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"cj" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"ck" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"cl" = (
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = null;
+ name = "Escape Shuttle Infirmary";
+ req_access_txt = "0"
+ },
+/obj/effect/decal/warning_stripes/south,
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"cm" = (
+/obj/structure/sign/greencross,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall12";
+ dir = 2
+ },
+/area/shuttle/escape)
+"cn" = (
+/obj/structure/sign/greencross,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall3";
+ dir = 2
+ },
+/area/shuttle/escape)
+"co" = (
+/obj/machinery/sleeper{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cp" = (
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cq" = (
+/obj/machinery/sleeper,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cr" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"cs" = (
+/turf/simulated/floor/plasteel{
+ tag = "icon-whiteblue (NORTH)";
+ icon_state = "whiteblue";
+ dir = 1
+ },
+/area/shuttle/escape)
+"ct" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 28
+ },
+/obj/machinery/light/small{
+ dir = 4;
+ pixel_y = 8
+ },
+/turf/simulated/floor/plasteel{
+ tag = "icon-whiteblue (SOUTHEAST)";
+ icon_state = "whiteblue";
+ dir = 6
+ },
+/area/shuttle/escape)
+"cu" = (
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = null;
+ name = "Escape Shuttle Infirmary";
+ req_access_txt = "0"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "neutralfull"
+ },
+/area/shuttle/escape)
+"cv" = (
+/turf/simulated/floor/plasteel{
+ icon_state = "white"
+ },
+/area/shuttle/escape)
+"cw" = (
+/obj/structure/bed/roller,
+/obj/machinery/iv_drip,
+/turf/simulated/floor/plasteel{
+ tag = "icon-whiteblue (EAST)";
+ icon_state = "whiteblue";
+ dir = 4
+ },
+/area/shuttle/escape)
+"cx" = (
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/iv_bag/blood/random,
+/obj/item/reagent_containers/iv_bag/blood/random,
+/obj/item/reagent_containers/iv_bag/blood/random,
+/turf/simulated/floor/plasteel{
+ tag = "icon-whiteblue (EAST)";
+ icon_state = "whiteblue";
+ dir = 4
+ },
+/area/shuttle/escape)
+"cy" = (
+/turf/simulated/floor/plasteel{
+ tag = "icon-whiteblue";
+ icon_state = "whiteblue"
+ },
+/area/shuttle/escape)
+"cz" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/firstaid/o2{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/storage/firstaid/regular,
+/obj/item/storage/firstaid/regular{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/turf/simulated/floor/plasteel{
+ tag = "icon-whiteblue (NORTHEAST)";
+ icon_state = "whiteblue";
+ dir = 5
+ },
+/area/shuttle/escape)
+"cA" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"cB" = (
+/obj/structure/table/reinforced,
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/obj/item/reagent_containers/food/drinks/mug/med,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cC" = (
+/obj/item/flag/med,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cD" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/backpack/medic,
+/obj/item/storage/belt/medical,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cE" = (
+/obj/structure/bed/roller,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cF" = (
+/obj/item/radio/intercom{
+ dir = 4;
+ name = "Station Intercom (General)";
+ pixel_x = 29;
+ pixel_y = -30
+ },
+/obj/structure/bed/roller,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cG" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/gloves/color/latex/nitrile,
+/obj/item/clothing/mask/breath,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cH" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "wall3"
+ },
+/area/shuttle/escape)
(1,1,1) = {"
aa
@@ -576,23 +1108,28 @@ aa
aa
aa
aa
-aa
ab
aq
aq
-aM
-aP
-aR
aq
-aE
-aK
+bo
+aP
+bD
+aq
aQ
+aK
+aE
aq
-aV
-aP
-aB
-ac
+bo
aq
+bo
+aq
+aq
+aQ
+aE
+aq
+aq
+bt
bq
aa
"}
@@ -602,309 +1139,524 @@ aa
aa
aa
aa
-aa
av
-az
aG
+aW
+az
aH
av
-am
-aS
-aC
-aC
-aC
-aU
-am
+bE
+bJ
+bP
+bP
+bP
+cb
+bE
+cj
+bE
+cb
+bP
+bP
+bP
+cA
+aV
av
-be
-bi
-bm
-ay
-bq
+bu
+bw
"}
(3,1,1) = {"
aa
aa
aa
aa
-ab
-aq
-aw
-aA
+aa
+ac
+aO
aH
aH
-av
-am
-am
-am
-am
-am
-am
-am
-aX
-be
-be
-bn
-br
+aH
+bj
+bg
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+bB
+bb
+bu
bw
"}
(4,1,1) = {"
aa
aa
+aa
+aa
ab
-ac
-ae
-ar
-av
-aO
+aw
+aI
+aH
aH
aN
-av
-am
-aD
-aD
-aD
-aD
-am
-am
-aY
-be
-be
-bo
-br
+bb
+bg
+ba
+bQ
+bQ
+bQ
+bQ
+bQ
+ba
+bQ
+bQ
+bQ
+bQ
+bQ
+ba
+bB
+bc
+bu
bw
"}
(5,1,1) = {"
-aa
ab
-ae
-ak
-ao
-as
-av
-aO
-aH
-aN
-av
-am
-aE
-aK
-aK
-aQ
-am
-am
-av
-bf
-bj
-bo
-br
-bw
-"}
-(6,1,1) = {"
-ab
-ae
-ah
-ai
-am
-am
-av
+aq
ac
-aI
-aE
-ba
-am
-aC
-aC
-aC
-aC
-am
-aW
-aZ
-aq
-aq
aq
bs
-bv
+aw
+aO
+aH
+aH
+aN
+bc
+bg
+ba
+bR
+bW
+bY
+cc
+bR
+ba
+bY
+cc
+bR
+bX
+bY
+ba
+bB
+av
+cH
+cH
+"}
+(6,1,1) = {"
+av
+ae
+am
+ar
+ay
+av
+aJ
+aX
+aH
+bp
+av
+bg
+ba
+bP
+bP
+bP
+bP
+bP
+ba
+bP
+cr
+bP
+bP
+bP
+ba
+bB
+av
+bu
+bw
"}
(7,1,1) = {"
ac
af
-ai
-am
-am
-am
-ax
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ac
-aa
-aa
-aa
-aa
-aa
-"}
-(8,1,1) = {"
-ad
-ag
-aj
-ai
-am
-at
-av
-aD
-aD
-aD
-aD
-am
-aD
-aD
-aD
-aD
-am
-aW
+an
+as
+aA
aZ
aq
+ac
+bj
aq
-aq
-bt
-bq
+aw
+bF
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+bB
+ac
+bu
+bw
"}
-(9,1,1) = {"
-aa
-ad
+(8,1,1) = {"
+ac
ag
+ao
an
-ap
-au
-ay
-aE
-aK
-aK
-aQ
-am
-aE
-aK
-aK
-aQ
-am
-am
+an
+aD
+aL
+aY
+bk
+br
ac
bg
-bk
-bp
+ba
+bQ
+bQ
+bQ
+bQ
+bQ
+ba
+bQ
+bQ
+bQ
+bQ
+bQ
+ba
+bB
+av
+cH
+cH
+"}
+(9,1,1) = {"
+ac
+ah
+ao
+an
+an
+aF
+aM
+ba
+ba
+bg
+bC
+bg
+ba
+bR
+bX
+bY
+cc
+bR
+ba
+bY
+cc
+bR
+bW
+bY
+ba
+bB
+bb
bu
bw
"}
(10,1,1) = {"
-aa
-aa
-ad
ac
-ag
-am
-av
-aC
-aC
-aC
-aC
-am
-aC
-aC
-aC
-aC
-am
-am
-bd
-aJ
-aJ
-aJ
+ai
+ao
+an
+an
+aF
+aM
+ba
+ba
+bg
+bC
+bg
+ba
+bP
+bP
+bP
+bP
+bP
+ba
+bP
+bP
+bP
+bP
+bP
+ba
+bB
+bc
bu
bw
"}
(11,1,1) = {"
+ac
+aj
+ao
+at
+an
+aD
+aR
+bd
+bf
+bx
+ac
+bg
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+bB
+av
+cH
+cH
+"}
+(12,1,1) = {"
+ac
+ak
+an
+au
+aB
+aZ
+aq
+be
+be
+aq
+aw
+aV
+bK
+bE
+bE
+bQ
+bQ
+bQ
+ck
+bQ
+bQ
+ba
+ba
+bQ
+ck
+aV
+ac
+bu
+bw
+"}
+(13,1,1) = {"
+av
+al
+ap
+ax
+aC
+av
+aS
+bf
+bd
+by
+aZ
+aq
+aq
+bS
+bS
+aq
+aq
+aq
+aP
+cn
+ac
+cu
+cu
+ac
+bW
+aq
+aw
+bu
+bw
+"}
+(14,1,1) = {"
+ad
+aq
+ac
+aq
+aP
+aw
+aT
+bg
+bl
+bz
+av
+bG
+bL
+bE
+bE
+bZ
+cd
+cf
+av
+co
+cs
+cv
+cv
+cy
+cB
+cD
+av
+cH
+cH
+"}
+(15,1,1) = {"
aa
aa
aa
aa
ad
-aq
aw
-aF
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
+aU
+bg
+bl
+bA
+av
+bn
+bM
+bT
+bT
+bT
+bT
+cg
+cl
+cp
+cs
+cv
+cv
+cy
+cp
+cE
bb
-aJ
-aJ
-bp
bu
bw
"}
-(12,1,1) = {"
+(16,1,1) = {"
aa
aa
aa
aa
aa
+ac
+aU
+bg
+bl
+bB
+av
+bH
+bN
+bU
+bU
+bU
+bU
+ch
+cl
+cp
+cs
+cv
+cv
+cy
+cp
+cF
+bc
+bu
+bw
+"}
+(17,1,1) = {"
+aa
+aa
+aa
+aa
aa
av
-aD
-aL
-aD
-aD
-aD
-aT
-aD
-aD
-aD
-am
-am
-bc
+aV
bh
-bl
-aJ
-ay
-bv
+bm
+aV
+av
+bI
+bO
+bV
+aV
+ca
+ce
+ci
+cm
+cq
+ct
+cw
+cx
+cz
+cC
+cG
+av
+bu
+bw
"}
-(13,1,1) = {"
-aa
+(18,1,1) = {"
aa
aa
aa
aa
aa
ad
-aq
-aq
ac
+bi
+bi
+ac
+bs
aq
-aq
-aq
-aE
-aK
aQ
+aK
+aK
+aK
+aE
aq
-ac
-aq
+bs
aq
aq
+aQ
+aK
+aK
+aE
aq
+bs
bv
aa
"}
diff --git a/_maps/map_files/shuttles/emergency_old.dmm b/_maps/map_files/shuttles/emergency_old.dmm
index f4a2b0c7754..b8b49da71e5 100644
--- a/_maps/map_files/shuttles/emergency_old.dmm
+++ b/_maps/map_files/shuttles/emergency_old.dmm
@@ -38,7 +38,7 @@
/area/shuttle/escape)
"ah" = (
/obj/machinery/computer/security{
- network = list("SS13","Research Outpost","Mining Outpost","Telecomms")
+ network = list("SS13","Telecomms","Research Outpost","Mining Outpost")
},
/turf/simulated/shuttle/floor,
/area/shuttle/escape)
@@ -192,9 +192,7 @@
/obj/structure/chair/comfy/shuttle{
dir = 4
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
+/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"aF" = (
/obj/structure/grille,
@@ -214,33 +212,6 @@
icon_state = "floor3"
},
/area/shuttle/escape)
-"aH" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/regular{
- pixel_x = 2;
- pixel_y = 6
- },
-/obj/item/storage/firstaid/regular{
- pixel_x = -2;
- pixel_y = 4
- },
-/obj/item/bodybag{
- pixel_x = 5
- },
-/obj/item/radio/intercom{
- dir = 4;
- name = "station intercom (General)";
- pixel_x = 28
- },
-/obj/item/storage/firstaid/o2{
- layer = 2.8;
- pixel_x = 4;
- pixel_y = 6
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
"aI" = (
/turf/simulated/shuttle/floor{
icon_state = "floor3"
@@ -311,10 +282,6 @@
icon_state = "floor3"
},
/area/shuttle/escape)
-"aO" = (
-/obj/machinery/recharge_station,
-/turf/simulated/shuttle/floor,
-/area/shuttle/escape)
"aP" = (
/obj/machinery/door/airlock/shuttle{
aiControlDisabled = 1;
@@ -346,10 +313,11 @@
/turf/simulated/floor/plating,
/area/shuttle/escape)
"aT" = (
-/obj/machinery/door/airlock/medical/glass{
+/obj/machinery/door/airlock/shuttle{
+ aiControlDisabled = 1;
+ hackProof = 1;
id_tag = null;
- name = "Escape Shuttle Infirmary";
- req_access_txt = "0"
+ name = "Shuttle Cargo Hatch"
},
/turf/simulated/shuttle/floor{
icon_state = "floor3"
@@ -363,11 +331,12 @@
},
/area/shuttle/escape)
"aV" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Escape Shuttle Cell";
- req_access_txt = "2"
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = null;
+ name = "Escape Shuttle Infirmary";
+ req_access_txt = "0"
},
-/turf/simulated/shuttle/floor4,
+/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"aW" = (
/obj/machinery/door/airlock/shuttle{
@@ -376,14 +345,12 @@
id_tag = "s_docking_airlock";
name = "Shuttle Hatch"
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
+/turf/simulated/floor/plating,
/area/shuttle/escape)
"aX" = (
-/obj/structure/bed/roller,
+/obj/structure/closet/crate,
/turf/simulated/shuttle/floor{
- icon_state = "floor3"
+ icon_state = "floor2"
},
/area/shuttle/escape)
"aZ" = (
@@ -394,30 +361,19 @@
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"bb" = (
-/obj/machinery/sleeper{
- icon_state = "sleeper-open";
- dir = 4
- },
+/obj/structure/closet/cardboard,
/turf/simulated/shuttle/floor{
- icon_state = "floor3"
+ icon_state = "floor2"
},
/area/shuttle/escape)
"bc" = (
-/obj/structure/bed/roller,
-/obj/machinery/vending/wallmed{
- layer = 3.3;
- name = "Emergency NanoMed";
- pixel_x = 28;
- pixel_y = 0;
- req_access_txt = "0"
- },
/obj/machinery/light/spot{
tag = "icon-tube1 (EAST)";
icon_state = "tube1";
dir = 4
},
/turf/simulated/shuttle/floor{
- icon_state = "floor3"
+ icon_state = "floor2"
},
/area/shuttle/escape)
"bd" = (
@@ -430,7 +386,9 @@
icon_state = "tube1";
dir = 8
},
-/turf/simulated/shuttle/floor4,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor3"
+ },
/area/shuttle/escape)
"be" = (
/obj/item/radio/intercom{
@@ -438,16 +396,17 @@
name = "station intercom (General)";
pixel_x = 28
},
-/turf/simulated/shuttle/floor4,
-/area/shuttle/escape)
-"bf" = (
-/obj/machinery/sleeper{
- dir = 4
- },
+/obj/structure/bed/roller,
/turf/simulated/shuttle/floor{
icon_state = "floor3"
},
/area/shuttle/escape)
+"bf" = (
+/obj/machinery/mech_bay_recharge_port,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
+/area/shuttle/escape)
"bh" = (
/obj/structure/chair/comfy/shuttle{
dir = 1
@@ -492,6 +451,124 @@
/obj/structure/shuttle/engine/propulsion,
/turf/simulated/shuttle/plating,
/area/shuttle/escape)
+"db" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Escape Shuttle Cell";
+ req_access_txt = "2"
+ },
+/turf/simulated/floor/plating,
+/area/shuttle/escape)
+"ev" = (
+/obj/machinery/sleeper{
+ tag = "icon-sleeper (NORTH)";
+ icon_state = "sleeper";
+ dir = 1
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor3"
+ },
+/area/shuttle/escape)
+"iM" = (
+/obj/structure/table,
+/obj/item/storage/firstaid/o2{
+ layer = 2.8;
+ pixel_x = 4;
+ pixel_y = 6
+ },
+/obj/item/storage/firstaid/regular{
+ pixel_x = 2;
+ pixel_y = 6
+ },
+/obj/item/storage/firstaid/regular{
+ pixel_x = -2;
+ pixel_y = 4
+ },
+/obj/item/bodybag{
+ pixel_x = 5
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor3"
+ },
+/area/shuttle/escape)
+"kP" = (
+/turf/simulated/shuttle/wall{
+ tag = "icon-swall7";
+ icon_state = "swall7";
+ dir = 2
+ },
+/area/shuttle/escape)
+"lJ" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor4,
+/area/shuttle/escape)
+"mk" = (
+/obj/machinery/status_display{
+ pixel_y = 30
+ },
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (NORTH)";
+ icon_state = "tube1";
+ dir = 1
+ },
+/obj/structure/chair/comfy/shuttle,
+/turf/simulated/shuttle/floor4,
+/area/shuttle/escape)
+"rj" = (
+/obj/machinery/vending/wallmed{
+ layer = 3.3;
+ name = "Emergency NanoMed";
+ pixel_x = 28;
+ pixel_y = 0;
+ req_access_txt = "0"
+ },
+/obj/structure/bed/roller,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor3"
+ },
+/area/shuttle/escape)
+"xo" = (
+/obj/machinery/recharge_station,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
+/area/shuttle/escape)
+"zT" = (
+/obj/structure/noticeboard,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall12";
+ dir = 2
+ },
+/area/shuttle/escape)
+"Bs" = (
+/obj/machinery/door/airlock/shuttle{
+ aiControlDisabled = 1;
+ hackProof = 1;
+ id_tag = "s_docking_airlock";
+ name = "Shuttle Hatch"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
+/area/shuttle/escape)
+"DZ" = (
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
+/area/shuttle/escape)
+"OC" = (
+/obj/structure/grille,
+/obj/structure/window/full/shuttle{
+ icon_state = "15"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor3"
+ },
+/area/shuttle/escape)
+"XL" = (
+/turf/simulated/floor/mech_bay_recharge_floor,
+/area/shuttle/escape)
(1,1,1) = {"
aa
@@ -504,7 +581,7 @@ ab
ar
ar
aW
-ar
+kP
ak
ar
aD
@@ -512,8 +589,8 @@ aF
aJ
ar
aP
-ar
-aW
+kP
+Bs
ac
ar
bi
@@ -527,10 +604,10 @@ aa
aa
aa
aw
-aA
+lJ
aE
-aI
-aA
+ba
+aw
an
aL
aA
@@ -538,8 +615,8 @@ aA
aA
aN
an
-aR
-aI
+aw
+DZ
bb
bf
az
@@ -553,7 +630,10 @@ aa
ab
ar
ax
-aB
+mk
+ba
+ba
+aw
an
an
an
@@ -561,13 +641,10 @@ an
an
an
an
-an
-an
-an
-aS
-aI
-aI
-aI
+zT
+DZ
+DZ
+XL
bj
bo
"}
@@ -579,10 +656,10 @@ ac
ae
as
aw
-aC
-aC
-aC
-aC
+aZ
+ba
+bh
+aw
an
aC
aC
@@ -591,9 +668,9 @@ aC
an
an
aT
-aI
-aI
-aI
+DZ
+DZ
+xo
bj
bo
"}
@@ -605,10 +682,10 @@ al
ap
at
aw
-aD
-aF
-aF
-aJ
+aZ
+ba
+bh
+aw
an
aD
aF
@@ -616,10 +693,10 @@ aF
aJ
an
an
-ac
+aw
aX
bc
-aH
+xo
bj
bo
"}
@@ -631,10 +708,10 @@ ai
an
an
aw
-aA
-aA
-aA
-aA
+ac
+db
+aD
+OC
an
aA
aA
@@ -721,9 +798,9 @@ aJ
an
an
ac
-aZ
+iM
bd
-bh
+ev
bm
bo
"}
@@ -747,9 +824,9 @@ aA
an
an
aV
-ba
-ba
-bh
+aI
+aI
+aI
bm
bo
"}
@@ -773,9 +850,9 @@ an
an
an
aR
-aZ
-ba
-bh
+aI
+aI
+ev
bm
bo
"}
@@ -796,12 +873,12 @@ aM
aC
aC
aC
-aO
-aO
+an
+an
aS
-aZ
+rj
be
-bh
+aI
az
bn
"}
diff --git a/_maps/metastation.dm b/_maps/metastation.dm
index ad4c4370d74..7747ad79fb8 100644
--- a/_maps/metastation.dm
+++ b/_maps/metastation.dm
@@ -16,22 +16,14 @@ z7 = empty space
#if !defined(USING_MAP_DATUM)
#include "map_files\MetaStation\MetaStation.v41A.II.dmm"
#include "map_files\MetaStation\z2.dmm"
- #include "map_files\MetaStation\z3.dmm"
- #include "map_files\MetaStation\z4.dmm"
#include "map_files\generic\Lavaland.dmm"
- #include "map_files\generic\z6.dmm"
- #include "map_files\generic\z7.dmm"
#define MAP_FILE "MetaStation.v41A.II.dmm"
#define MAP_NAME "MetaStation"
#define MAP_TRANSITION_CONFIG list(\
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
-DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE, BOOSTS_SIGNAL, AI_OK)),\
-DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\
-DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
-DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\
-DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)))
+DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)))
#define USING_MAP_DATUM /datum/map/metastation
diff --git a/_maps/test_all_maps.dm b/_maps/test_all_maps.dm
deleted file mode 100644
index 94bd9bac437..00000000000
--- a/_maps/test_all_maps.dm
+++ /dev/null
@@ -1,145 +0,0 @@
-// This is for Travis testing. DO NOT SET THIS AS THE GAME'S MAP NORMALLY!
-
-#if !defined(USING_MAP_DATUM)
- // Away missions
- #include "map_files\RandomZLevels\academy.dmm"
- #include "map_files\RandomZLevels\beach.dmm"
- #include "map_files\RandomZLevels\blackmarketpackers.dmm"
- #include "map_files\RandomZLevels\centcomAway.dmm"
- #include "map_files\RandomZLevels\evil_santa.dmm"
- #include "map_files\RandomZLevels\example.dmm"
- #include "map_files\RandomZLevels\moonoutpost19.dmm"
- #include "map_files\RandomZLevels\spacebattle.dmm"
- #include "map_files\RandomZLevels\spacehotel.dmm"
- #include "map_files\RandomZLevels\stationCollision.dmm"
- #include "map_files\RandomZLevels\terrorspiders.dmm"
- #include "map_files\RandomZLevels\undergroundoutpost45.dmm"
- #include "map_files\RandomZLevels\wildwest.dmm"
-
-
- // Lavaland Ruins
- #include "map_files\RandomRuins\LavaRuins\lavaland_biodome_beach.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_biodome_clown_planet.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_biodome_winter.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_animal_hospital.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_ash_walker1.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_blooddrunk1.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_blooddrunk2.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_blooddrunk3.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_cube.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_cultaltar.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_dead_ratvar.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_envy.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_fountain_hall.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_gluttony.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_greed.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_hermit.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_hierophant.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_pizzaparty.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_pride.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_puzzle.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_random_ripley.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_seed_vault.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_sloth.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_survivalpod.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_swarmer_crash.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_syndicate_base1.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_ufo_crash.dmm"
- #include "map_files\RandomRuins\LavaRuins\lavaland_surface_xeno_nest.dmm"
-
-
- // Space Ruins
- #include "map_files\RandomRuins\SpaceRuins\abandonedzoo.dmm"
- #include "map_files\RandomRuins\SpaceRuins\asteroid1.dmm"
- #include "map_files\RandomRuins\SpaceRuins\asteroid2.dmm"
- #include "map_files\RandomRuins\SpaceRuins\asteroid3.dmm"
- #include "map_files\RandomRuins\SpaceRuins\asteroid4.dmm"
- #include "map_files\RandomRuins\SpaceRuins\asteroid5.dmm"
- #include "map_files\RandomRuins\SpaceRuins\deepstorage.dmm"
- #include "map_files\RandomRuins\SpaceRuins\derelict1.dmm"
- #include "map_files\RandomRuins\SpaceRuins\derelict2.dmm"
- #include "map_files\RandomRuins\SpaceRuins\derelict3.dmm"
- #include "map_files\RandomRuins\SpaceRuins\derelict4.dmm"
- #include "map_files\RandomRuins\SpaceRuins\derelict5.dmm"
- #include "map_files\RandomRuins\SpaceRuins\emptyshell.dmm"
- #include "map_files\RandomRuins\SpaceRuins\gasthelizards.dmm"
- #include "map_files\RandomRuins\SpaceRuins\intactemptyship.dmm"
- #include "map_files\RandomRuins\SpaceRuins\listeningpost.dmm"
- #include "map_files\RandomRuins\SpaceRuins\mechtransport.dmm"
- #include "map_files\RandomRuins\SpaceRuins\oldstation.dmm"
- #include "map_files\RandomRuins\SpaceRuins\onehalf.dmm"
- #include "map_files\RandomRuins\SpaceRuins\spacebar.dmm"
- #include "map_files\RandomRuins\SpaceRuins\turretedoutpost.dmm"
- #include "map_files\RandomRuins\SpaceRuins\way_home.dmm"
-
-
- // Shuttle Templates
- #include "map_files\shuttles\cargo_base.dmm"
- #include "map_files\shuttles\emergency_bar.dmm"
- #include "map_files\shuttles\emergency_clown.dmm"
- #include "map_files\shuttles\emergency_cramped.dmm"
- #include "map_files\shuttles\emergency_cyb.dmm"
- #include "map_files\shuttles\emergency_dept.dmm"
- #include "map_files\shuttles\emergency_meta.dmm"
- #include "map_files\shuttles\emergency_mil.dmm"
- #include "map_files\shuttles\emergency_narnar.dmm"
- #include "map_files\shuttles\emergency_old.dmm"
- #include "map_files\shuttles\ferry_base.dmm"
- #include "map_files\shuttles\ferry_meat.dmm"
-
- // Other templates
- #include "map_files\templates\spacehotel\n_01.dmm"
- #include "map_files\templates\spacehotel\n_02.dmm"
- #include "map_files\templates\spacehotel\n_03.dmm"
- #include "map_files\templates\spacehotel\n_04.dmm"
- #include "map_files\templates\spacehotel\n_05.dmm"
- #include "map_files\templates\spacehotel\n_06.dmm"
- #include "map_files\templates\spacehotel\n_07.dmm"
- #include "map_files\templates\spacehotel\n_08.dmm"
- #include "map_files\templates\spacehotel\n_09.dmm"
- #include "map_files\templates\spacehotel\n_10.dmm"
- #include "map_files\templates\spacehotel\n_11.dmm"
- #include "map_files\templates\spacehotel\n_12.dmm"
- #include "map_files\templates\spacehotel\n_13.dmm"
- #include "map_files\templates\spacehotel\n_14.dmm"
- #include "map_files\templates\spacehotel\n_15.dmm"
- #include "map_files\templates\spacehotel\n_16.dmm"
- #include "map_files\templates\spacehotel\n_17.dmm"
- #include "map_files\templates\spacehotel\n_18.dmm"
- #include "map_files\templates\spacehotel\n_19.dmm"
-
- #include "map_files\templates\spacehotel\s_01.dmm"
- #include "map_files\templates\spacehotel\s_02.dmm"
- #include "map_files\templates\spacehotel\s_03.dmm"
- #include "map_files\templates\spacehotel\s_04.dmm"
- #include "map_files\templates\spacehotel\s_05.dmm"
- #include "map_files\templates\spacehotel\s_06.dmm"
-
- #include "map_files\templates\light_floor_1.dmm"
- #include "map_files\templates\light_floor_2.dmm"
- #include "map_files\templates\light_floor_3.dmm"
- #include "map_files\templates\medium_shuttle1.dmm"
- #include "map_files\templates\medium_shuttle2.dmm"
- #include "map_files\templates\medium_shuttle3.dmm"
- #include "map_files\templates\shelter_1.dmm"
- #include "map_files\templates\shelter_2.dmm"
- #include "map_files\templates\small_asteroid_1.dmm"
- #include "map_files\templates\small_shuttle_1.dmm"
-
- // This is pointless, we don't run the server
- /*#define MAP_TRANSITION_CONFIG list(AWAY_MISSION = UNAFFECTED,
- AWAY_MISSION = UNAFFECTED,
- AWAY_MISSION = UNAFFECTED,
- AWAY_MISSION = UNAFFECTED,
- AWAY_MISSION = UNAFFECTED,
- AWAY_MISSION = UNAFFECTED,
- AWAY_MISSION = UNAFFECTED,
- AWAY_MISSION = UNAFFECTED,
- AWAY_MISSION = UNAFFECTED,
- AWAY_MISSION = UNAFFECTED)
-
- #define USING_MAP_DATUM /datum/map*/
-
-#elif !defined(MAP_OVERRIDE)
- #warn a map has already been included.
-#endif
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index 0e3c1b78798..8dd95119aff 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -59,7 +59,7 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new())
for(var/mob/living/L in src) //ventcrawling is serious business
L.remove_ventcrawl()
L.forceMove(get_turf(src))
- QDEL_NULL(pipe_image) //we have to del it, or it might keep a ref somewhere else
+ QDEL_NULL(pipe_image) //we have to qdel it, or it might keep a ref somewhere else
return ..()
// Icons/overlays/underlays
@@ -257,7 +257,7 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new())
#define VENT_SOUND_DELAY 30
/obj/machinery/atmospherics/relaymove(mob/living/user, direction)
direction &= initialize_directions
- if(!direction || !(direction in cardinal)) //cant go this way.
+ if(!direction || !(direction in GLOB.cardinal)) //cant go this way.
return
if(user in buckled_mobs)// fixes buckle ventcrawl edgecase fuck bug
@@ -265,7 +265,7 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new())
var/obj/machinery/atmospherics/target_move = findConnecting(direction)
if(target_move)
- if(is_type_in_list(target_move, ventcrawl_machinery) && target_move.can_crawl_through())
+ if(is_type_in_list(target_move, GLOB.ventcrawl_machinery) && target_move.can_crawl_through())
user.remove_ventcrawl()
user.forceMove(target_move.loc) //handles entering and so on
user.visible_message("You hear something squeezing through the ducts.", "You climb out the ventilation system.")
@@ -278,7 +278,7 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new())
user.last_played_vent = world.time
playsound(src, 'sound/machines/ventcrawl.ogg', 50, 1, -3)
else
- if((direction & initialize_directions) || is_type_in_list(src, ventcrawl_machinery)) //if we move in a way the pipe can connect, but doesn't - or we're in a vent
+ if((direction & initialize_directions) || is_type_in_list(src, GLOB.ventcrawl_machinery)) //if we move in a way the pipe can connect, but doesn't - or we're in a vent
user.remove_ventcrawl()
user.forceMove(src.loc)
user.visible_message("You hear something squeezing through the pipes.", "You climb out the ventilation system.")
@@ -287,7 +287,7 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new())
user.canmove = 1
/obj/machinery/atmospherics/AltClick(var/mob/living/L)
- if(is_type_in_list(src, ventcrawl_machinery))
+ if(is_type_in_list(src, GLOB.ventcrawl_machinery))
L.handle_ventcrawl(src)
return
..()
@@ -343,3 +343,7 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new())
/obj/machinery/atmospherics/update_remote_sight(mob/user)
user.sight |= (SEE_TURFS|BLIND)
. = ..()
+
+//Used for certain children of obj/machinery/atmospherics to not show pipe vision when mob is inside it.
+/obj/machinery/atmospherics/proc/can_see_pipes()
+ return TRUE
diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
index c0ed34ef206..43b3c382c95 100644
--- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
@@ -26,7 +26,6 @@
var/frequency = ATMOS_VENTSCRUB
var/id_tag = null
var/datum/radio_frequency/radio_connection
- var/advcontrol = 0//does this device listen to the AAC
settagwhitelist = list("id_tag")
@@ -75,7 +74,7 @@
/obj/machinery/atmospherics/binary/dp_vent_pump/update_icon(var/safety = 0)
..()
-
+
if(!check_icon_cache())
return
@@ -192,7 +191,7 @@
return 1
/obj/machinery/atmospherics/binary/dp_vent_pump/receive_signal(datum/signal/signal)
- if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command") || (signal.data["advcontrol"] && !advcontrol))
+ if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
return 0
if(signal.data["power"] != null)
on = text2num(signal.data["power"])
@@ -256,14 +255,5 @@
"}
/obj/machinery/atmospherics/unary/vent_scrubber/multitool_topic(var/mob/user, var/list/href_list, var/obj/O)
- if("toggleadvcontrol" in href_list)
- advcontrol = !advcontrol
- return TRUE
-
if("set_id" in href_list)
var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID tag for this machine", src, src:id_tag) as null|text),1,MAX_MESSAGE_LEN)
if(!newid)
diff --git a/code/ATMOSPHERICS/datum_icon_manager.dm b/code/ATMOSPHERICS/datum_icon_manager.dm
index 75cb0fce8ce..2286b3523a0 100644
--- a/code/ATMOSPHERICS/datum_icon_manager.dm
+++ b/code/ATMOSPHERICS/datum_icon_manager.dm
@@ -6,26 +6,16 @@
// atmospherics devices.
//--------------------------------------------
-#define PIPE_COLOR_GREY "#ffffff" //yes white is grey
-#define PIPE_COLOR_RED "#ff0000"
-#define PIPE_COLOR_BLUE "#0000ff"
-#define PIPE_COLOR_CYAN "#00ffff"
-#define PIPE_COLOR_GREEN "#00ff00"
-#define PIPE_COLOR_YELLOW "#ffcc00"
-#define PIPE_COLOR_PURPLE "#5c1ec0"
-
-var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE)
-
/proc/pipe_color_lookup(var/color)
- for(var/C in pipe_colors)
- if(color == pipe_colors[C])
+ for(var/C in GLOB.pipe_colors)
+ if(color == GLOB.pipe_colors[C])
return "[C]"
/proc/pipe_color_check(var/color)
if(!color)
return 1
- for(var/C in pipe_colors)
- if(color == pipe_colors[C])
+ for(var/C in GLOB.pipe_colors)
+ if(color == GLOB.pipe_colors[C])
return 1
return 0
@@ -105,10 +95,10 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_
var/image/I = image('icons/atmos/pipes.dmi', icon_state = state)
pipe_icons[cache_name] = I
- for(var/pipe_color in pipe_colors)
+ for(var/pipe_color in GLOB.pipe_colors)
I = image('icons/atmos/pipes.dmi', icon_state = state)
- I.color = pipe_colors[pipe_color]
- pipe_icons[state + "[pipe_colors[pipe_color]]"] = I
+ I.color = GLOB.pipe_colors[pipe_color]
+ pipe_icons[state + "[GLOB.pipe_colors[pipe_color]]"] = I
pipe = new ('icons/atmos/heat.dmi')
for(var/state in pipe.IconStates())
@@ -137,10 +127,10 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_
if(findtext(state, "core") || findtext(state, "4way"))
var/image/I = image('icons/atmos/manifold.dmi', icon_state = state)
manifold_icons[state] = I
- for(var/pipe_color in pipe_colors)
+ for(var/pipe_color in GLOB.pipe_colors)
I = image('icons/atmos/manifold.dmi', icon_state = state)
- I.color = pipe_colors[pipe_color]
- manifold_icons[state + pipe_colors[pipe_color]] = I
+ I.color = GLOB.pipe_colors[pipe_color]
+ manifold_icons[state + GLOB.pipe_colors[pipe_color]] = I
/datum/pipe_icon_manager/proc/gen_device_icons()
if(!device_icons)
@@ -185,10 +175,10 @@ var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_
var/cache_name = state
- for(var/D in cardinal)
+ for(var/D in GLOB.cardinal)
var/image/I = image(icon('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D))
underlays[cache_name + "[D]"] = I
- for(var/pipe_color in pipe_colors)
+ for(var/pipe_color in GLOB.pipe_colors)
I = image(icon('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D))
- I.color = pipe_colors[pipe_color]
- underlays[state + "[D]" + "[pipe_colors[pipe_color]]"] = I
+ I.color = GLOB.pipe_colors[pipe_color]
+ underlays[state + "[D]" + "[GLOB.pipe_colors[pipe_color]]"] = I
diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm
index 4d849686851..ff9fb9a4ab1 100644
--- a/code/ATMOSPHERICS/datum_pipeline.dm
+++ b/code/ATMOSPHERICS/datum_pipeline.dm
@@ -28,7 +28,7 @@
reconcile_air()
return
-var/pipenetwarnings = 10
+GLOBAL_VAR_INIT(pipenetwarnings, 10)
/datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/base)
var/volume = 0
@@ -127,20 +127,15 @@ var/pipenetwarnings = 10
member.air_temporary = new
member.air_temporary.volume = member.volume
- member.air_temporary.oxygen = air.oxygen*member.volume/air.volume
- member.air_temporary.nitrogen = air.nitrogen*member.volume/air.volume
- member.air_temporary.toxins = air.toxins*member.volume/air.volume
- member.air_temporary.carbon_dioxide = air.carbon_dioxide*member.volume/air.volume
+ member.air_temporary.oxygen = air.oxygen * member.volume / air.volume
+ member.air_temporary.nitrogen = air.nitrogen * member.volume / air.volume
+ member.air_temporary.toxins = air.toxins * member.volume / air.volume
+ member.air_temporary.carbon_dioxide = air.carbon_dioxide * member.volume / air.volume
+ member.air_temporary.sleeping_agent = air.sleeping_agent * member.volume / air.volume
+ member.air_temporary.agent_b = air.agent_b * member.volume / air.volume
member.air_temporary.temperature = air.temperature
- if(air.trace_gases.len)
- for(var/datum/gas/trace_gas in air.trace_gases)
- var/datum/gas/corresponding = new trace_gas.type()
- member.air_temporary.trace_gases += corresponding
-
- corresponding.moles = trace_gas.moles*member.volume/air.volume
-
/datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity)
var/total_heat_capacity = air.heat_capacity()
var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume)
@@ -228,7 +223,8 @@ var/pipenetwarnings = 10
var/total_nitrogen = 0
var/total_toxins = 0
var/total_carbon_dioxide = 0
- var/list/total_trace_gases = list()
+ var/total_sleeping_agent = 0
+ var/total_agent_b = 0
for(var/datum/gas_mixture/G in GL)
total_volume += G.volume
@@ -239,15 +235,8 @@ var/pipenetwarnings = 10
total_nitrogen += G.nitrogen
total_toxins += G.toxins
total_carbon_dioxide += G.carbon_dioxide
-
- if(G.trace_gases.len)
- for(var/datum/gas/trace_gas in G.trace_gases)
- var/datum/gas/corresponding = locate(trace_gas.type) in total_trace_gases
- if(!corresponding)
- corresponding = new trace_gas.type()
- total_trace_gases += corresponding
-
- corresponding.moles += trace_gas.moles
+ total_sleeping_agent += G.sleeping_agent
+ total_agent_b += G.agent_b
if(total_volume > 0)
@@ -259,18 +248,11 @@ var/pipenetwarnings = 10
//Update individual gas_mixtures by volume ratio
for(var/datum/gas_mixture/G in GL)
- G.oxygen = total_oxygen*G.volume/total_volume
- G.nitrogen = total_nitrogen*G.volume/total_volume
- G.toxins = total_toxins*G.volume/total_volume
- G.carbon_dioxide = total_carbon_dioxide*G.volume/total_volume
+ G.oxygen = total_oxygen * G.volume / total_volume
+ G.nitrogen = total_nitrogen * G.volume / total_volume
+ G.toxins = total_toxins * G.volume / total_volume
+ G.carbon_dioxide = total_carbon_dioxide * G.volume / total_volume
+ G.sleeping_agent = total_sleeping_agent * G.volume / total_volume
+ G.agent_b = total_agent_b * G.volume / total_volume
G.temperature = temperature
-
- if(total_trace_gases.len)
- for(var/datum/gas/trace_gas in total_trace_gases)
- var/datum/gas/corresponding = locate(trace_gas.type) in G.trace_gases
- if(!corresponding)
- corresponding = new trace_gas.type()
- G.trace_gases += corresponding
-
- corresponding.moles = trace_gas.moles*G.volume/total_volume
diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm
index 13e35d10c7b..2eef5ad74c4 100644
--- a/code/ATMOSPHERICS/pipes/manifold.dm
+++ b/code/ATMOSPHERICS/pipes/manifold.dm
@@ -33,7 +33,7 @@
/obj/machinery/atmospherics/pipe/manifold/atmos_init()
..()
- for(var/D in cardinal)
+ for(var/D in GLOB.cardinal)
if(D == dir)
continue
for(var/obj/machinery/atmospherics/target in get_step(src, D))
@@ -116,7 +116,7 @@
/obj/machinery/atmospherics/pipe/manifold/update_icon(var/safety = 0)
..()
-
+
if(!check_icon_cache())
return
diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm
index d2cee29c0ba..2b384b3684b 100644
--- a/code/ATMOSPHERICS/pipes/manifold4w.dm
+++ b/code/ATMOSPHERICS/pipes/manifold4w.dm
@@ -90,7 +90,7 @@
/obj/machinery/atmospherics/pipe/manifold4w/update_icon(var/safety = 0)
..()
-
+
if(!check_icon_cache())
return
@@ -137,7 +137,7 @@
/obj/machinery/atmospherics/pipe/manifold4w/atmos_init()
..()
- for(var/D in cardinal)
+ for(var/D in GLOB.cardinal)
for(var/obj/machinery/atmospherics/target in get_step(src, D))
if(target.initialize_directions & get_dir(target,src))
var/c = check_connect_types(target,src)
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm
index b966690733b..7e304170e54 100644
--- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm
+++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm
@@ -48,7 +48,7 @@
if(initPipe)
normalize_dir()
var/N = 2
- for(var/D in cardinal)
+ for(var/D in GLOB.cardinal)
if(D & initialize_directions)
N--
for(var/obj/machinery/atmospherics/target in get_step(src, D))
@@ -87,7 +87,7 @@
else return 1
/obj/machinery/atmospherics/pipe/simple/proc/burst()
- src.visible_message("\The [src] bursts!");
+ src.visible_message("\The [src] bursts!")
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(1,0, src.loc, 0)
@@ -138,7 +138,7 @@
/obj/machinery/atmospherics/pipe/simple/update_icon(var/safety = 0)
..()
-
+
if(!check_icon_cache())
return
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
index 35df3c60d23..9c6b0da2121 100644
--- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
+++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
@@ -69,7 +69,7 @@
if(initPipe)
normalize_dir()
var/N = 2
- for(var/D in cardinal)
+ for(var/D in GLOB.cardinal)
if(D & initialize_directions_he)
N--
for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D))
diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm
index 2fbfb1dff76..30c56f93cc8 100644
--- a/code/LINDA/LINDA_fire.dm
+++ b/code/LINDA/LINDA_fire.dm
@@ -66,7 +66,7 @@
if(!fake)
SSair.hotspots += src
perform_exposure()
- dir = pick(cardinal)
+ dir = pick(GLOB.cardinal)
air_update_turf()
/obj/effect/hotspot/proc/perform_exposure()
@@ -133,7 +133,7 @@
//Possible spread due to radiated heat
if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD)
var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE
- for(var/direction in cardinal)
+ for(var/direction in GLOB.cardinal)
if(!(location.atmos_adjacent_turfs & direction))
var/turf/simulated/wall/W = get_step(src, direction)
if(istype(W))
@@ -176,7 +176,7 @@
if(istype(loc, /turf/simulated))
var/turf/simulated/T = loc
- if(T.to_be_destroyed)
+ if(T.to_be_destroyed && !T.changing_turf)
var/chance_of_deletion
if(T.heat_capacity) //beware of division by zero
chance_of_deletion = T.max_fire_temperature_sustained / T.heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0
@@ -309,7 +309,7 @@
if(dist == max_dist)
continue
- for(var/dir in cardinal)
+ for(var/dir in GLOB.cardinal)
var/turf/link = get_step(T, dir)
if (!link)
continue
diff --git a/code/LINDA/LINDA_system.dm b/code/LINDA/LINDA_system.dm
index fd24dcc0c77..3c8633c2b91 100644
--- a/code/LINDA/LINDA_system.dm
+++ b/code/LINDA/LINDA_system.dm
@@ -62,7 +62,7 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5)
/turf/proc/CalculateAdjacentTurfs()
atmos_adjacent_turfs_amount = 0
- for(var/direction in cardinal)
+ for(var/direction in GLOB.cardinal)
var/turf/T = get_step(src, direction)
if(!istype(T))
continue
@@ -89,7 +89,7 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5)
var/adjacent_turfs = list()
var/turf/simulated/curloc = src
- for(var/direction in cardinal)
+ for(var/direction in GLOB.cardinal)
if(!(curloc.atmos_adjacent_turfs & direction))
continue
@@ -99,11 +99,11 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5)
if(!alldir)
return adjacent_turfs
- for(var/direction in diagonals)
+ for(var/direction in GLOB.diagonals)
var/matchingDirections = 0
var/turf/simulated/S = get_step(curloc, direction)
- for(var/checkDirection in cardinal)
+ for(var/checkDirection in GLOB.cardinal)
if(!(S.atmos_adjacent_turfs & checkDirection))
continue
var/turf/simulated/checkTurf = get_step(S, checkDirection)
@@ -142,7 +142,7 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5)
return
T.atmos_spawn_air(text, amount)
-/turf/simulated/proc/atmos_spawn_air(var/flag, var/amount)
+/turf/simulated/proc/atmos_spawn_air(flag, amount)
if(!text || !amount || !air)
return
@@ -156,17 +156,21 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5)
if(flag & LINDA_SPAWN_TOXINS)
G.toxins += amount
+
if(flag & LINDA_SPAWN_OXYGEN)
G.oxygen += amount
+
if(flag & LINDA_SPAWN_CO2)
G.carbon_dioxide += amount
+
if(flag & LINDA_SPAWN_NITROGEN)
G.nitrogen += amount
if(flag & LINDA_SPAWN_N2O)
- var/datum/gas/sleeping_agent/T = new
- T.moles += amount
- G.trace_gases += T
+ G.sleeping_agent += amount
+
+ if(flag & LINDA_SPAWN_AGENT_B)
+ G.agent_b += amount
if(flag & LINDA_SPAWN_AIR)
G.oxygen += MOLES_O2STANDARD * amount
diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm
index b86ad2299ff..acfa1983f72 100644
--- a/code/LINDA/LINDA_turf_tile.dm
+++ b/code/LINDA/LINDA_turf_tile.dm
@@ -19,20 +19,24 @@
GM.carbon_dioxide = carbon_dioxide
GM.nitrogen = nitrogen
GM.toxins = toxins
+ GM.sleeping_agent = sleeping_agent
+ GM.agent_b = agent_b
GM.temperature = temperature
return GM
-/turf/remove_air(amount as num)
+/turf/remove_air(amount)
var/datum/gas_mixture/GM = new
- var/sum = oxygen + carbon_dioxide + nitrogen + toxins
- if(sum>0)
- GM.oxygen = (oxygen/sum)*amount
- GM.carbon_dioxide = (carbon_dioxide/sum)*amount
- GM.nitrogen = (nitrogen/sum)*amount
- GM.toxins = (toxins/sum)*amount
+ var/sum = oxygen + carbon_dioxide + nitrogen + toxins + sleeping_agent + agent_b
+ if(sum > 0)
+ GM.oxygen = (oxygen / sum) * amount
+ GM.carbon_dioxide = (carbon_dioxide / sum) * amount
+ GM.nitrogen = (nitrogen / sum) * amount
+ GM.toxins = (toxins / sum) * amount
+ GM.sleeping_agent = (sleeping_agent / sum) * amount
+ GM.agent_b = (agent_b / sum) * amount
GM.temperature = temperature
@@ -53,7 +57,7 @@
var/temperature_archived //USED ONLY FOR SOLIDS
- var/atmos_overlay_type = "" //current active overlay
+ var/atmos_overlay_type = null //current active overlay
/turf/simulated/New()
..()
@@ -64,12 +68,14 @@
air.carbon_dioxide = carbon_dioxide
air.nitrogen = nitrogen
air.toxins = toxins
+ air.sleeping_agent = sleeping_agent
+ air.agent_b = agent_b
air.temperature = temperature
/turf/simulated/Destroy()
- visibilityChanged()
QDEL_NULL(active_hotspot)
+ QDEL_NULL(wet_overlay)
return ..()
/turf/simulated/assume_air(datum/gas_mixture/giver)
@@ -100,7 +106,7 @@
else
return ..()
-/turf/simulated/remove_air(amount as num)
+/turf/simulated/remove_air(amount)
if(air)
var/datum/gas_mixture/removed = null
@@ -149,13 +155,13 @@
if (planet_atmos)
atmos_adjacent_turfs_amount++
- for(var/direction in cardinal)
+ for(var/direction in GLOB.cardinal)
if(!(atmos_adjacent_turfs & direction))
continue
var/turf/enemy_tile = get_step(src, direction)
- if(istype(enemy_tile,/turf/simulated))
+ if(istype(enemy_tile, /turf/simulated))
var/turf/simulated/enemy_simulated = enemy_tile
if(current_cycle > enemy_simulated.current_cycle)
@@ -211,7 +217,13 @@
if(planet_atmos) //share our air with the "atmosphere" "above" the turf
var/datum/gas_mixture/G = new
- G.copy_from_turf(src)
+ G.oxygen = oxygen
+ G.carbon_dioxide = carbon_dioxide
+ G.nitrogen = nitrogen
+ G.toxins = toxins
+ G.sleeping_agent = sleeping_agent
+ G.agent_b = agent_b
+ G.temperature = initial(temperature) // Temperature is modified at runtime; we only care about the turf's initial temperature
G.archive()
if(!air.compare(G))
if(!excited_group)
@@ -260,9 +272,9 @@
/turf/simulated/proc/get_atmos_overlay_by_name(name)
switch(name)
if("plasma")
- return plmaster
+ return GLOB.plmaster
if("sleeping_agent")
- return slmaster
+ return GLOB.slmaster
return null
/turf/simulated/proc/tile_graphic()
@@ -271,8 +283,7 @@
if(air.toxins > MOLES_PLASMA_VISIBLE)
return "plasma"
- var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air.trace_gases
- if(sleeping_agent && (sleeping_agent.moles > 1))
+ if(air.sleeping_agent > 1)
return "sleeping_agent"
return null
@@ -340,7 +351,7 @@
reset_cooldowns()
/datum/excited_group/proc/merge_groups(var/datum/excited_group/E)
- if(turf_list.len > E.turf_list.len)
+ if(length(turf_list) > length(E.turf_list))
SSair.excited_groups -= E
for(var/turf/simulated/T in E.turf_list)
T.excited_group = src
@@ -358,32 +369,26 @@
/datum/excited_group/proc/self_breakdown()
var/datum/gas_mixture/A = new
- var/datum/gas/sleeping_agent/S = new
- A.trace_gases += S
- for(var/turf/simulated/T in turf_list)
- A.oxygen += T.air.oxygen
- A.carbon_dioxide+= T.air.carbon_dioxide
- A.nitrogen += T.air.nitrogen
- A.toxins += T.air.toxins
- if(T.air.trace_gases.len)
- for(var/datum/gas/N in T.air.trace_gases)
- S.moles += N.moles
+ var/list/cached_turf_list = turf_list // cache for super speed
- for(var/turf/simulated/T in turf_list)
- T.air.oxygen = A.oxygen/turf_list.len
- T.air.carbon_dioxide= A.carbon_dioxide/turf_list.len
- T.air.nitrogen = A.nitrogen/turf_list.len
- T.air.toxins = A.toxins/turf_list.len
+ for(var/turf/simulated/T in cached_turf_list)
+ A.oxygen += T.air.oxygen
+ A.carbon_dioxide += T.air.carbon_dioxide
+ A.nitrogen += T.air.nitrogen
+ A.toxins += T.air.toxins
+ A.sleeping_agent += T.air.sleeping_agent
+ A.agent_b += T.air.agent_b
- if(S.moles > 0)
- if(T.air.trace_gases.len)
- for(var/datum/gas/G in T.air.trace_gases)
- G.moles = S.moles/turf_list.len
- else
- var/datum/gas/sleeping_agent/G = new
- G.moles = S.moles/turf_list.len
- T.air.trace_gases += G
+ var/turflen = length(cached_turf_list)
+
+ for(var/turf/simulated/T in cached_turf_list)
+ T.air.oxygen = A.oxygen / turflen
+ T.air.carbon_dioxide = A.carbon_dioxide / turflen
+ T.air.nitrogen = A.nitrogen / turflen
+ T.air.toxins = A.toxins / turflen
+ T.air.sleeping_agent = A.sleeping_agent / turflen
+ T.air.agent_b = A.agent_b / turflen
T.update_visuals()
@@ -412,13 +417,13 @@
archive()
else
//Does particate in air exchange so only consider directions not considered during process_cell()
- for(var/direction in cardinal)
+ for(var/direction in GLOB.cardinal)
if(!(atmos_adjacent_turfs & direction) && !(atmos_supeconductivity & direction))
conductivity_directions += direction
if(conductivity_directions>0)
//Conduct with tiles around me
- for(var/direction in cardinal)
+ for(var/direction in GLOB.cardinal)
if(conductivity_directions&direction)
var/turf/neighbor = get_step(src,direction)
@@ -499,7 +504,7 @@ turf/simulated/proc/radiate_to_spess() //Radiate excess tile heat to space
/turf/simulated/Initialize_Atmos(times_fired)
..()
update_visuals()
- for(var/direction in cardinal)
+ for(var/direction in GLOB.cardinal)
if(!(atmos_adjacent_turfs & direction))
continue
var/turf/enemy_tile = get_step(src, direction)
diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm
index cbcf2c1dd90..e2068cecb89 100644
--- a/code/__DEFINES/MC.dm
+++ b/code/__DEFINES/MC.dm
@@ -32,17 +32,16 @@
// (Requires a MC restart to change)
#define SS_NO_FIRE 2
-//subsystem only runs on spare cpu (after all non-background subsystems have ran that tick)
-// SS_BACKGROUND has its own priority bracket
+/** Subsystem only runs on spare cpu (after all non-background subsystems have ran that tick) */
+/// SS_BACKGROUND has its own priority bracket, this overrides SS_TICKER's priority bump
#define SS_BACKGROUND 4
//subsystem does not tick check, and should not run unless there is enough time (or its running behind (unless background))
#define SS_NO_TICK_CHECK 8
//Treat wait as a tick count, not DS, run every wait ticks.
-// (also forces it to run first in the tick, above even SS_NO_TICK_CHECK subsystems)
+/// (also forces it to run first in the tick (unless SS_BACKGROUND))
// (implies all runlevels because of how it works)
-// (overrides SS_BACKGROUND)
// This is designed for basically anything that works as a mini-mc (like SStimer)
#define SS_TICKER 16
diff --git a/code/__DEFINES/_spacemandmm.dm b/code/__DEFINES/_spacemandmm.dm
new file mode 100644
index 00000000000..ca54ca4b932
--- /dev/null
+++ b/code/__DEFINES/_spacemandmm.dm
@@ -0,0 +1,26 @@
+// This file contains all the defines related to the spacemanDMM linter (dreamchecker). When running under normal conditions, BYOND will ignore all these
+#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)
+ #define SHOULD_NOT_OVERRIDE(X) set SpacemanDMM_should_not_override = X
+ #define SHOULD_NOT_SLEEP(X)
+ #define SHOULD_BE_PURE(X)
+ #define PRIVATE_PROC(X)
+ #define PROTECTED_PROC(X)
+ #define VAR_FINAL var/SpacemanDMM_final
+ #define VAR_PRIVATE var
+ #define VAR_PROTECTED var
+#else
+ #define RETURN_TYPE(X)
+ #define SHOULD_CALL_PARENT(X)
+ #define UNLINT(X) X
+ #define SHOULD_NOT_OVERRIDE(X)
+ #define SHOULD_NOT_SLEEP(X)
+ #define SHOULD_BE_PURE(X)
+ #define PRIVATE_PROC(X)
+ #define PROTECTED_PROC(X)
+ #define VAR_FINAL var
+ #define VAR_PRIVATE var
+ #define VAR_PROTECTED var
+#endif
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index bbf394c6c0b..95494fb88cf 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -40,10 +40,11 @@
#define R_MOD 8192
#define R_MENTOR 16384
#define R_PROCCALL 32768
+#define R_VIEWRUNTIMES 65536
-#define R_MAXPERMISSION 32768 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
+#define R_MAXPERMISSION 65536 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
-#define R_HOST 65535
+#define R_HOST 131071 // Sum of all permissions to allow easy setting
#define ADMIN_QUE(user,display) "[display]"
#define ADMIN_FLW(user,display) "[display]"
diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm
index c39ce0947de..1678ea69c8e 100644
--- a/code/__DEFINES/clothing.dm
+++ b/code/__DEFINES/clothing.dm
@@ -78,7 +78,7 @@
//flags for covering body parts
#define GLASSESCOVERSEYES 1
-#define MASKCOVERSEYES 2 // get rid of some of the other retardation in these flags
+#define MASKCOVERSEYES 2 // get rid of some of the other mess in these flags
#define HEADCOVERSEYES 4 // feel free to realloc these numbers for other purposes
#define MASKCOVERSMOUTH 8 // on other items, these are just for mask/head
#define HEADCOVERSMOUTH 16
@@ -92,8 +92,6 @@
#define BLOCKHEADHAIR 4 // temporarily removes the user's hair overlay. Leaves facial hair.
#define BLOCKHAIR 32768 // temporarily removes the user's hair, facial and otherwise.
-#define ONESIZEFITSALL 1 // determines if something can be worn by a fatty or not.
-
//flags for muzzle speech blocking
#define MUZZLE_MUTE_NONE 0 // Does not mute you.
#define MUZZLE_MUTE_MUFFLE 1 // Muffles everything you say "MHHPHHMMM!!!
diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index 13f7777d386..2bb53c91ce4 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -99,3 +99,12 @@
#define COLOR_ASSEMBLY_LBLUE "#5D99BE"
#define COLOR_ASSEMBLY_BLUE "#38559E"
#define COLOR_ASSEMBLY_PURPLE "#6F6192"
+
+// Pipe colours
+#define PIPE_COLOR_GREY "#ffffff" //yes white is grey
+#define PIPE_COLOR_RED "#ff0000"
+#define PIPE_COLOR_BLUE "#0000ff"
+#define PIPE_COLOR_CYAN "#00ffff"
+#define PIPE_COLOR_GREEN "#00ff00"
+#define PIPE_COLOR_YELLOW "#ffcc00"
+#define PIPE_COLOR_PURPLE "#5c1ec0"
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 956930aae70..2f98b6ee7b5 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -35,7 +35,6 @@
#define CANPUSH 8
#define PASSEMOTES 16 //Mob has a cortical borer or holders inside of it that need to see emotes.
#define GOTTAGOFAST 32
-#define GOTTAGOFAST_METH 64
#define IGNORESLOWDOWN 128
#define GODMODE 4096
#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
deleted file mode 100644
index c9691c195b8..00000000000
--- a/code/__DEFINES/components.dm
+++ /dev/null
@@ -1,291 +0,0 @@
-#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) )
-
-#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) )
-
-//shorthand
-#define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path)
-#define GET_COMPONENT(varname, path) GET_COMPONENT_FROM(varname, path, src)
-
-#define COMPONENT_INCOMPATIBLE 1
-
-// How multiple components of the exact same type are handled in the same datum
-
-#define COMPONENT_DUPE_HIGHLANDER 0 //old component is deleted (default)
-#define COMPONENT_DUPE_ALLOWED 1 //duplicates allowed
-#define COMPONENT_DUPE_UNIQUE 2 //new component is deleted
-#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 //old component is given the initialization args of the new
-
-// All signals. Format:
-// When the signal is called: (signal arguments)
-// All signals send the source datum of the signal as the first argument
-
-// global signals
-// These are signals which can be listened to by any component on any parent
-// start global signals with "!", this used to be necessary but now it's just a formatting choice
-#define COMSIG_GLOB_NEW_Z "!new_z" //from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args)
-#define COMSIG_GLOB_VAR_EDIT "!var_edit" //called after a successful var edit somewhere in the world: (list/args)
-#define COMSIG_GLOB_MOB_CREATED "!mob_created" //mob was created somewhere : (mob)
-#define COMSIG_GLOB_MOB_DEATH "!mob_death" //mob died somewhere : (mob , gibbed)
-
-//////////////////////////////////////////////////////////////////
-
-// /datum signals
-#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_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
-#define COMSIG_TOPIC "handle_topic" //generic topic handler (usr, href_list)
-
-// /atom signals
-#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params)
- #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called
-#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human)
-#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob, result)
-#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides)
- //Positions for overrides list
- #define EXAMINE_POSITION_ARTICLE 1
- #define EXAMINE_POSITION_BEFORE 2
- //End positions
- #define COMPONENT_EXNAME_CHANGED 1
-#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom)
-#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc)
-#define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc)
- #define COMPONENT_ATOM_BLOCK_EXIT 1
-#define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target)
-#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //from base of atom/emp_act(): (severity)
-#define COMSIG_ATOM_FIRE_ACT "atom_fire_act" //from base of atom/fire_act(): (exposed_temperature, exposed_volume)
-#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" //from base of atom/bullet_act(): (/obj/item/projectile, def_zone)
-#define COMSIG_ATOM_BLOB_ACT "atom_blob_act" //from base of atom/blob_act(): (/obj/structure/blob)
-#define COMSIG_ATOM_ACID_ACT "atom_acid_act" //from base of atom/acid_act(): (acidpwr, acid_volume)
-#define COMSIG_ATOM_EMAG_ACT "atom_emag_act" //from base of atom/emag_act(): ()
-#define COMSIG_ATOM_RAD_ACT "atom_rad_act" //from base of atom/rad_act(intensity)
-#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act" //from base of atom/narsie_act(): ()
-#define COMSIG_ATOM_RATVAR_ACT "atom_ratvar_act" //from base of atom/ratvar_act(): ()
-#define COMSIG_ATOM_RCD_ACT "atom_rcd_act" //from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode)
-#define COMSIG_ATOM_SING_PULL "atom_sing_pull" //from base of atom/singularity_pull(): (S, current_size)
-#define COMSIG_ATOM_SET_LIGHT "atom_set_light" //from base of atom/set_light(): (l_range, l_power, l_color)
-#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" //from base of atom/setDir(): (old_dir, new_dir)
-#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" //from base of atom/handle_atom_del(): (atom/deleted)
-#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" //from base of atom/has_gravity(): (turf/location, list/forced_gravities)
-#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe" //from proc/get_rad_contents(): ()
- #define COMPONENT_BLOCK_RADIATION 1
-#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam" //from base of datum/radiation_wave/radiate(): (strength)
- #define COMPONENT_BLOCK_CONTAMINATION 1
-#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass" //from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width)
- #define COMPONENT_RAD_WAVE_HANDLED 1
-#define COMSIG_ATOM_CANREACH "atom_can_reach" //from internal loop in atom/movable/proc/CanReach(): (list/next)
- #define COMPONENT_BLOCK_REACH 1
-#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act" //from base of atom/screwdriver_act(): (mob/living/user, obj/item/I)
-/////////////////
-#define COMSIG_ATOM_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.
-/////////////////
-
-#define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area)
-#define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area)
-
-#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user)
-#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob)
-#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob)
-#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob)
-#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob)
-#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //from base of atom/MouseDrop(): (/atom/over, /mob/user)
- #define COMPONENT_NO_MOUSEDROP 1
-#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user)
-
-// /area signals
-#define COMSIG_AREA_ENTERED "area_entered" //from base of area/Entered(): (atom/movable/M)
-#define COMSIG_AREA_EXITED "area_exited" //from base of area/Exited(): (atom/movable/M)
-
-// /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)
-
-// /atom/movable signals
-#define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir)
-#define COMSIG_MOVABLE_CROSS "movable_cross" //from base of atom/movable/Cross(): (/atom/movable)
-#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable)
-#define COMSIG_CROSSED_MOVABLE "crossed_movable" //when we cross over something (calling Crossed() on that atom)
-#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed" //from base of atom/movable/Uncrossed(): (/atom/movable)
-#define COMSIG_MOVABLE_UNCROSS "movable_uncross" //from base of atom/movable/Uncross(): (/atom/movable)
- #define COMPONENT_MOVABLE_BLOCK_UNCROSS 1
-#define COMSIG_MOVABLE_BUMP "movable_bump" //from base of atom/movable/Bump(): (/atom)
-#define COMSIG_MOVABLE_IMPACT "movable_impact" //from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum)
-#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone" //from base of mob/living/hitby(): (mob/living/target, hit_zone)
-#define COMSIG_MOVABLE_BUCKLE "buckle" //from base of atom/movable/buckle_mob(): (mob, force)
-#define COMSIG_MOVABLE_UNBUCKLE "unbuckle" //from base of atom/movable/unbuckle_mob(): (mob, force)
-#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw" //from base of atom/movable/throw_at(): (list/args)
- #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_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)
-
-// /mob signals
-#define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed)
-#define COMSIG_MOB_CLICKON "mob_clickon" //from base of mob/clickon(): (atom/A, params)
- #define COMSIG_MOB_CANCEL_CLICKON 1
-#define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj
-#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (magic, holy, protection_sources)
- #define COMPONENT_BLOCK_MAGIC 1
-#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 COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters)
-#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params)
-#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target)
-#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): ()
-
-// /mob/living signals
-#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living)
-#define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living)
-#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living)
-#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage)
-#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: ()
-
-//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS!
-#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore)
-#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //from base of mob/living/Knockdown() (amount, update, ignore)
-#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze" //from base of mob/living/Paralyze() (amount, update, ignore)
-#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize" //from base of mob/living/Immobilize() (amount, update, ignore)
-#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //from base of mob/living/Unconscious() (amount, update, ignore)
-#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //from base of mob/living/Sleeping() (amount, update, ignore)
- #define COMPONENT_NO_STUN 1 //For all of them
-
-// /mob/living/carbon signals
-#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity))
-
-// /mob/living/simple_animal/hostile signals
-#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget"
- #define COMPONENT_HOSTILE_NO_ATTACK 1
-
-// /obj signals
-#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled)
-#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value)
-#define COMSIG_OBJ_UPDATE_ICON "obj_update_icon" //called in /obj/update_icon()
-
-
-// /obj/item signals
-#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user)
-#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob)
- #define COMPONENT_NO_INTERACT 1
-#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob)
- #define COMPONENT_NO_ATTACK_OBJ 1
-#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params)
- #define COMPONENT_NO_ATTACK 1
-#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params)
-#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot)
-#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user)
-#define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker)
-#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" //from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone)
-#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user)
-#define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args)
-
-// /obj/item/clothing signals
-#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): ()
-
-// /obj/item/implant signals
-#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): ()
-#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //from base of /obj/item/implant/proc/implant(): (list/args)
- #define COMPONENT_STOP_IMPLANTING 1
-#define COMSIG_IMPLANT_OTHER "implant_other" //called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant)
- //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both
- #define COMPONENT_DELETE_NEW_IMPLANT 2
- #define COMPONENT_DELETE_OLD_IMPLANT 4
-#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //called on implants being implanted into someone with an uplink implant: (datum/component/uplink)
- //This uses all return values of COMSIG_IMPLANT_OTHER
-
-// /obj/item/pda signals
-#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone)
- #define COMPONENT_STOP_RINGTONE_CHANGE 1
-
-// /obj/item/radio signals
-#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //called from base of /obj/item/radio/proc/set_frequency(): (list/args)
-
-// /obj/item/pen signals
-#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user)
-
-
-// /mob/living/carbon/human signals
-#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target)
-#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker)
-#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted)
-
-// /datum/species signals
-#define COMSIG_SPECIES_GAIN "species_gain" //from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species)
-#define COMSIG_SPECIES_LOSS "species_loss" //from datum/species/on_species_loss(): (datum/species/lost_species)
-
-/*******Component Specific Signals*******/
-//Janitor
-#define COMSIG_TURF_IS_WET "check_turf_wet" //(): Returns bitflags of wet values.
-#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool.
-#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength)
-
-//Food
-#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder)
-
-//Mood
-#define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code.
-#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code.
-
-//NTnet
-#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata))
-
-//Nanites
-#define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found
-#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list
-#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount
-#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount
-#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount
-#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount
-#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount
-#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount
-#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob.
-#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected
-#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs
-#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component
- #define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful
- #define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites
-#define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component
-
-// /datum/component/storage signals
-#define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool.
-#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //(obj/item/inserting, mob/user, silent, force) - returns bool
-#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force) - returns bool.
-#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //(mob/hide_from) - returns bool
-#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //returns bool
-#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //(newstate)
-#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST!
-#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types.
-#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items.
-#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool
-#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location.
-#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE)
-#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool
-
-// /datum/action signals
-#define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action)
- #define COMPONENT_ACTION_BLOCK_TRIGGER 1
-
-/*******Non-Signal Component Related Defines*******/
-
-//Redirection component init flags
-#define REDIRECT_TRANSFER_WITH_TURF 1
-
-//Arch
-#define ARCH_PROB "probability" //Probability for each item
-#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount
-
-//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/criminal_status.dm b/code/__DEFINES/criminal_status.dm
new file mode 100644
index 00000000000..75c33909fc2
--- /dev/null
+++ b/code/__DEFINES/criminal_status.dm
@@ -0,0 +1,10 @@
+//criminal status defines
+#define SEC_RECORD_STATUS_NONE "None"
+#define SEC_RECORD_STATUS_ARREST "*Arrest*"
+#define SEC_RECORD_STATUS_EXECUTE "*Execute*"
+#define SEC_RECORD_STATUS_INCARCERATED "Incarcerated"
+#define SEC_RECORD_STATUS_RELEASED "Released"
+#define SEC_RECORD_STATUS_PAROLLED "Parolled"
+#define SEC_RECORD_STATUS_DEMOTE "Demote"
+#define SEC_RECORD_STATUS_SEARCH "Search"
+#define SEC_RECORD_STATUS_MONITOR "Monitor"
diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm
new file mode 100644
index 00000000000..128c9f19387
--- /dev/null
+++ b/code/__DEFINES/dcs/flags.dm
@@ -0,0 +1,41 @@
+/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type.
+/// `parent` must not be modified if this is to be returned.
+/// This will be noted in the runtime logs
+#define COMPONENT_INCOMPATIBLE 1
+/// Returned in PostTransfer to prevent transfer, similar to `COMPONENT_INCOMPATIBLE`
+#define COMPONENT_NOTRANSFER 2
+
+/// Return value to cancel attaching
+#define ELEMENT_INCOMPATIBLE 1
+
+// /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
+/// old component is deleted (default)
+#define COMPONENT_DUPE_HIGHLANDER 0
+/// duplicates allowed
+#define COMPONENT_DUPE_ALLOWED 1
+/// new component is deleted
+#define COMPONENT_DUPE_UNIQUE 2
+/// old component is given the initialization args of the new
+#define COMPONENT_DUPE_UNIQUE_PASSARGS 4
+/// each component of the same type is consulted as to whether the duplicate should be allowed
+#define COMPONENT_DUPE_SELECTIVE 5
+
+//Redirection component init flags
+#define REDIRECT_TRANSFER_WITH_TURF 1
+
+//Arch
+#define ARCH_PROB "probability" //Probability for each item
+#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount
+
+//Ouch my toes!
+#define CALTROP_BYPASS_SHOES 1
+#define CALTROP_IGNORE_WALKERS 2
diff --git a/code/__DEFINES/dcs/helpers.dm b/code/__DEFINES/dcs/helpers.dm
new file mode 100644
index 00000000000..144e94f1fe0
--- /dev/null
+++ b/code/__DEFINES/dcs/helpers.dm
@@ -0,0 +1,15 @@
+/// Used to trigger signals and call procs registered for that signal
+/// The datum hosting the signal is automaticaly added as the first argument
+/// Returns a bitfield gathered from all registered procs
+/// Arguments given here are packaged in a list and given to _SendSignal
+#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) )
+
+#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) )
+
+/// A wrapper for _AddElement that allows us to pretend we're using normal named arguments
+#define AddElement(arguments...) _AddElement(list(##arguments))
+/// A wrapper for _RemoveElement that allows us to pretend we're using normal named arguments
+#define RemoveElement(arguments...) _RemoveElement(list(##arguments))
+
+/// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments
+#define AddComponent(arguments...) _AddComponent(list(##arguments))
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
new file mode 100644
index 00000000000..10aa1718dda
--- /dev/null
+++ b/code/__DEFINES/dcs/signals.dm
@@ -0,0 +1,728 @@
+// All signals. Format:
+// When the signal is called: (signal arguments)
+// All signals send the source datum of the signal as the first argument
+
+// global signals
+// These are signals which can be listened to by any component on any parent
+// start global signals with "!", this used to be necessary but now it's just a formatting choice
+
+///from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args)
+#define COMSIG_GLOB_NEW_Z "!new_z"
+/// called after a successful var edit somewhere in the world: (list/args)
+#define COMSIG_GLOB_VAR_EDIT "!var_edit"
+/// called after an explosion happened : (epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
+#define COMSIG_GLOB_EXPLOSION "!explosion"
+/// mob was created somewhere : (mob)
+#define COMSIG_GLOB_MOB_CREATED "!mob_created"
+/// mob died somewhere : (mob , gibbed)
+#define COMSIG_GLOB_MOB_DEATH "!mob_death"
+/// global living say plug - use sparingly: (mob/speaker , message)
+#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special"
+/// called by datum/cinematic/play() : (datum/cinematic/new_cinematic)
+#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic"
+ #define COMPONENT_GLOB_BLOCK_CINEMATIC (1<<0)
+/// ingame button pressed (/obj/machinery/button/button)
+#define COMSIG_GLOB_BUTTON_PRESSED "!button_pressed"
+
+/// signals from globally accessible objects
+
+///from SSsun when the sun changes position : (azimuth)
+#define COMSIG_SUN_MOVED "sun_moved"
+
+//////////////////////////////////////////////////////////////////
+
+// /datum signals
+/// when a component is added to a datum: (/datum/component)
+#define COMSIG_COMPONENT_ADDED "component_added"
+/// before a component is removed from a datum because of RemoveComponent: (/datum/component)
+#define COMSIG_COMPONENT_REMOVING "component_removing"
+/// before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation
+#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted"
+/// 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
+#define COMSIG_PARENT_QDELETING "parent_qdeleting"
+/// generic topic handler (usr, href_list)
+#define COMSIG_TOPIC "handle_topic"
+
+/// fires on the target datum when an element is attached to it (/datum/element)
+#define COMSIG_ELEMENT_ATTACH "element_attach"
+/// fires on the target datum when an element is attached to it (/datum/element)
+#define COMSIG_ELEMENT_DETACH "element_detach"
+
+// /atom signals
+///from base of atom/proc/Initialize(): sent any time a new atom is created
+#define COMSIG_ATOM_CREATED "atom_created"
+//from SSatoms InitAtom - Only if the atom was not deleted or failed initialization
+#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success"
+///from base of atom/attackby(): (/obj/item, /mob/living, params)
+#define COMSIG_PARENT_ATTACKBY "atom_attackby"
+///Return this in response if you don't want afterattack to be called
+ #define COMPONENT_NO_AFTERATTACK (1<<0)
+///from base of atom/attack_hulk(): (/mob/living/carbon/human)
+#define COMSIG_ATOM_HULK_ATTACK "hulk_attack"
+///from base of atom/animal_attack(): (/mob/user)
+#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal"
+///from base of atom/examine(): (/mob)
+#define COMSIG_PARENT_EXAMINE "atom_examine"
+///from base of atom/get_examine_name(): (/mob, list/overrides)
+#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name"
+ //Positions for overrides list
+ #define EXAMINE_POSITION_ARTICLE (1<<0)
+ #define EXAMINE_POSITION_BEFORE (1<<1)
+ //End positions
+ #define COMPONENT_EXNAME_CHANGED (1<<0)
+///from base of atom/update_icon(): ()
+#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon"
+ #define COMSIG_ATOM_NO_UPDATE_ICON_STATE (1<<0)
+ #define COMSIG_ATOM_NO_UPDATE_OVERLAYS (1<<1)
+///from base of atom/update_overlays(): (list/new_overlays)
+#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays"
+///from base of atom/update_icon(): (signalOut, did_anything)
+#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon"
+///from base of atom/Entered(): (atom/movable/entering, /atom)
+#define COMSIG_ATOM_ENTERED "atom_entered"
+///from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc)
+#define COMSIG_ATOM_EXIT "atom_exit"
+ #define COMPONENT_ATOM_BLOCK_EXIT (1<<0)
+///from base of atom/Exited(): (atom/movable/exiting, atom/newloc)
+#define COMSIG_ATOM_EXITED "atom_exited"
+///from base of atom/Bumped(): (/atom/movable)
+#define COMSIG_ATOM_BUMPED "atom_bumped"
+///from base of atom/ex_act(): (severity, target)
+#define COMSIG_ATOM_EX_ACT "atom_ex_act"
+///from base of atom/emp_act(): (severity)
+#define COMSIG_ATOM_EMP_ACT "atom_emp_act"
+///from base of atom/fire_act(): (exposed_temperature, exposed_volume)
+#define COMSIG_ATOM_FIRE_ACT "atom_fire_act"
+///from base of atom/bullet_act(): (/obj/projectile, def_zone)
+#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act"
+///from base of atom/blob_act(): (/obj/structure/blob)
+#define COMSIG_ATOM_BLOB_ACT "atom_blob_act"
+///from base of atom/acid_act(): (acidpwr, acid_volume)
+#define COMSIG_ATOM_ACID_ACT "atom_acid_act"
+///from base of atom/emag_act(): (/mob/user)
+#define COMSIG_ATOM_EMAG_ACT "atom_emag_act"
+///from base of atom/rad_act(intensity)
+#define COMSIG_ATOM_RAD_ACT "atom_rad_act"
+///from base of atom/narsie_act(): ()
+#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act"
+///from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode)
+#define COMSIG_ATOM_RCD_ACT "atom_rcd_act"
+///from base of atom/singularity_pull(): (S, current_size)
+#define COMSIG_ATOM_SING_PULL "atom_sing_pull"
+///from obj/machinery/bsa/full/proc/fire(): ()
+#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass"
+ #define COMSIG_ATOM_BLOCKS_BSA_BEAM (1<<0)
+///from base of atom/set_light(): (l_range, l_power, l_color)
+#define COMSIG_ATOM_SET_LIGHT "atom_set_light"
+///from base of atom/setDir(): (old_dir, new_dir)
+#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change"
+///from base of atom/handle_atom_del(): (atom/deleted)
+#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del"
+///from base of atom/has_gravity(): (turf/location, list/forced_gravities)
+#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity"
+///from proc/get_rad_contents(): ()
+#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe"
+ #define COMPONENT_BLOCK_RADIATION (1<<0)
+///from base of datum/radiation_wave/radiate(): (strength)
+#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam"
+ #define COMPONENT_BLOCK_CONTAMINATION (1<<0)
+///from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width)
+#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass"
+ #define COMPONENT_RAD_WAVE_HANDLED (1<<0)
+///from internal loop in atom/movable/proc/CanReach(): (list/next)
+#define COMSIG_ATOM_CANREACH "atom_can_reach"
+ #define COMPONENT_BLOCK_REACH (1<<0)
+///from base of atom/screwdriver_act(): (mob/living/user, obj/item/I)
+#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act"
+///from base of atom/wrench_act(): (mob/living/user, obj/item/I)
+#define COMSIG_ATOM_WRENCH_ACT "atom_wrench_act"
+///from base of atom/multitool_act(): (mob/living/user, obj/item/I)
+#define COMSIG_ATOM_MULTITOOL_ACT "atom_multitool_act"
+///from base of atom/welder_act(): (mob/living/user, obj/item/I)
+#define COMSIG_ATOM_WELDER_ACT "atom_welder_act"
+///from base of atom/wirecutter_act(): (mob/living/user, obj/item/I)
+#define COMSIG_ATOM_WIRECUTTER_ACT "atom_wirecutter_act"
+///from base of atom/crowbar_act(): (mob/living/user, obj/item/I)
+#define COMSIG_ATOM_CROWBAR_ACT "atom_crowbar_act"
+///from base of atom/analyser_act(): (mob/living/user, obj/item/I)
+#define COMSIG_ATOM_ANALYSER_ACT "atom_analyser_act"
+ #define COMPONENT_BLOCK_TOOL_ATTACK (1<<0)
+///called when teleporting into a protected turf: (channel, turf/origin)
+#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport"
+ #define COMPONENT_BLOCK_TELEPORT (1<<0)
+///called when an atom is added to the hearers on get_hearers_in_view(): (list/processing_list, list/hearers)
+#define COMSIG_ATOM_HEARER_IN_VIEW "atom_hearer_in_view"
+///called when an atom starts orbiting another atom: (atom)
+#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin"
+///called when an atom stops orbiting another atom: (atom)
+#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop"
+/////////////////
+///from base of atom/attack_ghost(): (mob/dead/observer/ghost)
+#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost"
+///from base of atom/attack_hand(): (mob/user)
+#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand"
+///from base of atom/attack_paw(): (mob/user)
+#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw"
+ #define COMPONENT_NO_ATTACK_HAND (1<<0) //works on all 3.
+//This signal return value bitflags can be found in __DEFINES/misc.dm
+
+///called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels)
+#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact"
+///called on a movable (NOT living) when someone starts pulling it (atom/movable/puller, state, force)
+#define COMSIG_ATOM_START_PULL "movable_start_pull"
+///called on /living when someone starts pulling it (atom/movable/puller, state, force)
+#define COMSIG_LIVING_START_PULL "living_start_pull"
+
+/////////////////
+
+///from base of area/Entered(): (/area)
+#define COMSIG_ENTER_AREA "enter_area"
+///from base of area/Exited(): (/area)
+#define COMSIG_EXIT_AREA "exit_area"
+///from base of atom/Click(): (location, control, params, mob/user)
+#define COMSIG_CLICK "atom_click"
+///from base of atom/ShiftClick(): (/mob)
+#define COMSIG_CLICK_SHIFT "shift_click"
+ #define COMPONENT_ALLOW_EXAMINATE (1<<0) //Allows the user to examinate regardless of client.eye.
+///from base of atom/CtrlClickOn(): (/mob)
+#define COMSIG_CLICK_CTRL "ctrl_click"
+///from base of atom/AltClick(): (/mob)
+#define COMSIG_CLICK_ALT "alt_click"
+///from base of atom/CtrlShiftClick(/mob)
+#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click"
+///from base of atom/MouseDrop(): (/atom/over, /mob/user)
+#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto"
+ #define COMPONENT_NO_MOUSEDROP (1<<0)
+///from base of atom/MouseDrop_T: (/atom/from, /mob/user)
+#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto"
+
+// /area signals
+
+///from base of area/Entered(): (atom/movable/M)
+#define COMSIG_AREA_ENTERED "area_entered"
+///from base of area/Exited(): (atom/movable/M)
+#define COMSIG_AREA_EXITED "area_exited"
+
+// /turf signals
+
+///from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps)
+#define COMSIG_TURF_CHANGE "turf_change"
+///from base of atom/has_gravity(): (atom/asker, list/forced_gravities)
+#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity"
+///from base of turf/New(): (turf/source, direction)
+#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new"
+
+// /atom/movable signals
+
+///from base of atom/movable/Moved(): (/atom)
+#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move"
+ #define COMPONENT_MOVABLE_BLOCK_PRE_MOVE (1<<0)
+///from base of atom/movable/Moved(): (/atom, dir)
+#define COMSIG_MOVABLE_MOVED "movable_moved"
+///from base of atom/movable/Cross(): (/atom/movable)
+#define COMSIG_MOVABLE_CROSS "movable_cross"
+///from base of atom/movable/Crossed(): (/atom/movable)
+#define COMSIG_MOVABLE_CROSSED "movable_crossed"
+///when we cross over something (calling Crossed() on that atom)
+#define COMSIG_CROSSED_MOVABLE "crossed_movable"
+///from base of atom/movable/Uncross(): (/atom/movable)
+#define COMSIG_MOVABLE_UNCROSS "movable_uncross"
+ #define COMPONENT_MOVABLE_BLOCK_UNCROSS (1<<0)
+///from base of atom/movable/Uncrossed(): (/atom/movable)
+#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed"
+///from base of atom/movable/Bump(): (/atom)
+#define COMSIG_MOVABLE_BUMP "movable_bump"
+///from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum)
+#define COMSIG_MOVABLE_IMPACT "movable_impact"
+ #define COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH (1<<0) //if true, flip if the impact will push what it hits
+ #define COMPONENT_MOVABLE_IMPACT_NEVERMIND (1<<1) //return true if you destroyed whatever it was you're impacting and there won't be anything for hitby() to run on
+///from base of mob/living/hitby(): (mob/living/target, hit_zone)
+#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone"
+///from base of atom/movable/buckle_mob(): (mob, force)
+#define COMSIG_MOVABLE_BUCKLE "buckle"
+///from base of atom/movable/unbuckle_mob(): (mob, force)
+#define COMSIG_MOVABLE_UNBUCKLE "unbuckle"
+///from base of atom/movable/throw_at(): (list/args)
+#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw"
+ #define COMPONENT_CANCEL_THROW (1<<0)
+///from base of atom/movable/throw_at(): (datum/thrownthing, spin)
+#define COMSIG_MOVABLE_POST_THROW "movable_post_throw"
+///from base of atom/movable/onTransitZ(): (old_z, new_z)
+#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit"
+///called when the movable is placed in an unaccessible area, used for stationloving: ()
+#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded"
+///from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode))
+#define COMSIG_MOVABLE_HEAR "movable_hear"
+ #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 */
+
+///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_DISPOSING "movable_disposing"
+
+// /mob signals
+
+///from base of /mob/Login(): ()
+#define COMSIG_MOB_LOGIN "mob_login"
+///from base of /mob/Logout(): ()
+#define COMSIG_MOB_LOGOUT "mob_logout"
+///from base of mob/death(): (gibbed)
+#define COMSIG_MOB_DEATH "mob_death"
+///from base of mob/set_stat(): (new_stat)
+#define COMSIG_MOB_STATCHANGE "mob_statchange"
+///from base of mob/clickon(): (atom/A, params)
+#define COMSIG_MOB_CLICKON "mob_clickon"
+///from base of mob/MiddleClickOn(): (atom/A)
+#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon"
+///from base of mob/AltClickOn(): (atom/A)
+#define COMSIG_MOB_ALTCLICKON "mob_altclickon"
+ #define COMSIG_MOB_CANCEL_CLICKON (1<<0)
+
+///from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj
+#define COMSIG_MOB_ALLOWED "mob_allowed"
+///from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources)
+#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic"
+ #define COMPONENT_BLOCK_MAGIC (1<<0)
+///from base of mob/create_mob_hud(): ()
+#define COMSIG_MOB_HUD_CREATED "mob_hud_created"
+///from base of atom/attack_hand(): (mob/user)
+#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand"
+///from base of /obj/item/attack(): (mob/M, mob/user)
+#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack"
+ #define COMPONENT_ITEM_NO_ATTACK (1<<0)
+///from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone)
+#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage"
+///from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters)
+#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack"
+///from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters)
+#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted"
+///from base of mob/RangedAttack(): (atom/A, params)
+#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged"
+///from base of /mob/throw_item(): (atom/target)
+#define COMSIG_MOB_THROW "mob_throw"
+///from base of /mob/verb/examinate(): (atom/target)
+#define COMSIG_MOB_EXAMINATE "mob_examinate"
+///from base of /mob/update_sight(): ()
+#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight"
+////from /mob/living/say(): ()
+#define COMSIG_MOB_SAY "mob_say"
+ #define COMPONENT_UPPERCASE_SPEECH (1<<0)
+ // used to access COMSIG_MOB_SAY argslist
+ #define SPEECH_MESSAGE 1
+ // #define SPEECH_BUBBLE_TYPE 2
+ #define SPEECH_SPANS 3
+ /* #define SPEECH_SANITIZE 4
+ #define SPEECH_LANGUAGE 5
+ #define SPEECH_IGNORE_SPAM 6
+ #define SPEECH_FORCED 7 */
+
+///from /mob/say_dead(): (mob/speaker, message)
+#define COMSIG_MOB_DEADSAY "mob_deadsay"
+ #define MOB_DEADSAY_SIGNAL_INTERCEPT (1<<0)
+///from /mob/living/emote(): ()
+#define COMSIG_MOB_EMOTE "mob_emote"
+///from base of mob/swap_hand(): (obj/item)
+#define COMSIG_MOB_SWAP_HANDS "mob_swap_hands"
+ #define COMPONENT_BLOCK_SWAP (1<<0)
+
+// /mob/living signals
+
+///from base of mob/living/resist() (/mob/living)
+#define COMSIG_LIVING_RESIST "living_resist"
+///from base of mob/living/IgniteMob() (/mob/living)
+#define COMSIG_LIVING_IGNITED "living_ignite"
+///from base of mob/living/ExtinguishMob() (/mob/living)
+#define COMSIG_LIVING_EXTINGUISHED "living_extinguished"
+///from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags)
+#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act"
+///sent when items with siemen coeff. of 0 block a shock: (power_source, source, siemens_coeff, dist_check)
+#define COMSIG_LIVING_SHOCK_PREVENTED "living_shock_prevented"
+///sent by stuff like stunbatons and tasers: ()
+#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock"
+///from base of mob/living/revive() (full_heal, admin_revive)
+#define COMSIG_LIVING_REVIVE "living_revive"
+///from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs)
+#define COMSIG_LIVING_REGENERATE_LIMBS "living_regen_limbs"
+///from base of /obj/item/bodypart/proc/attach_limb(): (new_limb, special) allows you to fail limb attachment
+#define COMSIG_LIVING_ATTACH_LIMB "living_attach_limb"
+ #define COMPONENT_NO_ATTACH (1<<0)
+///sent from borg recharge stations: (amount, repairs)
+#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge"
+///sent when a mob/login() finishes: (client)
+#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login"
+///sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation)
+#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon"
+
+//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS!
+
+///from base of mob/living/Stun() (amount, update, ignore)
+#define COMSIG_LIVING_STATUS_STUN "living_stun"
+///from base of mob/living/Knockdown() (amount, update, ignore)
+#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown"
+///from base of mob/living/Paralyze() (amount, update, ignore)
+#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze"
+///from base of mob/living/Immobilize() (amount, update, ignore)
+#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize"
+///from base of mob/living/Unconscious() (amount, update, ignore)
+#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious"
+///from base of mob/living/Sleeping() (amount, update, ignore)
+#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping"
+ #define COMPONENT_NO_STUN (1<<0) //For all of them
+///from base of /mob/living/can_track(): (mob/user)
+#define COMSIG_LIVING_CAN_TRACK "mob_cantrack"
+ #define COMPONENT_CANT_TRACK (1<<0)
+
+// /mob/living/carbon signals
+
+///from base of mob/living/carbon/soundbang_act(): (list(intensity))
+#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang"
+///from /item/organ/proc/Insert() (/obj/item/organ/)
+#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ"
+///from /item/organ/proc/Remove() (/obj/item/organ/)
+#define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ"
+///from /mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop, silent)
+#define COMSIG_CARBON_EQUIP_HAT "carbon_equip_hat"
+///from /mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop, silent)
+#define COMSIG_CARBON_UNEQUIP_HAT "carbon_unequip_hat"
+///defined twice, in carbon and human's topics, fired when interacting with a valid embedded_object to pull it out (mob/living/carbon/target, /obj/item, /obj/item/bodypart/L)
+#define COMSIG_CARBON_EMBED_RIP "item_embed_start_rip"
+///called when removing a given item from a mob, from mob/living/carbon/remove_embedded_object(mob/living/carbon/target, /obj/item)
+#define COMSIG_CARBON_EMBED_REMOVAL "item_embed_remove_safe"
+
+// /mob/living/simple_animal/hostile signals
+#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget"
+ #define COMPONENT_HOSTILE_NO_ATTACK (1<<0)
+
+// /obj signals
+
+///from base of obj/deconstruct(): (disassembled)
+#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct"
+///called in /obj/structure/setAnchored(): (value)
+#define COMSIG_OBJ_SETANCHORED "obj_setanchored"
+///from base of code/game/machinery
+#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench"
+///from base of /turf/proc/levelupdate(). (intact) true to hide and false to unhide
+#define COMSIG_OBJ_HIDE "obj_hide"
+///called in /obj/update_icon()
+#define COMSIG_OBJ_UPDATE_ICON "obj_update_icon"
+
+// /obj/machinery signals
+
+///from /obj/machinery/obj_break(damage_flag): (damage_flag)
+#define COMSIG_MACHINERY_BROKEN "machinery_broken"
+///from base power_change() when power is lost
+#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost"
+///from base power_change() when power is restored
+#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored"
+
+// /obj/item signals
+
+///from base of obj/item/attack(): (/mob/living/target, /mob/living/user)
+#define COMSIG_ITEM_ATTACK "item_attack"
+///from base of obj/item/attack_self(): (/mob)
+#define COMSIG_ITEM_ATTACK_SELF "item_attack_self"
+ #define COMPONENT_NO_INTERACT (1<<0)
+///from base of obj/item/attack_obj(): (/obj, /mob)
+#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj"
+ #define COMPONENT_NO_ATTACK_OBJ (1<<0)
+///from base of obj/item/pre_attack(): (atom/target, mob/user, params)
+#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack"
+ #define COMPONENT_NO_ATTACK (1<<0)
+///from base of obj/item/afterattack(): (atom/target, mob/user, params)
+#define COMSIG_ITEM_AFTERATTACK "item_afterattack"
+///from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params)
+#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted"
+///from base of obj/item/equipped(): (/mob/equipper, slot)
+#define COMSIG_ITEM_EQUIPPED "item_equip"
+///from base of obj/item/dropped(): (mob/user)
+#define COMSIG_ITEM_DROPPED "item_drop"
+///from base of obj/item/pickup(): (/mob/taker)
+#define COMSIG_ITEM_PICKUP "item_pickup"
+///from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone)
+#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone"
+///return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user)
+#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul"
+///called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user)
+#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval"
+ #define COMPONENT_BLOCK_MARK_RETRIEVAL (1<<0)
+///from base of obj/item/hit_reaction(): (list/args)
+#define COMSIG_ITEM_HIT_REACT "item_hit_react"
+///called on item when crossed by something (): (/atom/movable, mob/living/crossed)
+#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed"
+///called on item when microwaved (): (obj/machinery/microwave/M)
+#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act"
+///from base of item/sharpener/attackby(): (amount, max)
+#define COMSIG_ITEM_SHARPEN_ACT "sharpen_act"
+ #define COMPONENT_BLOCK_SHARPEN_APPLIED (1<<0)
+ #define COMPONENT_BLOCK_SHARPEN_BLOCKED (1<<1)
+ #define COMPONENT_BLOCK_SHARPEN_ALREADY (1<<2)
+ #define COMPONENT_BLOCK_SHARPEN_MAXED (1<<3)
+///from base of [/obj/item/proc/tool_check_callback]: (mob/living/user)
+#define COMSIG_TOOL_IN_USE "tool_in_use"
+///from base of [/obj/item/proc/tool_start_check]: (mob/living/user)
+#define COMSIG_TOOL_START_USE "tool_start_use"
+///from [/obj/item/proc/disableEmbedding]:
+#define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed"
+///from [/obj/effect/mine/proc/triggermine]:
+#define COMSIG_MINE_TRIGGERED "minegoboom"
+
+// /obj/item signals for economy
+///called when an item is sold by the exports subsystem
+#define COMSIG_ITEM_SOLD "item_sold"
+///called when a wrapped up structure is opened by hand
+#define COMSIG_STRUCTURE_UNWRAPPED "structure_unwrapped"
+#define COMSIG_ITEM_UNWRAPPED "item_unwrapped"
+///called when a wrapped up item is opened by hand
+ #define COMSIG_ITEM_SPLIT_VALUE (1<<0)
+///called when getting the item's exact ratio for cargo's profit.
+#define COMSIG_ITEM_SPLIT_PROFIT "item_split_profits"
+///called when getting the item's exact ratio for cargo's profit, without selling the item.
+#define COMSIG_ITEM_SPLIT_PROFIT_DRY "item_split_profits_dry"
+
+// /obj/item/clothing signals
+
+///from base of obj/item/clothing/shoes/proc/step_action(): ()
+#define COMSIG_SHOES_STEP_ACTION "shoes_step_action"
+///from base of /obj/item/clothing/suit/space/proc/toggle_spacesuit(): (obj/item/clothing/suit/space/suit)
+#define COMSIG_SUIT_SPACE_TOGGLE "suit_space_toggle"
+
+// /obj/item/implant signals
+///from base of /obj/item/implant/proc/activate(): ()
+#define COMSIG_IMPLANT_ACTIVATED "implant_activated"
+///from base of /obj/item/implant/proc/implant(): (list/args)
+#define COMSIG_IMPLANT_IMPLANTING "implant_implanting"
+ #define COMPONENT_STOP_IMPLANTING (1<<0)
+///called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant)
+#define COMSIG_IMPLANT_OTHER "implant_other"
+ //#define COMPONENT_STOP_IMPLANTING (1<<0) //The name makes sense for both
+ #define COMPONENT_DELETE_NEW_IMPLANT (1<<1)
+ #define COMPONENT_DELETE_OLD_IMPLANT (1<<2)
+///called on implants being implanted into someone with an uplink implant: (datum/component/uplink)
+#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists"
+ //This uses all return values of COMSIG_IMPLANT_OTHER
+
+// /obj/item/pda signals
+
+///called on pda when the user changes the ringtone: (mob/living/user, new_ringtone)
+#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone"
+ #define COMPONENT_STOP_RINGTONE_CHANGE (1<<0)
+#define COMSIG_PDA_CHECK_DETONATE "pda_check_detonate"
+ #define COMPONENT_PDA_NO_DETONATE (1<<0)
+
+// /obj/item/radio signals
+
+///called from base of /obj/item/radio/proc/set_frequency(): (list/args)
+#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency"
+
+// /obj/item/pen signals
+
+///called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user)
+#define COMSIG_PEN_ROTATED "pen_rotated"
+
+// /obj/item/gun signals
+
+///called in /obj/item/gun/process_fire (user, target, params, zone_override)
+#define COMSIG_MOB_FIRED_GUN "mob_fired_gun"
+
+// /obj/item/grenade signals
+
+///called in /obj/item/gun/process_fire (user, target, params, zone_override)
+#define COMSIG_GRENADE_PRIME "grenade_prime"
+///called in /obj/item/gun/process_fire (user, target, params, zone_override)
+#define COMSIG_GRENADE_ARMED "grenade_armed"
+
+// /obj/projectile signals (sent to the firer)
+
+///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
+#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit"
+///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
+#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit"
+///from base of /obj/projectile/proc/fire(): (obj/projectile, atom/original_target)
+#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire"
+///from the base of /obj/projectile/proc/fire(): ()
+#define COMSIG_PROJECTILE_FIRE "projectile_fire"
+///sent to targets during the process_hit proc of projectiles
+#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit"
+///sent to targets during the process_hit proc of projectiles
+#define COMSIG_PROJECTILE_RANGE_OUT "projectile_range_out"
+///sent when trying to force an embed (mainly for projectiles, only used in the embed element)
+#define COMSIG_EMBED_TRY_FORCE "item_try_embed"
+
+///sent to targets during the process_hit proc of projectiles
+#define COMSIG_PELLET_CLOUD_INIT "pellet_cloud_init"
+
+// /obj/mecha signals
+
+///sent from mecha action buttons to the mecha they're linked to
+#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate"
+
+// /mob/living/carbon/human signals
+
+///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
+#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack"
+///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
+#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack"
+///from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker)
+#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby"
+///Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted)
+#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit"
+///Whenever EquipRanked is called, called after job is set
+#define COMSIG_JOB_RECEIVED "job_received"
+
+// /datum/species signals
+
+///from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species)
+#define COMSIG_SPECIES_GAIN "species_gain"
+///from datum/species/on_species_loss(): (datum/species/lost_species)
+#define COMSIG_SPECIES_LOSS "species_loss"
+
+// /datum/song signals
+
+///sent to the instrument when a song starts playing
+#define COMSIG_SONG_START "song_start"
+///sent to the instrument when a song stops playing
+#define COMSIG_SONG_END "song_end"
+
+/*******Component Specific Signals*******/
+//Janitor
+
+///(): Returns bitflags of wet values.
+#define COMSIG_TURF_IS_WET "check_turf_wet"
+///(max_strength, immediate, duration_decrease = INFINITY): Returns bool.
+#define COMSIG_TURF_MAKE_DRY "make_turf_try"
+///called on an object to clean it of cleanables. Usualy with soap: (num/strength)
+#define COMSIG_COMPONENT_CLEAN_ACT "clean_act"
+
+//Creamed
+
+///called when you wash your face at a sink: (num/strength)
+#define COMSIG_COMPONENT_CLEAN_FACE_ACT "clean_face_act"
+
+//Food
+
+///from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder)
+#define COMSIG_FOOD_EATEN "food_eaten"
+
+//Gibs
+
+///from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases)
+#define COMSIG_GIBS_STREAK "gibs_streak"
+
+//Mood
+
+///called when you send a mood event from anywhere in the code.
+#define COMSIG_ADD_MOOD_EVENT "add_mood"
+///Mood event that only RnD members listen for
+#define COMSIG_ADD_MOOD_EVENT_RND "RND_add_mood"
+///called when you clear a mood event from anywhere in the code.
+#define COMSIG_CLEAR_MOOD_EVENT "clear_mood"
+
+//NTnet
+
+///called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata))
+#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive"
+
+//Nanites
+
+///() returns TRUE if nanites are found
+#define COMSIG_HAS_NANITES "has_nanites"
+///() returns TRUE if nanites have stealth
+#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy"
+///() deletes the nanite component
+#define COMSIG_NANITE_DELETE "nanite_delete"
+///(list/nanite_programs) - makes the input list a copy the nanites' program list
+#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs"
+///(amount) Returns nanite amount
+#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume"
+///(amount) Sets current nanite volume to the given amount
+#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume"
+///(amount) Adjusts nanite volume by the given amount
+#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust"
+///(amount) Sets maximum nanite volume to the given amount
+#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume"
+///(amount(0-100)) Sets cloud ID to the given amount
+#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud"
+///(method) Modify cloud sync status. Method can be toggle, enable or disable
+#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync"
+///(amount) Sets safety threshold to the given amount
+#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety"
+///(amount) Sets regeneration rate to the given amount
+#define COMSIG_NANITE_SET_REGEN "nanite_set_regen"
+///(code(1-9999)) Called when sending a nanite signal to a mob.
+#define COMSIG_NANITE_SIGNAL "nanite_signal"
+///(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob.
+#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal"
+///(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected
+#define COMSIG_NANITE_SCAN "nanite_scan"
+///(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs
+#define COMSIG_NANITE_UI_DATA "nanite_ui_data"
+///(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component
+#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program"
+ ///Installation successful
+ #define COMPONENT_PROGRAM_INSTALLED (1<<0)
+ ///Installation failed, but there are still nanites
+ #define COMPONENT_PROGRAM_NOT_INSTALLED (1<<1)
+///(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component
+#define COMSIG_NANITE_SYNC "nanite_sync"
+
+// /datum/component/storage signals
+
+///() - returns bool.
+#define COMSIG_CONTAINS_STORAGE "is_storage"
+///(obj/item/inserting, mob/user, silent, force) - returns bool
+#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert"
+///(mob/show_to, force) - returns bool.
+#define COMSIG_TRY_STORAGE_SHOW "storage_show_to"
+///(mob/hide_from) - returns bool
+#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from"
+///returns bool
+#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all"
+///(newstate)
+#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state"
+///() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST!
+#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate"
+///(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types.
+#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type"
+///(type, amount = INFINITY, force = FALSE). Force will ignore max_items, and amount is normally clamped to max_items.
+#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type"
+///(obj, new_loc, force = FALSE) - returns bool
+#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj"
+///(loc) - returns bool - if loc is null it will dump at parent location.
+#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty"
+///(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE)
+#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory"
+///(obj/item/insertion_candidate, mob/user, silent) - returns bool
+#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip"
+
+// /datum/component/two_handed signals
+
+///from base of datum/component/two_handed/proc/wield(mob/living/carbon/user): (/mob/user)
+#define COMSIG_TWOHANDED_WIELD "twohanded_wield"
+ #define COMPONENT_TWOHANDED_BLOCK_WIELD (1<<0)
+///from base of datum/component/two_handed/proc/unwield(mob/living/carbon/user): (/mob/user)
+#define COMSIG_TWOHANDED_UNWIELD "twohanded_unwield"
+
+// /datum/action signals
+
+///from base of datum/action/proc/Trigger(): (datum/action)
+#define COMSIG_ACTION_TRIGGER "action_trigger"
+ #define COMPONENT_ACTION_BLOCK_TRIGGER (1<<0)
+
+//Xenobio hotkeys
+
+///from slime CtrlClickOn(): (/mob)
+#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl"
+///from slime AltClickOn(): (/mob)
+#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt"
+///from slime ShiftClickOn(): (/mob)
+#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift"
+///from turf ShiftClickOn(): (/mob)
+#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift"
+///from turf AltClickOn(): (/mob)
+#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt"
+///from monkey CtrlClickOn(): (/mob)
+#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl"
diff --git a/code/__DEFINES/dna.dm b/code/__DEFINES/dna.dm
new file mode 100644
index 00000000000..7984c1a6dde
--- /dev/null
+++ b/code/__DEFINES/dna.dm
@@ -0,0 +1,57 @@
+// Defines for all genetics/DNA related stuff
+
+// What each index means:
+#define DNA_OFF_LOWERBOUND 1 // changed as lists start at 1 not 0
+#define DNA_OFF_UPPERBOUND 2
+#define DNA_ON_LOWERBOUND 3
+#define DNA_ON_UPPERBOUND 4
+
+// Define block bounds (off-low,off-high,on-low,on-high)
+// Used in setupgame.dm
+#define DNA_DEFAULT_BOUNDS list(1,2049,2050,4095)
+#define DNA_HARDER_BOUNDS list(1,3049,3050,4095)
+#define DNA_HARD_BOUNDS list(1,3490,3500,4095)
+
+// UI Indices (can change to mutblock style, if desired)
+#define DNA_UI_HAIR_R 1
+#define DNA_UI_HAIR_G 2
+#define DNA_UI_HAIR_B 3
+#define DNA_UI_HAIR2_R 4
+#define DNA_UI_HAIR2_G 5
+#define DNA_UI_HAIR2_B 6
+#define DNA_UI_BEARD_R 7
+#define DNA_UI_BEARD_G 8
+#define DNA_UI_BEARD_B 9
+#define DNA_UI_BEARD2_R 10
+#define DNA_UI_BEARD2_G 11
+#define DNA_UI_BEARD2_B 12
+#define DNA_UI_SKIN_TONE 13
+#define DNA_UI_SKIN_R 14
+#define DNA_UI_SKIN_G 15
+#define DNA_UI_SKIN_B 16
+#define DNA_UI_HACC_R 17
+#define DNA_UI_HACC_G 18
+#define DNA_UI_HACC_B 19
+#define DNA_UI_HEAD_MARK_R 20
+#define DNA_UI_HEAD_MARK_G 21
+#define DNA_UI_HEAD_MARK_B 22
+#define DNA_UI_BODY_MARK_R 23
+#define DNA_UI_BODY_MARK_G 24
+#define DNA_UI_BODY_MARK_B 25
+#define DNA_UI_TAIL_MARK_R 26
+#define DNA_UI_TAIL_MARK_G 27
+#define DNA_UI_TAIL_MARK_B 28
+#define DNA_UI_EYES_R 29
+#define DNA_UI_EYES_G 30
+#define DNA_UI_EYES_B 31
+#define DNA_UI_GENDER 32
+#define DNA_UI_BEARD_STYLE 33
+#define DNA_UI_HAIR_STYLE 34
+/*#define DNA_UI_BACC_STYLE 23*/
+#define DNA_UI_HACC_STYLE 35
+#define DNA_UI_HEAD_MARK_STYLE 36
+#define DNA_UI_BODY_MARK_STYLE 37
+#define DNA_UI_TAIL_MARK_STYLE 38
+#define DNA_UI_LENGTH 38 // Update this when you add something, or you WILL break shit.
+
+#define DNA_SE_LENGTH 55 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow.
diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm
index 73a812e8f5b..2de0a86c268 100644
--- a/code/__DEFINES/gamemode.dm
+++ b/code/__DEFINES/gamemode.dm
@@ -15,6 +15,7 @@
#define GAMEMODE_IS_NUCLEAR (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear))
#define GAMEMODE_IS_REVOLUTION (SSticker && istype(SSticker.mode, /datum/game_mode/revolution))
#define GAMEMODE_IS_WIZARD (SSticker && istype(SSticker.mode, /datum/game_mode/wizard))
+#define GAMEMODE_IS_RAGIN_MAGES (SSticker && istype(SSticker.mode, /datum/game_mode/wizard/raginmages))
//special roles
// Distinct from the ROLE_X defines because some antags have multiple special roles but only one ban type
diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
index c465ab2d514..5fd85513501 100644
--- a/code/__DEFINES/genetics.dm
+++ b/code/__DEFINES/genetics.dm
@@ -24,78 +24,61 @@
///////////////////////////////////////
// MUTATIONS
///////////////////////////////////////
+
// Generic mutations:
-#define TK 1
-#define COLDRES 2
-#define XRAY 3
-#define HULK 4
-#define CLUMSY 5
-#define FAT 6
-#define HUSK 7
-#define NOCLONE 8
-
-// Extra powers:
-#define LASER 9 // harm intent - click anywhere to shoot lasers from eyes
-
-//species mutation
-#define WINGDINGS 10 // Ayy lmao
-
-//2spooky
-#define SKELETON 29
-#define PLANT 30
-
-// Other Mutations:
-#define BREATHLESS 100 // no breathing
-#define REMOTE_VIEW 101 // remote viewing
-#define REGEN 102 // health regen
-#define RUN 103 // no slowdown
-#define REMOTE_TALK 104 // remote talking
-#define MORPH 105 // changing appearance
-#define HEATRES 106 // heat resistance
-#define HALLUCINATE 107 // hallucinations
-#define FINGERPRINTS 108 // no fingerprints
-#define NO_SHOCK 109 // insulated hands
-#define DWARF 110 // table climbing
-
-// Goon muts
-#define OBESITY 200 // Decreased metabolism
-// 201 undefined
-#define STRONG 202 // (Nothing)
-#define SOBER 203 // Increased alcohol metabolism
-#define PSY_RESIST 204 // Block remoteview
-// 205 undefined
-#define EMPATH 206 //Read minds
-#define COMIC 207 //Comic Sans
-
-// /vg/ muts
-#define LOUD 208 // CAUSES INTENSE YELLING
-#define DIZZY 210 // Trippy.
-
-#define LISP 300
-#define RADIOACTIVE 301
-#define CHAV 302
-#define SWEDISH 303
-#define SCRAMBLED 304
-#define HORNS 305
-#define IMMOLATE 306
-#define CLOAK 307
-#define CHAMELEON 308
-#define CRYO 309
-#define EATER 310
-
-#define JUMPY 400
-#define POLYMORPH 401
-
+#define TK "telekenesis"
+#define COLDRES "cold_resistance"
+#define XRAY "xray"
+#define HULK "hulk"
+#define CLUMSY "clumsy"
+#define FAT "fat"
+#define HUSK "husk"
+#define NOCLONE "noclone"
+#define LASER "eyelaser" // harm intent - click anywhere to shoot lasers from eyes
+#define WINGDINGS "wingdings" // Ayy lmao
+#define SKELETON "skeleton"
+#define BREATHLESS "breathless" // no breathing
+#define REMOTE_VIEW "remove_view" // remote viewing
+#define REGEN "regeneration" // health regen
+#define RUN "increased_run" // no slowdown
+#define REMOTE_TALK "remote_talk" // remote talking
+#define MORPH "morph" // changing appearance
+#define HEATRES "heat_resistance" // heat resistance
+#define HALLUCINATE "hallucinate" // hallucinations
+#define FINGERPRINTS "no_prints" // no fingerprints
+#define NO_SHOCK "no_shock" // insulated hands
+#define DWARF "dwarf" // table climbing
+#define OBESITY "obesity" // Decreased metabolism
+#define STRONG "strong" // (Nothing)
+#define SOBER "sober" // Increased alcohol metabolism
+#define PSY_RESIST "psy_resist" // Block remoteview
+#define EMPATH "empathy" //Read minds
+#define COMIC "comic_sans" //Comic Sans
+#define LOUD "loudness" // CAUSES INTENSE YELLING
+#define DIZZY "dizzy" // Trippy.
+#define LISP "lisp"
+#define RADIOACTIVE "radioactive"
+#define CHAV "chav"
+#define SWEDISH "swedish"
+#define SCRAMBLED "scrambled"
+#define HORNS "horns"
+#define IMMOLATE "immolate"
+#define CLOAK "cloak"
+#define CHAMELEON "chameleon"
+#define CRYO "cryokinesis"
+#define EATER "matter_eater"
+#define JUMPY "jumpy"
+#define POLYMORPH "polymorph"
//disabilities
-#define NEARSIGHTED 1
-#define EPILEPSY 2
-#define COUGHING 4
-#define TOURETTES 8
-#define NERVOUS 16
-#define BLIND 32
-#define COLOURBLIND 64
-#define MUTE 128
-#define DEAF 256
+#define NEARSIGHTED "nearsighted"
+#define EPILEPSY "epilepsy"
+#define COUGHING "coughing"
+#define TOURETTES "tourettes"
+#define NERVOUS "nervous"
+#define BLINDNESS "blind"
+#define COLOURBLIND "colorblind"
+#define MUTE "mute"
+#define DEAF "deaf"
//Nutrition levels for humans. No idea where else to put it
#define NUTRITION_LEVEL_FAT 600
@@ -104,6 +87,7 @@
#define NUTRITION_LEVEL_FED 350
#define NUTRITION_LEVEL_HUNGRY 250
#define NUTRITION_LEVEL_STARVING 150
+#define NUTRITION_LEVEL_HYPOGLYCEMIA 100
#define NUTRITION_LEVEL_CURSED 0
//Used as an upper limit for species that continuously gain nutriment
@@ -151,7 +135,6 @@
#define NO_SCAN "no_scan"
#define NO_PAIN "no_pain"
#define IS_PLANT "is_plant"
-#define CAN_BE_FAT "can_be_fat"
#define NO_INTORGANS "no_internal_organs"
#define RADIMMUNE "rad_immunity"
#define NOGUNS "no_guns"
@@ -162,7 +145,6 @@
#define RESISTCOLD "resist_cold"
#define NO_EXAMINE "no_examine"
#define CAN_WINGDINGS "can_wingdings"
-#define NOZOMBIE "no_zombie"
#define NO_GERMS "no_germs"
#define NO_DECAY "no_decay"
#define PIERCEIMMUNE "pierce_immunity"
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index cec707b8196..23ac017f1ec 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -5,6 +5,3 @@
#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 TV_TRIP "trip"
-#define TV_SLIP "slip"
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 33ce299c540..2b8c515e81a 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -1,10 +1,8 @@
// Atoms
-#define isatom(A) istype(A, /atom)
-#define ismovableatom(A) istype(A, /atom/movable)
+#define isatom(A) (isloc(A))
// Mobs
#define ismegafauna(A) istype(A, /mob/living/simple_animal/hostile/megafauna)
-#define iszombie(A) (is_species(A, /datum/species/zombie))
//Simple animals
#define isshade(A) (istype(A, /mob/living/simple_animal/shade))
@@ -28,13 +26,13 @@
#define is_pen(W) (istype(W, /obj/item/pen))
-var/list/static/global/pointed_types = typecacheof(list(
+GLOBAL_LIST_INIT(pointed_types, typecacheof(list(
/obj/item/pen,
/obj/item/screwdriver,
/obj/item/reagent_containers/syringe,
- /obj/item/kitchen/utensil/fork))
+ /obj/item/kitchen/utensil/fork)))
-#define is_pointed(W) (is_type_in_typecache(W, pointed_types))
+#define is_pointed(W) (is_type_in_typecache(W, GLOB.pointed_types))
GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list(
/obj/item/stack/sheet/glass,
diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm
index d72628e2cb7..349d1b246be 100644
--- a/code/__DEFINES/job.dm
+++ b/code/__DEFINES/job.dm
@@ -51,7 +51,7 @@
#define JOB_CLOWN (1<<11)
#define JOB_MIME (1<<12)
#define JOB_CIVILIAN (1<<13)
-
+#define JOB_EXPLORER (1<<14)
#define JOBCAT_KARMA (1<<3)
diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm
index 01dbc2f1c2b..34528090e86 100644
--- a/code/__DEFINES/lighting.dm
+++ b/code/__DEFINES/lighting.dm
@@ -90,3 +90,27 @@
#define FLASH_LIGHT_DURATION 2
#define FLASH_LIGHT_POWER 3
#define FLASH_LIGHT_RANGE 3.8
+
+/// Returns the red part of a #RRGGBB hex sequence as number
+#define GETREDPART(hexa) hex2num(copytext(hexa, 2, 4))
+
+/// Returns the green part of a #RRGGBB hex sequence as number
+#define GETGREENPART(hexa) hex2num(copytext(hexa, 4, 6))
+
+/// Returns the blue part of a #RRGGBB hex sequence as number
+#define GETBLUEPART(hexa) hex2num(copytext(hexa, 6, 8))
+
+/// Parse the hexadecimal color into lumcounts of each perspective.
+#define PARSE_LIGHT_COLOR(source) \
+do { \
+ if (source.light_color) { \
+ var/__light_color = source.light_color; \
+ source.lum_r = GETREDPART(__light_color) / 255; \
+ source.lum_g = GETGREENPART(__light_color) / 255; \
+ source.lum_b = GETBLUEPART(__light_color) / 255; \
+ } else { \
+ source.lum_r = 1; \
+ source.lum_g = 1; \
+ source.lum_b = 1; \
+ }; \
+} while (FALSE)
diff --git a/code/__DEFINES/logs.dm b/code/__DEFINES/logs.dm
new file mode 100644
index 00000000000..25d1fac7323
--- /dev/null
+++ b/code/__DEFINES/logs.dm
@@ -0,0 +1,6 @@
+#define ATTACK_LOG "Attack"
+#define DEFENSE_LOG "Defense"
+#define CONVERSION_LOG "Conversion"
+#define SAY_LOG "Say"
+#define EMOTE_LOG "Emote"
+#define MISC_LOG "Misc"
diff --git a/code/__DEFINES/math.dm b/code/__DEFINES/math.dm
index 2f2968561da..433d1c55b56 100644
--- a/code/__DEFINES/math.dm
+++ b/code/__DEFINES/math.dm
@@ -1,59 +1,238 @@
+#define NUM_E 2.71828183
+
#define PI 3.1415
-#define SPEED_OF_LIGHT 3e8 //not exact but hey!
-#define SPEED_OF_LIGHT_SQ 9e+16
#define INFINITY 1e31 //closer than enough
-#define Clamp(x, y, z) ((x) <= (y) ? (y) : ((x) >= (z) ? (z) : (x)))
-#define CLAMP01(x) (Clamp((x), 0, 1))
-
-// Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive
-#define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) )
-
-#define SIMPLE_SIGN(X) ((X) < 0 ? -1 : 1)
-#define SIGN(X) ((X) ? SIMPLE_SIGN(X) : 0)
-#define hypotenuse(Ax, Ay, Bx, By) (sqrt(((Ax) - (Bx))**2 + ((Ay) - (By))**2))
-#define Ceiling(x) (-round(-(x)))
-#define Tan(x) (sin(x) / cos(x))
-#define Cot(x) (1 / Tan(x))
-#define Csc(x) (1 / sin(x))
-#define Sec(x) (1 / cos(x))
-#define Floor(x) (round(x))
-#define Inverse(x) (1 / (x))
-#define IsEven(x) ((x) % 2 == 0)
-#define IsOdd(x) ((x) % 2 == 1)
-#define IsInRange(val, min, max) ((min) <= (val) && (val) <= (max))
-#define IsInteger(x) (Floor(x) == (x))
-#define IsMultiple(x, y) ((x) % (y) == 0)
-#define Lcm(a, b) (abs(a) / Gcd((a), (b)) * abs(b))
-#define Root(n, x) ((x) ** (1 / (n)))
-#define ToDegrees(radians) ((radians) * 57.2957795) // 180 / Pi
-#define ToRadians(degrees) ((degrees) * 0.0174532925) // Pi / 180
-
#define SHORT_REAL_LIMIT 16777216
-// Real modulus that handles decimals
-#define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) )
-
-
//"fancy" math for calculating time in ms from tick_usage percentage and the length of ticks
//percent_of_tick_used * (ticklag * 100(to convert to ms)) / 100(percent ratio)
//collapsed to percent_of_tick_used * tick_lag
#define TICK_DELTA_TO_MS(percent_of_tick_used) ((percent_of_tick_used) * world.tick_lag)
#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(TICK_USAGE_REAL - starting_tickusage))
+#define PERCENT(val) (round((val)*100, 0.1))
+#define CLAMP01(x) (clamp(x, 0, 1))
+
//time of day but automatically adjusts to the server going into the next day within the same round.
//for when you need a reliable time number that doesn't depend on byond time.
#define REALTIMEOFDAY (world.timeofday + (MIDNIGHT_ROLLOVER * MIDNIGHT_ROLLOVER_CHECK))
#define MIDNIGHT_ROLLOVER_CHECK ( GLOB.rollovercheck_last_timeofday != world.timeofday ? update_midnight_rollover() : GLOB.midnight_rollovers )
+#define SIMPLE_SIGN(X) ((X) < 0 ? -1 : 1)
+
+#define SIGN(x) ( (x)!=0 ? (x) / abs(x) : 0 )
+
#define CEILING(x, y) ( -round(-(x) / (y)) * (y) )
// round() acts like floor(x, 1) by default but can't handle other values
#define FLOOR(x, y) ( round((x) / (y)) * (y) )
+// Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive
+#define WRAP(val, min, max) clamp(( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) ),min,max)
+
+// Real modulus that handles decimals
+#define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) )
+
+// Cotangent
+#define COT(x) (1 / tan(x))
+
+// Secant
+#define SEC(x) (1 / cos(x))
+
+// Cosecant
+#define CSC(x) (1 / sin(x))
+
+#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
+
+#define HYPOTENUSE(Ax, Ay, Bx, By) (sqrt(((Ax) - (Bx))**2 + ((Ay) - (By))**2))
+
+// Greatest Common Divisor - Euclid's algorithm
+/proc/Gcd(a, b)
+ return b ? Gcd(b, (a) % (b)) : a
+
+// Least Common Multiple
+#define Lcm(a, b) (abs(a) / Gcd(a, b) * abs(b))
+
+#define INVERSE(x) ( 1/(x) )
+
+// Used for calculating the radioactive strength falloff
+#define INVERSE_SQUARE(initial_strength,cur_distance,initial_distance) ( (initial_strength)*((initial_distance)**2/(cur_distance)**2) )
+
+#define ISABOUTEQUAL(a, b, deviation) (deviation ? abs((a) - (b)) <= deviation : abs((a) - (b)) <= 0.1)
+
+#define ISEVEN(x) (x % 2 == 0)
+
+#define ISODD(x) (x % 2 != 0)
+
+// Returns true if val is from min to max, inclusive.
+#define ISINRANGE(val, min, max) (min <= val && val <= max)
+
+// Same as above, exclusive.
+#define ISINRANGE_EX(val, min, max) (min < val && val < max)
+
+#define ISINTEGER(x) (round(x) == x)
+
+#define ISMULTIPLE(x, y) ((x) % (y) == 0)
+
+// Performs a linear interpolation between a and b.
+// Note that amount=0 returns a, amount=1 returns b, and
+// amount=0.5 returns the mean of a and b.
+#define LERP(a, b, amount) ( amount ? ((a) + ((b) - (a)) * (amount)) : a )
+
+// Returns the nth root of x.
+#define ROOT(n, x) ((x) ** (1 / (n)))
+
+// The quadratic formula. Returns a list with the solutions, or an empty list
+// if they are imaginary.
+/proc/SolveQuadratic(a, b, c)
+ ASSERT(a)
+ . = list()
+ var/d = b*b - 4 * a * c
+ var/bottom = 2 * a
+ if(d < 0)
+ return
+ var/root = sqrt(d)
+ . += (-b + root) / bottom
+ if(!d)
+ return
+ . += (-b - root) / bottom
+
+#define TODEGREES(radians) ((radians) * 57.2957795)
+
+#define TORADIANS(degrees) ((degrees) * 0.0174532925)
+
+/// Gets shift x that would be required the bitflag (1< dec? -dec : inc
+
+//A logarithm that converts an integer to a number scaled between 0 and 1.
+//Currently, this is used for hydroponics-produce sprite transforming, but could be useful for other transform functions.
+#define TRANSFORM_USING_VARIABLE(input, max) ( sin((90*(input))/(max))**2 )
+
+//converts a uniform distributed random number into a normal distributed one
+//since this method produces two random numbers, one is saved for subsequent calls
+//(making the cost negligble for every second call)
+//This will return +/- decimals, situated about mean with standard deviation stddev
+//68% chance that the number is within 1stddev
+//95% chance that the number is within 2stddev
+//98% chance that the number is within 3stddev...etc
+#define ACCURACY 10000
+/proc/gaussian(mean, stddev)
+ var/static/gaussian_next
+ var/R1;var/R2;var/working
+ if(gaussian_next != null)
+ R1 = gaussian_next
+ gaussian_next = null
+ else
+ do
+ R1 = rand(-ACCURACY,ACCURACY)/ACCURACY
+ R2 = rand(-ACCURACY,ACCURACY)/ACCURACY
+ working = R1*R1 + R2*R2
+ while(working >= 1 || working==0)
+ working = sqrt(-2 * log(working) / working)
+ R1 *= working
+ gaussian_next = R2 * working
+ return (mean + stddev * R1)
+#undef ACCURACY
+
+/proc/get_turf_in_angle(angle, turf/starting, increments)
+ var/pixel_x = 0
+ var/pixel_y = 0
+ for(var/i in 1 to increments)
+ pixel_x += sin(angle)+16*sin(angle)*2
+ pixel_y += cos(angle)+16*cos(angle)*2
+ var/new_x = starting.x
+ var/new_y = starting.y
+ while(pixel_x > 16)
+ pixel_x -= 32
+ new_x++
+ while(pixel_x < -16)
+ pixel_x += 32
+ new_x--
+ while(pixel_y > 16)
+ pixel_y -= 32
+ new_y++
+ while(pixel_y < -16)
+ pixel_y += 32
+ new_y--
+ new_x = clamp(new_x, 0, world.maxx)
+ new_y = clamp(new_y, 0, world.maxy)
+ return locate(new_x, new_y, starting.z)
+
+// Returns a list where [1] is all x values and [2] is all y values that overlap between the given pair of rectangles
+/proc/get_overlap(x1, y1, x2, y2, x3, y3, x4, y4)
+ var/list/region_x1 = list()
+ var/list/region_y1 = list()
+ var/list/region_x2 = list()
+ var/list/region_y2 = list()
+
+ // These loops create loops filled with x/y values that the boundaries inhabit
+ // ex: list(5, 6, 7, 8, 9)
+ for(var/i in min(x1, x2) to max(x1, x2))
+ region_x1["[i]"] = TRUE
+ for(var/i in min(y1, y2) to max(y1, y2))
+ region_y1["[i]"] = TRUE
+ for(var/i in min(x3, x4) to max(x3, x4))
+ region_x2["[i]"] = TRUE
+ for(var/i in min(y3, y4) to max(y3, y4))
+ region_y2["[i]"] = TRUE
+
+ return list(region_x1 & region_x2, region_y1 & region_y2)
+
+#define EXP_DISTRIBUTION(desired_mean) ( -(1/(1/desired_mean)) * log(rand(1, 1000) * 0.001) )
+
+#define LORENTZ_DISTRIBUTION(x, s) ( s*tan(TODEGREES(PI*(rand()-0.5))) + x )
+#define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-y)/s)) + 1/2 )
+
+#define RULE_OF_THREE(a, b, x) ((a*x)/b)
+// )
+
+/proc/RaiseToPower(num, power)
+ if(!power)
+ return 1
+ return (power-- > 1 ? num * RaiseToPower(num, power) : num)
+
+// oof, what a mouthful
+// Used in status_procs' "adjust" to let them modify a status effect by a given
+// amount, without inadverdently increasing it in the wrong direction
+/proc/directional_bounded_sum(orig_val, modifier, bound_lower, bound_upper)
+ var/new_val = orig_val + modifier
+ if(modifier > 0)
+ if(new_val > bound_upper)
+ new_val = max(orig_val, bound_upper)
+ else if(modifier < 0)
+ if(new_val < bound_lower)
+ new_val = min(orig_val, bound_lower)
+ return new_val
+
+// sqrt, but if you give it a negative number, you get 0 instead of a runtime
+/proc/sqrtor0(num)
+ if(num < 0)
+ return 0
+ return sqrt(num)
+
+/proc/round_down(num)
+ if(round(num) != num)
+ return round(num--)
+ else
+ return num
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 346664e0758..ad5e5df7583 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -122,10 +122,10 @@
)
#define FOR_DVIEW(type, range, center, invis_flags) \
- dview_mob.loc = center; \
- dview_mob.see_invisible = invis_flags; \
- for(type in view(range, dview_mob))
-#define END_FOR_DVIEW dview_mob.loc = null
+ GLOB.dview_mob.loc = center; \
+ GLOB.dview_mob.see_invisible = invis_flags; \
+ for(type in view(range, GLOB.dview_mob))
+#define END_FOR_DVIEW GLOB.dview_mob.loc = null
//Turf locational stuff
#define get_turf(A) (get_step(A, 0))
@@ -319,7 +319,7 @@
#define INVESTIGATE_BOMB "bombs"
// The SQL version required by this version of the code
-#define SQL_VERSION 11
+#define SQL_VERSION 12
// Vending machine stuff
#define CAT_NORMAL 1
@@ -345,7 +345,7 @@
#define MOUSE_OPACITY_OPAQUE 2
// Defib stats
-#define DEFIB_TIME_LIMIT 120
+#define DEFIB_TIME_LIMIT 300
#define DEFIB_TIME_LOSS 60
//different types of atom colorations
@@ -431,7 +431,6 @@
#define LINDA_SPAWN_OXYGEN 8
#define LINDA_SPAWN_CO2 16
#define LINDA_SPAWN_NITROGEN 32
-
#define LINDA_SPAWN_N2O 64
-
+#define LINDA_SPAWN_AGENT_B 128
#define LINDA_SPAWN_AIR 256
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index e1e15a926d6..719274857ec 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -196,7 +196,7 @@
#define isslimeperson(A) (is_species(A, /datum/species/slime))
#define isgrey(A) (is_species(A, /datum/species/grey))
#define isdiona(A) (is_species(A, /datum/species/diona))
-#define ismachine(A) (is_species(A, /datum/species/machine))
+#define ismachineperson(A) (is_species(A, /datum/species/machine))
#define isdrask(A) (is_species(A, /datum/species/drask))
#define isanimal(A) (istype((A), /mob/living/simple_animal))
diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm
index e0c71836c72..ec65a37642f 100644
--- a/code/__DEFINES/radio.dm
+++ b/code/__DEFINES/radio.dm
@@ -58,3 +58,10 @@
#define RADIO_MEDBOT "12"
#define RADIO_MAGNETS "radio_magnet"
#define RADIO_LOGIC "radio_logic"
+
+// Signal types
+#define SIGNALTYPE_NORMAL 0
+#define SIGNALTYPE_INTERCOM 1 // Will only broadcast to intercoms
+#define SIGNALTYPE_INTERCOM_SBR 2 // Will only broadcast to intercoms and station-bounced radios
+#define SIGNALTYPE_AINOTRACK 4 // AI can't track down this person. Useful for imitation broadcasts where you can't find the actual mob
+
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 2b9e2c56b4d..8021fa4452d 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -48,7 +48,7 @@
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
//(in game days played) to play that role
-var/global/list/special_roles = list(
+GLOBAL_LIST_INIT(special_roles, list(
ROLE_ABDUCTOR = /datum/game_mode/abduction, // Abductor
ROLE_BLOB = /datum/game_mode/blob, // Blob
ROLE_CHANGELING = /datum/game_mode/changeling, // Changeling
@@ -72,10 +72,10 @@ var/global/list/special_roles = list(
ROLE_VAMPIRE = /datum/game_mode/vampire, // Vampire
ROLE_RAIDER = /datum/game_mode/heist, // Vox raider
ROLE_ALIEN, // Xenomorph
- ROLE_WIZARD = /datum/game_mode/wizard, // Wizard
+ ROLE_WIZARD = /datum/game_mode/wizard // Wizard
// UNUSED/BROKEN ANTAGS
// ROLE_HOG_GOD = /datum/game_mode/hand_of_god,
// ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god,
// ROLE_MONKEY = /datum/game_mode/monkey, Sooner or later these are going to get ported
-// ROLE_GANG = /datum/game_mode/gang,
-)
+// ROLE_GANG = /datum/game_mode/gang
+))
diff --git a/code/__DEFINES/rolebans.dm b/code/__DEFINES/rolebans.dm
index d6e54abf14a..ad6f1324afa 100644
--- a/code/__DEFINES/rolebans.dm
+++ b/code/__DEFINES/rolebans.dm
@@ -1,5 +1,5 @@
// Bannable antag roles
-var/global/list/antag_roles = list(
+GLOBAL_LIST_INIT(antag_roles, list(
ROLE_TRAITOR,
ROLE_OPERATIVE,
ROLE_CHANGELING,
@@ -18,14 +18,14 @@ var/global/list/antag_roles = list(
ROLE_GUARDIAN,
ROLE_MORPH,
ROLE_GSPIDER,
-)
+))
// Bannable other roles
-var/global/list/other_roles = list(
+GLOBAL_LIST_INIT(other_roles, list(
ROLE_SENTIENT,
ROLE_NYMPH,
ROLE_ERT,
ROLE_GHOST,
"AntagHUD",
"Records"
-)
+))
diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm
index b0274e9d802..c15dfd78b0f 100644
--- a/code/__DEFINES/sound.dm
+++ b/code/__DEFINES/sound.dm
@@ -15,3 +15,57 @@
#define SOUND_MINIMUM_PRESSURE 10
#define FALLOFF_SOUNDS 0.5
+
+//Ambience types
+
+#define GENERIC_SOUNDS list('sound/ambience/ambigen1.ogg', 'sound/ambience/ambigen3.ogg',\
+ 'sound/ambience/ambigen4.ogg', 'sound/ambience/ambigen5.ogg',\
+ 'sound/ambience/ambigen6.ogg', 'sound/ambience/ambigen7.ogg',\
+ 'sound/ambience/ambigen8.ogg', 'sound/ambience/ambigen9.ogg',\
+ 'sound/ambience/ambigen10.ogg', 'sound/ambience/ambigen11.ogg',\
+ 'sound/ambience/ambigen12.ogg', 'sound/ambience/ambigen14.ogg', 'sound/ambience/ambigen15.ogg')
+
+#define HOLY_SOUNDS list('sound/ambience/ambicha1.ogg', 'sound/ambience/ambicha2.ogg', 'sound/ambience/ambicha3.ogg',\
+ 'sound/ambience/ambicha4.ogg', 'sound/ambience/ambiholy.ogg', 'sound/ambience/ambiholy2.ogg',\
+ 'sound/ambience/ambiholy3.ogg')
+
+#define HIGHSEC_SOUNDS list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg')
+
+#define RUINS_SOUNDS list('sound/ambience/ambimine.ogg', 'sound/ambience/ambicave.ogg', 'sound/ambience/ambiruin.ogg',\
+ 'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\
+ 'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\
+ 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambitech3.ogg',\
+ 'sound/ambience/ambimystery.ogg', 'sound/ambience/ambimaint1.ogg')
+
+#define ENGINEERING_SOUNDS list('sound/ambience/ambisin1.ogg', 'sound/ambience/ambisin2.ogg', 'sound/ambience/ambisin3.ogg', 'sound/ambience/ambisin4.ogg',\
+ 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg', 'sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg')
+
+#define MINING_SOUNDS list('sound/ambience/ambimine.ogg', 'sound/ambience/ambicave.ogg', 'sound/ambience/ambiruin.ogg',\
+ 'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\
+ 'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\
+ 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint1.ogg',\
+ 'sound/ambience/ambilava1.ogg', 'sound/ambience/ambilava2.ogg', 'sound/ambience/ambilava3.ogg')
+
+#define MEDICAL_SOUNDS list('sound/ambience/ambinice.ogg')
+
+#define SPOOKY_SOUNDS list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg','sound/ambience/ambiruin7.ogg','sound/ambience/ambiruin6.ogg',\
+ 'sound/ambience/ambiodd.ogg', 'sound/ambience/ambimystery.ogg')
+
+#define SPACE_SOUNDS list('sound/ambience/ambispace.ogg', 'sound/ambience/ambispace2.ogg', 'sound/music/title2.ogg', 'sound/ambience/ambiatmos.ogg')
+
+#define MAINTENANCE_SOUNDS list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg',\
+ 'sound/ambience/ambimaint5.ogg', 'sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg', 'sound/ambience/ambitech2.ogg' )
+
+#define AWAY_MISSION_SOUNDS list('sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiruin.ogg',\
+ 'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\
+ 'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\
+ 'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint.ogg',\
+ 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg', 'sound/ambience/ambiodd.ogg')
+
+
+
+#define CREEPY_SOUNDS list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\
+ 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
+ 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
+ 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
+ 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm
index b0a74b6c702..c9763e4836c 100644
--- a/code/__DEFINES/stat.dm
+++ b/code/__DEFINES/stat.dm
@@ -3,7 +3,7 @@
#define UNCONSCIOUS 1
#define DEAD 2
-// NanoUI flags
+// NanoUI & TGUI flags
#define STATUS_INTERACTIVE 2 // GREEN Visability
#define STATUS_UPDATE 1 // ORANGE Visability
#define STATUS_DISABLED 0 // RED Visability
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 300d3a41fc0..153eca7f373 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -44,7 +44,7 @@
// Subsystem init_order, from highest priority to lowest priority
// Subsystems shutdown in the reverse of the order they initialize in
// The numbers just define the ordering, they are meaningless otherwise.
-
+#define INIT_ORDER_TITLE 100 // This **MUST** load first or people will se blank lobby screens
#define INIT_ORDER_GARBAGE 19
#define INIT_ORDER_DBCORE 18
#define INIT_ORDER_BLACKBOX 17
@@ -66,6 +66,7 @@
#define INIT_ORDER_TIMER 1
#define INIT_ORDER_DEFAULT 0
#define INIT_ORDER_AIR -1
+#define INIT_ORDER_SUN -2
#define INIT_ORDER_MINIMAP -3
#define INIT_ORDER_ASSETS -4
#define INIT_ORDER_ICON_SMOOTHING -5
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index 7a91c3bf9bc..a3154834fe4 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -5,7 +5,7 @@
// will get logs that are one big line if the system is Linux and they are using notepad. This solves it by adding CR to every line ending
// in the logs. ascii character 13 = CR
-/var/global/log_end = world.system_type == UNIX ? ascii2text(13) : ""
+GLOBAL_VAR_INIT(log_end, (world.system_type == UNIX ? ascii2text(13) : ""))
#define DIRECT_OUTPUT(A, B) A << B
#define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image)
@@ -30,13 +30,13 @@
#endif
/proc/log_admin(text)
- admin_log.Add(text)
+ GLOB.admin_log.Add(text)
if(config.log_admin)
- WRITE_LOG(GLOB.world_game_log, "ADMIN: [text][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "ADMIN: [text][GLOB.log_end]")
/proc/log_debug(text)
if(config.log_debug)
- WRITE_LOG(GLOB.world_game_log, "DEBUG: [text][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "DEBUG: [text][GLOB.log_end]")
for(var/client/C in GLOB.admins)
if(check_rights(R_DEBUG, 0, C.mob) && (C.prefs.toggles & CHAT_DEBUGLOGS))
@@ -44,88 +44,88 @@
/proc/log_game(text)
if(config.log_game)
- WRITE_LOG(GLOB.world_game_log, "GAME: [text][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "GAME: [text][GLOB.log_end]")
/proc/log_vote(text)
if(config.log_vote)
- WRITE_LOG(GLOB.world_game_log, "VOTE: [text][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "VOTE: [text][GLOB.log_end]")
/proc/log_access_in(client/new_client)
if(config.log_access)
var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]"
- WRITE_LOG(GLOB.world_game_log, "ACCESS IN: [message][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "ACCESS IN: [message][GLOB.log_end]")
/proc/log_access_out(mob/last_mob)
if(config.log_access)
var/message = "[key_name(last_mob)] - IP:[last_mob.lastKnownIP] - CID:[last_mob.computer_id] - BYOND Logged Out"
- WRITE_LOG(GLOB.world_game_log, "ACCESS OUT: [message][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "ACCESS OUT: [message][GLOB.log_end]")
/proc/log_say(text, mob/speaker)
if(config.log_say)
- WRITE_LOG(GLOB.world_game_log, "SAY: [speaker.simple_info_line()]: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "SAY: [speaker.simple_info_line()]: [html_decode(text)][GLOB.log_end]")
/proc/log_whisper(text, mob/speaker)
if(config.log_whisper)
- WRITE_LOG(GLOB.world_game_log, "WHISPER: [speaker.simple_info_line()]: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "WHISPER: [speaker.simple_info_line()]: [html_decode(text)][GLOB.log_end]")
/proc/log_ooc(text, client/user)
if(config.log_ooc)
- WRITE_LOG(GLOB.world_game_log, "OOC: [user.simple_info_line()]: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "OOC: [user.simple_info_line()]: [html_decode(text)][GLOB.log_end]")
/proc/log_aooc(text, client/user)
if(config.log_ooc)
- WRITE_LOG(GLOB.world_game_log, "AOOC: [user.simple_info_line()]: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "AOOC: [user.simple_info_line()]: [html_decode(text)][GLOB.log_end]")
/proc/log_looc(text, client/user)
if(config.log_ooc)
- WRITE_LOG(GLOB.world_game_log, "LOOC: [user.simple_info_line()]: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "LOOC: [user.simple_info_line()]: [html_decode(text)][GLOB.log_end]")
/proc/log_emote(text, mob/speaker)
if(config.log_emote)
- WRITE_LOG(GLOB.world_game_log, "EMOTE: [speaker.simple_info_line()]: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "EMOTE: [speaker.simple_info_line()]: [html_decode(text)][GLOB.log_end]")
/proc/log_attack(attacker, defender, message)
if(config.log_attack)
- WRITE_LOG(GLOB.world_game_log, "ATTACK: [attacker] against [defender]: [message][log_end]") //Seperate attack logs? Why?
+ WRITE_LOG(GLOB.world_game_log, "ATTACK: [attacker] against [defender]: [message][GLOB.log_end]") //Seperate attack logs? Why?
/proc/log_adminsay(text, mob/speaker)
if(config.log_adminchat)
- WRITE_LOG(GLOB.world_game_log, "ADMINSAY: [speaker.simple_info_line()]: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "ADMINSAY: [speaker.simple_info_line()]: [html_decode(text)][GLOB.log_end]")
/proc/log_qdel(text)
WRITE_LOG(GLOB.world_qdel_log, "QDEL: [text]")
/proc/log_mentorsay(text, mob/speaker)
if(config.log_adminchat)
- WRITE_LOG(GLOB.world_game_log, "MENTORSAY: [speaker.simple_info_line()]: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "MENTORSAY: [speaker.simple_info_line()]: [html_decode(text)][GLOB.log_end]")
/proc/log_ghostsay(text, mob/speaker)
if(config.log_say)
- WRITE_LOG(GLOB.world_game_log, "DEADCHAT: [speaker.simple_info_line()]: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "DEADCHAT: [speaker.simple_info_line()]: [html_decode(text)][GLOB.log_end]")
/proc/log_ghostemote(text, mob/speaker)
if(config.log_emote)
- WRITE_LOG(GLOB.world_game_log, "DEADEMOTE: [speaker.simple_info_line()]: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "DEADEMOTE: [speaker.simple_info_line()]: [html_decode(text)][GLOB.log_end]")
/proc/log_adminwarn(text)
if(config.log_adminwarn)
- WRITE_LOG(GLOB.world_game_log, "ADMINWARN: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "ADMINWARN: [html_decode(text)][GLOB.log_end]")
/proc/log_pda(text, mob/speaker)
if(config.log_pda)
- WRITE_LOG(GLOB.world_game_log, "PDA: [speaker.simple_info_line()]: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "PDA: [speaker.simple_info_line()]: [html_decode(text)][GLOB.log_end]")
/proc/log_chat(text, mob/speaker)
if(config.log_pda)
- WRITE_LOG(GLOB.world_game_log, "CHAT: [speaker.simple_info_line()] [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "CHAT: [speaker.simple_info_line()] [html_decode(text)][GLOB.log_end]")
/proc/log_misc(text)
- WRITE_LOG(GLOB.world_game_log, "MISC: [text][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "MISC: [text][GLOB.log_end]")
/proc/log_world(text)
SEND_TEXT(world.log, text)
if(config && config.log_world_output)
- WRITE_LOG(GLOB.world_game_log, "WORLD: [html_decode(text)][log_end]")
+ WRITE_LOG(GLOB.world_game_log, "WORLD: [html_decode(text)][GLOB.log_end]")
/proc/log_runtime_txt(text) // different from /tg/'s log_runtime because our error handler has a log_runtime proc already that does other stuff
WRITE_LOG(GLOB.world_runtime_log, text)
@@ -143,6 +143,9 @@
/proc/log_runtime_summary(text)
WRITE_LOG(GLOB.runtime_summary_log, "[text]")
+/proc/log_tgui(text)
+ WRITE_LOG(GLOB.tgui_log, "[text]")
+
/**
* Standardized method for tracking startup times.
*/
diff --git a/code/__HELPERS/_string_lists.dm b/code/__HELPERS/_string_lists.dm
index 36aa2f9b6fa..e2f0c6081e7 100644
--- a/code/__HELPERS/_string_lists.dm
+++ b/code/__HELPERS/_string_lists.dm
@@ -2,15 +2,15 @@
#define pick_list_replacements(FILE, KEY) (strings_replacement(FILE, KEY))
#define json_load(FILE) (json_decode(file2text(FILE)))
-var/global/list/string_cache
-var/global/list/string_filename_current_key
+GLOBAL_LIST_EMPTY(string_cache)
+GLOBAL_LIST_EMPTY(string_filename_current_key)
/proc/strings_replacement(filename, key)
load_strings_file(filename)
- if((filename in string_cache) && (key in string_cache[filename]))
- var/response = pick(string_cache[filename][key])
+ if((filename in GLOB.string_cache) && (key in GLOB.string_cache[filename]))
+ var/response = pick(GLOB.string_cache[filename][key])
var/regex/r = regex("@pick\\((\\D+?)\\)", "g")
response = r.Replace(response, /proc/strings_subkey_lookup)
return response
@@ -19,23 +19,23 @@ var/global/list/string_filename_current_key
/proc/strings(filename as text, key as text)
load_strings_file(filename)
- if((filename in string_cache) && (key in string_cache[filename]))
- return string_cache[filename][key]
+ if((filename in GLOB.string_cache) && (key in GLOB.string_cache[filename]))
+ return GLOB.string_cache[filename][key]
else
CRASH("strings list not found: strings/[filename], index=[key]")
/proc/strings_subkey_lookup(match, group1)
- return pick_list(string_filename_current_key, group1)
+ return pick_list(GLOB.string_filename_current_key, group1)
/proc/load_strings_file(filename)
- string_filename_current_key = filename
- if(filename in string_cache)
+ GLOB.string_filename_current_key = filename
+ if(filename in GLOB.string_cache)
return //no work to do
- if(!string_cache)
- string_cache = new
+ if(!GLOB.string_cache)
+ GLOB.string_cache = new
if(fexists("strings/[filename]"))
- string_cache[filename] = json_load("strings/[filename]")
+ GLOB.string_cache[filename] = json_load("strings/[filename]")
else
CRASH("file not found: strings/[filename]")
diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm
index c96357299c2..0a58ed035f7 100644
--- a/code/__HELPERS/files.dm
+++ b/code/__HELPERS/files.dm
@@ -18,6 +18,8 @@
src << browse_rsc(file)
/client/proc/browse_files(root="data/logs/", max_iterations=10, list/valid_extensions=list(".txt",".log",".htm"))
+ // wow why was this ever a parameter
+ root = "data/logs/"
var/path = root
for(var/i=0, i 0)
to_chat(src, "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.")
return 1
- fileaccess_timer = world.time + FTPDELAY
+ GLOB.fileaccess_timer = world.time + FTPDELAY
return 0
#undef FTPDELAY
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index f61b6452f22..bd077204f00 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -1,4 +1,5 @@
/proc/get_area(atom/A)
+ RETURN_TYPE(/area)
if(isarea(A))
return A
var/turf/T = get_turf(A)
@@ -120,7 +121,7 @@
-//var/debug_mob = 0
+//GLOBAL_VAR_INIT(debug_mob, 0)
// Will recursively loop through an atom's contents and check for mobs, then it will loop through every atom in that atom's contents.
// It will keep doing this until it checks every content possible. This will fix any problems with mobs, that are inside objects,
@@ -128,7 +129,7 @@
/proc/recursive_mob_check(var/atom/O, var/list/L = list(), var/recursion_limit = 3, var/client_check = 1, var/sight_check = 1, var/include_radio = 1)
- //debug_mob += O.contents.len
+ //GLOB.debug_mob += O.contents.len
if(!recursion_limit)
return L
for(var/atom/A in O.contents)
@@ -182,9 +183,6 @@
/proc/get_mobs_in_radio_ranges(var/list/obj/item/radio/radios)
-
- set background = 1
-
. = list()
// Returns a list of mobs who can hear any of the radios given in @radios
var/list/speaker_coverage = list()
@@ -273,7 +271,7 @@
/proc/try_move_adjacent(atom/movable/AM)
var/turf/T = get_turf(AM)
- for(var/direction in cardinal)
+ for(var/direction in GLOB.cardinal)
if(AM.Move(get_step(T, direction)))
break
@@ -346,7 +344,7 @@
for(var/i = 1; i <= GLOB.player_list.len; i++)
var/mob/M = GLOB.player_list[i]
if(M && M.client)
- if(istype(M, /mob/new_player)) // exclude people in the lobby
+ if(isnewplayer(M)) // exclude people in the lobby
continue
else if(isobserver(M)) // Ghosts are fine if they were playing once (didn't start as observers)
var/mob/dead/observer/O = M
@@ -407,7 +405,7 @@
/proc/alone_in_area(var/area/the_area, var/mob/must_be_alone, var/check_type = /mob/living/carbon)
var/area/our_area = get_area(the_area)
- for(var/C in GLOB.living_mob_list)
+ for(var/C in GLOB.alive_mob_list)
if(!istype(C, check_type))
continue
if(C == must_be_alone)
@@ -416,16 +414,6 @@
return 0
return 1
-
-/proc/GetRedPart(const/hexa)
- return hex2num(copytext(hexa, 2, 4))
-
-/proc/GetGreenPart(const/hexa)
- return hex2num(copytext(hexa, 4, 6))
-
-/proc/GetBluePart(const/hexa)
- return hex2num(copytext(hexa, 6, 8))
-
/proc/lavaland_equipment_pressure_check(turf/T)
. = FALSE
if(!istype(T))
@@ -437,19 +425,6 @@
if(pressure <= LAVALAND_EQUIPMENT_EFFECT_PRESSURE)
. = TRUE
-/proc/GetHexColors(const/hexa)
- return list(
- GetRedPart(hexa),
- GetGreenPart(hexa),
- GetBluePart(hexa),
- )
-
-/proc/MinutesToTicks(var/minutes as num)
- return minutes * 60 * 10
-
-/proc/SecondsToTicks(var/seconds)
- return seconds * 10
-
proc/pollCandidates(Question, be_special_type, antag_age_check = FALSE, poll_time = 300, ignore_respawnability = FALSE, min_hours = 0, flashwindow = TRUE, check_antaghud = TRUE)
var/roletext = be_special_type ? get_roletext(be_special_type) : null
var/list/mob/dead/observer/candidates = list()
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 0002bc0d488..cbc691e3c2a 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -23,6 +23,14 @@
init_subtypes(/datum/surgery_step, GLOB.surgery_steps)
+ // Different bodies
+ __init_body_accessory(/datum/body_accessory/body)
+ // Different tails
+ __init_body_accessory(/datum/body_accessory/tail)
+
+ // Setup species:accessory relations
+ initialize_body_accessory_by_species()
+
for(var/path in (subtypesof(/datum/surgery)))
GLOB.surgeries_list += new path()
@@ -30,6 +38,7 @@
init_datum_subtypes(/datum/superheroes, GLOB.all_superheroes, null, "name")
init_datum_subtypes(/datum/language, GLOB.all_languages, null, "name")
+ // Setup languages
for(var/language_name in GLOB.all_languages)
var/datum/language/L = GLOB.all_languages[language_name]
if(!(L.flags & NONGLOBAL))
@@ -54,7 +63,61 @@
var/datum/pipes/P = D
if(P.rpd_dispensable)
GLOB.rpd_pipe_list += list(list("pipe_name" = P.pipe_name, "pipe_id" = P.pipe_id, "pipe_type" = P.pipe_type, "pipe_category" = P.pipe_category, "orientations" = P.orientations, "pipe_icon" = P.pipe_icon, "bendy" = P.bendy))
- return 1
+
+ // Setup PAI software
+ for(var/type in subtypesof(/datum/pai_software))
+ var/datum/pai_software/P = new type()
+ if(GLOB.pai_software_by_key[P.id])
+ var/datum/pai_software/O = GLOB.pai_software_by_key[P.id]
+ to_chat(world, "pAI software module [P.name] has the same key as [O.name]!")
+ continue
+ GLOB.pai_software_by_key[P.id] = P
+ if(P.default)
+ GLOB.default_pai_software[P.id] = P
+
+ // Setup loadout gear
+ for(var/geartype in subtypesof(/datum/gear))
+ var/datum/gear/G = geartype
+
+ var/use_name = initial(G.display_name)
+ var/use_category = initial(G.sort_category)
+
+ if(G == initial(G.subtype_path))
+ continue
+
+ if(!use_name)
+ error("Loadout - Missing display name: [G]")
+ continue
+ if(!initial(G.cost))
+ error("Loadout - Missing cost: [G]")
+ continue
+ if(!initial(G.path))
+ error("Loadout - Missing path definition: [G]")
+ continue
+
+ if(!GLOB.loadout_categories[use_category])
+ GLOB.loadout_categories[use_category] = new /datum/loadout_category(use_category)
+ var/datum/loadout_category/LC = GLOB.loadout_categories[use_category]
+ GLOB.gear_datums[use_name] = new geartype
+ LC.gear[use_name] = GLOB.gear_datums[use_name]
+
+ GLOB.loadout_categories = sortAssoc(GLOB.loadout_categories)
+ for(var/loadout_category in GLOB.loadout_categories)
+ var/datum/loadout_category/LC = GLOB.loadout_categories[loadout_category]
+ LC.gear = sortAssoc(LC.gear)
+
+
+ // Setup a list of robolimbs
+ GLOB.basic_robolimb = new()
+ for(var/limb_type in typesof(/datum/robolimb))
+ var/datum/robolimb/R = new limb_type()
+ GLOB.all_robolimbs[R.company] = R
+ if(!R.unavailable_at_chargen)
+ if(R != "head" && R != "chest" && R != "groin" ) //Part of the method that ensures only IPCs can access head, chest and groin prosthetics.
+ if(R.has_subtypes) //Ensures solos get added to the list as well be incorporating has_subtypes == 1 and has_subtypes == 2.
+ GLOB.chargen_robolimbs[R.company] = R //List only main brands and solo parts.
+ if(R.selectable)
+ GLOB.selectable_robolimbs[R.company] = R
/* // Uncomment to debug chemical reaction list.
/client/verb/debug_chemical_list()
diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm
index acf202f0eee..caa8291b4bb 100644
--- a/code/__HELPERS/icon_smoothing.dm
+++ b/code/__HELPERS/icon_smoothing.dm
@@ -61,12 +61,12 @@
var/adjacencies = 0
var/atom/movable/AM
- if(ismovableatom(A))
+ if(ismovable(A))
AM = A
if(AM.can_be_unanchored && !AM.anchored)
return 0
- for(var/direction in cardinal)
+ for(var/direction in GLOB.cardinal)
AM = find_type_in_direction(A, direction)
if(AM == NULLTURF_BORDER)
if((A.smooth & SMOOTH_BORDER))
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index a434dd75577..ef0f47b2f9c 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -15,7 +15,7 @@ CHANGING ICONS
Several new procs have been added to the /icon datum to simplify working with icons. To use them,
remember you first need to setup an /icon var like so:
-var/icon/my_icon = new('iconfile.dmi')
+ var/icon/my_icon = new('iconfile.dmi')
icon/ChangeOpacity(amount = 1)
A very common operation in DM is to try to make an icon more or less transparent. Making an icon more
@@ -570,6 +570,18 @@ world
/proc/BlendRGBasHSV(rgb1, rgb2, amount)
return HSVtoRGB(RGBtoHSV(rgb1), RGBtoHSV(rgb2), amount)
+//Returns the perceived brightness of a color.
+//https://en.wikipedia.org/wiki/Relative_luminance
+//https://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color
+/proc/getLuminance(color)
+ var/list/RGB = ReadRGB(color)
+ var/R = RGB[1]
+ var/G = RGB[2]
+ var/B = RGB[2]
+
+ var/Y = (0.2126 * R) + (0.7152 * G) + (0.0722 * B)
+ return clamp((Y * 0.01), 0, 1) //Returns the brightness of a color in decimal percentage format. Can multiply light_power by this to receive 100% brightness or a lower brightness. Not a higher brightness.
+
/proc/HueToAngle(hue)
// normalize hsv in case anything is screwy
if(hue < 0 || hue >= 1536) hue %= 1536
@@ -887,9 +899,9 @@ The _flatIcons list is a cache for generated icon files.
if(!value) return color
var/list/RGB = ReadRGB(color)
- RGB[1] = Clamp(RGB[1]+value,0,255)
- RGB[2] = Clamp(RGB[2]+value,0,255)
- RGB[3] = Clamp(RGB[3]+value,0,255)
+ RGB[1] = clamp(RGB[1]+value,0,255)
+ RGB[2] = clamp(RGB[2]+value,0,255)
+ RGB[3] = clamp(RGB[3]+value,0,255)
return rgb(RGB[1],RGB[2],RGB[3])
/proc/sort_atoms_by_layer(var/list/atoms)
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index 7d1b8ee6ebc..f9b9850bd2d 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -690,6 +690,8 @@ proc/dd_sortedObjectList(list/incoming)
// LAZYING PT 2: THE LAZENING
#define LAZYREINITLIST(L) LAZYCLEARLIST(L); LAZYINITLIST(L);
+// Lazying Episode 3
+#define LAZYSET(L, K, V) LAZYINITLIST(L); L[K] = V;
//same, but returns nothing and acts on list in place
/proc/shuffle_inplace(list/L)
diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm
deleted file mode 100644
index d3deb81d458..00000000000
--- a/code/__HELPERS/maths.dm
+++ /dev/null
@@ -1,143 +0,0 @@
-// Credits to Nickr5 for the useful procs I've taken from his library resource.
-
-#define MATH_E 2.71828183
-#define SQRT2 1.41421356
-
-/proc/Atan2(x, y)
- if(!x && !y) return 0
- var/a = arccos(x / sqrt(x*x + y*y))
- return y >= 0 ? a : -a
-
-// Greatest Common Divisor - Euclid's algorithm
-/proc/Gcd(a, b)
- return b ? Gcd(b, a % b) : a
-
-/proc/IsAboutEqual(a, b, deviation = 0.1)
- return abs(a - b) <= deviation
-
-// Performs a linear interpolation between a and b.
-// Note that amount=0 returns a, amount=1 returns b, and
-// amount=0.5 returns the mean of a and b.
-/proc/Lerp(a, b, amount = 0.5)
- return a + (b - a) * amount
-
-/proc/Mean(...)
- var/values = 0
- var/sum = 0
- for(var/val in args)
- values++
- sum += val
- return sum / values
-
-// The quadratic formula. Returns a list with the solutions, or an empty list
-// if they are imaginary.
-/proc/SolveQuadratic(a, b, c)
- ASSERT(a)
- . = list()
- var/d = b*b - 4 * a * c
- var/bottom = 2 * a
- if(d < 0) return
- var/root = sqrt(d)
- . += (-b + root) / bottom
- if(!d) return
- . += (-b - root) / bottom
-
-// Will filter out extra rotations and negative rotations
-// E.g: 540 becomes 180. -180 becomes 180.
-/proc/SimplifyDegrees(degrees)
- degrees = degrees % 360
- if(degrees < 0)
- degrees += 360
- return degrees
-
-// min is inclusive, max is exclusive
-/proc/Wrap(val, min, max)
- var/d = max - min
- var/t = Floor((val - min) / d)
- return val - (t * d)
-
-//A logarithm that converts an integer to a number scaled between 0 and 1 (can be tweaked to be higher).
-//Currently, this is used for hydroponics-produce sprite transforming, but could be useful for other transform functions.
-/proc/TransformUsingVariable(input, inputmaximum, scaling_modifier = 0)
-
- var/inputToDegrees = (input/inputmaximum)*180 //Converting from a 0 -> 100 scale to a 0 -> 180 scale. The 0 -> 180 scale corresponds to degrees
- var/size_factor = ((-cos(inputToDegrees) +1) /2) //returns a value from 0 to 1
-
- return size_factor + scaling_modifier //scale mod of 0 results in a number from 0 to 1. A scale modifier of +0.5 returns 0.5 to 1.5
- //world<< "Transform multiplier of [src] is [size_factor + scaling_modifer]"
-
-/proc/RaiseToPower(num, power)
- if(!power) return 1
- return (power-- > 1 ? num * RaiseToPower(num, power) : num)
-
-//converts a uniform distributed random number into a normal distributed one
-//since this method produces two random numbers, one is saved for subsequent calls
-//(making the cost negligble for every second call)
-//This will return +/- decimals, situated about mean with standard deviation stddev
-//68% chance that the number is within 1stddev
-//95% chance that the number is within 2stddev
-//98% chance that the number is within 3stddev...etc
-var/gaussian_next
-#define ACCURACY 10000
-/proc/gaussian(mean, stddev)
- var/R1;var/R2;var/working
- if(gaussian_next != null)
- R1 = gaussian_next
- gaussian_next = null
- else
- do
- R1 = rand(-ACCURACY,ACCURACY)/ACCURACY
- R2 = rand(-ACCURACY,ACCURACY)/ACCURACY
- working = R1*R1 + R2*R2
- while(working >= 1 || working==0)
- working = sqrt(-2 * log(working) / working)
- R1 *= working
- gaussian_next = R2 * working
- return (mean + stddev * R1)
-#undef ACCURACY
-
-
-
-// oof, what a mouthful
-// Used in status_procs' "adjust" to let them modify a status effect by a given
-// amount, without inadverdently increasing it in the wrong direction
-/proc/directional_bounded_sum(orig_val, modifier, bound_lower, bound_upper)
- var/new_val = orig_val + modifier
- if(modifier > 0)
- if(new_val > bound_upper)
- new_val = max(orig_val, bound_upper)
- else if(modifier < 0)
- if(new_val < bound_lower)
- new_val = min(orig_val, bound_lower)
- return new_val
-
-// sqrt, but if you give it a negative number, you get 0 instead of a runtime
-/proc/sqrtor0(num)
- if(num < 0)
- return 0
- return sqrt(num)
-
-/proc/round_down(num)
- if(round(num) != num)
- return round(num--)
- else return num
-
-// Returns a list where [1] is all x values and [2] is all y values that overlap between the given pair of rectangles
-/proc/get_overlap(x1, y1, x2, y2, x3, y3, x4, y4)
- var/list/region_x1 = list()
- var/list/region_y1 = list()
- var/list/region_x2 = list()
- var/list/region_y2 = list()
-
- // These loops create loops filled with x/y values that the boundaries inhabit
- // ex: list(5, 6, 7, 8, 9)
- for(var/i in min(x1, x2) to max(x1, x2))
- region_x1["[i]"] = TRUE
- for(var/i in min(y1, y2) to max(y1, y2))
- region_y1["[i]"] = TRUE
- for(var/i in min(x3, x4) to max(x3, x4))
- region_x2["[i]"] = TRUE
- for(var/i in min(y3, y4) to max(y3, y4))
- region_y2["[i]"] = TRUE
-
- return list(region_x1 & region_x2, region_y1 & region_y2)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 2dc3057ce19..f7c66c3378b 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -59,7 +59,7 @@ proc/random_hair_style(var/gender, species = "Human", var/datum/robolimb/robohea
continue
if(species == "Machine") //If the user is a species who can have a robotic head...
if(!robohead)
- robohead = all_robolimbs["Morpheus Cyberkinetics"]
+ robohead = GLOB.all_robolimbs["Morpheus Cyberkinetics"]
if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
valid_hairstyles += hairstyle //Give them their hairstyles if they do.
else
@@ -88,7 +88,7 @@ proc/random_facial_hair_style(var/gender, species = "Human", var/datum/robolimb/
continue
if(species == "Machine") //If the user is a species who can have a robotic head...
if(!robohead)
- robohead = all_robolimbs["Morpheus Cyberkinetics"]
+ robohead = GLOB.all_robolimbs["Morpheus Cyberkinetics"]
if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
else
@@ -142,7 +142,7 @@ proc/random_marking_style(var/location = "body", species = "Human", var/datum/ro
var/datum/sprite_accessory/body_markings/head/M = GLOB.marking_styles_list[S.name]
if(species == "Machine")//If the user is a species that can have a robotic head...
if(!robohead)
- robohead = all_robolimbs["Morpheus Cyberkinetics"]
+ robohead = GLOB.all_robolimbs["Morpheus Cyberkinetics"]
if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
continue
else if(alt_head && alt_head != "None") //If the user's got an alt head, validate markings for that head.
@@ -161,8 +161,8 @@ proc/random_marking_style(var/location = "body", species = "Human", var/datum/ro
proc/random_body_accessory(species = "Vulpkanin")
var/body_accessory = null
var/list/valid_body_accessories = list()
- for(var/B in body_accessory_by_name)
- var/datum/body_accessory/A = body_accessory_by_name[B]
+ for(var/B in GLOB.body_accessory_by_name)
+ var/datum/body_accessory/A = GLOB.body_accessory_by_name[B]
if(!istype(A))
valid_body_accessories += "None" //The only null entry should be the "None" option.
continue
@@ -244,24 +244,30 @@ proc/age2agedescription(age)
var/their_rank = target_records.fields["rank"]
switch(criminal_status)
if("arrest")
- status = "*Arrest*"
+ status = SEC_RECORD_STATUS_ARREST
if("none")
- status = "None"
+ status = SEC_RECORD_STATUS_NONE
if("execute")
if((ACCESS_MAGISTRATE in authcard_access) || (ACCESS_ARMORY in authcard_access))
- status = "*Execute*"
+ status = SEC_RECORD_STATUS_EXECUTE
message_admins("[ADMIN_FULLMONTY(usr)] authorized EXECUTION for [their_rank] [their_name], with comment: [comment]")
else
return 0
+ if("search")
+ status = SEC_RECORD_STATUS_SEARCH
+ if("monitor")
+ status = SEC_RECORD_STATUS_MONITOR
+ if ("demote")
+ status = SEC_RECORD_STATUS_DEMOTE
if("incarcerated")
- status = "Incarcerated"
+ status = SEC_RECORD_STATUS_INCARCERATED
if("parolled")
- status = "Parolled"
+ status = SEC_RECORD_STATUS_PAROLLED
if("released")
- status = "Released"
+ status = SEC_RECORD_STATUS_RELEASED
target_records.fields["criminal"] = status
log_admin("[key_name_admin(user)] set secstatus of [their_rank] [their_name] to [status], comment: [comment]")
- target_records.fields["comments"] += "Set to [status] by [user.name] ([user_rank]) on [current_date_string] [station_time_timestamp()], comment: [comment]"
+ target_records.fields["comments"] += "Set to [status] by [user.name] ([user_rank]) on [GLOB.current_date_string] [station_time_timestamp()], comment: [comment]"
update_all_mob_security_hud()
return 1
@@ -274,32 +280,41 @@ Proc for attack log creation, because really why not
This is always put in the attack log.
*/
-/proc/add_attack_logs(mob/user, mob/target, what_done, custom_level)
+/proc/add_attack_logs(atom/user, target, what_done, custom_level)
if(islist(target)) // Multi-victim adding
var/list/targets = target
- for(var/mob/M in targets)
- add_attack_logs(user, M, what_done, custom_level)
+ for(var/t in targets)
+ add_attack_logs(user, t, what_done, custom_level)
return
var/user_str = key_name_log(user) + COORD(user)
- var/target_str = key_name_log(target) + COORD(target)
-
- if(istype(user))
- user.create_attack_log("Attacked [target_str]: [what_done]")
- if(istype(target))
- target.create_attack_log("Attacked by [user_str]: [what_done]")
+ var/target_str
+ if(isatom(target))
+ var/atom/AT = target
+ target_str = key_name_log(AT) + COORD(AT)
+ else
+ target_str = target
+ var/mob/MU = user
+ var/mob/MT = target
+ if(istype(MU))
+ MU.create_log(ATTACK_LOG, what_done, target, get_turf(user))
+ MU.create_attack_log("Attacked [target_str]: [what_done]")
+ if(istype(MT))
+ MT.create_log(DEFENSE_LOG, what_done, user, get_turf(MT))
+ MT.create_attack_log("Attacked by [user_str]: [what_done]")
log_attack(user_str, target_str, what_done)
var/loglevel = ATKLOG_MOST
if(!isnull(custom_level))
loglevel = custom_level
- else if(istype(target))
- if(istype(user) && !user.ckey && !target.ckey) // Attacks between NPCs are only shown to admins with ATKLOG_ALL
- loglevel = ATKLOG_ALL
- else if(!user.ckey || !target.ckey || (user.ckey == target.ckey)) // Player v NPC combat is de-prioritized. Also no self-harm, nobody cares
- loglevel = ATKLOG_ALMOSTALL
+ else if(istype(MT))
+ if(istype(MU))
+ if(!MU.ckey && !MT.ckey) // Attacks between NPCs are only shown to admins with ATKLOG_ALL
+ loglevel = ATKLOG_ALL
+ else if(!MU.ckey || !MT.ckey || (MU.ckey == MT.ckey)) // Player v NPC combat is de-prioritized. Also no self-harm, nobody cares
+ loglevel = ATKLOG_ALMOSTALL
else
- var/area/A = get_area(target)
+ var/area/A = get_area(MT)
if(A && A.hide_attacklogs)
loglevel = ATKLOG_ALMOSTALL
if(isLivingSSD(target)) // Attacks on SSDs are shown to admins with any log level except ATKLOG_NONE. Overrides custom level
@@ -307,7 +322,7 @@ This is always put in the attack log.
msg_admin_attack("[key_name_admin(user)] vs [key_name_admin(target)]: [what_done]", loglevel)
-/proc/do_mob(var/mob/user, var/mob/target, var/time = 30, var/uninterruptible = 0, progress = 1, datum/callback/extra_checks = null)
+/proc/do_mob(mob/user, mob/target, time = 30, uninterruptible = 0, progress = 1, list/extra_checks = list())
if(!user || !target)
return 0
var/user_loc = user.loc
@@ -340,30 +355,41 @@ This is always put in the attack log.
drifting = 0
user_loc = user.loc
- if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_hand() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke()))
+ if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_hand() != holding || user.incapacitated() || user.lying || check_for_true_callbacks(extra_checks))
. = 0
break
if(progress)
qdel(progbar)
-/proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null)
+/* Use this proc when you want to have code under it execute after a delay, and ensure certain conditions are met during that delay...
+ * Such as the user not being interrupted via getting stunned or by moving off the tile they're currently on.
+ *
+ * Example usage:
+ *
+ * if(do_after(user, 50, target = sometarget, extra_checks = list(callback_check1, callback_check2)))
+ * do_stuff()
+ *
+ * This will create progress bar that lasts for 5 seconds. If the user doesn't move or otherwise do something that would cause the checks to fail in those 5 seconds, do_stuff() would execute.
+ * The Proc returns TRUE upon success (the progress bar reached the end), or FALSE upon failure (the user moved or some other check failed)
+ */
+/proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1, list/extra_checks = list(), use_default_checks = TRUE)
if(!user)
- return 0
+ return FALSE
var/atom/Tloc = null
if(target)
Tloc = target.loc
var/atom/Uloc = user.loc
- var/drifting = 0
+ var/drifting = FALSE
if(!user.Process_Spacemove(0) && user.inertia_dir)
- drifting = 1
+ drifting = TRUE
var/holding = user.get_active_hand()
- var/holdingnull = 1 //User's hand started out empty, check for an empty hand
+ var/holdingnull = TRUE //User's hand started out empty, check for an empty hand
if(holding)
- holdingnull = 0 //Users hand started holding something, check to see if it's still holding that
+ holdingnull = FALSE //Users hand started holding something, check to see if it's still holding that
var/datum/progressbar/progbar
if(progress)
@@ -371,22 +397,29 @@ This is always put in the attack log.
var/endtime = world.time + delay
var/starttime = world.time
- . = 1
+ . = TRUE
+
+ // By default, checks for weakness and stunned get added to the extra_checks list.
+ // Setting `use_default_checks` to FALSE means that you don't want the do_after to check for these statuses, or that you will be supplying your own checks.
+ if(use_default_checks)
+ extra_checks += CALLBACK(user, /mob.proc/IsWeakened)
+ extra_checks += CALLBACK(user, /mob.proc/IsStunned)
+
while(world.time < endtime)
sleep(1)
if(progress)
progbar.update(world.time - starttime)
if(drifting && !user.inertia_dir)
- drifting = 0
+ drifting = FALSE
Uloc = user.loc
- if(!user || user.stat || user.IsWeakened() || user.stunned || (!drifting && user.loc != Uloc)|| (extra_checks && !extra_checks.Invoke()))
- . = 0
+ if(!user || user.stat || (!drifting && user.loc != Uloc) || check_for_true_callbacks(extra_checks))
+ . = FALSE
break
if(Tloc && (!target || Tloc != target.loc))
- . = 0
+ . = FALSE
break
if(needhand)
@@ -394,14 +427,21 @@ This is always put in the attack log.
//i.e the hand is used to pull some item/tool out of the construction
if(!holdingnull)
if(!holding)
- . = 0
+ . = FALSE
break
if(user.get_active_hand() != holding)
- . = 0
+ . = FALSE
break
if(progress)
qdel(progbar)
+// Upon any of the callbacks in the list returning TRUE, the proc will return TRUE.
+/proc/check_for_true_callbacks(list/extra_checks)
+ for(var/datum/callback/CB in extra_checks)
+ if(CB.Invoke())
+ return TRUE
+ return FALSE
+
#define DOAFTERONCE_MAGIC "Magic~~"
GLOBAL_LIST_INIT(do_after_once_tracker, list())
/proc/do_after_once(mob/user, delay, needhand = 1, atom/target = null, progress = 1, attempt_cancel_message = "Attempt cancelled.")
@@ -414,14 +454,14 @@ GLOBAL_LIST_INIT(do_after_once_tracker, list())
to_chat(user, "[attempt_cancel_message]")
return FALSE
GLOB.do_after_once_tracker[cache_key] = TRUE
- . = do_after(user, delay, needhand, target, progress, extra_checks = CALLBACK(GLOBAL_PROC, .proc/do_after_once_checks, cache_key))
+ . = do_after(user, delay, needhand, target, progress, extra_checks = list(CALLBACK(GLOBAL_PROC, .proc/do_after_once_checks, cache_key)))
GLOB.do_after_once_tracker[cache_key] = FALSE
/proc/do_after_once_checks(cache_key)
if(GLOB.do_after_once_tracker[cache_key] && GLOB.do_after_once_tracker[cache_key] == DOAFTERONCE_MAGIC)
GLOB.do_after_once_tracker[cache_key] = FALSE
- return FALSE
- return TRUE
+ return TRUE
+ return FALSE
/proc/is_species(A, species_datum)
. = FALSE
@@ -576,3 +616,34 @@ GLOBAL_LIST_INIT(do_after_once_tracker, list())
chosen = pick(mob_spawn_meancritters)
var/mob/living/simple_animal/C = new chosen(spawn_location)
return C
+
+//determines the job of a mob, taking into account job transfers
+/proc/determine_role(mob/living/P)
+ var/datum/mind/M = P.mind
+ if(!M)
+ return
+ return M.playtime_role ? M.playtime_role : M.assigned_role //returns current role
+
+/** checks the security force on station and returns a list of numbers, of the form:
+ * total, active, dead, antag
+ * where active is defined as conscious (STAT = 0) and not an antag
+*/
+/proc/check_active_security_force()
+ var/sec_positions = GLOB.security_positions - "Magistrate" - "Brig Physician"
+ var/total = 0
+ var/active = 0
+ var/dead = 0
+ var/antag = 0
+ for(var/p in GLOB.human_list) //contains only human mobs, so no type check needed
+ var/mob/living/carbon/human/player = p //need to tell it what type it is or we can't access stat without the dreaded :
+ if(determine_role(player) in sec_positions)
+ total++
+ if(player.stat == DEAD)
+ dead++
+ continue
+ if(isAntag(player))
+ antag++
+ continue
+ if(player.stat == CONSCIOUS)
+ active++
+ return list(total, active, dead, antag)
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index 2125326852e..29e0f9b52b9 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -1,7 +1,7 @@
-var/church_name = null
+GLOBAL_VAR(church_name)
/proc/church_name()
- if(church_name)
- return church_name
+ if(GLOB.church_name)
+ return GLOB.church_name
var/name = ""
@@ -15,14 +15,14 @@ var/church_name = null
return name
-var/command_name = null
+GLOBAL_VAR(command_name)
/proc/command_name()
- return using_map.dock_name
+ return GLOB.using_map.dock_name
-var/religion_name = null
+GLOBAL_VAR(religion_name)
/proc/religion_name()
- if(religion_name)
- return religion_name
+ if(GLOB.religion_name)
+ return GLOB.religion_name
var/name = ""
@@ -32,10 +32,10 @@ var/religion_name = null
return capitalize(name)
/proc/system_name()
- return using_map.starsys_name
+ return GLOB.using_map.starsys_name
/proc/station_name()
- return using_map.station_name
+ return GLOB.using_map.station_name
/proc/new_station_name()
var/random = rand(1,5)
@@ -80,10 +80,10 @@ var/religion_name = null
new_station_name += pick("13","XIII","Thirteen")
return new_station_name
-var/syndicate_name = null
+GLOBAL_VAR(syndicate_name)
/proc/syndicate_name()
- if(syndicate_name)
- return syndicate_name
+ if(GLOB.syndicate_name)
+ return GLOB.syndicate_name
var/name = ""
@@ -107,7 +107,7 @@ var/syndicate_name = null
name += pick("-", "*", "")
name += pick("Tech", "Sun", "Co", "Tek", "X", "Inc", "Gen", "Star", "Dyne", "Code", "Hive")
- syndicate_name = name
+ GLOB.syndicate_name = name
return name
@@ -142,10 +142,10 @@ GLOBAL_VAR(syndicate_code_response) //Code response for traitors.
var/safety[] = list(1,2,3)//Tells the proc which options to remove later on.
var/nouns[] = list("love","hate","anger","peace","pride","sympathy","bravery","loyalty","honesty","integrity","compassion","charity","success","courage","deceit","skill","beauty","brilliance","pain","misery","beliefs","dreams","justice","truth","faith","liberty","knowledge","thought","information","culture","trust","dedication","progress","education","hospitality","leisure","trouble","friendships", "relaxation")
var/drinks[] = list("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequila sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine")
- var/locations[] = teleportlocs.len ? teleportlocs : drinks//if null, defaults to drinks instead.
+ var/locations[] = GLOB.teleportlocs.len ? GLOB.teleportlocs : drinks//if null, defaults to drinks instead.
var/names[] = list()
- for(var/datum/data/record/t in data_core.general)//Picks from crew manifest.
+ for(var/datum/data/record/t in GLOB.data_core.general)//Picks from crew manifest.
names += t.fields["name"]
var/maxwords = words//Extra var to check for duplicates.
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 289bbbae717..ecbebf813df 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -19,7 +19,7 @@
return null
if(!istext(t))
t = "[t]" // Just quietly assume any non-texts are supposed to be text
- var/sqltext = dbcon.Quote(t);
+ var/sqltext = GLOB.dbcon.Quote(t);
return copytext(sqltext, 2, length(sqltext));//Quote() adds quotes around input, we already do that
/proc/format_table_name(table as text)
@@ -207,7 +207,7 @@ proc/checkhtml(var/t)
tag = copytext(t,start, p)
p++
tag = copytext(t,start+1, p)
- if(!(tag in paper_tag_whitelist)) //if it's unkown tag, disarming it
+ if(!(tag in GLOB.paper_tag_whitelist)) //if it's unkown tag, disarming it
t = copytext(t,1,start-1) + "<" + copytext(t,start+1)
p = findtext(t,"<",p)
return t
diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm
index d13bf08c58b..83347c20d3b 100644
--- a/code/__HELPERS/time.dm
+++ b/code/__HELPERS/time.dm
@@ -11,25 +11,6 @@
#define TICKS2DS(T) ((T) TICKS)
-#define TimeOfGame (get_game_time())
-#define TimeOfTick (world.tick_usage*0.01*world.tick_lag)
-
-/proc/get_game_time()
- var/global/time_offset = 0
- var/global/last_time = 0
- var/global/last_usage = 0
-
- var/wtime = world.time
- var/wusage = world.tick_usage * 0.01
-
- if(last_time < wtime && last_usage > 1)
- time_offset += last_usage - 1
-
- last_time = wtime
- last_usage = wusage
-
- return wtime + (time_offset + wusage) * world.tick_lag
-
/* This proc should only be used for world/Topic.
* If you want to display the time for which dream daemon has been running ("round time") use worldtime2text.
* If you want to display the canonical station "time" (aka the in-character time of the station) use station_time_timestamp
@@ -50,10 +31,24 @@
return "[date_portion]T[time_portion]"
/proc/gameTimestamp(format = "hh:mm:ss", wtime=null)
- if(!wtime)
+ if(wtime == null)
wtime = world.time
return time2text(wtime - GLOB.timezoneOffset, format)
+// max hh:mm:ss supported
+/proc/timeStampToNum(timestamp)
+ var/list/splits = text2numlist(timestamp, ":")
+ . = 0
+ var/split_len = length(splits)
+ for(var/i = 1 to length(splits))
+ switch(split_len - i)
+ if(2)
+ . += splits[i] HOURS
+ if(1)
+ . += splits[i] MINUTES
+ if(0)
+ . += splits[i] SECONDS
+
/* This is used for displaying the "station time" equivelent of a world.time value
Calling it with no args will give you the current time, but you can specify a world.time-based value as an argument
- You can use this, for example, to do "This will expire at [station_time_at(world.time + 500)]" to display a "station time" expiration date
@@ -84,14 +79,14 @@ proc/isDay(var/month, var/day)
* Returns "watch handle" (really just a timestamp :V)
*/
/proc/start_watch()
- return TimeOfGame
+ return REALTIMEOFDAY
/**
* Returns number of seconds elapsed.
* @param wh number The "Watch Handle" from start_watch(). (timestamp)
*/
/proc/stop_watch(wh)
- return round(0.1 * (TimeOfGame - wh), 0.1)
+ return round(0.1 * (REALTIMEOFDAY - wh), 0.1)
/proc/numberToMonthName(number)
return GLOB.month_names.Find(number)
diff --git a/code/__HELPERS/traits.dm b/code/__HELPERS/traits.dm
index 467b07a0ddf..352a6fa3680 100644
--- a/code/__HELPERS/traits.dm
+++ b/code/__HELPERS/traits.dm
@@ -62,7 +62,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
//mob traits
#define TRAIT_PACIFISM "pacifism"
-#define TRAIT_WATERBREATH "waterbreathing"
+#define TRAIT_WATERBREATH "waterbreathing"
+#define TRAIT_BLOODCRAWL "bloodcrawl"
+#define TRAIT_BLOODCRAWL_EAT "bloodcrawl_eat"
+#define TRAIT_JESTER "jester"
// common trait sources
#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 661d09f0412..bf44f6a4bc9 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -167,7 +167,7 @@
return SOUTH
if(225.6 to 315.5)
return WEST
-
+
//returns the north-zero clockwise angle in degrees, given a direction
/proc/dir2angle(var/D)
@@ -212,6 +212,7 @@
if(rights & R_PROCCALL) . += "[seperator]+PROCCALL"
if(rights & R_MOD) . += "[seperator]+MODERATOR"
if(rights & R_MENTOR) . += "[seperator]+MENTOR"
+ if(rights & R_VIEWRUNTIMES) . += "[seperator]+VIEWRUNTIMES"
return .
/proc/ui_style2icon(ui_style)
diff --git a/code/__HELPERS/unique_ids.dm b/code/__HELPERS/unique_ids.dm
index a66de0b5a88..b66b1a11b90 100644
--- a/code/__HELPERS/unique_ids.dm
+++ b/code/__HELPERS/unique_ids.dm
@@ -14,15 +14,13 @@
// var/myUID = mydatum.UID()
// var/datum/D = locateUID(myUID)
-var/global/next_unique_datum_id = 1
-
-// /client/var/tmp/unique_datum_id = null
+GLOBAL_VAR_INIT(next_unique_datum_id, 1)
/datum/proc/UID()
if(!unique_datum_id)
var/tag_backup = tag
tag = null // Grab the raw ref, not the tag
- unique_datum_id = "\ref[src]_[next_unique_datum_id++]"
+ unique_datum_id = "\ref[src]_[GLOB.next_unique_datum_id++]"
tag = tag_backup
return unique_datum_id
@@ -37,8 +35,6 @@ var/global/next_unique_datum_id = 1
var/datum/D = locate(copytext(uid, 1, splitat))
- // We might locate a client instead of a datum, but just using : is easier
- // than actually checking and typecasting
- if(D && D:unique_datum_id == uid)
+ if(D && D.unique_datum_id == uid)
return D
return null
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 45283498ebd..7e57a394988 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -25,11 +25,9 @@
if(!( istext(HTMLstring) ))
CRASH("Given non-text argument!")
- return
else
if(length(HTMLstring) != 7)
CRASH("Given non-HTML argument!")
- return
var/textr = copytext(HTMLstring, 2, 4)
var/textg = copytext(HTMLstring, 4, 6)
var/textb = copytext(HTMLstring, 6, 8)
@@ -46,7 +44,6 @@
if(length(textb) < 2)
textr = text("0[]", textb)
return text("#[][][]", textr, textg, textb)
- return
//Returns the middle-most value
/proc/dd_range(var/low, var/high, var/num)
@@ -320,7 +317,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
//When a borg is activated, it can choose which AI it wants to be slaved to
/proc/active_ais()
. = list()
- for(var/mob/living/silicon/ai/A in GLOB.living_mob_list)
+ for(var/mob/living/silicon/ai/A in GLOB.alive_mob_list)
if(A.stat == DEAD)
continue
if(A.control_disabled == 1)
@@ -332,8 +329,9 @@ Turf and target are seperate in case you want to teleport some distance from a t
/proc/select_active_ai_with_fewest_borgs()
var/mob/living/silicon/ai/selected
var/list/active = active_ais()
- for(var/mob/living/silicon/ai/A in active)
- if(!selected || (selected.connected_robots > A.connected_robots))
+ for(var/thing in active)
+ var/mob/living/silicon/ai/A = thing
+ if(!selected || (length(selected.connected_robots) > length(A.connected_robots)))
selected = A
return selected
@@ -437,16 +435,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
return "[round((powerused * 0.000001), 0.001)] MW"
return "[round((powerused * 0.000000001), 0.0001)] GW"
-//E = MC^2
-/proc/convert2energy(var/M)
- var/E = M*(SPEED_OF_LIGHT_SQ)
- return E
-
-//M = E/C^2
-/proc/convert2mass(var/E)
- var/M = E/(SPEED_OF_LIGHT_SQ)
- return M
-
//Forces a variable to be posative
/proc/modulus(var/M)
if(M >= 0)
@@ -540,21 +528,6 @@ Returns 1 if the chain up to the area contains the given typepath
/proc/between(var/low, var/middle, var/high)
return max(min(middle, high), low)
-
-
-#if DM_VERSION > 513
-#warn 513 is definitely stable now, remove this
-#endif
-#if DM_VERSION < 513
-/proc/arctan(x)
- var/y=arcsin(x/sqrt(1+x*x))
- return y
-/proc/islist(list/list)
- if(istype(list))
- return 1
- return 0
-#endif
-
//returns random gauss number
proc/GaussRand(var/sigma)
var/x,y,rsq
@@ -1129,9 +1102,9 @@ proc/get_mob_with_client_list()
//For objects that should embed, but make no sense being is_sharp or is_pointed()
//e.g: rods
-var/list/can_embed_types = typecacheof(list(
+GLOBAL_LIST_INIT(can_embed_types, typecacheof(list(
/obj/item/stack/rods,
- /obj/item/pipe))
+ /obj/item/pipe)))
/proc/can_embed(obj/item/W)
if(is_sharp(W))
@@ -1139,7 +1112,7 @@ var/list/can_embed_types = typecacheof(list(
if(is_pointed(W))
return 1
- if(is_type_in_typecache(W, can_embed_types))
+ if(is_type_in_typecache(W, GLOB.can_embed_types))
return 1
/proc/is_hot(obj/item/W as obj)
@@ -1221,18 +1194,18 @@ var/list/can_embed_types = typecacheof(list(
/*
Checks if that loc and dir has a item on the wall
*/
-var/list/static/global/wall_items = typecacheof(list(/obj/machinery/power/apc, /obj/machinery/alarm,
+GLOBAL_LIST_INIT(wall_items, typecacheof(list(/obj/machinery/power/apc, /obj/machinery/alarm,
/obj/item/radio/intercom, /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank,
/obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign,
/obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/door_control,
/obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio/airlock,
/obj/item/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth,
/obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment,
- /obj/structure/sign))
+ /obj/structure/sign)))
/proc/gotwallitem(loc, dir)
for(var/obj/O in loc)
- if(is_type_in_typecache(O, wall_items))
+ if(is_type_in_typecache(O, GLOB.wall_items))
//Direction works sometimes
if(O.dir == dir)
return 1
@@ -1254,7 +1227,7 @@ var/list/static/global/wall_items = typecacheof(list(/obj/machinery/power/apc, /
//Some stuff is placed directly on the wallturf (signs)
for(var/obj/O in get_step(loc, dir))
- if(is_type_in_typecache(O, wall_items))
+ if(is_type_in_typecache(O, GLOB.wall_items))
if(abs(O.pixel_x) <= 10 && abs(O.pixel_y) <= 10)
return 1
return 0
@@ -1381,7 +1354,7 @@ atom/proc/GetTypeInAllContents(typepath)
var/initial_chance = chance
while(steps > 0)
if(prob(chance))
- step(AM, pick(alldirs))
+ step(AM, pick(GLOB.alldirs))
chance = max(chance - (initial_chance / steps), 0)
steps--
@@ -1415,19 +1388,19 @@ atom/proc/GetTypeInAllContents(typepath)
return locate(dest_x,dest_y,dest_z)
-var/mob/dview/dview_mob = new
+GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
//Version of view() which ignores darkness, because BYOND doesn't have it.
/proc/dview(var/range = world.view, var/center, var/invis_flags = 0)
if(!center)
return
- dview_mob.loc = center
+ GLOB.dview_mob.loc = center
- dview_mob.see_invisible = invis_flags
+ GLOB.dview_mob.see_invisible = invis_flags
- . = view(range, dview_mob)
- dview_mob.loc = null
+ . = view(range, GLOB.dview_mob)
+ GLOB.dview_mob.loc = null
/mob/dview
invisibility = 101
@@ -1520,7 +1493,7 @@ var/mob/dview/dview_mob = new
//orbit() can run without it (swap orbiting for A)
//but then you can never stop it and that's just silly.
/atom/movable/var/atom/orbiting = null
-
+/atom/movable/var/cached_transform = null
//A: atom to orbit
//radius: range to orbit at, radius of the circle formed by orbiting
//clockwise: whether you orbit clockwise or anti clockwise
@@ -1538,6 +1511,7 @@ var/mob/dview/dview_mob = new
orbiting = A
var/matrix/initial_transform = matrix(transform)
+ cached_transform = initial_transform
var/lastloc = loc
//Head first!
@@ -1555,8 +1529,6 @@ var/mob/dview/dview_mob = new
SpinAnimation(rotation_speed, -1, clockwise, rotation_segments)
- //we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit
- transform = initial_transform
while(orbiting && orbiting == A && A.loc)
var/targetloc = get_turf(A)
if(!lockinorbit && loc != lastloc && loc != targetloc)
@@ -1570,12 +1542,14 @@ var/mob/dview/dview_mob = new
if(orbiting == A) //make sure we haven't started orbiting something else.
orbiting = null
- SpinAnimation(0,0)
+ SpinAnimation(0, 0)
+ transform = cached_transform
/atom/movable/proc/stop_orbit()
orbiting = null
+ transform = cached_transform
//Centers an image.
//Requires:
@@ -1813,7 +1787,6 @@ var/mob/dview/dview_mob = new
/obj/machinery/portable_atmospherics/canister = "CANISTER",
/obj/machinery/portable_atmospherics = "PORT_ATMOS",
/obj/machinery/power = "POWER",
- /obj/machinery/telecomms = "TCOMMS",
/obj/machinery = "MACHINERY",
/obj/mecha = "MECHA",
/obj/structure/closet/crate = "CRATE",
@@ -1895,8 +1868,15 @@ var/mob/dview/dview_mob = new
#undef DELTA_CALC
-// This proc gets a list of all "points of interest" (poi's) that can be used by admins to track valuable mobs or atoms (such as the nuke disk).
-/proc/getpois(mobs_only=0,skip_mindless=0)
+/*
+ * This proc gets a list of all "points of interest" (poi's) that can be used by admins to track valuable mobs or atoms (such as the nuke disk).
+ * @param mobs_only if set to TRUE it won't include locations to the returned list
+ * @param skip_mindless if set to TRUE it will skip mindless mobs
+ * @param force_include_bots if set to TRUE it will include bots even if skip_mindless is set to TRUE
+ * @param force_include_cameras if set to TRUE it will include camera eyes even if skip_mindless is set to TRUE
+ * @return returns a list with the found points of interest
+*/
+/proc/getpois(mobs_only = FALSE, skip_mindless = FALSE, force_include_bots = FALSE, force_include_cameras = FALSE)
var/list/mobs = sortmobs()
var/list/names = list()
var/list/pois = list()
@@ -1904,7 +1884,7 @@ var/mob/dview/dview_mob = new
for(var/mob/M in mobs)
if(skip_mindless && (!M.mind && !M.ckey))
- if(!isbot(M) && !istype(M, /mob/camera/))
+ if(!(force_include_bots && isbot(M)) && !(force_include_cameras && istype(M, /mob/camera)))
continue
if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins
continue
@@ -2029,6 +2009,13 @@ var/mob/dview/dview_mob = new
tX = splittext(tX[1], ":")
tX = tX[1]
var/list/actual_view = getviewsize(C ? C.view : world.view)
- tX = Clamp(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx)
- tY = Clamp(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy)
+ tX = clamp(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx)
+ tY = clamp(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy)
return locate(tX, tY, tZ)
+
+/proc/CallAsync(datum/source, proctype, list/arguments)
+ set waitfor = FALSE
+ return call(source, proctype)(arglist(arguments))
+
+/// Waits at a line of code until X is true
+#define UNTIL(X) while(!(X)) stoplag()
diff --git a/code/_compile_options.dm b/code/_compile_options.dm
index bd7e6484bdf..342e572177a 100644
--- a/code/_compile_options.dm
+++ b/code/_compile_options.dm
@@ -1,6 +1,14 @@
#define DEBUG
//#define TESTING
+// Uncomment the following line to compile unit tests.
+// #define UNIT_TESTS
+
+
+#ifdef TRAVISBUILDING
+#define UNIT_TESTS
+#endif
+
#ifdef TESTING
//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing.
//implies FIND_REF_NO_CHECK_TICK
@@ -11,8 +19,6 @@
#define IS_MODE_COMPILED(MODE) (ispath(text2path("/datum/game_mode/"+(MODE))))
-#define BACKGROUND_ENABLED 0 // The default value for all uses of set background. Set background can cause gradual lag and is recommended you only turn this on if necessary.
-
//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 1024
#define MAX_PAPER_MESSAGE_LEN 3072
@@ -20,12 +26,14 @@
#define MAX_BOOK_MESSAGE_LEN 9216
#define MAX_NAME_LEN 50 //diona names can get loooooooong
-// Version check, terminates compilation if someone is using a version of BYOND that's too old
-#if DM_VERSION < 510
-#error OUTDATED VERSION ERROR - \
-Due to BYOND features used in this codebase, you must update to version 510 or later to compile. \
-This may require updating to a beta release.
+//Update this whenever you need to take advantage of more recent byond features
+#define MIN_COMPILER_VERSION 513
+#define MIN_COMPILER_BUILD 1514
+#if DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD
+//Don't forget to update this part
+#error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update.
+#error You need version 513.1514 or higher
#endif
// Macros that must exist before world.dm
-#define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat
+// #define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat
diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm
index ee3f6a73a92..ea2cf1290fd 100644
--- a/code/_globalvars/configuration.dm
+++ b/code/_globalvars/configuration.dm
@@ -1,45 +1,44 @@
-var/datum/configuration/config = null
+GLOBAL_REAL(config, /datum/configuration)
-var/host = null
-var/join_motd = null
+GLOBAL_VAR(host)
+GLOBAL_VAR(join_motd)
GLOBAL_VAR(join_tos)
-var/game_version = "ParaCode"
-var/changelog_hash = md5('html/changelog.html') //used to check if the CL changed
-var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 544)
+GLOBAL_VAR_INIT(game_version, "ParaCode")
+GLOBAL_VAR_INIT(game_year, (text2num(time2text(world.realtime, "YYYY")) + 544))
-var/aliens_allowed = 1
-var/traitor_scaling = 1
-//var/goonsay_allowed = 0
-var/dna_ident = 1
-var/abandon_allowed = 0
-var/enter_allowed = 1
-var/guests_allowed = 1
-var/shuttle_frozen = 0
-var/shuttle_left = 0
-var/tinted_weldhelh = 1
-var/mouse_respawn_time = 5 //Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes.
-
-// Command to run if shutting down (SHUTDOWN_ON_REBOOT) instead of rebooting
-// It's defined here as a global because this is a hilariously bad thing to have on the easily-edited config datum
-var/global/shutdown_shell_command
-
-// Also global to prevent easy edits
-var/global/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix
+GLOBAL_VAR_INIT(aliens_allowed, 1)
+GLOBAL_VAR_INIT(traitor_scaling, 1)
+//GLOBAL_VAR_INIT(goonsay_allowed, 0)
+GLOBAL_VAR_INIT(dna_ident, 1)
+GLOBAL_VAR_INIT(abandon_allowed, 0)
+GLOBAL_VAR_INIT(enter_allowed, 1)
+GLOBAL_VAR_INIT(guests_allowed, 1)
+GLOBAL_VAR_INIT(shuttle_frozen, 0)
+GLOBAL_VAR_INIT(shuttle_left, 0)
+GLOBAL_VAR_INIT(tinted_weldhelh, 1)
+GLOBAL_VAR_INIT(mouse_respawn_time, 5) //Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes.
// Debug is used exactly once (in living.dm) but is commented out in a lot of places. It is not set anywhere and only checked.
// Debug2 is used in conjunction with a lot of admin verbs and therefore is actually legit.
-var/Debug = 0 // global debug switch
-var/Debug2 = 1 // enables detailed job debug file in secrets
+GLOBAL_VAR_INIT(debug, 0) // global debug switch
+GLOBAL_VAR_INIT(debug2, 1) // enables detailed job debug file in secrets
//This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage
-var/MAX_EX_DEVASTATION_RANGE = 3
-var/MAX_EX_HEAVY_RANGE = 7
-var/MAX_EX_LIGHT_RANGE = 14
-var/MAX_EX_FLASH_RANGE = 14
-var/MAX_EX_FLAME_RANGE = 14
+GLOBAL_VAR_INIT(max_ex_devastation_range, 3)
+GLOBAL_VAR_INIT(max_ex_heavy_range, 7)
+GLOBAL_VAR_INIT(max_ex_light_range, 14)
+GLOBAL_VAR_INIT(max_ex_flash_range, 14)
+GLOBAL_VAR_INIT(max_ex_flame_range, 14)
//Random event stuff, apparently used
-var/eventchance = 10 //% per 5 mins
-var/event = 0
-var/hadevent = 0
-var/blobevent = 0
+GLOBAL_VAR_INIT(eventchance, 10) //% per 5 mins
+GLOBAL_VAR_INIT(event, 0)
+GLOBAL_VAR_INIT(hadevent, 0)
+GLOBAL_VAR_INIT(blobevent, 0)
+
+// These vars are protected because changing them could pose a security risk, though they are fine to be read since they are just system paths
+GLOBAL_VAR(shutdown_shell_command) // Command to run if shutting down (SHUTDOWN_ON_REBOOT) instead of rebooting
+GLOBAL_PROTECT(shutdown_shell_command)
+
+GLOBAL_VAR(python_path) //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix
+GLOBAL_PROTECT(python_path)
diff --git a/code/_globalvars/database.dm b/code/_globalvars/database.dm
deleted file mode 100644
index 5c5b4e93f6a..00000000000
--- a/code/_globalvars/database.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-// MySQL configuration
-var/sqladdress = "localhost"
-var/sqlport = "3306"
-var/sqlfdbkdb = "test"
-var/sqlfdbklogin = "root"
-var/sqlfdbkpass = ""
-var/sqlfdbktableprefix = "erro_" //backwords compatibility with downstream server hosts
-
-//Database connections
-//A connection is established on world creation. Ideally, the connection dies when the server restarts (After feedback logging.).
-var/DBConnection/dbcon = new() //Feedback database (New database)
diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm
index 3f8ec321470..3088270579c 100644
--- a/code/_globalvars/game_modes.dm
+++ b/code/_globalvars/game_modes.dm
@@ -1,10 +1,11 @@
-var/master_mode = "extended"//"extended"
-var/secret_force_mode = "secret" // if this is anything but "secret", the secret rotation will forceably choose this mode
-var/wavesecret = 0 // meteor mode, delays wave progression, terrible name
-var/datum/station_state/start_state = null // Used in round-end report
+GLOBAL_VAR_INIT(master_mode, "extended") //"extended"
+GLOBAL_VAR_INIT(secret_force_mode, "secret") // if this is anything but "secret", the secret rotation will forceably choose this mode
-var/custom_event_msg = null
-var/custom_event_admin_msg = null
+GLOBAL_VAR_INIT(wavesecret, 0) // meteor mode, delays wave progression, terrible name
+GLOBAL_DATUM(start_state, /datum/station_state) // Used in round-end report. Dont ask why it inits as null
-var/list/summon_spots = list()
+GLOBAL_VAR(custom_event_msg)
+GLOBAL_VAR(custom_event_admin_msg)
+
+GLOBAL_LIST_EMPTY(summon_spots)
diff --git a/code/_globalvars/genetics.dm b/code/_globalvars/genetics.dm
index 6a4a118f866..1119ac364cc 100644
--- a/code/_globalvars/genetics.dm
+++ b/code/_globalvars/genetics.dm
@@ -1,68 +1,68 @@
///////////
-var/BLINDBLOCK = 0
-var/COLOURBLINDBLOCK = 0
-var/DEAFBLOCK = 0
-var/HULKBLOCK = 0
-var/TELEBLOCK = 0
-var/FIREBLOCK = 0
-var/XRAYBLOCK = 0
-var/CLUMSYBLOCK = 0
-var/FAKEBLOCK = 0
-var/COUGHBLOCK = 0
-var/GLASSESBLOCK = 0
-var/EPILEPSYBLOCK = 0
-var/TWITCHBLOCK = 0
-var/NERVOUSBLOCK = 0
-var/WINGDINGSBLOCK = 0
-var/MONKEYBLOCK = 50 // Monkey block will always be the DNA_SE_LENGTH
+GLOBAL_VAR_INIT(blindblock, 0)
+GLOBAL_VAR_INIT(colourblindblock, 0)
+GLOBAL_VAR_INIT(deafblock, 0)
+GLOBAL_VAR_INIT(hulkblock, 0)
+GLOBAL_VAR_INIT(teleblock, 0)
+GLOBAL_VAR_INIT(fireblock, 0)
+GLOBAL_VAR_INIT(xrayblock, 0)
+GLOBAL_VAR_INIT(clumsyblock, 0)
+GLOBAL_VAR_INIT(fakeblock, 0)
+GLOBAL_VAR_INIT(coughblock, 0)
+GLOBAL_VAR_INIT(glassesblock, 0)
+GLOBAL_VAR_INIT(epilepsyblock, 0)
+GLOBAL_VAR_INIT(twitchblock, 0)
+GLOBAL_VAR_INIT(nervousblock, 0)
+GLOBAL_VAR_INIT(wingdingsblock, 0)
+GLOBAL_VAR_INIT(monkeyblock, DNA_SE_LENGTH) // Monkey block will always be the DNA_SE_LENGTH
-var/BLOCKADD = 0
-var/DIFFMUT = 0
+GLOBAL_VAR_INIT(blockadd, 0)
+GLOBAL_VAR_INIT(diffmut, 0)
-var/BREATHLESSBLOCK = 0
-var/REMOTEVIEWBLOCK = 0
-var/REGENERATEBLOCK = 0
-var/INCREASERUNBLOCK = 0
-var/REMOTETALKBLOCK = 0
-var/MORPHBLOCK = 0
-var/COLDBLOCK = 0
-var/HALLUCINATIONBLOCK = 0
-var/NOPRINTSBLOCK = 0
-var/SHOCKIMMUNITYBLOCK = 0
-var/SMALLSIZEBLOCK = 0
+GLOBAL_VAR_INIT(breathlessblock, 0)
+GLOBAL_VAR_INIT(remoteviewblock, 0)
+GLOBAL_VAR_INIT(regenerateblock, 0)
+GLOBAL_VAR_INIT(increaserunblock, 0)
+GLOBAL_VAR_INIT(remotetalkblock, 0)
+GLOBAL_VAR_INIT(morphblock, 0)
+GLOBAL_VAR_INIT(coldblock, 0)
+GLOBAL_VAR_INIT(hallucinationblock, 0)
+GLOBAL_VAR_INIT(noprintsblock, 0)
+GLOBAL_VAR_INIT(shockimmunityblock, 0)
+GLOBAL_VAR_INIT(smallsizeblock, 0)
///////////////////////////////
// Goon Stuff
///////////////////////////////
// Disabilities
-var/LISPBLOCK = 0
-var/MUTEBLOCK = 0
-var/RADBLOCK = 0
-var/FATBLOCK = 0
-var/CHAVBLOCK = 0
-var/SWEDEBLOCK = 0
-var/SCRAMBLEBLOCK = 0
-var/STRONGBLOCK = 0
-var/HORNSBLOCK = 0
-var/COMICBLOCK = 0
+GLOBAL_VAR_INIT(lispblock, 0)
+GLOBAL_VAR_INIT(muteblock, 0)
+GLOBAL_VAR_INIT(radblock, 0)
+GLOBAL_VAR_INIT(fatblock, 0)
+GLOBAL_VAR_INIT(chavblock, 0)
+GLOBAL_VAR_INIT(swedeblock, 0)
+GLOBAL_VAR_INIT(scrambleblock, 0)
+GLOBAL_VAR_INIT(strongblock, 0)
+GLOBAL_VAR_INIT(hornsblock, 0)
+GLOBAL_VAR_INIT(comicblock, 0)
// Powers
-var/SOBERBLOCK = 0
-var/PSYRESISTBLOCK = 0
-var/SHADOWBLOCK = 0
-var/CHAMELEONBLOCK = 0
-var/CRYOBLOCK = 0
-var/EATBLOCK = 0
-var/JUMPBLOCK = 0
-var/EMPATHBLOCK = 0
-var/IMMOLATEBLOCK = 0
-var/POLYMORPHBLOCK = 0
+GLOBAL_VAR_INIT(soberblock, 0)
+GLOBAL_VAR_INIT(psyresistblock, 0)
+GLOBAL_VAR_INIT(shadowblock, 0)
+GLOBAL_VAR_INIT(chameleonblock, 0)
+GLOBAL_VAR_INIT(cryoblock, 0)
+GLOBAL_VAR_INIT(eatblock, 0)
+GLOBAL_VAR_INIT(jumpblock, 0)
+GLOBAL_VAR_INIT(empathblock, 0)
+GLOBAL_VAR_INIT(immolateblock, 0)
+GLOBAL_VAR_INIT(polymorphblock, 0)
///////////////////////////////
// /vg/ Mutations
///////////////////////////////
-var/LOUDBLOCK = 0
-var/DIZZYBLOCK = 0
+GLOBAL_VAR_INIT(loudblock, 0)
+GLOBAL_VAR_INIT(dizzyblock, 0)
-var/list/reg_dna = list( ) //this appears to be a list of UE == real_name correlations
-var/list/global_mutations = list() // list of hidden mutation things
+GLOBAL_LIST_EMPTY(reg_dna)
+GLOBAL_LIST_EMPTY(global_mutations)
diff --git a/code/_globalvars/lists/devil.dm b/code/_globalvars/lists/devil.dm
index 2c941069fe4..54528709573 100644
--- a/code/_globalvars/lists/devil.dm
+++ b/code/_globalvars/lists/devil.dm
@@ -1,8 +1,8 @@
//what could possibly go wrong
-var/list/devil_machines = typecacheof(/obj/item/circuitboard, TRUE) - list(
+GLOBAL_LIST_INIT(devil_machines, typecacheof(/obj/item/circuitboard, TRUE) - list(
/obj/item/circuitboard/shuttle,
/obj/item/circuitboard/swfdoor,
/obj/item/circuitboard/olddoor,
/obj/item/circuitboard/computer,
/obj/item/circuitboard/machine
- )
+))
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
index b6fcae25061..17444f66207 100644
--- a/code/_globalvars/lists/mobs.dm
+++ b/code/_globalvars/lists/mobs.dm
@@ -3,30 +3,33 @@ GLOBAL_LIST_EMPTY(all_species)
GLOBAL_LIST_EMPTY(all_languages)
GLOBAL_LIST_EMPTY(language_keys) // Table of say codes for all languages
GLOBAL_LIST_EMPTY(all_superheroes)
-GLOBAL_LIST_INIT(whitelisted_species, list())
+GLOBAL_LIST_EMPTY(whitelisted_species)
-GLOBAL_LIST_INIT(clients, list()) //list of all clients
-GLOBAL_LIST_INIT(admins, list()) //list of all clients whom are admins
-GLOBAL_LIST_INIT(deadmins, list()) //list of all clients who have used the de-admin verb.
-GLOBAL_LIST_INIT(directory, list()) //list of all ckeys with associated client
-GLOBAL_LIST_INIT(stealthminID, list()) //reference list with IDs that store ckeys, for stealthmins
+GLOBAL_LIST_EMPTY(clients) //list of all clients
+GLOBAL_LIST_EMPTY(admins) //list of all clients whom are admins
+GLOBAL_LIST_EMPTY(deadmins) //list of all clients who have used the de-admin verb.
+GLOBAL_LIST_EMPTY(directory) //list of all ckeys with associated client
+GLOBAL_LIST_EMPTY(stealthminID) //reference list with IDs that store ckeys, for stealthmins
//Since it didn't really belong in any other category, I'm putting this here
//This is for procs to replace all the goddamn 'in world's that are chilling around the code
-GLOBAL_LIST_INIT(player_list, list()) //List of all mobs **with clients attached**. Excludes /mob/new_player
-GLOBAL_LIST_INIT(mob_list, list()) //List of all mobs, including clientless
-GLOBAL_LIST_INIT(silicon_mob_list, list()) //List of all silicon mobs, including clientless
-GLOBAL_LIST_INIT(spirits, list()) //List of all the spirits, including Masks
-GLOBAL_LIST_INIT(living_mob_list, list()) //List of all alive mobs, including clientless. Excludes /mob/new_player
-GLOBAL_LIST_INIT(dead_mob_list, list()) //List of all dead mobs, including clientless. Excludes /mob/new_player
-GLOBAL_LIST_INIT(respawnable_list, list()) //List of all mobs, dead or in mindless creatures that still be respawned.
-GLOBAL_LIST_INIT(non_respawnable_keys, list()) //List of ckeys that are excluded from respawning for remainder of round.
+GLOBAL_LIST_EMPTY(player_list) //List of all mobs **with clients attached**. Excludes /mob/new_player
+GLOBAL_LIST_EMPTY(mob_list) //List of all mobs, including clientless
+GLOBAL_LIST_EMPTY(silicon_mob_list) //List of all silicon mobs, including clientless
+GLOBAL_LIST_EMPTY(mob_living_list) //all instances of /mob/living and subtypes
+GLOBAL_LIST_EMPTY(carbon_list) //all instances of /mob/living/carbon and subtypes, notably does not contain simple animals
+GLOBAL_LIST_EMPTY(human_list) //all instances of /mob/living/carbon/human and subtypes
+GLOBAL_LIST_EMPTY(spirits) //List of all the spirits, including Masks
+GLOBAL_LIST_EMPTY(alive_mob_list) //List of all alive mobs, including clientless. Excludes /mob/new_player
+GLOBAL_LIST_EMPTY(dead_mob_list) //List of all dead mobs, including clientless. Excludes /mob/new_player
+GLOBAL_LIST_EMPTY(respawnable_list) //List of all mobs, dead or in mindless creatures that still be respawned.
+GLOBAL_LIST_EMPTY(non_respawnable_keys) //List of ckeys that are excluded from respawning for remainder of round.
GLOBAL_LIST_INIT(simple_animals, list(list(), list(), list(), list())) //One for each AI_* status define, List of all simple animals, including clientless
-GLOBAL_LIST_INIT(bots_list, list()) //List of all bots(beepsky, medibots,etc)
+GLOBAL_LIST_EMPTY(bots_list) //List of all bots(beepsky, medibots,etc)
-GLOBAL_LIST_INIT(med_hud_users, list())
-GLOBAL_LIST_INIT(sec_hud_users, list())
-GLOBAL_LIST_INIT(antag_hud_users, list())
-GLOBAL_LIST_INIT(surgeries_list, list())
-GLOBAL_LIST_INIT(hear_radio_list, list()) //Mobs that hear the radio even if there's no client
+GLOBAL_LIST_EMPTY(med_hud_users)
+GLOBAL_LIST_EMPTY(sec_hud_users)
+GLOBAL_LIST_EMPTY(antag_hud_users)
+GLOBAL_LIST_EMPTY(surgeries_list)
+GLOBAL_LIST_EMPTY(hear_radio_list) //Mobs that hear the radio even if there's no client
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 931a0e394e8..21af95cab48 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -16,7 +16,6 @@ GLOBAL_LIST_INIT(prisoncomputer_list, list())
GLOBAL_LIST_INIT(celltimers_list, list()) // list of all cell timers
GLOBAL_LIST_INIT(cell_logs, list())
GLOBAL_LIST_INIT(navigation_computers, list())
-GLOBAL_LIST_INIT(zombie_infection_list, list())
GLOBAL_LIST_INIT(all_areas, list())
GLOBAL_LIST_INIT(machines, list())
diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm
index 20620d60800..abd878ff936 100644
--- a/code/_globalvars/lists/reagents.dm
+++ b/code/_globalvars/lists/reagents.dm
@@ -64,3 +64,5 @@ GLOBAL_LIST_INIT(safe_chem_list, list("antihol", "charcoal", "epinephrine", "ins
"omnizine", "stimulants", "synaptizine", "potass_iodide", "oculine", "mannitol", "styptic_powder",
"spaceacillin", "salglu_solution", "sal_acid", "cryoxadone", "blood", "synthflesh", "hydrocodone",
"mitocholide", "rezadone"))
+
+GLOBAL_LIST_INIT(safe_chem_applicator_list, list("silver_sulfadiazine", "styptic_powder", "synthflesh"))
diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm
index 10c7d74c752..f5f71e65c57 100644
--- a/code/_globalvars/logging.dm
+++ b/code/_globalvars/logging.dm
@@ -1,3 +1,4 @@
+// Everything in this file should be protected
GLOBAL_VAR(log_directory)
GLOBAL_PROTECT(log_directory)
GLOBAL_VAR(world_game_log)
@@ -14,15 +15,23 @@ GLOBAL_VAR(world_asset_log)
GLOBAL_PROTECT(world_asset_log)
GLOBAL_VAR(runtime_summary_log)
GLOBAL_PROTECT(runtime_summary_log)
+GLOBAL_VAR(tgui_log)
+GLOBAL_PROTECT(tgui_log)
-var/list/jobMax = list()
-var/list/admin_log = list ( )
-var/list/lastsignalers = list( ) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]"
-var/list/lawchanges = list( ) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
+GLOBAL_LIST_EMPTY(jobMax)
+GLOBAL_PROTECT(jobMax)
+GLOBAL_LIST_EMPTY(admin_log)
+GLOBAL_PROTECT(admin_log)
+GLOBAL_LIST_EMPTY(lastsignalers)
+GLOBAL_PROTECT(lastsignalers)
+GLOBAL_LIST_EMPTY(lawchanges)
+GLOBAL_PROTECT(lawchanges)
-var/list/combatlog = list()
-var/list/IClog = list()
-var/list/OOClog = list()
-var/list/adminlog = list()
+GLOBAL_LIST_EMPTY(combatlog)
+GLOBAL_PROTECT(combatlog)
+GLOBAL_LIST_EMPTY(IClog)
+GLOBAL_PROTECT(IClog)
+GLOBAL_LIST_EMPTY(OOClog)
+GLOBAL_PROTECT(OOClog)
-var/list/investigate_log_subjects = list("notes", "watchlist", "hrefs")
+GLOBAL_LIST_INIT(investigate_log_subjects, list("notes", "watchlist", "hrefs"))
diff --git a/code/_globalvars/mapping.dm b/code/_globalvars/mapping.dm
index 9c54212cbb7..e43062a18b7 100644
--- a/code/_globalvars/mapping.dm
+++ b/code/_globalvars/mapping.dm
@@ -3,12 +3,15 @@
#define Z_SOUTH 3
#define Z_WEST 4
-var/list/cardinal = list( NORTH, SOUTH, EAST, WEST )
-var/list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
-var/list/diagonals = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
+GLOBAL_LIST_INIT(cardinal, list(NORTH, SOUTH, EAST, WEST))
+GLOBAL_LIST_INIT(alldirs, list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST))
+GLOBAL_LIST_INIT(alldirs2, list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTH, SOUTH, EAST, WEST))
+GLOBAL_LIST_INIT(diagonals, list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST))
-var/global/list/global_map = null
- //list/global_map = list(list(1,5),list(4,3))//an array of map Z levels.
+// This must exist early on or shit breaks bad
+GLOBAL_DATUM_INIT(using_map, /datum/map, new USING_MAP_DATUM)
+
+GLOBAL_LIST(global_map) // This is the array of zlevels | list(list(1,5),list(4,3)) | becomes a 2D array of zlevels
//Resulting sector map looks like
//|_1_|_4_|
//|_5_|_3_|
@@ -18,38 +21,41 @@ var/global/list/global_map = null
//3 - AI satellite
//5 - empty space
-var/list/wizardstart = list()
-var/list/newplayer_start = list()
-var/list/latejoin = list()
-var/list/latejoin_gateway = list()
-var/list/latejoin_cryo = list()
-var/list/latejoin_cyborg = list()
-var/list/prisonwarp = list() //prisoners go to these
-var/list/xeno_spawn = list()//Aliens spawn at these.
-var/list/ertdirector = list()
-var/list/emergencyresponseteamspawn = list()
-var/list/tdome1 = list()
-var/list/tdome2 = list()
-var/list/team_alpha = list()
-var/list/team_bravo = list()
-var/list/tdomeobserve = list()
-var/list/tdomeadmin = list()
-var/list/aroomwarp = list()
-var/list/prisonsecuritywarp = list() //prison security goes to these
-var/list/prisonwarped = list() //list of players already warped
-var/list/blobstart = list()
-var/list/ninjastart = list()
-var/list/carplist = list() //list of all carp-spawn landmarks
-var/list/syndicateofficer = list()
+GLOBAL_LIST_EMPTY(wizardstart)
+GLOBAL_LIST_EMPTY(newplayer_start)
+GLOBAL_LIST_EMPTY(latejoin)
+GLOBAL_LIST_EMPTY(latejoin_gateway)
+GLOBAL_LIST_EMPTY(latejoin_cryo)
+GLOBAL_LIST_EMPTY(latejoin_cyborg)
+GLOBAL_LIST_EMPTY(prisonwarp) //prisoners go to these
+GLOBAL_LIST_EMPTY(xeno_spawn)//Aliens spawn at these.
+GLOBAL_LIST_EMPTY(ertdirector)
+GLOBAL_LIST_EMPTY(emergencyresponseteamspawn)
+GLOBAL_LIST_EMPTY(tdome1)
+GLOBAL_LIST_EMPTY(tdome2)
+GLOBAL_LIST_EMPTY(team_alpha)
+GLOBAL_LIST_EMPTY(team_bravo)
+GLOBAL_LIST_EMPTY(tdomeobserve)
+GLOBAL_LIST_EMPTY(tdomeadmin)
+GLOBAL_LIST_EMPTY(aroomwarp)
+GLOBAL_LIST_EMPTY(prisonsecuritywarp) //prison security goes to these
+GLOBAL_LIST_EMPTY(prisonwarped) //list of players already warped
+GLOBAL_LIST_EMPTY(blobstart)
+GLOBAL_LIST_EMPTY(ninjastart)
+GLOBAL_LIST_EMPTY(carplist) //list of all carp-spawn landmarks
+GLOBAL_LIST_EMPTY(syndicateofficer)
//away missions
-var/list/awaydestinations = list() //a list of landmarks that the warpgate can take you to
+GLOBAL_LIST_EMPTY(awaydestinations) //a list of landmarks that the warpgate can take you to
//List of preloaded templates
-var/list/datum/map_template/map_templates = list()
+GLOBAL_LIST_EMPTY(map_templates)
+GLOBAL_LIST_EMPTY(ruins_templates)
+GLOBAL_LIST_EMPTY(space_ruins_templates)
+GLOBAL_LIST_EMPTY(lava_ruins_templates)
+GLOBAL_LIST_EMPTY(shelter_templates)
+GLOBAL_LIST_EMPTY(shuttle_templates)
-var/list/datum/map_template/ruins_templates = list()
-var/list/datum/map_template/space_ruins_templates = list()
-var/list/datum/map_template/lava_ruins_templates = list()
-var/list/datum/map_template/shelter_templates = list()
-var/list/datum/map_template/shuttle_templates = list()
+// Teleport locations
+GLOBAL_LIST_EMPTY(teleportlocs)
+GLOBAL_LIST_EMPTY(ghostteleportlocs)
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index 04db7233401..283d92a954f 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -1,93 +1,104 @@
-var/global/obj/effect/overlay/plmaster = null
-var/global/obj/effect/overlay/slmaster = null
+GLOBAL_DATUM(plmaster, /obj/effect/overlay)
+GLOBAL_DATUM(slmaster, /obj/effect/overlay)
GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule
GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
-// Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it.
-var/global/obj/item/radio/intercom/global_announcer = create_global_announcer()
-var/global/obj/item/radio/intercom/command/command_announcer = create_command_announcer()
+// Announcer intercom, because too much stuff creates an intercom for one message then qdel()s it.
+GLOBAL_DATUM_INIT(global_announcer, /obj/item/radio/intercom, create_global_announcer())
+GLOBAL_DATUM_INIT(command_announcer, /obj/item/radio/intercom/command, create_command_announcer())
+
// Load order issues means this can't be new'd until other code runs
// This is probably not the way I should be doing this, but I don't know how to do it right!
proc/create_global_announcer()
spawn(0)
- global_announcer = new(null)
+ GLOB.global_announcer = new(null)
return
proc/create_command_announcer()
spawn(0)
- command_announcer = new(null)
+ GLOB.command_announcer = new(null)
return
-var/list/paper_tag_whitelist = list("center","p","div","span","h1","h2","h3","h4","h5","h6","hr","pre", \
+GLOBAL_LIST_INIT(paper_tag_whitelist, list("center","p","div","span","h1","h2","h3","h4","h5","h6","hr","pre", \
"big","small","font","i","u","b","s","sub","sup","tt","br","hr","ol","ul","li","caption","col", \
- "table","td","th","tr")
-var/list/paper_blacklist = list("java","onblur","onchange","onclick","ondblclick","onfocus","onkeydown", \
+ "table","td","th","tr"))
+GLOBAL_LIST_INIT(paper_blacklist, list("java","onblur","onchange","onclick","ondblclick","onfocus","onkeydown", \
"onkeypress","onkeyup","onload","onmousedown","onmousemove","onmouseout","onmouseover", \
- "onmouseup","onreset","onselect","onsubmit","onunload")
+ "onmouseup","onreset","onselect","onsubmit","onunload"))
//Reverse of dir
-var/list/reverse_dir = list(2, 1, 3, 8, 10, 9, 11, 4, 6, 5, 7, 12, 14, 13, 15, 32, 34, 33, 35, 40, 42, 41, 43, 36, 38, 37, 39, 44, 46, 45, 47, 16, 18, 17, 19, 24, 26, 25, 27, 20, 22, 21, 23, 28, 30, 29, 31, 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63)
-var/gravity_is_on = 1 //basically unused, just one admin verb..
+GLOBAL_LIST_INIT(reverse_dir, list(2, 1, 3, 8, 10, 9, 11, 4, 6, 5, 7, 12, 14, 13, 15, 32, 34, 33, 35, 40, 42, 41, 43, 36, 38, 37, 39, 44, 46, 45, 47, 16, 18, 17, 19, 24, 26, 25, 27, 20, 22, 21, 23, 28, 30, 29, 31, 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63))
+GLOBAL_VAR_INIT(gravity_is_on, 1) //basically unused, just one admin verb..
// Recall time limit: 2 hours
-var/recall_time_limit=72000 //apparently used for the comm console
+GLOBAL_VAR_INIT(recall_time_limit, 72000) //apparently used for the comm console
//////SCORE STUFF
//Goonstyle scoreboard
-var/score_crewscore = 0 // this is the overall var/score for the whole round
-var/score_stuffshipped = 0 // how many useful items have cargo shipped out?
-var/score_stuffharvested = 0 // how many harvests have hydroponics done?
-var/score_oremined = 0 // obvious
-var/score_researchdone = 0
-var/score_eventsendured = 0 // how many random events did the station survive?
-var/score_powerloss = 0 // how many APCs have poor charge?
-var/score_escapees = 0 // how many people got out alive?
-var/score_deadcrew = 0 // dead bodies on the station, oh no
-var/score_mess = 0 // how much poo, puke, gibs, etc went uncleaned
-var/score_meals = 0
-var/score_disease = 0 // how many rampant, uncured diseases are on board the station
-var/score_deadcommand = 0 // used during rev, how many command staff perished
-var/score_arrested = 0 // how many traitors/revs/whatever are alive in the brig
-var/score_traitorswon = 0 // how many traitors were successful?
-var/score_allarrested = 0 // did the crew catch all the enemies alive?
-var/score_opkilled = 0 // used during nuke mode, how many operatives died?
-var/score_disc = 0 // is the disc safe and secure?
-var/score_nuked = 0 // was the station blown into little bits?
-var/score_nuked_penalty = 0 //penalty for getting blown to bits
+GLOBAL_VAR_INIT(score_crewscore, 0) // this is the overall var/score for the whole round
+GLOBAL_VAR_INIT(score_stuffshipped, 0) // how many useful items have cargo shipped out?
+GLOBAL_VAR_INIT(score_stuffharvested, 0) // how many harvests have hydroponics done?
+GLOBAL_VAR_INIT(score_oremined, 0) // obvious
+GLOBAL_VAR_INIT(score_researchdone, 0)
+GLOBAL_VAR_INIT(score_eventsendured, 0) // how many random events did the station survive?
+GLOBAL_VAR_INIT(score_powerloss, 0) // how many APCs have poor charge?
+GLOBAL_VAR_INIT(score_escapees, 0) // how many people got out alive?
+GLOBAL_VAR_INIT(score_deadcrew, 0) // dead bodies on the station, oh no
+GLOBAL_VAR_INIT(score_mess, 0) // how much poo, puke, gibs, etc went uncleaned
+GLOBAL_VAR_INIT(score_meals, 0)
+GLOBAL_VAR_INIT(score_disease, 0) // how many rampant, uncured diseases are on board the station
+GLOBAL_VAR_INIT(score_deadcommand, 0) // used during rev, how many command staff perished
+GLOBAL_VAR_INIT(score_arrested, 0) // how many traitors/revs/whatever are alive in the brig
+GLOBAL_VAR_INIT(score_traitorswon, 0) // how many traitors were successful?
+GLOBAL_VAR_INIT(score_allarrested, 0) // did the crew catch all the enemies alive?
+GLOBAL_VAR_INIT(score_opkilled, 0) // used during nuke mode, how many operatives died?
+GLOBAL_VAR_INIT(score_disc, 0) // is the disc safe and secure?
+GLOBAL_VAR_INIT(score_nuked, 0) // was the station blown into little bits?
+GLOBAL_VAR_INIT(score_nuked_penalty, 0) //penalty for getting blown to bits
// these ones are mainly for the stat panel
-var/score_powerbonus = 0 // if all APCs on the station are running optimally, big bonus
-var/score_messbonus = 0 // if there are no messes on the station anywhere, huge bonus
-var/score_deadaipenalty = 0 // is the AI dead? if so, big penalty
-var/score_foodeaten = 0 // nom nom nom
-var/score_clownabuse = 0 // how many times a clown was punched, struck or otherwise maligned
-var/score_richestname = null // this is all stuff to show who was the richest alive on the shuttle
-var/score_richestjob = null // kinda pointless if you dont have a money system i guess
-var/score_richestcash = 0
-var/score_richestkey = null
-var/score_dmgestname = null // who had the most damage on the shuttle (but was still alive)
-var/score_dmgestjob = null
-var/score_dmgestdamage = 0
-var/score_dmgestkey = null
+GLOBAL_VAR_INIT(score_powerbonus, 0) // if all APCs on the station are running optimally, big bonus
+GLOBAL_VAR_INIT(score_messbonus, 0) // if there are no messes on the station anywhere, huge bonus
+GLOBAL_VAR_INIT(score_deadaipenalty, 0) // is the AI dead? if so, big penalty
+GLOBAL_VAR_INIT(score_foodeaten, 0) // nom nom nom
+GLOBAL_VAR_INIT(score_clownabuse, 0) // how many times a clown was punched, struck or otherwise maligned
+GLOBAL_VAR(score_richestname) // this is all stuff to show who was the richest alive on the shuttle
+GLOBAL_VAR(score_richestjob) // kinda pointless if you dont have a money system i guess
+GLOBAL_VAR_INIT(score_richestcash, 0)
+GLOBAL_VAR(score_richestkey)
+GLOBAL_VAR(score_dmgestname) // who had the most damage on the shuttle (but was still alive)
+GLOBAL_VAR(score_dmgestjob)
+GLOBAL_VAR_INIT(score_dmgestdamage, 0)
+GLOBAL_VAR(score_dmgestkey)
-var/TAB = " "
+#define TAB " "
GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the host computer) and 0 world.ticks.
// For FTP requests. (i.e. downloading runtime logs.)
// However it'd be ok to use for accessing attack logs and such too, which are even laggier.
-var/fileaccess_timer = 0
+GLOBAL_VAR_INIT(fileaccess_timer, 0)
GLOBAL_VAR_INIT(gametime_offset, 432000) // 12:00 in seconds
//printers shutdown if too much shit printed
-var/copier_items_printed = 0
-var/copier_max_items = 300
-var/copier_items_printed_logged = FALSE
+GLOBAL_VAR_INIT(copier_items_printed, 0)
+GLOBAL_VAR_INIT(copier_max_items, 300)
+GLOBAL_VAR_INIT(copier_items_printed_logged, FALSE)
GLOBAL_VAR(map_name) // Self explanatory
-var/global/datum/datacore/data_core = null // Station datacore, manifest, etc
+GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) // Station datacore, manifest, etc
GLOBAL_VAR_INIT(panic_bunker_enabled, FALSE) // Is the panic bunker enabled
+
+//Database connections
+//A connection is established on world creation. Ideally, the connection dies when the server restarts (After feedback logging.).
+// This is a protected datum which means its read only. I hope the reason for protecting this is obvious
+GLOBAL_DATUM_INIT(dbcon, /DBConnection, new) //Feedback database (New database)
+GLOBAL_PROTECT(dbcon)
+
+GLOBAL_LIST_EMPTY(ability_verbs) // Create-level abilities
+GLOBAL_LIST_INIT(pipe_colors, list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE))
+
diff --git a/code/_globalvars/sensitive.dm b/code/_globalvars/sensitive.dm
new file mode 100644
index 00000000000..4c04b2d480b
--- /dev/null
+++ b/code/_globalvars/sensitive.dm
@@ -0,0 +1,12 @@
+// All global vars in this file require a different handler as we dont want their data to be exposed, not even to admins with permission to view globals
+// They write as native BYOND globals, which means they cant be edited at all, and also use a format
+// Please only throw absolutely crucial do-not-view shit in here please. -aa07
+
+// MySQL configuration
+GLOBAL_REAL_VAR(sqladdress) = "localhost"
+GLOBAL_REAL_VAR(sqlport) = "3306"
+GLOBAL_REAL_VAR(sqlfdbkdb) = "test"
+GLOBAL_REAL_VAR(sqlfdbklogin) = "root"
+GLOBAL_REAL_VAR(sqlfdbkpass) = ""
+GLOBAL_REAL_VAR(sqlfdbktableprefix) = "erro_"
+GLOBAL_REAL_VAR(sql_version) = 0
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index 9e0d45643be..ccc31e5c501 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -5,7 +5,10 @@
*/
GLOBAL_LIST_INIT(traits_by_type, list(
/mob = list(
- "TRAIT_PACIFISM" = TRAIT_PACIFISM
+ "TRAIT_PACIFISM" = TRAIT_PACIFISM,
+ "TRAIT_WATERBREATH" = TRAIT_WATERBREATH,
+ "BLOODCRAWL" = TRAIT_BLOODCRAWL,
+ "BLOODCRAWL_EAT" = TRAIT_BLOODCRAWL_EAT
)))
/// value -> trait name, generated on use from trait_by_type global
diff --git a/code/_globalvars/unused.dm b/code/_globalvars/unused.dm
deleted file mode 100644
index 6e2075559b8..00000000000
--- a/code/_globalvars/unused.dm
+++ /dev/null
@@ -1 +0,0 @@
-var/going = 1.0
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index 7c2214e2287..fbb04d4c021 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -42,7 +42,7 @@
if(control_disabled || stat)
return
-
+
var/turf/pixel_turf = isturf(A) ? A : get_turf_pixel(A)
if(isnull(pixel_turf))
return
@@ -57,7 +57,7 @@
var/turf_visible
if(pixel_turf)
- turf_visible = cameranet.checkTurfVis(pixel_turf)
+ turf_visible = GLOB.cameranet.checkTurfVis(pixel_turf)
if(!turf_visible)
if(istype(loc, /obj/item/aicard) && (pixel_turf in view(client.view, loc)))
turf_visible = TRUE
@@ -228,4 +228,4 @@
//
/mob/living/silicon/ai/TurfAdjacent(var/turf/T)
- return (cameranet && cameranet.checkTurfVis(T))
+ return (GLOB.cameranet && GLOB.cameranet.checkTurfVis(T))
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 6bfd72413de..d840f64bb4a 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -134,9 +134,9 @@
if(W == A)
W.attack_self(src)
if(hand)
- update_inv_l_hand(0)
+ update_inv_l_hand()
else
- update_inv_r_hand(0)
+ update_inv_r_hand()
return
// operate three levels deep here (item in backpack in src; item in box in backpack in src, not any deeper)
@@ -258,28 +258,34 @@
Makes the mob face the direction of the clicked thing
*/
/mob/proc/MiddleShiftClickOn(atom/A)
+ return
+
+/mob/living/MiddleShiftClickOn(atom/A)
if(incapacitated())
return
var/face_dir = get_cardinal_dir(src, A)
- if(forced_look == face_dir)
+ if(!face_dir || forced_look == face_dir || A == src)
forced_look = null
- to_chat(src, "You are no longer facing any direction.")
+ to_chat(src, "Cancelled direction lock.")
return
forced_look = face_dir
- to_chat(src, "You are now facing [dir2text(forced_look)].")
+ to_chat(src, "You are now facing [dir2text(forced_look)]. To cancel this, shift-middleclick yourself.")
/*
Middle shift-control-click
Makes the mob constantly face the object (until it's out of sight)
*/
/mob/proc/MiddleShiftControlClickOn(atom/A)
+ return
+
+/mob/living/MiddleShiftControlClickOn(atom/A)
var/face_uid = A.UID()
- if(forced_look == face_uid)
+ if(forced_look == face_uid || A == src)
forced_look = null
- to_chat(src, "You are no longer facing [A].")
+ to_chat(src, "Cancelled direction lock.")
return
forced_look = face_uid
- to_chat(src, "You are now facing [A].")
+ to_chat(src, "You are now facing [A]. To cancel this, shift-middleclick yourself.")
// In case of use break glass
/*
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 58e82733abe..b069ff31eb7 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -161,10 +161,13 @@
#define ui_bot_pull "EAST-2:26,SOUTH:7"
//Ghosts
-#define ui_ghost_jumptomob "SOUTH:6,CENTER-2:24"
-#define ui_ghost_orbit "SOUTH:6,CENTER-1:24"
-#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24"
-#define ui_ghost_teleport "SOUTH:6,CENTER+1:24"
+#define ui_ghost_jumptomob "SOUTH:6,CENTER-2"
+#define ui_ghost_orbit "SOUTH:6,CENTER-1"
+#define ui_ghost_reenter_corpse "SOUTH:6,CENTER"
+#define ui_ghost_teleport "SOUTH:6,CENTER+1"
+#define ui_ghost_respawn_list "SOUTH:6,CENTER+2"
+#define ui_ghost_respawn_mob "SOUTH:6+1,CENTER+2"
+#define ui_ghost_respawn_pai "SOUTH:6+2,CENTER+2"
//HUD styles. Please ensure HUD_VERSIONS is the same as the maximum index. Index order defines how they are cycled in F12.
#define HUD_STYLE_STANDARD 1
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index d49c0ee59eb..a93e65c762b 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -19,9 +19,8 @@
if(!category)
return
- var/obj/screen/alert/alert
- if(alerts[category])
- alert = alerts[category]
+ var/obj/screen/alert/alert = LAZYACCESS(alerts, category)
+ if(alert)
if(alert.override_alerts)
return 0
if(new_master && new_master != alert.master)
@@ -57,7 +56,7 @@
alert.icon_state = "[initial(alert.icon_state)][severity]"
alert.severity = severity
- alerts[category] = alert
+ LAZYSET(alerts, category, alert) // This also creates the list if it doesn't exist
if(client && hud_used)
hud_used.reorganize_alerts()
alert.transform = matrix(32, 6, MATRIX_TRANSLATE)
@@ -72,7 +71,7 @@
// Proc to clear an existing alert.
/mob/proc/clear_alert(category, clear_override = FALSE)
- var/obj/screen/alert/alert = alerts[category]
+ var/obj/screen/alert/alert = LAZYACCESS(alerts, category)
if(!alert)
return 0
if(alert.override_alerts && !clear_override)
@@ -585,12 +584,14 @@ so as to remain in compliance with the most up-to-date laws."
// Re-render all alerts - also called in /datum/hud/show_hud() because it's needed there
/datum/hud/proc/reorganize_alerts()
var/list/alerts = mymob.alerts
+ if(!alerts)
+ return FALSE
var/icon_pref
if(!hud_shown)
- for(var/i = 1, i <= alerts.len, i++)
+ for(var/i in 1 to alerts.len)
mymob.client.screen -= alerts[alerts[i]]
- return 1
- for(var/i = 1, i <= alerts.len, i++)
+ return TRUE
+ for(var/i in 1 to alerts.len)
var/obj/screen/alert/alert = alerts[alerts[i]]
if(alert.icon_state == "template")
if(!icon_pref)
@@ -611,10 +612,10 @@ so as to remain in compliance with the most up-to-date laws."
. = ""
alert.screen_loc = .
mymob.client.screen |= alert
- return 1
+ return TRUE
/mob
- var/list/alerts = list() // contains /obj/screen/alert only // On /mob so clientless mobs will throw alerts properly
+ var/list/alerts // lazy list. contains /obj/screen/alert only // On /mob so clientless mobs will throw alerts properly
/obj/screen/alert/Click(location, control, params)
if(!usr || !usr.client)
diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm
index 600c1105e8e..a291120fb85 100644
--- a/code/_onclick/hud/ghost.dm
+++ b/code/_onclick/hud/ghost.dm
@@ -40,6 +40,52 @@
var/mob/dead/observer/G = usr
G.dead_tele()
+/obj/screen/ghost/respawn_list
+ name = "Ghost spawns"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "template"
+
+/obj/screen/ghost/respawn_list/Initialize(mapload)
+ . = ..()
+ update_hidden_state()
+
+/obj/screen/ghost/respawn_list/Click()
+ var/client/C = hud.mymob.client
+ hud.inventory_shown = !hud.inventory_shown
+ if(hud.inventory_shown)
+ C.screen += hud.toggleable_inventory
+ else
+ C.screen -= hud.toggleable_inventory
+ update_hidden_state()
+
+/obj/screen/ghost/respawn_list/proc/update_hidden_state()
+ var/matrix/M = matrix(transform)
+ M.Turn(-90)
+
+ overlays.Cut()
+ var/image/img = image('icons/mob/actions/actions.dmi', src, (hud && hud.inventory_shown) ? "hide" : "show")
+ img.transform = M
+ overlays += img
+
+/obj/screen/ghost/respawn_mob
+ name = "Mob spawners"
+ icon_state = "mob_spawner"
+
+/obj/screen/ghost/respawn_mob/Click()
+ var/mob/dead/observer/G = usr
+ G.open_spawners_menu()
+
+/obj/screen/ghost/respawn_pai
+ name = "Configure pAI"
+ icon_state = "pai"
+
+/obj/screen/ghost/respawn_pai/Click()
+ var/mob/dead/observer/G = usr
+ GLOB.paiController.recruitWindow(G)
+
+/datum/hud/ghost
+ inventory_shown = FALSE
+
/datum/hud/ghost/New(mob/owner)
..()
var/obj/screen/using
@@ -59,6 +105,22 @@
using = new /obj/screen/ghost/teleport()
using.screen_loc = ui_ghost_teleport
static_inventory += using
+ static_inventory += using
+
+ using = new /obj/screen/ghost/respawn_list()
+ using.screen_loc = ui_ghost_respawn_list
+ static_inventory += using
+
+ using = new /obj/screen/ghost/respawn_mob()
+ using.screen_loc = ui_ghost_respawn_mob
+ toggleable_inventory += using
+
+ using = new /obj/screen/ghost/respawn_pai()
+ using.screen_loc = ui_ghost_respawn_pai
+ toggleable_inventory += using
+
+ for(var/obj/screen/S in (static_inventory + toggleable_inventory))
+ S.hud = src
/datum/hud/ghost/show_hud()
mymob.client.screen = list()
diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm
index f03d436bcaf..8f243dfcdc1 100644
--- a/code/_onclick/hud/other_mobs.dm
+++ b/code/_onclick/hud/other_mobs.dm
@@ -3,6 +3,10 @@
/datum/hud/simple_animal/New(mob/user)
..()
+
+ mymob.healths = new /obj/screen/healths()
+ infodisplay += mymob.healths
+
var/obj/screen/using
using = new /obj/screen/act_intent/simple_animal()
using.icon_state = mymob.a_intent
diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm
index 68847cbd97d..d5fb5cad4fa 100644
--- a/code/_onclick/hud/parallax.dm
+++ b/code/_onclick/hud/parallax.dm
@@ -246,7 +246,7 @@
if(!view)
view = world.view
var/list/new_overlays = list()
- var/count = Ceiling(view/(480/world.icon_size))+1
+ var/count = CEILING(view/(480/world.icon_size), 1)+1
for(var/x in -count to count)
for(var/y in -count to count)
if(x == 0 && y == 0)
diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm
index 872659d714b..eda0cc5640d 100644
--- a/code/_onclick/hud/picture_in_picture.dm
+++ b/code/_onclick/hud/picture_in_picture.dm
@@ -102,8 +102,8 @@
overlays += standard_background
/obj/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE)
- width = Clamp(width, 0, max_dimensions)
- height = Clamp(height, 0, max_dimensions)
+ width = clamp(width, 0, max_dimensions)
+ height = clamp(height, 0, max_dimensions)
src.width = width
src.height = height
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index 14080274617..f048c3c393d 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -201,7 +201,7 @@
if(!R.robot_modules_background)
return
- var/display_rows = Ceiling(R.module.modules.len / 8)
+ var/display_rows = CEILING(R.module.modules.len / 8, 1)
R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
R.client.screen += R.robot_modules_background
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index c0f5cfd5f3b..1423720f8f6 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -371,15 +371,15 @@
return 1
if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
-
+
if(hud?.mymob && slot_id)
var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id)
if(inv_item)
return inv_item.Click(location, control, params)
if(usr.attack_ui(slot_id))
- usr.update_inv_l_hand(0)
- usr.update_inv_r_hand(0)
+ usr.update_inv_l_hand()
+ usr.update_inv_r_hand()
return 1
/obj/screen/inventory/hand
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index d2a91da4020..f88244c0cd8 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -58,7 +58,7 @@
else
return 1
var/obj/item/organ/external/O = M.get_organ(user.zone_selected)
- if((is_sharp(src) || (isscrewdriver(src) && O.is_robotic())) && user.a_intent == INTENT_HELP)
+ if((is_sharp(src) || (isscrewdriver(src) && O?.is_robotic())) && user.a_intent == INTENT_HELP)
if(!attempt_initiate_surgery(src, M, user))
return FALSE
else
@@ -75,8 +75,8 @@
if(hitsound)
playsound(loc, hitsound, get_clamped_volume(), 1, -1)
- user.lastattacked = M
- M.lastattacker = user
+ M.lastattacker = user.real_name
+ M.lastattackerckey = user.ckey
user.do_attack_animation(M)
. = M.attacked_by(src, user, def_zone)
@@ -135,9 +135,9 @@
/obj/item/proc/get_clamped_volume()
if(w_class)
if(force)
- return Clamp((force + w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100
+ return clamp((force + w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100
else
- return Clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100
+ return clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100
/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area)
if(I.discrete)
diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm
index 460bc0193f6..3452400edbb 100644
--- a/code/_onclick/observer.dm
+++ b/code/_onclick/observer.dm
@@ -15,7 +15,6 @@
// Otherwise jump
else
- following = null
forceMove(get_turf(A))
update_parallax_contents()
@@ -64,7 +63,7 @@
if(!istype(user)) // Make sure user is actually an observer. Revenents also use attack_ghost, but do not have the health_scan var.
return
if(user.client && user.health_scan)
- if(issilicon(src) || ismachine(src))
+ if(issilicon(src) || ismachineperson(src))
robot_healthscan(user, src)
else if(ishuman(src))
healthscan(user, src, 1, TRUE)
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 3f5785e44ab..f4f2f72b16b 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -36,7 +36,7 @@
var/vote_no_default = 0 // vote does not default to nochange/norestart (tbi)
var/vote_no_dead = 0 // dead people can't vote (tbi)
// var/enable_authentication = 0 // goon authentication
- var/del_new_on_log = 1 // del's new players if they log before they spawn in
+ var/del_new_on_log = 1 // qdel's new players if they log before they spawn in
var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard
var/traitor_scaling = 0 //if amount of traitors scales based on amount of players
var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other
@@ -200,8 +200,8 @@
var/disable_away_missions = 0 // disable away missions
var/disable_space_ruins = 0 //disable space ruins
- var/extra_space_ruin_levels_min = 2
- var/extra_space_ruin_levels_max = 4
+ var/extra_space_ruin_levels_min = 4
+ var/extra_space_ruin_levels_max = 8
var/ooc_allowed = 1
var/looc_allowed = 1
@@ -265,6 +265,11 @@
src.votable_modes += "secret"
/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist
+ if(IsAdminAdvancedProcCall())
+ to_chat(usr, "Config reload blocked: Advanced ProcCall detected.")
+ message_admins("[key_name(usr)] attempted to reload configuration via advanced proc-call")
+ log_admin("[key_name(usr)] attempted to reload configuration via advanced proc-call")
+ return
var/list/Lines = file2list(filename)
for(var/t in Lines)
@@ -502,7 +507,7 @@
config.guest_jobban = 1
if("guest_ban")
- guests_allowed = 0
+ GLOB.guests_allowed = 0
if("panic_bunker_threshold")
config.panic_bunker_threshold = text2num(value)
@@ -618,12 +623,12 @@
if("python_path")
if(value)
- python_path = value
+ GLOB.python_path = value
else
if(world.system_type == UNIX)
- python_path = "/usr/bin/env python2"
+ GLOB.python_path = "/usr/bin/env python2"
else //probably windows, if not this should work anyway
- python_path = "pythonw"
+ GLOB.python_path = "pythonw"
if("assistant_limit")
config.assistantlimit = 1
@@ -641,31 +646,31 @@
config.max_maint_drones = text2num(value)
if("expected_round_length")
- config.expected_round_length = MinutesToTicks(text2num(value))
+ config.expected_round_length = text2num(value) MINUTES
if("event_custom_start_mundane")
var/values = text2numlist(value, ";")
- config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2]))
+ config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = values[1] MINUTES, "upper" = values[2] MINUTES)
if("event_custom_start_moderate")
var/values = text2numlist(value, ";")
- config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2]))
+ config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = values[1] MINUTES, "upper" = values[2] MINUTES)
if("event_custom_start_major")
var/values = text2numlist(value, ";")
- config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2]))
+ config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = values[1] MINUTES, "upper" = values[2] MINUTES)
if("event_delay_lower")
var/values = text2numlist(value, ";")
- config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1])
- config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2])
- config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3])
+ config.event_delay_lower[EVENT_LEVEL_MUNDANE] = values[1] MINUTES
+ config.event_delay_lower[EVENT_LEVEL_MODERATE] = values[2] MINUTES
+ config.event_delay_lower[EVENT_LEVEL_MAJOR] = values[3] MINUTES
if("event_delay_upper")
var/values = text2numlist(value, ";")
- config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1])
- config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2])
- config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3])
+ config.event_delay_upper[EVENT_LEVEL_MUNDANE] = values[1] MINUTES
+ config.event_delay_upper[EVENT_LEVEL_MODERATE] = values[2] MINUTES
+ config.event_delay_upper[EVENT_LEVEL_MAJOR] = values[3] MINUTES
if("starlight")
config.starlight = 1
@@ -701,7 +706,7 @@
config.max_loadout_points = text2num(value)
if("round_abandon_penalty_period")
- config.round_abandon_penalty_period = MinutesToTicks(text2num(value))
+ config.round_abandon_penalty_period = text2num(value) MINUTES
if("medal_hub_address")
config.medal_hub_address = value
@@ -716,7 +721,7 @@
config.shutdown_on_reboot = 1
if("shutdown_shell_command")
- shutdown_shell_command = value
+ GLOB.shutdown_shell_command = value
if("disable_karma")
config.disable_karma = 1
@@ -789,11 +794,11 @@
if(BombCap > 128)
BombCap = 128
- MAX_EX_DEVASTATION_RANGE = round(BombCap/4)
- MAX_EX_HEAVY_RANGE = round(BombCap/2)
- MAX_EX_LIGHT_RANGE = BombCap
- MAX_EX_FLASH_RANGE = BombCap
- MAX_EX_FLAME_RANGE = BombCap
+ GLOB.max_ex_devastation_range = round(BombCap/4)
+ GLOB.max_ex_heavy_range = round(BombCap/2)
+ GLOB.max_ex_light_range = BombCap
+ GLOB.max_ex_flash_range = BombCap
+ GLOB.max_ex_flame_range = BombCap
if("default_laws")
config.default_laws = text2num(value)
if("randomize_shift_time")
@@ -808,8 +813,12 @@
log_config("Unknown setting in configuration: '[name]'")
/datum/configuration/proc/loadsql(filename) // -- TLE
+ if(IsAdminAdvancedProcCall())
+ to_chat(usr, "SQL configuration reload blocked: Advanced ProcCall detected.")
+ message_admins("[key_name(usr)] attempted to reload SQL configuration via advanced proc-call")
+ log_admin("[key_name(usr)] attempted to reload SQL configuration via advanced proc-call")
+ return
var/list/Lines = file2list(filename)
- var/db_version = 0
for(var/t in Lines)
if(!t) continue
@@ -848,17 +857,21 @@
if("feedback_tableprefix")
sqlfdbktableprefix = value
if("db_version")
- db_version = text2num(value)
+ sql_version = text2num(value)
else
log_config("Unknown setting in configuration: '[name]'")
- if(config.sql_enabled && db_version != SQL_VERSION)
+
+ // The unit tests have their own version of this check, which wont hold the server up infinitely, so this is disabled if we are running unit tests
+ #ifndef UNIT_TESTS
+ if(config.sql_enabled && sql_version != SQL_VERSION)
config.sql_enabled = 0
log_config("WARNING: DB_CONFIG DEFINITION MISMATCH!")
spawn(60)
if(SSticker.current_state == GAME_STATE_PREGAME)
- going = 0
+ SSticker.ticker_going = FALSE
spawn(600)
to_chat(world, "DB_CONFIG MISMATCH, ROUND START DELAYED. Please check database version for recent upstream changes!")
+ #endif
/datum/configuration/proc/loadoverflowwhitelist(filename)
var/list/Lines = file2list(filename)
diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm
index 5a520b547e1..691f19201f6 100644
--- a/code/controllers/globals.dm
+++ b/code/controllers/globals.dm
@@ -14,7 +14,7 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars)
var/datum/controller/exclude_these = new
gvars_datum_in_built_vars = exclude_these.vars + list("gvars_datum_protected_varlist", "gvars_datum_in_built_vars", "gvars_datum_init_order")
- qdel(exclude_these)
+ QDEL_IN(exclude_these, 0) //signal logging isn't ready
Initialize()
diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm
deleted file mode 100644
index 59510162e1c..00000000000
--- a/code/controllers/hooks-defs.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * Startup hook.
- * Called in world.dm when the server starts.
- */
-/hook/startup
-
-/**
- * Roundstart hook.
- * Called in gameticker.dm when a round starts.
- */
-/hook/roundstart
diff --git a/code/controllers/hooks.dm b/code/controllers/hooks.dm
deleted file mode 100644
index 48f1199ef76..00000000000
--- a/code/controllers/hooks.dm
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * @file hooks.dm
- * Implements hooks, a simple way to run code on pre-defined events.
- */
-
-/** @page hooks Code hooks
- * @section hooks Hooks
- * A hook is defined under /hook in the type tree.
- *
- * To add some code to be called by the hook, define a proc under the type, as so:
- * @code
- /hook/foo/proc/bar()
- if(1)
- return 1 //Sucessful
- else
- return 0 //Error, or runtime.
- * @endcode
- * All hooks must return nonzero on success, as runtimes will force return null.
- */
-
-/**
- * Calls a hook, executing every piece of code that's attached to it.
- * @param hook Identifier of the hook to call.
- * @returns 1 if all hooked code runs successfully, 0 otherwise.
- */
-/proc/callHook(hook, list/args=null)
- var/hook_path = text2path("/hook/[hook]")
- if(!hook_path)
- error("Invalid hook '/hook/[hook]' called.")
- return 0
-
- var/caller = new hook_path
- var/status = 1
- for(var/P in typesof("[hook_path]/proc"))
- if(!call(caller, P)(arglist(args)))
- error("Hook '[P]' failed or runtimed.")
- status = 0
-
- return status
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index f64e566e097..b8c3cdbf1e2 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -62,10 +62,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
var/static/current_ticklimit = TICK_LIMIT_RUNNING
/datum/controller/master/New()
- //temporary file used to record errors with loading config, moved to log directory once logging is set up
- GLOB.config_error_log = GLOB.world_game_log = GLOB.world_runtime_log = "data/logs/config_error.log"
- load_configuration()
- // Highlander-style: there can only be one! Kill off the old and replace it with the new.
if(!random_seed)
random_seed = rand(1, 1e9)
@@ -73,6 +69,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
var/list/_subsystems = list()
subsystems = _subsystems
+ // Highlander-style: there can only be one! Kill off the old and replace it with the new.
if(Master != src)
if(istype(Master))
Recover()
@@ -146,7 +143,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
msg = "The [BadBoy.name] subsystem was the last to fire for 2 controller restarts. It will be recovered now and disabled if it happens again."
FireHim = TRUE
if(3)
- msg = "The [BadBoy.name] subsystem seems to be destabilizing the MC and will be offlined."
+ msg = "The [BadBoy.name] subsystem seems to be destabilizing the MC and will be offlined. The following implications are now in effect: [BadBoy.offline_implications]"
BadBoy.flags |= SS_NO_FIRE
if(msg)
to_chat(GLOB.admins, "[msg]")
@@ -454,14 +451,15 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
// in those cases, so we just let them run)
if(queue_node_flags & SS_NO_TICK_CHECK)
if(queue_node.tick_usage > TICK_LIMIT_RUNNING - TICK_USAGE && ran_non_ticker)
- queue_node.queued_priority += queue_priority_count * 0.1
- queue_priority_count -= queue_node_priority
- queue_priority_count += queue_node.queued_priority
- current_tick_budget -= queue_node_priority
- queue_node = queue_node.queue_next
+ if(!(queue_node_flags & SS_BACKGROUND))
+ queue_node.queued_priority += queue_priority_count * 0.1
+ queue_priority_count -= queue_node_priority
+ queue_priority_count += queue_node.queued_priority
+ current_tick_budget -= queue_node_priority
+ queue_node = queue_node.queue_next
continue
- if((queue_node_flags & SS_BACKGROUND) && !bg_calc)
+ if(!bg_calc && (queue_node_flags & SS_BACKGROUND))
current_tick_budget = queue_priority_count_bg
bg_calc = TRUE
@@ -514,7 +512,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
queue_node.paused_ticks = 0
queue_node.paused_tick_usage = 0
- if(queue_node_flags & SS_BACKGROUND) //update our running total
+ if(bg_calc) //update our running total
queue_priority_count_bg -= queue_node_priority
else
queue_priority_count -= queue_node_priority
diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm
index b8996f2cf89..03e54df61c5 100644
--- a/code/controllers/subsystem.dm
+++ b/code/controllers/subsystem.dm
@@ -1,7 +1,7 @@
/datum/controller/subsystem
// Metadata; you should define these.
- name = "fire coderbus" //name of the subsystem
+ name = "fire codertrain" //name of the subsystem
var/init_order = INIT_ORDER_DEFAULT //order of initialization. Higher numbers are initialized first, lower numbers later. Use defines in __DEFINES/subsystems.dm for easy understanding of order.
var/wait = 20 //time to wait (in deciseconds) between each call to fire(). Must be a positive integer.
var/priority = FIRE_PRIORITY_DEFAULT //When mutiple subsystems need to run in the same tick, higher priority subsystems will run first and be given a higher share of the tick before MC_TICK_CHECK triggers a sleep
@@ -35,6 +35,8 @@
var/static/list/failure_strikes //How many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out!
+ var/offline_implications = "None" // What are the implications of this SS being offlined?
+
//Do not override
///datum/controller/subsystem/New()
@@ -87,7 +89,7 @@
queue_node_flags = queue_node.flags
if(queue_node_flags & SS_TICKER)
- if(!(SS_flags & SS_TICKER))
+ if((SS_flags & (SS_TICKER|SS_BACKGROUND)) != SS_TICKER)
continue
if(queue_node_priority < SS_priority)
break
@@ -179,7 +181,7 @@
var/title = name
if(can_fire)
- title = "\[[state_letter()]][title]"
+ title = "[state_colour()]\[[state_letter()]][title]"
stat(title, statclick.update(msg))
@@ -196,6 +198,18 @@
if(SS_IDLE)
. = " "
+/datum/controller/subsystem/proc/state_colour()
+ switch(state)
+ if(SS_RUNNING) // If its actively processing, colour it green
+ . = ""
+ if(SS_QUEUED) // If its in the running queue, but delayed, colour it orange
+ . = ""
+ if(SS_PAUSED, SS_PAUSING) // If its being paused due to lag, colour it red
+ . = ""
+ if(SS_SLEEPING) // If fire() slept, colour it blue
+ . = ""
+ if(SS_IDLE) // Leave it default if the SS is idle
+ . = ""
//could be used to postpone a costly subsystem for (default one) var/cycles, cycles
//for instance, during cpu intensive operations like explosions
/datum/controller/subsystem/proc/postpone(cycles = 1)
diff --git a/code/controllers/subsystem/acid.dm b/code/controllers/subsystem/acid.dm
index 40063b00a87..119d82113d7 100644
--- a/code/controllers/subsystem/acid.dm
+++ b/code/controllers/subsystem/acid.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(acid)
priority = FIRE_PRIORITY_ACID
flags = SS_NO_INIT|SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Objects will no longer react to acid. No immediate action is needed."
var/list/currentrun = list()
var/list/processing = list()
diff --git a/code/controllers/subsystem/afk.dm b/code/controllers/subsystem/afk.dm
index 6ab1d67a816..951a7fb1786 100644
--- a/code/controllers/subsystem/afk.dm
+++ b/code/controllers/subsystem/afk.dm
@@ -1,63 +1,76 @@
-#define AFK_WARNED 1
-#define AFK_CRYOD 2
+#define AFK_WARNED 1
+#define AFK_CRYOD 2
+#define AFK_ADMINS_WARNED 3
SUBSYSTEM_DEF(afk)
name = "AFK Watcher"
wait = 300
flags = SS_BACKGROUND
+ offline_implications = "Players will no longer be marked as AFK. No immediate action is needed."
var/list/afk_players = list() // Associative list. ckey as key and AFK state as value
+ var/list/non_cryo_antags
/datum/controller/subsystem/afk/Initialize()
- if(config.warn_afk_minimum <= 0 || config.auto_cryo_afk <= 0 || config.auto_despawn_afk <= 0)
- flags |= SS_NO_FIRE
+ if(config.warn_afk_minimum <= 0 || config.auto_cryo_afk <= 0 || config.auto_despawn_afk <= 0)
+ flags |= SS_NO_FIRE
+ else
+ non_cryo_antags = list(SPECIAL_ROLE_ABDUCTOR_AGENT, SPECIAL_ROLE_ABDUCTOR_SCIENTIST, \
+ SPECIAL_ROLE_SHADOWLING, SPECIAL_ROLE_WIZARD, SPECIAL_ROLE_WIZARD_APPRENTICE, SPECIAL_ROLE_NUKEOPS)
+ return ..()
/datum/controller/subsystem/afk/fire()
var/list/toRemove = list()
- for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
- if(!H.ckey) // Useless non ckey creatures
+ for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
+ if(!H?.ckey) // Useless non ckey creatures
continue
-
- var/turf/T
+
+ var/turf/T
// Only players and players with the AFK watch enabled
- // No dead, unconcious, restrained, people without jobs, people on other Z levels than the station or antags
+ // No dead, unconcious, restrained, people without jobs or people on other Z levels than the station
if(!H.client || !H.client.prefs.afk_watch || !H.mind || \
- H.stat || H.restrained() || !H.job || H.mind.special_role || \
- !is_station_level((T = get_turf(H)).z)) // Assign the turf as last. Small optimization
- if(afk_players[H.ckey])
+ H.stat || H.restrained() || !H.job || !is_station_level((T = get_turf(H)).z)) // Assign the turf as last. Small optimization
+ if(afk_players[H.ckey])
toRemove += H.ckey
continue
-
+
var/mins_afk = round(H.client.inactivity / 600)
if(mins_afk < config.warn_afk_minimum)
if(afk_players[H.ckey])
toRemove += H.ckey
continue
-
+
if(!afk_players[H.ckey])
afk_players[H.ckey] = AFK_WARNED
warn(H, "You are AFK for [mins_afk] minutes. You will be cryod after [config.auto_cryo_afk] total minutes and fully despawned after [config.auto_despawn_afk] total minutes. Please move or click in game if you want to avoid being despawned.")
- else
+ else
var/area/A = T.loc // Turfs loc is the area
if(afk_players[H.ckey] == AFK_WARNED)
if(mins_afk >= config.auto_cryo_afk && A.can_get_auto_cryod)
if(A.fast_despawn)
toRemove += H.ckey
- warn(H, "You are have been despawned after being AFK for [mins_afk] minutes. You have been despawned instantly due to you being in a secure area.")
- msg_admins(H, mins_afk, T, "forcefully despawned", "AFK in a fast despawn area")
+ warn(H, "You have been despawned after being AFK for [mins_afk] minutes. You have been despawned instantly due to you being in a secure area.")
+ log_afk_action(H, mins_afk, T, "despawned", "AFK in a fast despawn area")
force_cryo_human(H)
- else if(cryo_ssd(H))
- afk_players[H.ckey] = AFK_CRYOD
- msg_admins(H, mins_afk, T, "put into cryostorage")
- warn(H, "You are AFK for [mins_afk] minutes and have been moved to cryostorage. After being AFK for [config.auto_despawn_afk] total minutes you will be fully despawned. Please eject yourself (right click, eject) out of the cryostorage if you want to avoid being despawned.")
-
- else if(mins_afk >= config.auto_despawn_afk)
- var/obj/machinery/cryopod/P = H.loc
- msg_admins(H, mins_afk, T, "forcefully despawned")
- warn(H, "You are have been despawned after being AFK for [mins_afk] minutes.")
+ else
+ if(!(H.mind.special_role in non_cryo_antags))
+ if(cryo_ssd(H))
+ H.create_log(MISC_LOG, "Put into cryostorage by the AFK subsystem")
+ afk_players[H.ckey] = AFK_CRYOD
+ log_afk_action(H, mins_afk, T, "put into cryostorage")
+ warn(H, "You are AFK for [mins_afk] minutes and have been moved to cryostorage. \
+ After being AFK for another [config.auto_despawn_afk] minutes you will be fully despawned. \
+ Please eject yourself (right click, eject) out of the cryostorage if you want to avoid being despawned.")
+ else
+ message_admins("[key_name_admin(H)] at ([get_area(T).name] [ADMIN_JMP(T)]) is AFK for [mins_afk] and can't be automatically cryod due to it's antag status: ([H.mind.special_role]).")
+ afk_players[H.ckey] = AFK_ADMINS_WARNED
+
+ else if(afk_players[H.ckey] != AFK_ADMINS_WARNED && mins_afk >= config.auto_despawn_afk)
+ log_afk_action(H, mins_afk, T, "despawned")
+ warn(H, "You have been despawned after being AFK for [mins_afk] minutes.")
toRemove += H.ckey
- P.despawn_occupant()
-
+ force_cryo_human(H)
+
removeFromWatchList(toRemove)
/datum/controller/subsystem/afk/proc/warn(mob/living/carbon/human/H, text)
@@ -66,9 +79,8 @@ SUBSYSTEM_DEF(afk)
if(H.client)
window_flash(H.client)
-/datum/controller/subsystem/afk/proc/msg_admins(mob/living/carbon/human/H, mins_afk, turf/location, action, info)
+/datum/controller/subsystem/afk/proc/log_afk_action(mob/living/carbon/human/H, mins_afk, turf/location, action, info)
log_admin("[key_name(H)] has been [action] by the AFK Watcher subsystem after being AFK for [mins_afk] minutes.[info ? " Extra info:" + info : ""]")
- message_admins("[key_name_admin(H)] at ([get_area(location).name] [ADMIN_JMP(location)]) has been [action] by the AFK Watcher subsystem after being AFK for [mins_afk] minutes.[info ? " Extra info:" + info : ""]")
/datum/controller/subsystem/afk/proc/removeFromWatchList(list/toRemove)
for(var/C in toRemove)
@@ -79,3 +91,4 @@ SUBSYSTEM_DEF(afk)
#undef AFK_WARNED
#undef AFK_CRYOD
+#undef AFK_ADMINS_WARNED
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 04141f6c3ab..80ce66d13ec 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -14,6 +14,7 @@ SUBSYSTEM_DEF(air)
wait = 5
flags = SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Turfs will no longer process atmos, and all atmospheric machines (including cryotubes) will no longer function. Shuttle call recommended."
var/cost_turfs = 0
var/cost_groups = 0
var/cost_highpressure = 0
@@ -275,7 +276,7 @@ SUBSYSTEM_DEF(air)
if(blockchanges && T.excited_group)
T.excited_group.garbage_collect()
else
- for(var/direction in cardinal)
+ for(var/direction in GLOB.cardinal)
if(!(T.atmos_adjacent_turfs & direction))
continue
var/turf/simulated/S = get_step(T, direction)
@@ -360,21 +361,21 @@ SUBSYSTEM_DEF(air)
return count
/datum/controller/subsystem/air/proc/setup_overlays()
- plmaster = new /obj/effect/overlay()
- plmaster.icon = 'icons/effects/tile_effects.dmi'
- plmaster.icon_state = "plasma"
- plmaster.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- plmaster.anchored = TRUE // should only appear in vis_contents, but to be safe
- plmaster.layer = FLY_LAYER
- plmaster.appearance_flags = TILE_BOUND
+ GLOB.plmaster = new /obj/effect/overlay()
+ GLOB.plmaster.icon = 'icons/effects/tile_effects.dmi'
+ GLOB.plmaster.icon_state = "plasma"
+ GLOB.plmaster.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ GLOB.plmaster.anchored = TRUE // should only appear in vis_contents, but to be safe
+ GLOB.plmaster.layer = FLY_LAYER
+ GLOB.plmaster.appearance_flags = TILE_BOUND
- slmaster = new /obj/effect/overlay()
- slmaster.icon = 'icons/effects/tile_effects.dmi'
- slmaster.icon_state = "sleeping_agent"
- slmaster.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- slmaster.anchored = TRUE // should only appear in vis_contents, but to be safe
- slmaster.layer = FLY_LAYER
- slmaster.appearance_flags = TILE_BOUND
+ GLOB.slmaster = new /obj/effect/overlay()
+ GLOB.slmaster.icon = 'icons/effects/tile_effects.dmi'
+ GLOB.slmaster.icon_state = "sleeping_agent"
+ GLOB.slmaster.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ GLOB.slmaster.anchored = TRUE // should only appear in vis_contents, but to be safe
+ GLOB.slmaster.layer = FLY_LAYER
+ GLOB.slmaster.appearance_flags = TILE_BOUND
#undef SSAIR_PIPENETS
#undef SSAIR_ATMOSMACHINERY
diff --git a/code/controllers/subsystem/alarm.dm b/code/controllers/subsystem/alarm.dm
index bac32a449de..289adf6de40 100644
--- a/code/controllers/subsystem/alarm.dm
+++ b/code/controllers/subsystem/alarm.dm
@@ -1,6 +1,7 @@
SUBSYSTEM_DEF(alarms)
name = "Alarms"
init_order = INIT_ORDER_ALARMS // 2
+ offline_implications = "Alarms (Power, camera, fire, etc) will no longer be checked. No immediate action is needed."
var/datum/alarm_handler/atmosphere/atmosphere_alarm = new()
var/datum/alarm_handler/burglar/burglar_alarm = new()
var/datum/alarm_handler/camera/camera_alarm = new()
diff --git a/code/controllers/subsystem/changelog.dm b/code/controllers/subsystem/changelog.dm
new file mode 100644
index 00000000000..98188599abd
--- /dev/null
+++ b/code/controllers/subsystem/changelog.dm
@@ -0,0 +1,263 @@
+/*
+ Subsystem core for ParadiseSS13 changelogs
+ Author: AffectedArc07
+
+ Basically this SS extracts changelogs from the past 30 days from the database, and cleanly formats them into HTML that the players can see
+ It only runs the extraction on initialize to ensure that the changelog doesnt change mid round, and to reduce the amount of DB calls that need to be done
+ The changelog entries are generated from the PHP scripts in tools/githubChangelogProcessor.php
+
+ This SS also handles the checking of player CL dates and informing them if it has changed
+
+*/
+
+SUBSYSTEM_DEF(changelog)
+ name = "Changelog"
+ flags = SS_NO_FIRE
+ var/current_cl_timestamp = "0" // Timestamp is seconds since UNIX epoch (1st January 1970). ITs also a string because BYOND doesnt like big numbers.
+ var/ss_ready = FALSE // Is the SS ready? We dont want to run procs if we have not generated yet
+ var/list/startup_clients_button = list() // Clients who connected before initialization who need their button color updating
+ var/list/startup_clients_open = list() // Clients who connected before initialization who need the CL opening
+ var/changelogHTML = "" // HTML that the changelog will use to display
+
+/datum/controller/subsystem/changelog/Initialize()
+ // This entire subsystem relies on SQL being here.
+ if(!GLOB.dbcon.IsConnected())
+ return ..()
+
+ var/DBQuery/latest_cl_date = GLOB.dbcon.NewQuery("SELECT UNIX_TIMESTAMP(date_merged) AS ut FROM [format_table_name("changelog")] ORDER BY date_merged DESC LIMIT 1")
+ if(!latest_cl_date.Execute())
+ var/err = latest_cl_date.ErrorMsg()
+ log_game("SQL ERROR during SSchangelog initialization L24. Error: \[[err]\]\n")
+ message_admins("SQL ERROR during SSchangelog initialization L24. Error: \[[err]\]\n")
+ // Abort if we cant do this
+ return ..()
+
+ while(latest_cl_date.NextRow())
+ current_cl_timestamp = latest_cl_date.item[1]
+
+ if(!GenerateChangelogHTML()) // if this failed to generate
+ to_chat(world, "WARNING: Changelog failed to generate. Please inform a coder/server dev")
+ return ..()
+
+ ss_ready = TRUE
+ // Now we can alert anyone who wanted to check the changelog
+ for(var/x in startup_clients_button)
+ var/client/C = x
+ UpdatePlayerChangelogButton(C)
+
+ // Now we can alert anyone who wanted to check the changelog
+ for(var/client/C in startup_clients_open)
+ OpenChangelog(C)
+
+ return ..()
+
+
+/datum/controller/subsystem/changelog/proc/UpdatePlayerChangelogDate(client/C)
+ if(!ss_ready)
+ return // Only return here, we dont have to worry about a queue list because this will be called from ShowChangelog()
+ // Technically this is only for the date but we can also do the UI button at the same time
+ var/datum/preferences/P = GLOB.preferences_datums[C.ckey]
+ if(P.toggles & UI_DARKMODE)
+ winset(C, "rpane.changelog", "background-color=#40628a;font-color=#ffffff;font-style=none")
+ else
+ winset(C, "rpane.changelog", "background-color=none;font-style=none")
+ C.prefs.lastchangelog = current_cl_timestamp
+ var/DBQuery/updatePlayerCLTime = GLOB.dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastchangelog='[sanitizeSQL(current_cl_timestamp)]' WHERE ckey='[C.ckey]'")
+ if(!updatePlayerCLTime.Execute())
+ var/err = updatePlayerCLTime.ErrorMsg()
+ log_game("SQL ERROR during lastchangelog updating. Error: \[[err]\]\n")
+ message_admins("SQL ERROR during lastchangelog updating. Error: \[[err]\]\n")
+ to_chat(C, "Couldn't update your last seen changelog, please try again later.")
+ return FALSE
+ return TRUE
+
+/datum/controller/subsystem/changelog/proc/UpdatePlayerChangelogButton(client/C)
+ // If SQL aint even enabled, just set the button to default style
+ if(!GLOB.dbcon.IsConnected())
+ if(C.prefs.toggles & UI_DARKMODE)
+ winset(C, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF")
+ else
+ winset(C, "rpane.changelog", "background-color=none;text-color=#000000")
+ return
+
+ // If SQL is enabled but we aint ready, queue them up, and use the default style
+ if(!ss_ready)
+ startup_clients_button |= C
+ if(C.prefs.toggles & UI_DARKMODE)
+ winset(C, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF")
+ else
+ winset(C, "rpane.changelog", "background-color=none;text-color=#000000")
+ return
+
+ // Sanity check to ensure clients still exist (If a client DCs mid startup this would runtime)
+ if(C && C.prefs)
+ // If we are ready, process the button style
+ if(C.prefs.lastchangelog != current_cl_timestamp)
+ winset(C, "rpane.changelog", "background-color=#bb7700;text-color=#FFFFFF;font-style=bold")
+ to_chat(C, "Changelog has changed since your last visit.")
+ else
+ if(C.prefs.toggles & UI_DARKMODE)
+ winset(C, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF")
+ else
+ winset(C, "rpane.changelog", "background-color=none;text-color=#000000")
+
+
+/datum/controller/subsystem/changelog/proc/OpenChangelog(client/C)
+ // If SQL isnt enabled, dont even queue them, just tell them it wont work
+ if(!GLOB.dbcon.IsConnected())
+ to_chat(C, "This server is not running with an SQL backend. Changelog is unavailable.")
+ return
+
+ // If SQL is enabled but we aint ready, queue them up
+ if(!ss_ready)
+ startup_clients_open |= C
+ to_chat(C, "The changelog system is still initializing. The changelog will open for you once it has initialized.")
+ return
+
+ UpdatePlayerChangelogDate(C)
+ UpdatePlayerChangelogButton(C)
+
+ var/datum/browser/cl_popup = new(C.mob, "changelog", "Changelog", 700, 800)
+ cl_popup.set_content(changelogHTML)
+ cl_popup.open()
+
+/client/verb/changes()
+ set name = "Changelog"
+ set desc = "View the changelog."
+ set category = "OOC"
+ // Just invoke the actual CL thing
+ SSchangelog.OpenChangelog(src)
+
+// Helper to turn CL types into a fontawesome icon instead of an image
+// The colors are #28a745 for green, #fd7e14 for orange, and #dc3545 for red.
+// These colours are from bootstrap and look good with black and white
+/datum/controller/subsystem/changelog/proc/Text2Icon(text)
+ switch(text)
+ if("FIX")
+ return "" // Fixes are white because while they are good, they have no negative coutnerpart
+ if("WIP")
+ return "" // WIP stuff is orange because new code is good but its not done yet
+ if("TWEAK")
+ return "" // Tweaks are white because they could be good or bad, and theres no specific add or remove
+ if("SOUNDADD")
+ return "" // Sound additions are green because its something new
+ if("SOUNDDEL")
+ return "" // Sound removals are red because something has been removed
+ if("CODEADD")
+ return "" // Code additions are green because its something new
+ if("CODEDEL")
+ return "" // Code removals are red becuase someting has been removed
+ if("IMAGEADD")
+ return "" // Image additions are green because something has been added
+ if("IMAGEDEL")
+ return "" // Image removals are red because something has been removed
+ if("SPELLCHECK")
+ return "" // Spellcheck is white because theres no dedicated negative to it, so theres no red for it to collate with
+ if("EXPERIMENT")
+ return "" // Experimental stuff is orange because while its a new feature, its unstable
+ else // Just incase the DB somehow breaks
+ return "" // Same here
+
+// This proc is the star of the show
+/datum/controller/subsystem/changelog/proc/GenerateChangelogHTML()
+ // Modify the code below to modify the header of the changelog
+ var/changelog_header = {"
+
+ ParadiseSS13 Changelog
+
+
+ "}
+
+ var/list/prs_to_process = list()
+ // Grab all from last 30 days
+ var/DBQuery/pr_list_query = GLOB.dbcon.NewQuery("SELECT DISTINCT pr_number FROM changelog WHERE date_merged BETWEEN NOW() - INTERVAL 30 DAY AND NOW() ORDER BY date_merged DESC")
+ if(!pr_list_query.Execute())
+ var/err = pr_list_query.ErrorMsg()
+ log_game("SQL ERROR during CL generation L143. Error: \[[err]\]\n")
+ message_admins("SQL ERROR during CL generation L143. Error: \[[err]\]\n")
+ return FALSE
+
+ while(pr_list_query.NextRow())
+ prs_to_process += text2num(pr_list_query.item[1])
+
+ // Load in the header
+ changelogHTML += changelog_header
+
+ // Make blocks for all the PRs
+ for(var/pr_number in prs_to_process)
+ // Initial declarations
+ var/pr_block = "" // HTML for the changelog section
+ var/author = "" // Author of the PR
+ var/merge_date = "" // Timestamp of when the PR was merged
+
+ // Now we gather the data from the DB
+ // Also we probably dont need to sanitize the PR number but you never know
+ var/DBQuery/pr_meta = GLOB.dbcon.NewQuery("SELECT author,DATE(date_merged) AS date FROM changelog WHERE pr_number = [sanitizeSQL(pr_number)] LIMIT 1")
+ if(!pr_meta.Execute())
+ var/err = pr_meta.ErrorMsg()
+ log_game("SQL ERROR during CL generation L190. Error: \[[err]\]\n")
+ message_admins("SQL ERROR during CL generation L190. Error: \[[err]\]\n")
+ return FALSE
+
+ while(pr_meta.NextRow())
+ author = pr_meta.item[1]
+ merge_date = pr_meta.item[2]
+
+ // Now for each actual entry
+ var/DBQuery/db_entries = GLOB.dbcon.NewQuery("SELECT cl_type, cl_entry FROM changelog WHERE pr_number = [sanitizeSQL(pr_number)]")
+ if(!db_entries.Execute())
+ var/err = db_entries.ErrorMsg()
+ log_game("SQL ERROR during CL generation L204. Error: \[[err]\]\n")
+ message_admins("SQL ERROR during CL generation L204. Error: \[[err]\]\n")
+ return FALSE
+
+
+ // Now we make a changelog block
+ pr_block += "
"
+ // If the github URL in the config has a trailing slash, it doesnt matter here, thankfully github accepts having a double slash: https://github.com/org/repo//pull/1
+ pr_block += "
#[pr_number] by [author] (Merged on [merge_date])"
+
+ while(db_entries.NextRow())
+ pr_block += "
"
+
+ changelogHTML += pr_block
+
+ // Make sure we return TRUE so we know it worked
+ return TRUE
+
+
+// Topic handler so that PRs and forums and stuff open in another window
+/datum/controller/subsystem/changelog/Topic(href, href_list)
+ // Handler to open pages in your browser instead of inside the CL window
+ // Yes usr.client is gross here but src is the subsystem
+ // Takes the page to open as an argument
+ if(href_list["openPage"])
+ switch(href_list["openPage"])
+ if("forum")
+ usr.client.forum()
+ if("wiki")
+ // Wiki needs snowflake because it has no cancel button
+ if(config.wikiurl)
+ if(alert("This will open the wiki in your browser. Are you sure?",,"Yes","No")=="No")
+ return
+ usr.client.wiki("") // Blank arg is important here
+ else
+ to_chat(usr, "The Wiki URL is not set in the server configuration. Please inform the server host.")
+
+ if("github")
+ usr.client.github()
+ // Takes a PR number as argument
+ if(href_list["openPR"])
+ if(config.githuburl)
+ if(alert("This will open PR #[href_list["openPR"]] in your browser. Are you sure?",,"Yes","No")=="No")
+ return
+ var/url = "[config.githuburl]/pull/[href_list["openPR"]]"
+ usr << link(url)
+ else
+ to_chat(usr, "The GitHub URL is not set in the server configuration. PRs cannot be opened from changelog view. Please inform the server host.")
+
diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm
index dbe38634e6a..4eb468a0952 100644
--- a/code/controllers/subsystem/chat.dm
+++ b/code/controllers/subsystem/chat.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(chat)
wait = 1
priority = FIRE_PRIORITY_CHAT
init_order = INIT_ORDER_CHAT
+ offline_implications = "Chat messages will no longer be cleanly queued. No immediate action is needed."
var/list/payload = list()
diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm
new file mode 100644
index 00000000000..09dea24071f
--- /dev/null
+++ b/code/controllers/subsystem/dcs.dm
@@ -0,0 +1,53 @@
+PROCESSING_SUBSYSTEM_DEF(dcs)
+ name = "Datum Component System"
+ flags = SS_NO_INIT
+
+ var/list/elements_by_type = list()
+
+/datum/controller/subsystem/processing/dcs/Recover()
+ comp_lookup = SSdcs.comp_lookup
+
+/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments)
+ var/datum/element/eletype = arguments[1]
+ var/element_id = eletype
+
+ if(!ispath(eletype, /datum/element))
+ CRASH("Attempted to instantiate [eletype] as a /datum/element")
+
+ if(initial(eletype.element_flags) & ELEMENT_BESPOKE)
+ element_id = GetIdFromArguments(arguments)
+
+ . = elements_by_type[element_id]
+ if(.)
+ return
+ . = elements_by_type[element_id] = new eletype
+
+/****
+ * Generates an id for bespoke elements when given the argument list
+ * Generating the id here is a bit complex because we need to support named arguments
+ * Named arguments can appear in any order and we need them to appear after ordered arguments
+ * We assume that no one will pass in a named argument with a value of null
+ **/
+/datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments)
+ var/datum/element/eletype = arguments[1]
+ var/list/fullid = list("[eletype]")
+ var/list/named_arguments = list()
+ for(var/i in initial(eletype.id_arg_index) to length(arguments))
+ var/key = arguments[i]
+ var/value
+ if(istext(key))
+ value = arguments[key]
+ if(!(istext(key) || isnum(key)))
+ key = "\ref[key]"
+ key = "[key]" // Key is stringified so numbers dont break things
+ if(!isnull(value))
+ if(!(istext(value) || isnum(value)))
+ value = "\ref[value]"
+ named_arguments["[key]"] = value
+ else
+ fullid += "[key]"
+
+ if(length(named_arguments))
+ named_arguments = sortList(named_arguments)
+ fullid += named_arguments
+ return list2params(fullid)
diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm
index 0465f47e152..390c6bc1a62 100644
--- a/code/controllers/subsystem/events.dm
+++ b/code/controllers/subsystem/events.dm
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(events)
name = "Events"
init_order = INIT_ORDER_EVENTS
runlevels = RUNLEVEL_GAME
+ offline_implications = "Random events will no longer happen. No immediate action is needed."
// Report events at the end of the rouund
var/report_at_round_end = 0
@@ -36,7 +37,7 @@ SUBSYSTEM_DEF(events)
E.process()
for(var/i = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR)
- var/list/datum/event_container/EC = event_containers[i]
+ var/datum/event_container/EC = event_containers[i]
EC.process()
/datum/controller/subsystem/events/proc/event_complete(var/datum/event/E)
@@ -65,7 +66,7 @@ SUBSYSTEM_DEF(events)
log_debug("Event '[EM.name]' has completed at [station_time_timestamp()].")
/datum/controller/subsystem/events/proc/delay_events(var/severity, var/delay)
- var/list/datum/event_container/EC = event_containers[severity]
+ var/datum/event_container/EC = event_containers[severity]
EC.next_event_time += delay
/datum/controller/subsystem/events/proc/Interact(var/mob/living/user)
@@ -89,7 +90,7 @@ SUBSYSTEM_DEF(events)
if(E.isRunning)
message += "and is still running."
else
- if(E.endedAt - E.startedAt > MinutesToTicks(5)) // Only mention end time if the entire duration was more than 5 minutes
+ if(E.endedAt - E.startedAt > 5 MINUTES) // Only mention end time if the entire duration was more than 5 minutes
message += "and ended at [station_time_timestamp("hh:mm:ss", E.endedAt)]."
else
message += "and ran to completion."
@@ -104,7 +105,7 @@ SUBSYSTEM_DEF(events)
html += "Back "
html += "Time till start: [round(event_time / 600, 0.1)] "
html += "
"
- html += "
Available [severity_to_string[selected_event_container.severity]] Events (queued & running events will not be displayed)
"
+ html += "
Available [GLOB.severity_to_string[selected_event_container.severity]] Events (queued & running events will not be displayed)
"
@@ -211,38 +212,38 @@ SUBSYSTEM_DEF(events)
if(href_list["toggle_report"])
report_at_round_end = !report_at_round_end
- admin_log_and_message_admins("has [report_at_round_end ? "enabled" : "disabled"] the round end event report.")
+ log_and_message_admins("has [report_at_round_end ? "enabled" : "disabled"] the round end event report.")
else if(href_list["dec_timer"])
var/datum/event_container/EC = locate(href_list["event"])
var/decrease = (60 * RaiseToPower(10, text2num(href_list["dec_timer"])))
EC.next_event_time -= decrease
- admin_log_and_message_admins("decreased timer for [severity_to_string[EC.severity]] events by [decrease/600] minute(s).")
+ log_and_message_admins("decreased timer for [GLOB.severity_to_string[EC.severity]] events by [decrease/600] minute(s).")
else if(href_list["inc_timer"])
var/datum/event_container/EC = locate(href_list["event"])
var/increase = (60 * RaiseToPower(10, text2num(href_list["inc_timer"])))
EC.next_event_time += increase
- admin_log_and_message_admins("increased timer for [severity_to_string[EC.severity]] events by [increase/600] minute(s).")
+ log_and_message_admins("increased timer for [GLOB.severity_to_string[EC.severity]] events by [increase/600] minute(s).")
else if(href_list["select_event"])
var/datum/event_container/EC = locate(href_list["select_event"])
var/datum/event_meta/EM = EC.SelectEvent()
if(EM)
- admin_log_and_message_admins("has queued the [severity_to_string[EC.severity]] event '[EM.name]'.")
+ log_and_message_admins("has queued the [GLOB.severity_to_string[EC.severity]] event '[EM.name]'.")
else if(href_list["pause"])
var/datum/event_container/EC = locate(href_list["pause"])
EC.delayed = !EC.delayed
- admin_log_and_message_admins("has [EC.delayed ? "paused" : "resumed"] countdown for [severity_to_string[EC.severity]] events.")
+ log_and_message_admins("has [EC.delayed ? "paused" : "resumed"] countdown for [GLOB.severity_to_string[EC.severity]] events.")
else if(href_list["interval"])
var/delay = input("Enter delay modifier. A value less than one means events fire more often, higher than one less often.", "Set Interval Modifier") as num|null
if(delay && delay > 0)
var/datum/event_container/EC = locate(href_list["interval"])
EC.delay_modifier = delay
- admin_log_and_message_admins("has set the interval modifier for [severity_to_string[EC.severity]] events to [EC.delay_modifier].")
+ log_and_message_admins("has set the interval modifier for [GLOB.severity_to_string[EC.severity]] events to [EC.delay_modifier].")
else if(href_list["stop"])
if(alert("Stopping an event may have unintended side-effects. Continue?","Stopping Event!","Yes","No") != "Yes")
return
var/datum/event/E = locate(href_list["stop"])
var/datum/event_meta/EM = E.event_meta
- admin_log_and_message_admins("has stopped the [severity_to_string[EM.severity]] event '[EM.name]'.")
+ log_and_message_admins("has stopped the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.")
E.kill()
else if(href_list["view_events"])
selected_event_container = locate(href_list["view_events"])
@@ -264,23 +265,23 @@ SUBSYSTEM_DEF(events)
var/datum/event_meta/EM = locate(href_list["set_weight"])
EM.weight = weight
if(EM != new_event)
- admin_log_and_message_admins("has changed the weight of the [severity_to_string[EM.severity]] event '[EM.name]' to [EM.weight].")
+ log_and_message_admins("has changed the weight of the [GLOB.severity_to_string[EM.severity]] event '[EM.name]' to [EM.weight].")
else if(href_list["toggle_oneshot"])
var/datum/event_meta/EM = locate(href_list["toggle_oneshot"])
EM.one_shot = !EM.one_shot
if(EM != new_event)
- admin_log_and_message_admins("has [EM.one_shot ? "set" : "unset"] the oneshot flag for the [severity_to_string[EM.severity]] event '[EM.name]'.")
+ log_and_message_admins("has [EM.one_shot ? "set" : "unset"] the oneshot flag for the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.")
else if(href_list["toggle_enabled"])
var/datum/event_meta/EM = locate(href_list["toggle_enabled"])
EM.enabled = !EM.enabled
- admin_log_and_message_admins("has [EM.enabled ? "enabled" : "disabled"] the [severity_to_string[EM.severity]] event '[EM.name]'.")
+ log_and_message_admins("has [EM.enabled ? "enabled" : "disabled"] the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.")
else if(href_list["remove"])
if(alert("This will remove the event from rotation. Continue?","Removing Event!","Yes","No") != "Yes")
return
var/datum/event_meta/EM = locate(href_list["remove"])
var/datum/event_container/EC = locate(href_list["EC"])
EC.available_events -= EM
- admin_log_and_message_admins("has removed the [severity_to_string[EM.severity]] event '[EM.name]'.")
+ log_and_message_admins("has removed the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.")
else if(href_list["add"])
if(!new_event.name || !new_event.event_type)
return
@@ -288,12 +289,12 @@ SUBSYSTEM_DEF(events)
return
new_event.severity = selected_event_container.severity
selected_event_container.available_events += new_event
- admin_log_and_message_admins("has added \a [severity_to_string[new_event.severity]] event '[new_event.name]' of type [new_event.event_type] with weight [new_event.weight].")
+ log_and_message_admins("has added \a [GLOB.severity_to_string[new_event.severity]] event '[new_event.name]' of type [new_event.event_type] with weight [new_event.weight].")
new_event = new
else if(href_list["clear"])
var/datum/event_container/EC = locate(href_list["clear"])
if(EC.next_event)
- admin_log_and_message_admins("has dequeued the [severity_to_string[EC.severity]] event '[EC.next_event.name]'.")
+ log_and_message_admins("has dequeued the [GLOB.severity_to_string[EC.severity]] event '[EC.next_event.name]'.")
EC.next_event = null
Interact(usr)
diff --git a/code/controllers/subsystem/fires.dm b/code/controllers/subsystem/fires.dm
index aafc5ed48d5..dc419fffeb5 100644
--- a/code/controllers/subsystem/fires.dm
+++ b/code/controllers/subsystem/fires.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(fires)
priority = FIRE_PRIOTITY_BURNING
flags = SS_NO_INIT|SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Objects will no longer react to fires. No immediate action is needed."
var/list/currentrun = list()
var/list/processing = list()
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 4bc3965e6cf..619508544a6 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -5,8 +5,9 @@ SUBSYSTEM_DEF(garbage)
flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
init_order = INIT_ORDER_GARBAGE
+ offline_implications = "Garbage collection is no longer functional, and objects will not be qdel'd. Immediate server restart recommended."
- var/list/collection_timeout = list(0, 2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level
+ var/list/collection_timeout = list(2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level
//Stat tracking
var/delslasttick = 0 // number of del()'s we've done this tick
diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm
index 531b6af2e78..8d6a7e39852 100644
--- a/code/controllers/subsystem/icon_smooth.dm
+++ b/code/controllers/subsystem/icon_smooth.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(icon_smooth)
wait = 1
priority = FIRE_PRIOTITY_SMOOTHING
flags = SS_TICKER
+ offline_implications = "Objects will no longer smooth together properly. No immediate action is needed."
var/list/smooth_queue = list()
@@ -18,8 +19,18 @@ SUBSYSTEM_DEF(icon_smooth)
can_fire = 0
/datum/controller/subsystem/icon_smooth/Initialize()
- smooth_zlevel(1,TRUE)
- smooth_zlevel(2,TRUE)
+ log_startup_progress("Smoothing atoms...")
+ // Smooth EVERYTHING in the world
+ for(var/turf/T in world)
+ if(T.smooth)
+ smooth_icon(T)
+ for(var/A in T)
+ var/atom/AA = A
+ if(AA.smooth)
+ smooth_icon(AA)
+ CHECK_TICK
+
+ // Incase any new atoms were added to the smoothing queue for whatever reason
var/queue = smooth_queue
smooth_queue = list()
for(var/V in queue)
diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm
index 42df941e10f..d61b90f1239 100644
--- a/code/controllers/subsystem/idlenpcpool.dm
+++ b/code/controllers/subsystem/idlenpcpool.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(idlenpcpool)
priority = FIRE_PRIORITY_IDLE_NPC
wait = 60
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Idle simple animals will no longer process. Shuttle call recommended."
var/list/currentrun = list()
var/static/list/idle_mobs_by_zlevel[][]
@@ -39,4 +40,4 @@ SUBSYSTEM_DEF(idlenpcpool)
if(SA.stat != DEAD)
SA.consider_wakeup()
if(MC_TICK_CHECK)
- return
+ return
diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm
index f379deec72b..ecbf1471993 100644
--- a/code/controllers/subsystem/input.dm
+++ b/code/controllers/subsystem/input.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(input)
flags = SS_TICKER
priority = FIRE_PRIORITY_INPUT
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
+ offline_implications = "Player input will no longer be recognised. Immediate server restart recommended."
var/list/macro_sets
var/list/movement_keys
@@ -24,7 +25,7 @@ SUBSYSTEM_DEF(input)
// This is for when macro sets are eventualy datumized
/datum/controller/subsystem/input/proc/setup_default_macro_sets()
var/list/static/default_macro_sets
-
+
if(default_macro_sets)
macro_sets = default_macro_sets
return
@@ -120,3 +121,8 @@ SUBSYSTEM_DEF(input)
for(var/i in 1 to clients.len)
var/client/C = clients[i]
C.keyLoop()
+
+/datum/controller/subsystem/input/Recover()
+ macro_sets = SSinput.macro_sets
+ movement_keys = SSinput.movement_keys
+ alt_movement_keys = SSinput.alt_movement_keys
diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm
index 29efa85b8a0..ef89317d0f5 100644
--- a/code/controllers/subsystem/jobs.dm
+++ b/code/controllers/subsystem/jobs.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(jobs)
init_order = INIT_ORDER_JOBS // 12
wait = 3000 // 5 minutes (Deciseconds)
runlevels = RUNLEVEL_GAME
+ offline_implications = "Job playtime hours will no longer be logged. No immediate action is needed."
//List of all jobs
var/list/occupations = list()
@@ -10,7 +11,7 @@ SUBSYSTEM_DEF(jobs)
var/list/type_occupations = list() //Dict of all jobs, keys are types
var/list/prioritized_jobs = list() // List of jobs set to priority by HoP/Captain
var/list/id_change_records = list() // List of all job transfer records
- var/list/id_change_counter = 1
+ var/id_change_counter = 1
//Players who need jobs
var/list/unassigned = list()
//Debug info
@@ -39,8 +40,6 @@ SUBSYSTEM_DEF(jobs)
var/datum/job/job = new J()
if(!job)
continue
- if(!job.faction in faction)
- continue
occupations += job
name_occupations[job.title] = job
type_occupations[J] = job
@@ -49,7 +48,7 @@ SUBSYSTEM_DEF(jobs)
/datum/controller/subsystem/jobs/proc/Debug(var/text)
- if(!Debug2)
+ if(!GLOB.debug2)
return 0
job_debug.Add(text)
return 1
@@ -138,7 +137,7 @@ SUBSYSTEM_DEF(jobs)
if(flag && !(flag in player.client.prefs.be_special))
Debug("FOC flag failed, Player: [player], Flag: [flag], ")
continue
- if(player.mind && job.title in player.mind.restricted_roles)
+ if(player.mind && (job.title in player.mind.restricted_roles))
Debug("FOC incompatbile with antagonist role, Player: [player]")
continue
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
@@ -155,10 +154,10 @@ SUBSYSTEM_DEF(jobs)
if(istype(job, GetJob("Civilian"))) // We don't want to give him assistant, that's boring!
continue
- if(job.title in command_positions) //If you want a command position, select it!
+ if(job.title in GLOB.command_positions) //If you want a command position, select it!
continue
- if(job.title in whitelisted_positions) // No random whitelisted job, sorry!
+ if(job.title in GLOB.whitelisted_positions) // No random whitelisted job, sorry!
continue
if(job.admin_only) // No admin positions either.
@@ -180,7 +179,7 @@ SUBSYSTEM_DEF(jobs)
Debug("GRJ player has disability rendering them ineligible for job, Player: [player]")
continue
- if(player.mind && job.title in player.mind.restricted_roles)
+ if(player.mind && (job.title in player.mind.restricted_roles))
Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]")
continue
@@ -203,7 +202,7 @@ SUBSYSTEM_DEF(jobs)
///This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check
/datum/controller/subsystem/jobs/proc/FillHeadPosition()
for(var/level = 1 to 3)
- for(var/command_position in command_positions)
+ for(var/command_position in GLOB.command_positions)
var/datum/job/job = GetJob(command_position)
if(!job)
continue
@@ -231,7 +230,7 @@ SUBSYSTEM_DEF(jobs)
///This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level
/datum/controller/subsystem/jobs/proc/CheckHeadPositions(var/level)
- for(var/command_position in command_positions)
+ for(var/command_position in GLOB.command_positions)
var/datum/job/job = GetJob(command_position)
if(!job)
continue
@@ -357,7 +356,7 @@ SUBSYSTEM_DEF(jobs)
Debug("DO player has disability rendering them ineligible for job, Player: [player], Job:[job.title]")
continue
- if(player.mind && job.title in player.mind.restricted_roles)
+ if(player.mind && (job.title in player.mind.restricted_roles))
Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]")
continue
@@ -498,13 +497,14 @@ SUBSYSTEM_DEF(jobs)
job.after_spawn(H)
//Gives glasses to the vision impaired
- if(H.disabilities & DISABILITY_FLAG_NEARSIGHTED)
+ if(NEARSIGHTED in H.mutations)
var/equipped = H.equip_to_slot_or_del(new /obj/item/clothing/glasses/regular(H), slot_glasses)
if(equipped != 1)
var/obj/item/clothing/glasses/G = H.glasses
if(istype(G) && !G.prescription)
- G.prescription = 1
+ G.prescription = TRUE
G.name = "prescription [G.name]"
+ H.update_nearsighted_effects()
return H
@@ -600,7 +600,7 @@ SUBSYSTEM_DEF(jobs)
// If they're head, give them the account info for their department
if(job && job.head_position)
remembered_info = ""
- var/datum/money_account/department_account = department_accounts[job.department]
+ var/datum/money_account/department_account = GLOB.department_accounts[job.department]
if(department_account)
remembered_info += "Your department's account number is: #[department_account.account_number] "
@@ -622,7 +622,9 @@ SUBSYSTEM_DEF(jobs)
if(tgtcard.assignment && tgtcard.assignment == job.title)
jobs_to_formats[job.title] = "disabled" // the job they already have is pre-selected
else if(!job.would_accept_job_transfer_from_player(M))
- jobs_to_formats[job.title] = "linkDiscourage" // karma jobs they don't have available are discouraged
+ jobs_to_formats[job.title] = "linkDiscourage" // jobs which are karma-locked and not unlocked for this player are discouraged
+ else if((job.title in GLOB.command_positions) && istype(M) && M.client && job.available_in_playtime(M.client))
+ jobs_to_formats[job.title] = "linkDiscourage" // command jobs which are playtime-locked and not unlocked for this player are discouraged
else if(job.total_positions && !job.current_positions && job.title != "Civilian")
jobs_to_formats[job.title] = "linkEncourage" // jobs with nobody doing them at all are encouraged
else if(job.total_positions >= 0 && job.current_positions >= job.total_positions)
@@ -638,7 +640,7 @@ SUBSYSTEM_DEF(jobs)
var/datum/job/oldjobdatum = SSjobs.GetJob(oldtitle)
var/datum/job/newjobdatum = SSjobs.GetJob(newtitle)
if(istype(oldjobdatum) && oldjobdatum.current_positions > 0 && istype(newjobdatum))
- if(!(oldjobdatum.title in command_positions) && !(newjobdatum.title in command_positions))
+ if(!(oldjobdatum.title in GLOB.command_positions) && !(newjobdatum.title in GLOB.command_positions))
oldjobdatum.current_positions--
newjobdatum.current_positions++
diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm
index 7441d855f22..6761e9647d9 100644
--- a/code/controllers/subsystem/lighting.dm
+++ b/code/controllers/subsystem/lighting.dm
@@ -1,15 +1,15 @@
-GLOBAL_LIST_EMPTY(lighting_update_lights) // List of lighting sources queued for update.
-GLOBAL_LIST_EMPTY(lighting_update_corners) // List of lighting corners queued for update.
-GLOBAL_LIST_EMPTY(lighting_update_objects) // List of lighting objects queued for update.
-
SUBSYSTEM_DEF(lighting)
name = "Lighting"
wait = 2
init_order = INIT_ORDER_LIGHTING
flags = SS_TICKER
+ offline_implications = "Lighting will no longer update. Shuttle call recommended."
+ var/static/list/sources_queue = list() // List of lighting sources queued for update.
+ var/static/list/corners_queue = list() // List of lighting corners queued for update.
+ var/static/list/objects_queue = list() // List of lighting objects queued for update.
/datum/controller/subsystem/lighting/stat_entry()
- ..("L:[GLOB.lighting_update_lights.len]|C:[GLOB.lighting_update_corners.len]|O:[GLOB.lighting_update_objects.len]")
+ ..("L:[length(sources_queue)]|C:[length(corners_queue)]|O:[length(objects_queue)]")
/datum/controller/subsystem/lighting/Initialize(timeofday)
if(!initialized)
@@ -30,9 +30,10 @@ SUBSYSTEM_DEF(lighting)
MC_SPLIT_TICK_INIT(3)
if(!init_tick_checks)
MC_SPLIT_TICK
+ var/list/queue = sources_queue
var/i = 0
- for(i in 1 to GLOB.lighting_update_lights.len)
- var/datum/light_source/L = GLOB.lighting_update_lights[i]
+ for(i in 1 to length(queue))
+ var/datum/light_source/L = queue[i]
L.update_corners()
@@ -43,14 +44,15 @@ SUBSYSTEM_DEF(lighting)
else if(MC_TICK_CHECK)
break
if(i)
- GLOB.lighting_update_lights.Cut(1, i+1)
+ queue.Cut(1, i + 1)
i = 0
if(!init_tick_checks)
MC_SPLIT_TICK
- for (i in 1 to GLOB.lighting_update_corners.len)
- var/datum/lighting_corner/C = GLOB.lighting_update_corners[i]
+ queue = corners_queue
+ for(i in 1 to length(queue))
+ var/datum/lighting_corner/C = queue[i]
C.update_objects()
C.needs_update = FALSE
@@ -59,15 +61,16 @@ SUBSYSTEM_DEF(lighting)
else if(MC_TICK_CHECK)
break
if(i)
- GLOB.lighting_update_corners.Cut(1, i+1)
+ queue.Cut(1, i + 1)
i = 0
if(!init_tick_checks)
MC_SPLIT_TICK
- for (i in 1 to GLOB.lighting_update_objects.len)
- var/atom/movable/lighting_object/O = GLOB.lighting_update_objects[i]
+ queue = objects_queue
+ for(i in 1 to length(queue))
+ var/atom/movable/lighting_object/O = queue[i]
if(QDELETED(O))
continue
@@ -79,7 +82,7 @@ SUBSYSTEM_DEF(lighting)
else if(MC_TICK_CHECK)
break
if(i)
- GLOB.lighting_update_objects.Cut(1, i+1)
+ queue.Cut(1, i + 1)
/datum/controller/subsystem/lighting/Recover()
diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm
index 9a73c1dbabb..cebc6a5f768 100644
--- a/code/controllers/subsystem/machinery.dm
+++ b/code/controllers/subsystem/machinery.dm
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(machines)
name = "Machines"
init_order = INIT_ORDER_MACHINES
flags = SS_KEEP_TIMING
+ offline_implications = "Machinery will no longer process. Shuttle call recommended."
var/list/processing = list()
var/list/currentrun = list()
@@ -41,7 +42,7 @@ SUBSYSTEM_DEF(machines)
while(currentrun.len)
var/obj/O = currentrun[currentrun.len]
currentrun.len--
- if(O)
+ if(O && !QDELETED(O))
var/datum/powernet/newPN = new() // create a new powernet...
propagate_network(O, newPN)//... and propagate it to the other side of the cable
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index af741423526..163b2635d0e 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -11,26 +11,144 @@ SUBSYSTEM_DEF(mapping)
createRandomZlevel()
// Seed space ruins
if(!config.disable_space_ruins)
- var/timer = start_watch()
- log_startup_progress("Creating random space levels...")
- seedRuins(list(level_name_to_num(EMPTY_AREA)), rand(0, 3), /area/space, space_ruins_templates)
- log_startup_progress("Loaded random space levels in [stop_watch(timer)]s.")
-
// load in extra levels of space ruins
-
+ var/load_zlevels_timer = start_watch()
+ log_startup_progress("Creating random space levels...")
var/num_extra_space = rand(config.extra_space_ruin_levels_min, config.extra_space_ruin_levels_max)
for(var/i = 1, i <= num_extra_space, i++)
- var/zlev = space_manager.add_new_zlevel("[EMPTY_AREA] #[i]", linkage = CROSSLINKED, traits = list(REACHABLE))
- seedRuins(list(zlev), rand(0, 3), /area/space, space_ruins_templates)
+ GLOB.space_manager.add_new_zlevel("Ruin Area #[i]", linkage = CROSSLINKED, traits = list(REACHABLE, SPAWN_RUINS))
+ log_startup_progress("Loaded random space levels in [stop_watch(load_zlevels_timer)]s.")
+
+ // Now spawn ruins, random budget between 20 and 30 for all zlevels combined.
+ // While this may seem like a high number, the amount of ruin Z levels can be anywhere between 3 and 7.
+ // Note that this budget is not split evenly accross all zlevels
+ log_startup_progress("Seeding ruins...")
+ var/seed_ruins_timer = start_watch()
+ seedRuins(levels_by_trait(SPAWN_RUINS), rand(20, 30), /area/space, GLOB.space_ruins_templates)
+ log_startup_progress("Successfully seeded ruins in [stop_watch(seed_ruins_timer)]s.")
+
+ // Makes a blank space level for the sake of randomness
+ GLOB.space_manager.add_new_zlevel("Empty Area", linkage = CROSSLINKED, traits = list(REACHABLE))
+
// Setup the Z-level linkage
- space_manager.do_transition_setup()
+ GLOB.space_manager.do_transition_setup()
// Spawn Lavaland ruins and rivers.
- seedRuins(list(level_name_to_num(MINING)), config.lavaland_budget, /area/lavaland/surface/outdoors/unexplored, lava_ruins_templates)
+ log_startup_progress("Populating lavaland...")
+ var/lavaland_setup_timer = start_watch()
+ seedRuins(list(level_name_to_num(MINING)), config.lavaland_budget, /area/lavaland/surface/outdoors/unexplored, GLOB.lava_ruins_templates)
spawn_rivers(list(level_name_to_num(MINING)))
+ log_startup_progress("Successfully populated lavaland in [stop_watch(lavaland_setup_timer)]s.")
+
+ // Now we make a list of areas for teleport locs
+ // TOOD: Make these locs into lists on the SS itself, not globs
+ for(var/area/AR in world)
+ if(AR.no_teleportlocs)
+ continue
+ if(GLOB.teleportlocs[AR.name])
+ continue
+ var/turf/picked = safepick(get_area_turfs(AR.type))
+ if(picked && is_station_level(picked.z))
+ GLOB.teleportlocs[AR.name] = AR
+
+ GLOB.teleportlocs = sortAssoc(GLOB.teleportlocs)
+
+ for(var/area/AR in world)
+ if(GLOB.ghostteleportlocs[AR.name])
+ continue
+ var/list/turfs = get_area_turfs(AR.type)
+ if(turfs.len)
+ GLOB.ghostteleportlocs[AR.name] = AR
+
+ GLOB.ghostteleportlocs = sortAssoc(GLOB.ghostteleportlocs)
return ..()
+
+/datum/controller/subsystem/mapping/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins)
+ if(!z_levels || !z_levels.len)
+ WARNING("No Z levels provided - Not generating ruins")
+ return
+
+ for(var/zl in z_levels)
+ var/turf/T = locate(1, 1, zl)
+ if(!T)
+ WARNING("Z level [zl] does not exist - Not generating ruins")
+ return
+
+ 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/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)
+ var/datum/map_template/ruin/R = ruins[key]
+ if(R.cost > budget) //Why would you do that
+ continue
+ if(R.always_place)
+ forced_ruins[R] = -1
+ if(R.unpickable)
+ continue
+ ruins_availible[R] = R.placement_weight
+
+ while(budget > 0 && (ruins_availible.len || forced_ruins.len))
+ var/datum/map_template/ruin/current_pick
+ var/forced = FALSE
+ 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
+ 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/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
+
+ //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)
+ ruins_availible -= R
+ log_world("Failed to place [current_pick.name] ruin.")
+ else
+ budget -= current_pick.cost
+ if(!current_pick.allow_duplicates)
+ for(var/datum/map_template/ruin/R in ruins_availible)
+ if(R.id == current_pick.id)
+ ruins_availible -= R
+ if(current_pick.never_spawn_with)
+ for(var/blacklisted_type in current_pick.never_spawn_with)
+ for(var/possible_exclusion in ruins_availible)
+ if(istype(possible_exclusion,blacklisted_type))
+ ruins_availible -= possible_exclusion
+ forced_z = 0
+
+ //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.")
+
/datum/controller/subsystem/mapping/Recover()
flags |= SS_NO_INIT
diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm
index c21b8f0760a..9445dd2717a 100644
--- a/code/controllers/subsystem/mobs.dm
+++ b/code/controllers/subsystem/mobs.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(mobs)
priority = FIRE_PRIORITY_MOBS
flags = SS_KEEP_TIMING
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Mobs will no longer process. Immediate server restart recommended."
var/list/currentrun = list()
var/static/list/clients_by_zlevel[][]
@@ -10,7 +11,7 @@ SUBSYSTEM_DEF(mobs)
var/static/list/cubemonkeys = list()
/datum/controller/subsystem/mobs/stat_entry()
- ..("P:[GLOB.mob_list.len]")
+ ..("P:[GLOB.mob_living_list.len]")
/datum/controller/subsystem/mobs/Initialize(start_timeofday)
clients_by_zlevel = new /list(world.maxz,0)
@@ -20,17 +21,17 @@ SUBSYSTEM_DEF(mobs)
/datum/controller/subsystem/mobs/fire(resumed = 0)
var/seconds = wait * 0.1
if(!resumed)
- src.currentrun = GLOB.mob_list.Copy()
+ src.currentrun = GLOB.mob_living_list.Copy()
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
var/times_fired = src.times_fired
while(currentrun.len)
- var/mob/M = currentrun[currentrun.len]
+ var/mob/living/L = currentrun[currentrun.len]
currentrun.len--
- if(M)
- M.Life(seconds, times_fired)
+ if(L)
+ L.Life(seconds, times_fired)
else
- GLOB.mob_list.Remove(M)
+ GLOB.mob_living_list.Remove(L)
if(MC_TICK_CHECK)
return
diff --git a/code/controllers/subsystem/nano_mob_hunter.dm b/code/controllers/subsystem/nano_mob_hunter.dm
index a634f091013..19b57f59a70 100644
--- a/code/controllers/subsystem/nano_mob_hunter.dm
+++ b/code/controllers/subsystem/nano_mob_hunter.dm
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(mob_hunt)
name = "Nano-Mob Hunter GO Server"
init_order = INIT_ORDER_NANOMOB
priority = FIRE_PRIORITY_NANOMOB // Low priority, no need for MC_TICK_CHECK due to extremely low performance impact.
+ offline_implications = "Nano-Mob Hunter will no longer spawn mobs. No immediate action is needed."
var/max_normal_spawns = 15 //change this to adjust the number of normal spawns that can exist at one time. trapped spawns (from traitors) don't count towards this
var/list/normal_spawns = list()
var/max_trap_spawns = 15 //change this to adjust the number of trap spawns that can exist at one time. traps spawned beyond this point clear the oldest traps
@@ -102,12 +103,12 @@ SUBSYSTEM_DEF(mob_hunt)
return
if(red_terminal && red_terminal.ready && blue_terminal && blue_terminal.ready)
battle_turn = pick("Red", "Blue")
- red_terminal.audible_message("Battle starting!", null, 5)
- blue_terminal.audible_message("Battle starting!", null, 5)
+ red_terminal.atom_say("Battle starting!")
+ blue_terminal.atom_say("Battle starting!")
if(battle_turn == "Red")
- red_terminal.audible_message("Red Player's Turn!", null, 5)
+ red_terminal.atom_say("Red Player's Turn!")
else if(battle_turn == "Blue")
- blue_terminal.audible_message("Blue Player's Turn!", null, 5)
+ blue_terminal.atom_say("Blue Player's Turn!")
/datum/controller/subsystem/mob_hunt/proc/launch_attack(team, raw_damage, datum/mob_type/attack_type)
if(!team || !raw_damage)
@@ -134,11 +135,11 @@ SUBSYSTEM_DEF(mob_hunt)
winner_terminal.ready = 0
loser_terminal.ready = 0
if(surrender) //surrender doesn't give exp, to avoid people just farming exp without actually doing a battle
- winner_terminal.audible_message("Your rival surrendered!", null, 2)
+ winner_terminal.atom_say("Your rival surrendered!")
else
var/progress_message = winner_terminal.mob_info.gain_exp()
- winner_terminal.audible_message("[winner_terminal.team] Player wins!", null, 5)
- winner_terminal.audible_message(progress_message, null, 2)
+ winner_terminal.atom_say("[winner_terminal.team] Player wins!")
+ winner_terminal.atom_say(progress_message)
/datum/controller/subsystem/mob_hunt/proc/end_turn()
red_terminal.updateUsrDialog()
@@ -147,7 +148,7 @@ SUBSYSTEM_DEF(mob_hunt)
return
if(battle_turn == "Red")
battle_turn = "Blue"
- blue_terminal.audible_message("Blue's turn.", null, 5)
+ blue_terminal.atom_say("Blue's turn.")
else if(battle_turn == "Blue")
battle_turn = "Red"
- blue_terminal.audible_message("Red's turn.", null, 5)
+ blue_terminal.atom_say("Red's turn.")
diff --git a/code/controllers/subsystem/nanoui.dm b/code/controllers/subsystem/nanoui.dm
index c8cbbc62013..ef1b6ee03fe 100644
--- a/code/controllers/subsystem/nanoui.dm
+++ b/code/controllers/subsystem/nanoui.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(nanoui)
flags = SS_NO_INIT
priority = FIRE_PRIORITY_NANOUI
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
+ offline_implications = "All NanoUIs will no longer process. Shuttle call recommended."
var/list/currentrun = list()
var/list/open_uis = list() // A list of open UIs, grouped by src_object and ui_key.
diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm
index 4ebe1dceb0e..deffcb6bddf 100644
--- a/code/controllers/subsystem/nightshift.dm
+++ b/code/controllers/subsystem/nightshift.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(nightshift)
priority = FIRE_PRIORITY_NIGHTSHIFT
wait = 600
flags = SS_NO_TICK_CHECK
+ offline_implications = "The game will no longer shift between day and night lighting. No immediate action is needed."
var/nightshift_active = FALSE
var/nightshift_start_time = 702000 //7:30 PM, station time
@@ -25,12 +26,12 @@ SUBSYSTEM_DEF(nightshift)
check_nightshift()
/datum/controller/subsystem/nightshift/proc/announce(message)
- priority_announcement.Announce(message, new_sound = 'sound/misc/notice2.ogg', new_title = "Automated Lighting System Announcement")
+ GLOB.priority_announcement.Announce(message, new_sound = 'sound/misc/notice2.ogg', new_title = "Automated Lighting System Announcement")
/datum/controller/subsystem/nightshift/proc/check_nightshift(check_canfire=FALSE)
if(check_canfire && !can_fire)
return
- var/emergency = security_level >= SEC_LEVEL_RED
+ var/emergency = GLOB.security_level >= SEC_LEVEL_RED
var/announcing = TRUE
var/time = station_time()
var/night_time = (time < nightshift_end_time) || (time > nightshift_start_time)
@@ -41,7 +42,7 @@ SUBSYSTEM_DEF(nightshift)
if(!emergency)
announce("Restoring night lighting configuration to normal operation.")
else
- announce("Disabling night lighting: Station is in a state of emergency.")
+ announce("Disabling night lighting: Station is in a state of emergency.")
if(emergency)
night_time = FALSE
if(nightshift_active != night_time)
diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm
index 5eaca5d19c4..79541c199a4 100644
--- a/code/controllers/subsystem/npcpool.dm
+++ b/code/controllers/subsystem/npcpool.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(npcpool)
flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND
priority = FIRE_PRIORITY_NPC
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Simple animals will no longer process. Shuttle call recommended."
var/list/currentrun = list()
diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm
index c35f1adee65..95b9e925b5d 100644
--- a/code/controllers/subsystem/overlays.dm
+++ b/code/controllers/subsystem/overlays.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(overlays)
wait = 1
priority = FIRE_PRIORITY_OVERLAYS
init_order = INIT_ORDER_OVERLAY
+ offline_implications = "Overlays may look strange. No immediate action is needed."
var/list/queue
var/list/stats
diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm
index 039b6d2b008..9135f62b03f 100644
--- a/code/controllers/subsystem/parallax.dm
+++ b/code/controllers/subsystem/parallax.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(parallax)
flags = SS_POST_FIRE_TIMING | SS_BACKGROUND
priority = FIRE_PRIORITY_PARALLAX
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
+ offline_implications = "Space parallax will no longer move around. No immediate action is needed."
var/list/currentrun
var/planet_x_offset = 128
var/planet_y_offset = 128
diff --git a/code/controllers/subsystem/radio.dm b/code/controllers/subsystem/radio.dm
index 49b30062786..5a49070bf89 100644
--- a/code/controllers/subsystem/radio.dm
+++ b/code/controllers/subsystem/radio.dm
@@ -54,7 +54,7 @@ SUBSYSTEM_DEF(radio)
// If the above switch somehow failed. And it needs the SSradio. part otherwise it fails to compile
if(frequency in DEPT_FREQS)
return "deptradio"
-
+
// If its none of the others
return "radio"
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index da3d91c1de1..247d71d05b8 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(shuttle)
init_order = INIT_ORDER_SHUTTLE
flags = SS_KEEP_TIMING|SS_NO_TICK_CHECK
runlevels = RUNLEVEL_SETUP | RUNLEVEL_GAME
+ offline_implications = "Shuttles will no longer function and cargo will not generate points. Immediate server restart recommended."
var/list/mobile = list()
var/list/stationary = list()
var/list/transit = list()
@@ -223,11 +224,12 @@ SUBSYSTEM_DEF(shuttle)
return 0 //dock successful
-/datum/controller/subsystem/shuttle/proc/moveShuttle(shuttleId, dockId, timed)
+/datum/controller/subsystem/shuttle/proc/moveShuttle(shuttleId, dockId, timed, mob/user)
var/obj/docking_port/mobile/M = getShuttle(shuttleId)
var/obj/docking_port/stationary/D = getDock(dockId)
if(!M)
return 1
+ M.last_caller = user // Save the caller of the shuttle for later logging
if(timed)
if(M.request(D))
return 2
diff --git a/code/controllers/subsystem/spacedrift.dm b/code/controllers/subsystem/spacedrift.dm
index fcc62a2fa50..d9c46f9c9d7 100644
--- a/code/controllers/subsystem/spacedrift.dm
+++ b/code/controllers/subsystem/spacedrift.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(spacedrift)
wait = 5
flags = SS_NO_INIT|SS_KEEP_TIMING
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Mobs will no longer respect a lack of gravity. No immediate action is needed."
var/list/currentrun = list()
var/list/processing = list()
diff --git a/code/controllers/subsystem/statistics.dm b/code/controllers/subsystem/statistics.dm
new file mode 100644
index 00000000000..3a0bf7e51e2
--- /dev/null
+++ b/code/controllers/subsystem/statistics.dm
@@ -0,0 +1,28 @@
+SUBSYSTEM_DEF(statistics)
+ name = "Statistics"
+ wait = 6000 // 10 minute delay between fires
+ runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME // Only count time actually ingame to avoid logging pre-round dips
+ offline_implications = "Player count and admin count statistics will no longer be logged to the database. No immediate action is needed."
+
+
+/datum/controller/subsystem/statistics/Initialize(start_timeofday)
+ if(!config.sql_enabled)
+ flags |= SS_NO_FIRE // Disable firing if SQL is disabled
+ return ..()
+
+/datum/controller/subsystem/statistics/fire(resumed = 0)
+ sql_poll_players()
+
+/datum/controller/subsystem/statistics/proc/sql_poll_players()
+ if(!config.sql_enabled)
+ return
+ var/playercount = GLOB.clients.len
+ var/admincount = GLOB.admins.len
+ if(!GLOB.dbcon.IsConnected())
+ log_game("SQL ERROR during player polling. Failed to connect.")
+ else
+ var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
+ var/DBQuery/query = GLOB.dbcon.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time) VALUES ([playercount], [admincount], '[sqltime]')")
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ log_game("SQL ERROR during playercount polling. Error: \[[err]\]\n")
diff --git a/code/controllers/subsystem/sun.dm b/code/controllers/subsystem/sun.dm
index 6cfb52f2d25..3f8e15df05a 100644
--- a/code/controllers/subsystem/sun.dm
+++ b/code/controllers/subsystem/sun.dm
@@ -1,19 +1,29 @@
SUBSYSTEM_DEF(sun)
name = "Sun"
wait = 600
- flags = SS_NO_TICK_CHECK|SS_NO_INIT
+ flags = SS_NO_TICK_CHECK
+ init_order = INIT_ORDER_SUN
+ offline_implications = "Solar panels will no longer rotate. No immediate action is needed."
var/angle
var/dx
var/dy
var/rate
var/list/solars = list()
-/datum/controller/subsystem/sun/PreInit()
+/datum/controller/subsystem/sun/Initialize(start_timeofday)
+ // Lets work out an angle for the "sun" to rotate around the station
angle = rand (0,360) // the station position to the sun is randomised at round start
rate = rand(50,200)/100 // 50% - 200% of standard rotation
if(prob(50)) // same chance to rotate clockwise than counter-clockwise
rate = -rate
+ // Solar consoles need to load after machines init, so this handles that
+ for(var/obj/machinery/power/solar_control/SC in solars)
+ SC.setup()
+
+ return ..()
+
+
/datum/controller/subsystem/sun/stat_entry(msg)
..("P:[solars.len]")
diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm
new file mode 100644
index 00000000000..c4240021137
--- /dev/null
+++ b/code/controllers/subsystem/tgui.dm
@@ -0,0 +1,286 @@
+ /**
+ * tgui subsystem
+ *
+ * Contains all tgui state and subsystem code.
+ **/
+
+
+SUBSYSTEM_DEF(tgui)
+ name = "TGUI"
+ wait = 9
+ flags = SS_NO_INIT
+ priority = FIRE_PRIORITY_NANOUI // Yes I am aware that this is TGUI and I used the nanoUI fire priority. Dont @ me.
+ runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
+ offline_implications = "All TGUIs will no longer process. Shuttle call recommended."
+
+ var/list/currentrun = list()
+ var/list/open_uis = list() // A list of open UIs, grouped by src_object and ui_key.
+ var/list/processing_uis = list() // A list of processing UIs, ungrouped.
+ var/basehtml // The HTML base used for all UIs.
+
+/datum/controller/subsystem/tgui/PreInit()
+ basehtml = file2text('tgui/packages/tgui/public/tgui.html')
+
+/datum/controller/subsystem/tgui/Shutdown()
+ close_all_uis()
+
+/datum/controller/subsystem/tgui/stat_entry()
+ ..("P:[processing_uis.len]")
+
+/datum/controller/subsystem/tgui/fire(resumed = 0)
+ if (!resumed)
+ src.currentrun = processing_uis.Copy()
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+
+ while(currentrun.len)
+ var/datum/tgui/ui = currentrun[currentrun.len]
+ currentrun.len--
+ if(ui && ui.user && ui.src_object)
+ ui.process()
+ else
+ processing_uis.Remove(ui)
+ if (MC_TICK_CHECK)
+ return
+
+ /**
+ * public
+ *
+ * Get a open UI given a user, src_object, and ui_key and try to update it with data.
+ *
+ * required user mob The mob who opened/is using the UI.
+ * required src_object datum The object/datum which owns the UI.
+ * required ui_key string The ui_key of the UI.
+ * optional ui datum/tgui The UI to be updated, if it exists.
+ * optional force_open bool If the UI should be re-opened instead of updated.
+ *
+ * return datum/tgui The found UI.
+ **/
+/datum/controller/subsystem/tgui/proc/try_update_ui(mob/user, datum/src_object, ui_key, datum/tgui/ui, force_open = FALSE)
+ if(isnull(ui)) // No UI was passed, so look for one.
+ ui = get_open_ui(user, src_object, ui_key)
+
+ if(!isnull(ui))
+ var/data = src_object.tgui_data(user) // Get data from the src_object.
+ if(!force_open) // UI is already open; update it.
+ ui.push_data(data)
+ else // Re-open it anyways.
+ ui.reinitialize(null, data)
+ return ui // We found the UI, return it.
+ else
+ return null // We couldn't find a UI.
+
+ /**
+ * private
+ *
+ * Get a open UI given a user, src_object, and ui_key.
+ *
+ * required user mob The mob who opened/is using the UI.
+ * required src_object datum The object/datum which owns the UI.
+ * required ui_key string The ui_key of the UI.
+ *
+ * return datum/tgui The found UI.
+ **/
+/datum/controller/subsystem/tgui/proc/get_open_ui(mob/user, datum/src_object, ui_key)
+ var/src_object_key = "[src_object.UID()]"
+ if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ return null // No UIs open.
+ else if(isnull(open_uis[src_object_key][ui_key]) || !istype(open_uis[src_object_key][ui_key], /list))
+ return null // No UIs open for this object.
+
+ for(var/datum/tgui/ui in open_uis[src_object_key][ui_key]) // Find UIs for this object.
+ if(ui.user == user) // Make sure we have the right user
+ return ui
+
+ return null // Couldn't find a UI!
+
+ /**
+ * private
+ *
+ * Update all UIs attached to src_object.
+ *
+ * required src_object datum The object/datum which owns the UIs.
+ *
+ * return int The number of UIs updated.
+ **/
+/datum/controller/subsystem/tgui/proc/update_uis(datum/src_object)
+ var/src_object_key = "[src_object.UID()]"
+ if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ return 0 // Couldn't find any UIs for this object.
+
+ var/update_count = 0
+ for(var/ui_key in open_uis[src_object_key])
+ for(var/datum/tgui/ui in open_uis[src_object_key][ui_key])
+ if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid.
+ ui.process(force = 1) // Update the UI.
+ update_count++ // Count each UI we update.
+ return update_count
+
+ /**
+ * private
+ *
+ * Close all UIs attached to src_object.
+ *
+ * required src_object datum The object/datum which owns the UIs.
+ *
+ * return int The number of UIs closed.
+ **/
+/datum/controller/subsystem/tgui/proc/close_uis(datum/src_object)
+ var/src_object_key = "[src_object.UID()]"
+ if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ return 0 // Couldn't find any UIs for this object.
+
+ var/close_count = 0
+ for(var/ui_key in open_uis[src_object_key])
+ for(var/datum/tgui/ui in open_uis[src_object_key][ui_key])
+ if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid.
+ ui.close() // Close the UI.
+ close_count++ // Count each UI we close.
+ return close_count
+
+ /**
+ * private
+ *
+ * Close *ALL* UIs
+ *
+ * return int The number of UIs closed.
+ **/
+/datum/controller/subsystem/tgui/proc/close_all_uis()
+ var/close_count = 0
+ for(var/src_object_key in open_uis)
+ for(var/ui_key in open_uis[src_object_key])
+ for(var/datum/tgui/ui in open_uis[src_object_key][ui_key])
+ if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid.
+ ui.close() // Close the UI.
+ close_count++ // Count each UI we close.
+ return close_count
+
+ /**
+ * private
+ *
+ * Update all UIs belonging to a user.
+ *
+ * required user mob The mob who opened/is using the UI.
+ * optional src_object datum If provided, only update UIs belonging this src_object.
+ * optional ui_key string If provided, only update UIs with this UI key.
+ *
+ * return int The number of UIs updated.
+ **/
+/datum/controller/subsystem/tgui/proc/update_user_uis(mob/user, datum/src_object = null, ui_key = null)
+ if(isnull(user.open_tguis) || !istype(user.open_tguis, /list) || open_uis.len == 0)
+ return 0 // Couldn't find any UIs for this user.
+
+ var/update_count = 0
+ for(var/datum/tgui/ui in user.open_tguis)
+ if((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
+ ui.process(force = 1) // Update the UI.
+ update_count++ // Count each UI we upadte.
+ return update_count
+
+ /**
+ * private
+ *
+ * Close all UIs belonging to a user.
+ *
+ * required user mob The mob who opened/is using the UI.
+ * optional src_object datum If provided, only close UIs belonging this src_object.
+ * optional ui_key string If provided, only close UIs with this UI key.
+ *
+ * return int The number of UIs closed.
+ **/
+/datum/controller/subsystem/tgui/proc/close_user_uis(mob/user, datum/src_object = null, ui_key = null)
+ if(isnull(user.open_tguis) || !istype(user.open_tguis, /list) || open_uis.len == 0)
+ return 0 // Couldn't find any UIs for this user.
+
+ var/close_count = 0
+ for(var/datum/tgui/ui in user.open_tguis)
+ if((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
+ ui.close() // Close the UI.
+ close_count++ // Count each UI we close.
+ return close_count
+
+ /**
+ * private
+ *
+ * Add a UI to the list of open UIs.
+ *
+ * required ui datum/tgui The UI to be added.
+ **/
+/datum/controller/subsystem/tgui/proc/on_open(datum/tgui/ui)
+ var/src_object_key = "[ui.src_object.UID()]"
+ if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ open_uis[src_object_key] = list(ui.ui_key = list()) // Make a list for the ui_key and src_object.
+ else if(isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
+ open_uis[src_object_key][ui.ui_key] = list() // Make a list for the ui_key.
+
+ // Append the UI to all the lists.
+ ui.user.open_tguis |= ui
+ var/list/uis = open_uis[src_object_key][ui.ui_key]
+ uis |= ui
+ processing_uis |= ui
+
+ /**
+ * private
+ *
+ * Remove a UI from the list of open UIs.
+ *
+ * required ui datum/tgui The UI to be removed.
+ *
+ * return bool If the UI was removed or not.
+ **/
+/datum/controller/subsystem/tgui/proc/on_close(datum/tgui/ui)
+ var/src_object_key = "[ui.src_object.UID()]"
+ if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ return FALSE // It wasn't open.
+ else if(isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
+ return FALSE // It wasn't open.
+
+ processing_uis.Remove(ui) // Remove it from the list of processing UIs.
+ if(ui.user) // If the user exists, remove it from them too.
+ ui.user.open_tguis.Remove(ui)
+ var/Ukey = ui.ui_key
+ var/list/uis = open_uis[src_object_key][Ukey] // Remove it from the list of open UIs.
+ uis.Remove(ui)
+ if(!uis.len)
+ var/list/uiobj = open_uis[src_object_key]
+ uiobj.Remove(Ukey)
+ if(!uiobj.len)
+ open_uis.Remove(src_object_key)
+
+ return TRUE // Let the caller know we did it.
+
+ /**
+ * private
+ *
+ * Handle client logout, by closing all their UIs.
+ *
+ * required user mob The mob which logged out.
+ *
+ * return int The number of UIs closed.
+ **/
+/datum/controller/subsystem/tgui/proc/on_logout(mob/user)
+ return close_user_uis(user)
+
+ /**
+ * private
+ *
+ * Handle clients switching mobs, by transferring their UIs.
+ *
+ * required user source The client's original mob.
+ * required user target The client's new mob.
+ *
+ * return bool If the UIs were transferred.
+ **/
+/datum/controller/subsystem/tgui/proc/on_transfer(mob/source, mob/target)
+ if(!source || isnull(source.open_tguis) || !istype(source.open_tguis, /list) || open_uis.len == 0)
+ return FALSE // The old mob had no open UIs.
+
+ if(isnull(target.open_tguis) || !istype(target.open_tguis, /list))
+ target.open_tguis = list() // Create a list for the new mob if needed.
+
+ for(var/datum/tgui/ui in source.open_tguis)
+ ui.user = target // Inform the UIs of their new owner.
+ target.open_tguis.Add(ui) // Transfer all the UIs.
+
+ source.open_tguis.Cut() // Clear the old list.
+ return TRUE // Let the caller know we did it.
diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm
index 74dbf4c4d93..04ddf40f442 100644
--- a/code/controllers/subsystem/throwing.dm
+++ b/code/controllers/subsystem/throwing.dm
@@ -7,6 +7,7 @@ SUBSYSTEM_DEF(throwing)
wait = 1
flags = SS_NO_INIT|SS_KEEP_TIMING|SS_TICKER
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Thrown objects may not react properly. Shuttle call recommended."
var/list/currentrun
var/list/processing = list()
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 6366eba7613..5d0a53c221e 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(ticker)
priority = FIRE_PRIORITY_TICKER
flags = SS_KEEP_TIMING
runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME
+ offline_implications = "The game is no longer aware of when the round ends. Immediate server restart recommended."
var/round_start_time = 0
var/const/restart_timeout = 600
@@ -23,17 +24,15 @@ SUBSYSTEM_DEF(ticker)
var/Bible_deity_name
var/datum/cult_info/cultdat = null //here instead of cult for adminbus purposes
var/random_players = 0 // if set to nonzero, ALL players who latejoin or declare-ready join will have random appearances/genders
- var/list/syndicate_coalition = list() // list of traitor-compatible factions
- var/list/factions = list() // list of all factions
- var/list/availablefactions = list() // list of factions with openings
var/tipped = FALSE //Did we broadcast the tip of the day yet?
var/selected_tip // What will be the tip of the day?
var/pregame_timeleft // This is used for calculations
var/delay_end = 0 //if set to nonzero, the round will not restart on it's own
var/triai = 0//Global holder for Triumvirate
- var/initialtpass = 0 //holder for inital autotransfer vote timer
+ var/next_autotransfer = 0 //holder for inital autotransfer vote timer
var/obj/screen/cinematic = null //used for station explosion cinematic
- var/round_end_announced = 0 // Spam Prevention. Announce round end only once.\
+ var/round_end_announced = 0 // Spam Prevention. Announce round end only once.
+ var/ticker_going = TRUE // This used to be in the unused globals, but it turns out its actually used in a load of places. Its now a ticker var because its related to round stuff, -aa
/datum/controller/subsystem/ticker/Initialize()
login_music = pick(\
@@ -42,10 +41,9 @@ SUBSYSTEM_DEF(ticker)
'sound/music/title1.ogg',\
'sound/music/title2.ogg',\
'sound/music/title3.ogg',)
-
// Map name
- if(using_map && using_map.name)
- GLOB.map_name = "[using_map.name]"
+ if(GLOB.using_map && GLOB.using_map.name)
+ GLOB.map_name = "[GLOB.using_map.name]"
else
GLOB.map_name = "Unknown"
@@ -68,12 +66,12 @@ SUBSYSTEM_DEF(ticker)
current_state = GAME_STATE_PREGAME
fire() // TG says this is a good idea
if(GAME_STATE_PREGAME)
- if(!going)
+ if(!SSticker.ticker_going) // This has to be referenced like this, and I dont know why. If you dont put SSticker. it will break
return
// This is so we dont have sleeps in controllers, because that is a bad, bad thing
if(!delay_end)
- pregame_timeleft = max(0,round_start_time - world.time) // Normal lobby countdown when roundstart was not delayed
+ pregame_timeleft = max(0,round_start_time - world.time) // Normal lobby countdown when roundstart was not delayed
else
pregame_timeleft = max(0,pregame_timeleft - 20) // If roundstart was delayed, we should resume the countdown where it left off
@@ -92,12 +90,17 @@ SUBSYSTEM_DEF(ticker)
delay_end = 0 // reset this in case round start was delayed
mode.process()
mode.process_job_tasks()
+
+ if(world.time > next_autotransfer)
+ SSvote.autotransfer()
+ next_autotransfer = world.time + config.vote_autotransfer_interval
+
var/game_finished = SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked
if(config.continuous_rounds)
mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result
else
game_finished |= mode.check_finished()
- if(game_finished)
+ if(game_finished || force_ending)
current_state = GAME_STATE_FINISHED
if(GAME_STATE_FINISHED)
current_state = GAME_STATE_FINISHED
@@ -113,36 +116,23 @@ SUBSYSTEM_DEF(ticker)
else
world.Reboot("Round ended.", "end_proper", "proper completion")
-
-/datum/controller/subsystem/ticker/proc/votetimer()
- var/timerbuffer = 0
- if(initialtpass == 0)
- timerbuffer = config.vote_autotransfer_initial
- else
- timerbuffer = config.vote_autotransfer_interval
- spawn(timerbuffer)
- SSvote.autotransfer()
- initialtpass = 1
- votetimer()
-
-
/datum/controller/subsystem/ticker/proc/setup()
cultdat = setupcult()
//Create and announce mode
- if(master_mode=="secret")
+ if(GLOB.master_mode=="secret")
src.hide_mode = 1
var/list/datum/game_mode/runnable_modes
- if((master_mode=="random") || (master_mode=="secret"))
+ if((GLOB.master_mode=="random") || (GLOB.master_mode=="secret"))
runnable_modes = config.get_runnable_modes()
if(runnable_modes.len==0)
current_state = GAME_STATE_PREGAME
Master.SetRunLevel(RUNLEVEL_LOBBY)
to_chat(world, "Unable to choose playable game mode. Reverting to pre-game lobby.")
return 0
- if(secret_force_mode != "secret")
- var/datum/game_mode/M = config.pick_mode(secret_force_mode)
+ if(GLOB.secret_force_mode != "secret")
+ var/datum/game_mode/M = config.pick_mode(GLOB.secret_force_mode)
if(M.can_start())
- src.mode = config.pick_mode(secret_force_mode)
+ src.mode = config.pick_mode(GLOB.secret_force_mode)
SSjobs.ResetOccupations()
if(!src.mode)
src.mode = pickweight(runnable_modes)
@@ -150,7 +140,7 @@ SUBSYSTEM_DEF(ticker)
var/mtype = src.mode.type
src.mode = new mtype
else
- src.mode = config.pick_mode(master_mode)
+ src.mode = config.pick_mode(GLOB.master_mode)
if(!src.mode.can_start())
to_chat(world, "Unable to start [mode.name]. Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby.")
mode = null
@@ -167,7 +157,7 @@ SUBSYSTEM_DEF(ticker)
if(!can_continue)
qdel(mode)
current_state = GAME_STATE_PREGAME
- to_chat(world, "Error setting up [master_mode]. Reverting to pre-game lobby.")
+ to_chat(world, "Error setting up [GLOB.master_mode]. Reverting to pre-game lobby.")
SSjobs.ResetOccupations()
Master.SetRunLevel(RUNLEVEL_LOBBY)
return 0
@@ -186,15 +176,21 @@ SUBSYSTEM_DEF(ticker)
populate_spawn_points()
collect_minds()
equip_characters()
- data_core.manifest()
+ GLOB.data_core.manifest()
current_state = GAME_STATE_PLAYING
Master.SetRunLevel(RUNLEVEL_GAME)
- callHook("roundstart")
+ // Generate the list of playable AI cores in the world
+ for(var/obj/effect/landmark/start/S in GLOB.landmarks_list)
+ if(S.name != "AI")
+ continue
+ if(locate(/mob/living) in S.loc)
+ continue
+ GLOB.empty_playable_ai_cores += new /obj/structure/AIcore/deactivated(get_turf(S))
+
//here to initialize the random events nicely at round start
setup_economy()
- setupfactions()
//shuttle_controller.setup_shuttle_docks()
@@ -284,17 +280,28 @@ SUBSYSTEM_DEF(ticker)
auto_toggle_ooc(0) // Turn it off
round_start_time = world.time
- if(config.sql_enabled)
- spawn(3000)
- statistic_cycle() // Polls population totals regularly and stores them in an SQL DB
-
- votetimer()
+ // Sets the auto shuttle vote to happen after the config duration
+ next_autotransfer = world.time + config.vote_autotransfer_initial
for(var/mob/new_player/N in GLOB.mob_list)
if(N.client)
N.new_player_panel_proc()
- return 1
+ // Now that every other piece of the round has initialized, lets setup player job scaling
+ var/playercount = length(GLOB.clients)
+ var/highpop_trigger = 80
+
+ if(playercount >= highpop_trigger)
+ log_debug("Playercount: [playercount] versus trigger: [highpop_trigger] - loading highpop job config")
+ SSjobs.LoadJobs("config/jobs_highpop.txt")
+ else
+ log_debug("Playercount: [playercount] versus trigger: [highpop_trigger] - keeping standard job config")
+
+ #ifdef UNIT_TESTS
+ RunUnitTests()
+ #endif
+ return TRUE
+
/datum/controller/subsystem/ticker/proc/station_explosion_cinematic(station_missed = 0, override = null)
if(cinematic)
@@ -309,15 +316,12 @@ SUBSYSTEM_DEF(ticker)
cinematic.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
cinematic.screen_loc = "1,0"
- var/obj/structure/bed/temp_buckle = new(src)
if(station_missed)
for(var/mob/M in GLOB.mob_list)
- M.buckled = temp_buckle //buckles the mob so it can't do anything
if(M.client)
M.client.screen += cinematic //show every client the cinematic
else //nuke kills everyone on z-level 1 to prevent "hurr-durr I survived"
for(var/mob/M in GLOB.mob_list)
- M.buckled = temp_buckle
if(M.stat != DEAD)
var/turf/T = get_turf(M)
if(T && is_station_level(T.z) && !istype(M.loc, /obj/structure/closet/secure_closet/freezer))
@@ -387,8 +391,6 @@ SUBSYSTEM_DEF(ticker)
//Otherwise if its a verb it will continue on afterwards.
spawn(300)
QDEL_NULL(cinematic) //end the cinematic
- if(temp_buckle)
- qdel(temp_buckle) //release everybody
@@ -424,7 +426,7 @@ SUBSYSTEM_DEF(ticker)
EquipCustomItems(player)
if(captainless)
for(var/mob/M in GLOB.player_list)
- if(!istype(M,/mob/new_player))
+ if(!isnewplayer(M))
to_chat(M, "Captainship not forced on anyone.")
/datum/controller/subsystem/ticker/proc/send_tip_of_the_round()
@@ -442,18 +444,12 @@ SUBSYSTEM_DEF(ticker)
if(m)
to_chat(world, "Tip of the round: [html_encode(m)]")
-/datum/controller/subsystem/ticker/proc/getfactionbyname(var/name)
- for(var/datum/faction/F in factions)
- if(F.name == name)
- return F
-
-
/datum/controller/subsystem/ticker/proc/declare_completion()
- nologevent = 1 //end of round murder and shenanigans are legal; there's no need to jam up attack logs past this point.
+ GLOB.nologevent = 1 //end of round murder and shenanigans are legal; there's no need to jam up attack logs past this point.
//Round statistics report
var/datum/station_state/end_state = new /datum/station_state()
end_state.count()
- var/station_integrity = min(round( 100.0 * start_state.score(end_state), 0.1), 100.0)
+ var/station_integrity = min(round( 100.0 * GLOB.start_state.score(end_state), 0.1), 100.0)
to_chat(world, " [TAB]Shift Duration: [round(ROUND_TIME / 36000)]:[add_zero("[ROUND_TIME / 600 % 60]", 2)]:[ROUND_TIME / 100 % 6][ROUND_TIME / 100 % 10]")
to_chat(world, " [TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]")
@@ -518,8 +514,13 @@ SUBSYSTEM_DEF(ticker)
//Ask the event manager to print round end information
SSevents.RoundEnd()
+ //make big obvious note in game logs that round ended
+ log_game("///////////////////////////////////////////////////////")
+ log_game("///////////////////// ROUND ENDED /////////////////////")
+ log_game("///////////////////////////////////////////////////////")
+
// Add AntagHUD to everyone, see who was really evil the whole time!
- for(var/datum/atom_hud/antag/H in huds)
+ for(var/datum/atom_hud/antag/H in GLOB.huds)
for(var/m in GLOB.player_list)
var/mob/M = m
H.add_hud_to(M)
diff --git a/code/controllers/subsystem/tickets/mentor_tickets.dm b/code/controllers/subsystem/tickets/mentor_tickets.dm
index d8bae77840c..76c7ed2dc28 100644
--- a/code/controllers/subsystem/tickets/mentor_tickets.dm
+++ b/code/controllers/subsystem/tickets/mentor_tickets.dm
@@ -1,8 +1,8 @@
GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets)
/datum/controller/subsystem/tickets/mentor_tickets/New()
- NEW_SS_GLOBAL(SSmentor_tickets);
- PreInit();
+ NEW_SS_GLOBAL(SSmentor_tickets)
+ PreInit()
/datum/controller/subsystem/tickets/mentor_tickets
name = "Mentor Tickets"
@@ -15,7 +15,7 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets
message_mentorTicket(msg)
/datum/controller/subsystem/tickets/mentor_tickets/Initialize()
- close_messages = list("- [ticket_name] Closed -",
- "Please try to be as descriptive as possible in mentor helps. Mentors do not know the full situation you're in and need more information to give you a helpful response.",
+ close_messages = list("- [ticket_name] Closed -",
+ "Please try to be as descriptive as possible in mentor helps. Mentors do not know the full situation you're in and need more information to give you a helpful response.",
"Your [ticket_name] has now been closed.")
return ..()
diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm
index 058569250ec..3aa0a8846c3 100644
--- a/code/controllers/subsystem/tickets/tickets.dm
+++ b/code/controllers/subsystem/tickets/tickets.dm
@@ -20,16 +20,16 @@ SUBSYSTEM_DEF(tickets)
init_order = INIT_ORDER_TICKETS
wait = 300
priority = FIRE_PRIORITY_TICKETS
-
+
flags = SS_BACKGROUND
-
+
var/list/allTickets = list() //make it here because someone might ahelp before the system has initialized
var/ticketCounter = 1
/datum/controller/subsystem/tickets/Initialize()
close_messages = list("- [ticket_name] Rejected! -",
- "Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.",
+ "Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.",
"Your [ticket_name] has now been closed.")
return ..()
@@ -112,7 +112,7 @@ SUBSYSTEM_DEF(tickets)
message_staff("[usr.client] / ([usr]) resolved [ticket_name] number [N]")
to_chat_safe(returnClient(N), "Your [ticket_name] has now been resolved.")
return TRUE
-
+
/datum/controller/subsystem/tickets/proc/autoRespond(N)
if(!check_rights(R_ADMIN|R_MOD))
@@ -124,19 +124,19 @@ SUBSYSTEM_DEF(tickets)
if(alert(usr, "[T.ticketState == TICKET_OPEN ? "Another admin appears to already be handling this." : "This ticket is already marked as closed or resolved"] Are you sure you want to continue?", "Confirmation", "Yes", "No") != "Yes")
return
T.assignStaff(C)
-
- var/response_phrases = list("Thanks" = "Thanks, have a Paradise day!",
+
+ var/response_phrases = list("Thanks" = "Thanks, have a Paradise day!",
"Handling It" = "The issue is being looked into, thanks.",
"Already Resolved" = "The problem has been resolved already.",
"Mentorhelp" = "Please redirect your question to Mentorhelp, as they are better experienced with these types of questions.",
"Happens Again" = "Thanks, let us know if it continues to happen.",
- "Clear Cache" = "To fix a blank screen, please leave the game and clear your Byond Cache. To clear your Byond Cache, there is a Settings icon in the top right of the launcher. After you click that, go into the Games tab and hit the Clear Cache button. If the issue persists a few minutes after rejoining and doing this, please adminhelp again and state you cleared your cache." ,
+ "Clear Cache" = "To fix a blank screen, go to the 'Special Verbs' tab and press 'Reload UI Resources'. If that fails, clear your BYOND cache (instructions provided with 'Reload UI Resources'). If that still fails, please adminhelp again, stating you have already done the following." ,
"IC Issue" = "This is an In Character (IC) issue and will not be handled by admins. You could speak to Security, Internal Affairs, a Departmental Head, Nanotrasen Representetive, or any other relevant authority currently on station.",
"Reject" = "Reject",
"Man Up" = "Man Up",
"Appeal on the Forums" = "Appealing a ban must occur on the forums. Privately messaging, or adminhelping about your ban will not resolve it. To appeal your ban, please head to [config.banappeals]"
)
-
+
var/sorted_responses = list()
for(var/key in response_phrases) //build a new list based on the short descriptive keys of the master list so we can send this as the input instead of the full paragraphs to the admin choosing which autoresponse
sorted_responses += key
@@ -351,7 +351,7 @@ UI STUFF
dat += "
"
+ for(var/i in log_records)
+ var/datum/log_record/L = i
+ var/time = gameTimestamp(wtime = L.raw_time - 9.99) // The time rounds up for some reason. Will result in weird filtering results
+
+ dat +="
[time]
[L.log_type]
\
+
[L.who]
[L.what]
\
+
[L.target]
[ADMIN_COORDJMP(L.where)]
"
+
+ dat += "
"
+ dat += "
"
+
+ var/datum/browser/popup = new(user, "Log viewer", "Log viewer", 1400, 600)
+ popup.set_content(dat)
+ popup.open()
+
+/datum/log_viewer/Topic(href, href_list)
+ if(href_list["start_time"])
+ var/input = input(usr, "hh:mm:ss", "Start time", "00:00:00") as text|null
+ if(!input)
+ return
+ var/res = timeStampToNum(input)
+ if(res < 0)
+ to_chat(usr, "'[input]' is an invalid input value.")
+ return
+ time_from = res
+ show_ui(usr)
+ return
+ if(href_list["end_time"])
+ var/input = input(usr, "hh:mm:ss", "End time", "04:00:00") as text|null
+ if(!input)
+ return
+ var/res = timeStampToNum(input)
+ if(res < 0)
+ to_chat(usr, "'[input]' is an invalid input value.")
+ return
+ time_to = res
+
+ show_ui(usr)
+ return
+ if(href_list["search"])
+ search(usr)
+ show_ui(usr)
+ return
+ if(href_list["clear_all"])
+ clear_all(usr)
+ show_ui(usr)
+ return
+ if(href_list["clear_mobs"])
+ selected_mobs.Cut()
+ show_ui(usr)
+ return
+ if(href_list["add_mob"])
+ var/list/mobs = getpois(TRUE, TRUE)
+ var/datum/async_input/A = input_autocomplete_async(usr, "Please, select a mob: ", mobs)
+ A.on_close(CALLBACK(src, .proc/add_mob, usr))
+ return
+ if(href_list["remove_mob"])
+ var/mob/M = locate(href_list["remove_mob"])
+ if(M)
+ selected_mobs -= M
+ show_ui(usr)
+ return
+ if(href_list["toggle_log_type"])
+ var/log_type = href_list["toggle_log_type"]
+ if(log_type in selected_log_types)
+ selected_log_types -= log_type
+ else
+ selected_log_types += log_type
+ show_ui(usr)
+ return
+
+/datum/log_viewer/proc/get_logtype_color(log_type)
+ switch(log_type)
+ if(ATTACK_LOG)
+ return "darkred"
+ if(DEFENSE_LOG)
+ return "chocolate"
+ if(CONVERSION_LOG)
+ return "indigo"
+ if(SAY_LOG)
+ return "teal"
+ if(EMOTE_LOG)
+ return "deepskyblue"
+ if(MISC_LOG)
+ return "gray"
+ return "slategray"
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index db2420a1bf8..2f22e58d37b 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -39,7 +39,6 @@
var/role_alt_title
var/datum/job/assigned_job
- var/list/kills = list()
var/list/datum/objective/objectives = list()
var/list/datum/objective/special_verbs = list()
var/list/targets = list()
@@ -48,30 +47,23 @@
var/miming = 0 // Mime's vow of silence
var/list/antag_datums
- var/speech_span // What span any body this mind has talks in.
- var/datum/faction/faction //associated faction
var/datum/changeling/changeling //changeling holder
var/linglink
var/datum/vampire/vampire //vampire holder
var/datum/abductor/abductor //abductor holder
- var/datum/devilinfo/devilinfo //devil holder
var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state
var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD
var/datum/mindslaves/som //stands for slave or master...hush..
var/datum/devilinfo/devilinfo //Information about the devil, if any.
- var/damnation_type = 0
- var/datum/mind/soulOwner //who owns the soul. Under normal circumstances, this will point to src
+ var/damnation_type = 0
+ var/datum/mind/soulOwner //who owns the soul. Under normal circumstances, this will point to src
var/hasSoul = TRUE
- var/rev_cooldown = 0
-
var/isholy = FALSE // is this person a chaplain or admin role allowed to use bibles
var/isblessed = FALSE // is this person blessed by a chaplain?
var/num_blessed = 0 // for prayers
- // the world.time since the mob has been brigged, or -1 if not at all
- var/brigged_since = -1
var/suicided = FALSE
//put this here for easier tracking ingame
@@ -94,6 +86,9 @@
if(antag_datum.delete_on_mind_deletion)
qdel(i)
antag_datums = null
+ current = null
+ original = null
+ soulOwner = null
return ..()
/datum/mind/proc/transfer_to(mob/living/new_character)
@@ -105,6 +100,14 @@
current.mind = null
leave_all_huds() //leave all the huds in the old body, so it won't get huds if somebody else enters it
+ for(var/log_type in current.logs) // Copy the old logs
+ var/list/logs = current.logs[log_type]
+ if(new_character.logs[log_type])
+ new_character.logs[log_type] += logs.Copy() // Append the old ones
+ new_character.logs[log_type] = sortTim(new_character.logs[log_type], /proc/compare_log_record) // Sort them on time
+ else
+ new_character.logs[log_type] = logs.Copy() // Just copy them
+
SSnanoui.user_transferred(current, new_character)
if(new_character.mind) //remove any mind currently in our new body's mind variable
@@ -539,13 +542,22 @@
var/mob/def_target = null
var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain)
if(objective&&(objective.type in objective_list) && objective:target)
- def_target = objective:target.current
+ def_target = objective.target.current
possible_targets = sortAtom(possible_targets)
- possible_targets += "Free objective"
- var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
- if(!new_target)
- return
+ var/new_target
+ if(length(possible_targets) > 0)
+ if(alert(usr, "Do you want to pick the objective yourself? No will randomise it", "Pick objective", "Yes", "No") == "Yes")
+ possible_targets += "Free objective"
+ new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
+ else
+ new_target = pick(possible_targets)
+
+ if(!new_target)
+ return
+ else
+ to_chat(usr, "No possible target found. Defaulting to a Free objective.")
+ new_target = "Free objective"
var/objective_path = text2path("/datum/objective/[new_obj_type]")
if(new_target == "Free objective")
@@ -845,11 +857,11 @@
to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve [SSticker.cultdat.entity_title2] above all else. Bring It back.")
log_admin("[key_name(usr)] has culted [key_name(current)]")
message_admins("[key_name_admin(usr)] has culted [key_name_admin(current)]")
- if(!summon_spots.len)
- while(summon_spots.len < SUMMON_POSSIBILITIES)
- var/area/summon = pick(return_sorted_areas() - summon_spots)
+ if(!GLOB.summon_spots.len)
+ while(GLOB.summon_spots.len < SUMMON_POSSIBILITIES)
+ var/area/summon = pick(return_sorted_areas() - GLOB.summon_spots)
if(summon && is_station_level(summon.z) && summon.valid_territory)
- summon_spots += summon
+ GLOB.summon_spots += summon
if("tome")
var/mob/living/carbon/human/H = current
if(istype(H))
@@ -902,7 +914,7 @@
log_admin("[key_name(usr)] has wizarded [key_name(current)]")
message_admins("[key_name_admin(usr)] has wizarded [key_name_admin(current)]")
if("lair")
- current.forceMove(pick(wizardstart))
+ current.forceMove(pick(GLOB.wizardstart))
log_admin("[key_name(usr)] has moved [key_name(current)] to the wizard's lair")
message_admins("[key_name_admin(usr)] has moved [key_name_admin(current)] to the wizard's lair")
if("dressup")
@@ -1165,7 +1177,7 @@
remove_antag_datum(/datum/antagonist/traitor)
log_admin("[key_name(usr)] has de-traitored [key_name(current)]")
message_admins("[key_name_admin(usr)] has de-traitored [key_name_admin(current)]")
-
+
if("traitor")
if(!(has_antag_datum(/datum/antagonist/traitor)))
var/datum/antagonist/traitor/T = new()
@@ -1487,11 +1499,11 @@
special_role = SPECIAL_ROLE_WIZARD
assigned_role = SPECIAL_ROLE_WIZARD
//ticker.mode.learn_basic_spells(current)
- if(!wizardstart.len)
- current.loc = pick(latejoin)
+ if(!GLOB.wizardstart.len)
+ current.loc = pick(GLOB.latejoin)
to_chat(current, "HOT INSERTION, GO GO GO")
else
- current.loc = pick(wizardstart)
+ current.loc = pick(GLOB.wizardstart)
SSticker.mode.equip_wizard(current)
for(var/obj/item/spellbook/S in current.contents)
@@ -1578,25 +1590,6 @@
L = agent_landmarks[team]
H.forceMove(L.loc)
-
-// check whether this mind's mob has been brigged for the given duration
-// have to call this periodically for the duration to work properly
-/datum/mind/proc/is_brigged(duration)
- var/turf/T = current.loc
- if(!istype(T))
- brigged_since = -1
- return 0
-
- var/is_currently_brigged = current.is_in_brig()
- if(!is_currently_brigged)
- brigged_since = -1
- return 0
-
- if(brigged_since == -1)
- brigged_since = world.time
-
- return (duration <= world.time - brigged_since)
-
/datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S)
spell_list += S
S.action.Grant(current)
@@ -1659,7 +1652,7 @@
SSticker.mode.implanter[missionary.mind] = implanters
SSticker.mode.traitors += src
-
+
var/datum/objective/protect/zealot_objective = new
zealot_objective.target = missionary.mind
zealot_objective.owner = src
@@ -1684,7 +1677,7 @@
if(H.w_uniform)
jumpsuit = H.w_uniform
jumpsuit.color = team_color
- H.update_inv_w_uniform(0,0)
+ H.update_inv_w_uniform()
add_attack_logs(missionary, current, "Converted to a zealot for [convert_duration/600] minutes")
addtimer(CALLBACK(src, .proc/remove_zealot, jumpsuit), convert_duration) //deconverts after the timer expires
@@ -1701,7 +1694,7 @@
jumpsuit.color = initial(jumpsuit.color) //reset the jumpsuit no matter where our mind is
if(ishuman(current)) //but only try updating us if we are still a human type since it is a human proc
var/mob/living/carbon/human/H = current
- H.update_inv_w_uniform(0,0)
+ H.update_inv_w_uniform()
to_chat(current, "You seem to have forgotten the events of the past 10 minutes or so, and your head aches a bit as if someone beat it savagely with a stick.")
to_chat(current, "This means you don't remember who you were working for or what you were doing.")
diff --git a/code/datums/mixed.dm b/code/datums/mixed.dm
index 05fb0a99649..a5ff38a26b0 100644
--- a/code/datums/mixed.dm
+++ b/code/datums/mixed.dm
@@ -22,14 +22,14 @@
var/list/fields = list( )
/datum/data/record/Destroy()
- if(src in data_core.medical)
- data_core.medical -= src
- if(src in data_core.security)
- data_core.security -= src
- if(src in data_core.general)
- data_core.general -= src
- if(src in data_core.locked)
- data_core.locked -= src
+ if(src in GLOB.data_core.medical)
+ GLOB.data_core.medical -= src
+ if(src in GLOB.data_core.security)
+ GLOB.data_core.security -= src
+ if(src in GLOB.data_core.general)
+ GLOB.data_core.general -= src
+ if(src in GLOB.data_core.locked)
+ GLOB.data_core.locked -= src
return ..()
/datum/data/text
diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm
index 0887290a6f4..4d870e1296c 100644
--- a/code/datums/mutable_appearance.dm
+++ b/code/datums/mutable_appearance.dm
@@ -22,5 +22,4 @@
/mutable_appearance/clean/New()
. = ..()
alpha = 255
- opacity = 1
transform = null
diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm
index db5cca6e9ec..416c4f9c02d 100644
--- a/code/datums/outfits/outfit.dm
+++ b/code/datums/outfits/outfit.dm
@@ -1,5 +1,5 @@
/datum/outfit
- var/name = "Naked"
+ var/name = "SOMEBODY FORGOT TO SET A NAME, NOTIFY A CODER"
var/collect_not_del = FALSE
var/uniform = null
@@ -33,6 +33,9 @@
var/can_be_admin_equipped = TRUE // Set to FALSE if your outfit requires runtime parameters
+/datum/outfit/naked
+ name = "Naked"
+
/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
//to be overriden for customization depending on client prefs,species etc
return
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index d2c19f61bfa..14bc959fbb1 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -541,7 +541,7 @@
P.attack_self(H) // activate them, display musical notes effect
/datum/outfit/admin/soviet
-
+ name = "Soviet Generic"
gloves = /obj/item/clothing/gloves/combat
uniform = /obj/item/clothing/under/soviet
back = /obj/item/storage/backpack/satchel
@@ -709,7 +709,8 @@
pda = /obj/item/pda
backpack_contents = list(
/obj/item/storage/box/survival = 1,
- /obj/item/hand_labeler = 1
+ /obj/item/hand_labeler = 1,
+ /obj/item/hand_labeler_refill = 1
)
/datum/outfit/admin/sol_trader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
@@ -771,6 +772,7 @@
apply_to_card(I, H, get_all_accesses(), "Space Explorer")
/datum/outfit/admin/hardsuit
+ name = "Hardsuit Generic"
back = /obj/item/tank/jetpack/oxygen
mask = /obj/item/clothing/mask/breath
shoes = /obj/item/clothing/shoes/magboots
@@ -823,6 +825,7 @@
/datum/outfit/admin/tournament
+ name = "Tournament Generic"
suit = /obj/item/clothing/suit/armor/vest
shoes = /obj/item/clothing/shoes/black
head = /obj/item/clothing/head/helmet/thunderdome
@@ -1048,8 +1051,8 @@
to_chat(H, "You have gained the ability to shapeshift into lesser hellhound form. This is a combat form with different abilities, tough but not invincible. It can regenerate itself over time by resting.")
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/raise_vampires)
to_chat(H, "You have gained the ability to Raise Vampires. This extremely powerful AOE ability affects all humans near you. Vampires/thralls are healed. Corpses are raised as vampires. Others are stunned, then brain damaged, then killed.")
- H.dna.SetSEState(JUMPBLOCK, 1)
- genemutcheck(H, JUMPBLOCK, null, MUTCHK_FORCED)
+ H.dna.SetSEState(GLOB.jumpblock, 1)
+ genemutcheck(H, GLOB.jumpblock, null, MUTCHK_FORCED)
H.update_mutations()
H.gene_stability = 100
@@ -1100,7 +1103,7 @@
l_hand = null
backpack_contents = list(
/obj/item/storage/box/engineer = 1,
- /obj/item/clothing/suit/space/hardsuit/shielded/wizard = 1,
+ /obj/item/clothing/suit/space/hardsuit/shielded/wizard/arch = 1,
/obj/item/clothing/shoes/magboots = 1,
/obj/item/kitchen/knife/ritual = 1,
/obj/item/clothing/suit/wizrobe/red = 1,
diff --git a/code/datums/outfits/plasmamen.dm b/code/datums/outfits/plasmamen.dm
index 376bf2af90c..94206c0ae3a 100644
--- a/code/datums/outfits/plasmamen.dm
+++ b/code/datums/outfits/plasmamen.dm
@@ -176,3 +176,9 @@
head = /obj/item/clothing/head/helmet/space/plasmaman/blueshield
uniform = /obj/item/clothing/under/plasmaman/blueshield
+
+/datum/outfit/plasmaman/wizard
+ name = "Wizard Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/wizard
+ uniform = /obj/item/clothing/under/plasmaman/wizard
diff --git a/code/datums/periodic_news.dm b/code/datums/periodic_news.dm
index 9a09ec4a7ec..d0d1f01ebf3 100644
--- a/code/datums/periodic_news.dm
+++ b/code/datums/periodic_news.dm
@@ -2,136 +2,125 @@
// Uses BYOND's type system to put everything into a nice format
/datum/news_announcement
- var
- round_time // time of the round at which this should be announced, in seconds
- message // body of the message
- author = "Nanotrasen Editor"
- channel_name = "Nyx Daily"
- can_be_redacted = 0
- message_type = "Story"
- revolution_inciting_event
+ var/round_time // time of the round at which this should be announced, in seconds
+ var/message // body of the message
+ var/author = "Nanotrasen Editor"
+ var/channel_name = "Nyx Daily"
+ var/can_be_redacted = FALSE
+ var/message_type = "Story"
- paycuts_suspicion
- round_time = 60*10
- message = {"Reports have leaked that Nanotrasen Inc. is planning to put paycuts into
- effect on many of its Research Stations in Tau Ceti. Apparently these research
- stations haven't been able to yield the expected revenue, and thus adjustments
- have to be made."}
- author = "Unauthorized"
+/datum/news_announcement/revolution_inciting_event/paycuts_suspicion
+ round_time = 60*10
+ message = {"Reports have leaked that Nanotrasen Inc. is planning to put paycuts into
+ effect on many of its Research Stations in Tau Ceti. Apparently these research
+ stations haven't been able to yield the expected revenue, and thus adjustments
+ have to be made."}
+ author = "Unauthorized"
- paycuts_confirmation
- round_time = 60*40
- message = {"Earlier rumours about paycuts on Research Stations in the Tau Ceti system have
- been confirmed. Shockingly, however, the cuts will only affect lower tier
- personnel. Heads of Staff will, according to our sources, not be affected."}
- author = "Unauthorized"
+/datum/news_announcement/revolution_inciting_event/paycuts_confirmation
+ round_time = 60*40
+ message = {"Earlier rumours about paycuts on Research Stations in the Tau Ceti system have
+ been confirmed. Shockingly, however, the cuts will only affect lower tier
+ personnel. Heads of Staff will, according to our sources, not be affected."}
+ author = "Unauthorized"
- human_experiments
- round_time = 60*90
- message = {"Unbelievable reports about human experimentation have reached our ears. According
- to a refugee from one of the Tau Ceti Research Stations, their station, in order
- to increase revenue, has refactored several of their facilities to perform experiments
- on live humans, including virology research, genetic manipulation, and \"feeding them
- to the slimes to see what happens\". Allegedly, these test subjects were neither
- humanified monkeys nor volunteers, but rather unqualified staff that were forced into
- the experiments, and reported to have died in a \"work accident\" by Nanotrasen Inc."}
- author = "Unauthorized"
+/datum/news_announcement/revolution_inciting_event/human_experiments
+ round_time = 60*90
+ message = {"Unbelievable reports about human experimentation have reached our ears. According
+ to a refugee from one of the Tau Ceti Research Stations, their station, in order
+ to increase revenue, has refactored several of their facilities to perform experiments
+ on live humans, including virology research, genetic manipulation, and \"feeding them
+ to the slimes to see what happens\". Allegedly, these test subjects were neither
+ humanified monkeys nor volunteers, but rather unqualified staff that were forced into
+ the experiments, and reported to have died in a \"work accident\" by Nanotrasen Inc."}
+ author = "Unauthorized"
- bluespace_research
+/datum/news_announcement/bluespace_research/announcement
+ round_time = 60*20
+ message = {"The new field of research trying to explain several interesting spacetime oddities,
+ also known as \"Bluespace Research\", has reached new heights. Of the several
+ hundred space stations now orbiting in Tau Ceti, fifteen are now specially equipped
+ to experiment with and research Bluespace effects. Rumours have it some of these
+ stations even sport functional \"travel gates\" that can instantly move a whole research
+ team to an alternate reality."}
- announcement
- round_time = 60*20
- message = {"The new field of research trying to explain several interesting spacetime oddities,
- also known as \"Bluespace Research\", has reached new heights. Of the several
- hundred space stations now orbiting in Tau Ceti, fifteen are now specially equipped
- to experiment with and research Bluespace effects. Rumours have it some of these
- stations even sport functional \"travel gates\" that can instantly move a whole research
- team to an alternate reality."}
+/datum/news_announcement/random_junk/cheesy_honkers
+ author = "Assistant Editor Carl Ritz"
+ channel_name = "The Gibson Gazette"
+ message = {"Do cheesy honkers increase risk of having a miscarriage? Several health administrations
+ say so!"}
+ round_time = 60 * 15
- random_junk
+/datum/news_announcement/random_junk/net_block
+ author = "Assistant Editor Carl Ritz"
+ channel_name = "The Gibson Gazette"
+ message = {"Several corporations banding together to block access to 'wetskrell.nt', site administrators
+ claiming violation of net laws."}
+ round_time = 60 * 50
- cheesy_honkers
- author = "Assistant Editor Carl Ritz"
- channel_name = "The Gibson Gazette"
- message = {"Do cheesy honkers increase risk of having a miscarriage? Several health administrations
- say so!"}
- round_time = 60 * 15
+/datum/news_announcement/random_junk/found_ssd
+ channel_name = "Nyx Daily"
+ author = "Doctor Eric Hanfield"
- net_block
- author = "Assistant Editor Carl Ritz"
- channel_name = "The Gibson Gazette"
- message = {"Several corporations banding together to block access to 'wetskrell.nt', site administrators
- claiming violation of net laws."}
- round_time = 60 * 50
+ message = {"Several people have been found unconscious at their terminals. It is thought that it was due
+ to a lack of sleep or of simply migraines from staring at the screen too long. Camera footage
+ reveals that many of them were playing games instead of working and their pay has been docked
+ accordingly."}
+ round_time = 60 * 90
- found_ssd
- channel_name = "Nyx Daily"
- author = "Doctor Eric Hanfield"
+/datum/news_announcement/lotus_tree/explosions
+ channel_name = "Nyx Daily"
+ author = "Reporter Leland H. Howards"
- message = {"Several people have been found unconscious at their terminals. It is thought that it was due
- to a lack of sleep or of simply migraines from staring at the screen too long. Camera footage
- reveals that many of them were playing games instead of working and their pay has been docked
- accordingly."}
- round_time = 60 * 90
+ message = {"The newly-christened civillian transport Lotus Tree suffered two very large explosions near the
+ bridge today, and there are unconfirmed reports that the death toll has passed 50. The cause of
+ the explosions remain unknown, but there is speculation that it might have something to do with
+ the recent change of regulation in the Moore-Lee Corporation, a major funder of the ship, when M-L
+ announced that they were officially acknowledging inter-species marriage and providing couples
+ with marriage tax-benefits."}
+ round_time = 60 * 30
- lotus_tree
+/datum/news_announcement/food_riots/breaking_news
+ channel_name = "Nyx Daily"
+ author = "Reporter Ro'kii Ar-Raqis"
- explosions
- channel_name = "Nyx Daily"
- author = "Reporter Leland H. Howards"
+ message = {"Breaking news: Food riots have broken out throughout the Refuge asteroid colony in the Tenebrae
+ Lupus system. This comes only hours after Nanotrasen officials announced they will no longer trade with the
+ colony, citing the increased presence of \"hostile factions\" on the colony has made trade too dangerous to
+ continue. Nanotrasen officials have not given any details about said factions. More on that at the top of
+ the hour."}
+ round_time = 60 * 10
- message = {"The newly-christened civillian transport Lotus Tree suffered two very large explosions near the
- bridge today, and there are unconfirmed reports that the death toll has passed 50. The cause of
- the explosions remain unknown, but there is speculation that it might have something to do with
- the recent change of regulation in the Moore-Lee Corporation, a major funder of the ship, when M-L
- announced that they were officially acknowledging inter-species marriage and providing couples
- with marriage tax-benefits."}
- round_time = 60 * 30
+/datum/news_announcement/food_riots/more
+ channel_name = "Nyx Daily"
+ author = "Reporter Ro'kii Ar-Raqis"
- food_riots
+ message = {"More on the Refuge food riots: The Refuge Council has condemned Nanotrasen's withdrawal from
+ the colony, claiming \"there has been no increase in anti-Nanotrasen activity\", and \"\[the only] reason
+ Nanotrasen withdrew was because the \[Tenebrae Lupus] system's Plasma deposits have been completely mined out.
+ We have little to trade with them now\". Nanotrasen officials have denied these allegations, calling them
+ \"further proof\" of the colony's anti-Nanotrasen stance. Meanwhile, Refuge Security has been unable to quell
+ the riots. More on this at 6."}
+ round_time = 60 * 60
+GLOBAL_LIST_INIT(newscaster_standard_feeds, list(/datum/news_announcement/bluespace_research, /datum/news_announcement/lotus_tree, /datum/news_announcement/random_junk, /datum/news_announcement/food_riots))
- breaking_news
- channel_name = "Nyx Daily"
- author = "Reporter Ro'kii Ar-Raqis"
-
- message = {"Breaking news: Food riots have broken out throughout the Refuge asteroid colony in the Tenebrae
- Lupus system. This comes only hours after Nanotrasen officials announced they will no longer trade with the
- colony, citing the increased presence of \"hostile factions\" on the colony has made trade too dangerous to
- continue. Nanotrasen officials have not given any details about said factions. More on that at the top of
- the hour."}
- round_time = 60 * 10
-
- more
- channel_name = "Nyx Daily"
- author = "Reporter Ro'kii Ar-Raqis"
-
- message = {"More on the Refuge food riots: The Refuge Council has condemned Nanotrasen's withdrawal from
- the colony, claiming \"there has been no increase in anti-Nanotrasen activity\", and \"\[the only] reason
- Nanotrasen withdrew was because the \[Tenebrae Lupus] system's Plasma deposits have been completely mined out.
- We have little to trade with them now\". Nanotrasen officials have denied these allegations, calling them
- \"further proof\" of the colony's anti-Nanotrasen stance. Meanwhile, Refuge Security has been unable to quell
- the riots. More on this at 6."}
- round_time = 60 * 60
-
-
-var/global/list/newscaster_standard_feeds = list(/datum/news_announcement/bluespace_research, /datum/news_announcement/lotus_tree, /datum/news_announcement/random_junk, /datum/news_announcement/food_riots)
-
-proc/process_newscaster()
+/proc/process_newscaster()
check_for_newscaster_updates(SSticker.mode.newscaster_announcements)
-var/global/tmp/announced_news_types = list()
-proc/check_for_newscaster_updates(type)
+GLOBAL_LIST_EMPTY(announced_news_types)
+
+/proc/check_for_newscaster_updates(type)
for(var/subtype in subtypesof(type))
var/datum/news_announcement/news = new subtype()
- if(news.round_time * 10 <= world.time && !(subtype in announced_news_types))
- announced_news_types += subtype
+ if(news.round_time * 10 <= world.time && !(subtype in GLOB.announced_news_types))
+ GLOB.announced_news_types += subtype
announce_newscaster_news(news)
-proc/announce_newscaster_news(datum/news_announcement/news)
+/proc/announce_newscaster_news(datum/news_announcement/news)
var/datum/feed_channel/sendto
- for(var/datum/feed_channel/FC in news_network.network_channels)
+ for(var/datum/feed_channel/FC in GLOB.news_network.network_channels)
if(FC.channel_name == news.channel_name)
sendto = FC
break
@@ -142,7 +131,7 @@ proc/announce_newscaster_news(datum/news_announcement/news)
sendto.author = news.author
sendto.locked = 1
sendto.is_admin_channel = 1
- news_network.network_channels += sendto
+ GLOB.news_network.network_channels += sendto
var/datum/feed_message/newMsg = new /datum/feed_message
newMsg.author = news.author ? news.author : sendto.author
@@ -152,5 +141,5 @@ proc/announce_newscaster_news(datum/news_announcement/news)
sendto.messages += newMsg
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
+ for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allNewscasters)
NEWSCASTER.newsAlert(news.channel_name)
diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm
index dae85c1726f..4a812b40e4e 100644
--- a/code/datums/progressbar.dm
+++ b/code/datums/progressbar.dm
@@ -39,7 +39,7 @@
if(user.client)
user.client.images += bar
- progress = Clamp(progress, 0, goal)
+ progress = clamp(progress, 0, goal)
bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]"
if(!shown)
user.client.images += bar
diff --git a/code/datums/radio.dm b/code/datums/radio.dm
index b748a9f9229..efeebc7c973 100644
--- a/code/datums/radio.dm
+++ b/code/datums/radio.dm
@@ -1,7 +1,7 @@
/datum/radio_frequency
var/frequency as num
- var/list/list/obj/devices = list()
+ var/list/obj/devices = list()
/datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, var/filter = null as text|null, var/range = null as num|null)
var/turf/start_point
@@ -108,7 +108,7 @@
. = "Domestic Animal"
else
. = "Unidentifiable"
-
+
//callback used by objects to react to incoming radio signals
/obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param)
return null
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index 018d5bb3496..799a12f4db9 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -175,6 +175,7 @@
description = "The crew of a space station awaken one hundred years after a crisis. Awaking to a derelict space station on the verge of collapse, and a hostile force of invading \
hivebots. Can the surviving crew overcome the odds and survive and rebuild, or will the cold embrace of the stars become their new home?"
cost = 2
+ allow_duplicates = FALSE
/datum/map_template/ruin/space/wizardcrash
id = "wizardcrash"
@@ -182,3 +183,68 @@
name = "Crashed Wizard Shuttle"
description = "A shuttle of the Wizard Federation, sent out to crush some wandless scum. Unfortunately, the pilot suffered a magic-related accident and the shuttle crashed into a nearby asteroid."
cost = 2
+
+/datum/map_template/ruin/space/abandonedtele
+ id = "abandonedtele"
+ suffix = "abandonedtele.dmm"
+ name = "Abandoned Teleporter"
+ description = "An old teleporter, seemingly part of what used to be a larger satellite."
+
+/datum/map_template/ruin/space/blowntcommsat
+ id = "blowntcommsat"
+ suffix = "blowntcommsat.dmm"
+ name = "Blown-out Telecommunications Satellite"
+ description = "The remains of an old telecommunications satellite once utilised by NanoTrasen. It lays derelict, with quite a few pieces missing."
+ cost = 5 // This is a chonky boy
+ allow_duplicates = FALSE // Absolutely huge, also has its own APC and the area isnt set to allow many
+
+/datum/map_template/ruin/space/clownmime
+ id = "clownmime"
+ suffix = "clownmime.dmm"
+ name = "Clown & Mime Mineral Deposits"
+ description = "A crash site of two opposing factions, both trying to complete mining trips for their own valuable minerals. While all the crew have long perished, the minerals are likely intact."
+
+/datum/map_template/ruin/space/dj
+ id = "dj"
+ suffix = "dj.dmm"
+ name = "Russian DJ Station"
+ description = "An old russian listening station, long since defunct and lifeless, however the equipment is likely still in working condition."
+ cost = 2
+
+/datum/map_template/ruin/space/druglab
+ id = "druglab"
+ suffix = "druglab.dmm"
+ name = "Drug Lab"
+ description = "An old abandoned \"Chemistry\" site, which has a strong aura of amphetamines around it."
+
+/datum/map_template/ruin/space/syndiedepot
+ id = "syndiedepot"
+ suffix = "syndiedepot.dmm"
+ name = "Suspicious Supply Depot"
+ description = "A syndicate supply depot, heavily stocked, but heavily guarded with an assortment of shields, sentry bots, armed operatives and more."
+ allow_duplicates = FALSE // One of these is enough
+ always_place = TRUE // This is on the always spawn list because of the shielding chance
+ cost = 0 // Force spawned so shouldnt have a cost
+
+/datum/map_template/ruin/space/ussp_tele
+ id = "ussp_tele"
+ suffix = "ussp_tele.dmm"
+ name = "USSP Teleporter"
+ description = "An old, almost fully destroyed teleporter, seemingly part of what used to be a much larger structure."
+
+/datum/map_template/ruin/space/ussp
+ id = "ussp"
+ suffix = "ussp.dmm"
+ name = "USSP"
+ description = "A decript station of seemingly russian origin. The last contact had with this station was a distress signal, and the rest was dark."
+ allow_duplicates = FALSE // One of these has enough loot
+ cost = 5 // This ruin is 100x100 tiles, so we dont want it to be treated like a 10x10 meteor
+
+/datum/map_template/ruin/space/whiteship
+ id = "whiteship"
+ suffix = "whiteship.dmm"
+ name = "NT Medical Ship"
+ description = "An old, abandoned NT medical ship. Its computer can navigate to other landmarks within space with ease."
+ allow_duplicates = FALSE // I dont even want to think about what happens if you have 2 shuttles with the same ID. Likely scary stuff.
+ always_place = TRUE // Its designed to make exploring other space ruins more accessible
+ cost = 0 // Force spawned so shouldnt have a cost
diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm
index 5cc76721377..a651edbc79c 100644
--- a/code/datums/spawners_menu.dm
+++ b/code/datums/spawners_menu.dm
@@ -6,7 +6,7 @@
qdel(src)
owner = new_owner
-/datum/spawners_menu/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = FALSE, datum/topic_state/state = ghost_state, datum/nanoui/master_ui = null)
+/datum/spawners_menu/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = FALSE, datum/topic_state/state = GLOB.ghost_state, datum/nanoui/master_ui = null)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "spawners_menu.tmpl", "Spawners Menu", 700, 600, master_ui, state = state)
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index 7f1541248d9..3855dbcfac3 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -13,7 +13,7 @@
/obj/effect/proc_holder/singularity_pull()
return
-var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin verb for now
+GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell))
/obj/effect/proc_holder/proc/InterceptClickOn(mob/living/user, params, atom/A)
if(user.ranged_ability != src)
@@ -237,11 +237,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(action)
action.UpdateButtonIcon()
-/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells
+/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr, make_attack_logs = TRUE) //if recharge is started is important for the trigger spells
before_cast(targets)
invocation()
- if(user && user.ckey)
- user.create_attack_log("[key_name(user)] cast the spell [name].")
+ if(user && user.ckey && make_attack_logs)
+ add_attack_logs(user, targets, "cast the spell [name]", ATKLOG_ALL)
spawn(0)
if(charge_type == "recharge" && recharge)
start_recharge()
diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm
index fbde291ae98..0d24a984014 100644
--- a/code/datums/spells/area_teleport.dm
+++ b/code/datums/spells/area_teleport.dm
@@ -25,14 +25,14 @@
var/A = null
if(!randomise_selection)
- A = input("Area to teleport to", "Teleport", A) as null|anything in teleportlocs
+ A = input("Area to teleport to", "Teleport", A) as null|anything in GLOB.teleportlocs
else
- A = pick(teleportlocs)
+ A = pick(GLOB.teleportlocs)
if(!A)
return
- var/area/thearea = teleportlocs[A]
+ var/area/thearea = GLOB.teleportlocs[A]
if(thearea.tele_proof && !istype(thearea, /area/wizard_station))
to_chat(usr, "A mysterious force disrupts your arcane spell matrix, and you remain where you are.")
@@ -79,6 +79,8 @@
target.forceMove(pick(L))
playsound(get_turf(user), sound2, 50,1)
+ user.update_action_buttons_icon() //Update action buttons as some spells might now be castable
+
return
/obj/effect/proc_holder/spell/targeted/area_teleport/invocation(area/chosenarea = null)
diff --git a/code/datums/spells/banana_touch.dm b/code/datums/spells/banana_touch.dm
index cbfa158531e..e8b7f27b0da 100644
--- a/code/datums/spells/banana_touch.dm
+++ b/code/datums/spells/banana_touch.dm
@@ -55,10 +55,10 @@
equip_to_slot_if_possible(new /obj/item/clothing/under/rank/clown/nodrop, slot_w_uniform, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/shoes/clown_shoes/nodrop, slot_shoes, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/clown_hat/nodrop, slot_wear_mask, TRUE, TRUE)
- dna.SetSEState(CLUMSYBLOCK, TRUE, TRUE)
- dna.SetSEState(COMICBLOCK, TRUE, TRUE)
- genemutcheck(src, CLUMSYBLOCK, null, MUTCHK_FORCED)
- genemutcheck(src, COMICBLOCK, null, MUTCHK_FORCED)
+ dna.SetSEState(GLOB.clumsyblock, TRUE, TRUE)
+ dna.SetSEState(GLOB.comicblock, TRUE, TRUE)
+ genemutcheck(src, GLOB.clumsyblock, null, MUTCHK_FORCED)
+ genemutcheck(src, GLOB.comicblock, null, MUTCHK_FORCED)
if(!(iswizard(src) || (mind && mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE))) //Mutations are permanent on non-wizards. Can still be removed by genetics fuckery but not mutadone.
- dna.default_blocks.Add(CLUMSYBLOCK)
- dna.default_blocks.Add(COMICBLOCK)
+ dna.default_blocks.Add(GLOB.clumsyblock)
+ dna.default_blocks.Add(GLOB.comicblock)
diff --git a/code/datums/spells/cluwne.dm b/code/datums/spells/cluwne.dm
index 58a33e31a44..19a12055fef 100644
--- a/code/datums/spells/cluwne.dm
+++ b/code/datums/spells/cluwne.dm
@@ -27,8 +27,8 @@
var/obj/item/organ/internal/honktumor/cursed/tumor = new
tumor.insert(src)
mutations.Add(NERVOUS)
- dna.SetSEState(NERVOUSBLOCK, 1, 1)
- genemutcheck(src, NERVOUSBLOCK, null, MUTCHK_FORCED)
+ dna.SetSEState(GLOB.nervousblock, 1, 1)
+ genemutcheck(src, GLOB.nervousblock, null, MUTCHK_FORCED)
rename_character(real_name, "cluwne")
unEquip(w_uniform, 1)
@@ -36,10 +36,10 @@
unEquip(gloves, 1)
if(!istype(wear_mask, /obj/item/clothing/mask/cursedclown)) //Infinite loops otherwise
unEquip(wear_mask, 1)
- equip_to_slot_if_possible(new /obj/item/clothing/under/cursedclown, slot_w_uniform, 1, 1, 1)
- equip_to_slot_if_possible(new /obj/item/clothing/gloves/cursedclown, slot_gloves, 1, 1, 1)
- equip_to_slot_if_possible(new /obj/item/clothing/mask/cursedclown, slot_wear_mask, 1, 1, 1)
- equip_to_slot_if_possible(new /obj/item/clothing/shoes/cursedclown, slot_shoes, 1, 1, 1)
+ equip_to_slot_if_possible(new /obj/item/clothing/under/cursedclown, slot_w_uniform, TRUE, TRUE)
+ equip_to_slot_if_possible(new /obj/item/clothing/gloves/cursedclown, slot_gloves, TRUE, TRUE)
+ equip_to_slot_if_possible(new /obj/item/clothing/mask/cursedclown, slot_wear_mask, TRUE, TRUE)
+ equip_to_slot_if_possible(new /obj/item/clothing/shoes/cursedclown, slot_shoes, TRUE, TRUE)
/mob/living/carbon/human/proc/makeAntiCluwne()
to_chat(src, "You don't feel very funny.")
@@ -56,14 +56,14 @@
tumor.remove(src)
else
mutations.Remove(CLUMSY)
- mutations.Remove(COMICBLOCK)
- dna.SetSEState(CLUMSYBLOCK,0)
- dna.SetSEState(COMICBLOCK,0)
- genemutcheck(src, CLUMSYBLOCK, null, MUTCHK_FORCED)
- genemutcheck(src, COMICBLOCK, null, MUTCHK_FORCED)
+ mutations.Remove(GLOB.comicblock)
+ dna.SetSEState(GLOB.clumsyblock,0)
+ dna.SetSEState(GLOB.comicblock,0)
+ genemutcheck(src, GLOB.clumsyblock, null, MUTCHK_FORCED)
+ genemutcheck(src, GLOB.comicblock, null, MUTCHK_FORCED)
mutations.Remove(NERVOUS)
- dna.SetSEState(NERVOUSBLOCK, 0)
- genemutcheck(src, NERVOUSBLOCK, null, MUTCHK_FORCED)
+ dna.SetSEState(GLOB.nervousblock, 0)
+ genemutcheck(src, GLOB.nervousblock, null, MUTCHK_FORCED)
var/obj/item/clothing/under/U = w_uniform
unEquip(w_uniform, 1)
@@ -83,5 +83,5 @@
unEquip(gloves, 1)
qdel(G)
- equip_to_slot_if_possible(new /obj/item/clothing/under/lawyer/black, slot_w_uniform, 1, 1, 1)
- equip_to_slot_if_possible(new /obj/item/clothing/shoes/black, slot_shoes, 1, 1, 1)
+ equip_to_slot_if_possible(new /obj/item/clothing/under/lawyer/black, slot_w_uniform, TRUE, TRUE)
+ equip_to_slot_if_possible(new /obj/item/clothing/shoes/black, slot_shoes, TRUE, TRUE)
diff --git a/code/datums/spells/devil.dm b/code/datums/spells/devil.dm
index 12e2a44a8c1..27b2fcb8851 100644
--- a/code/datums/spells/devil.dm
+++ b/code/datums/spells/devil.dm
@@ -142,7 +142,6 @@
return 0
fakefire()
forceMove(get_turf(src))
- reset_perspective()
visible_message("[src] appears in a firey blaze!")
playsound(get_turf(src), 'sound/misc/exit_blood.ogg', 100, 1, -1)
spawn(15)
diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm
index 4f2c88b659d..f7d7a9bfb8d 100644
--- a/code/datums/spells/ethereal_jaunt.dm
+++ b/code/datums/spells/ethereal_jaunt.dm
@@ -56,7 +56,7 @@
qdel(holder)
if(!QDELETED(target))
if(mobloc.density)
- for(var/direction in alldirs)
+ for(var/direction in GLOB.alldirs)
var/turf/T = get_step(mobloc, direction)
if(T)
if(target.Move(T))
diff --git a/code/datums/spells/genetic.dm b/code/datums/spells/genetic.dm
index 3c2f997e461..d95c6212486 100644
--- a/code/datums/spells/genetic.dm
+++ b/code/datums/spells/genetic.dm
@@ -2,7 +2,6 @@
name = "Genetic"
desc = "This spell inflicts a set of mutations and disabilities upon the target."
- var/disabilities = 0 //bits
var/list/mutations = list() //mutation strings
var/duration = 100 //deciseconds
/*
@@ -20,16 +19,12 @@
for(var/mob/living/target in targets)
for(var/x in mutations)
target.mutations.Add(x)
- /* if(x == HULK && ishuman(target))
- target:hulk_time=world.time + duration */
- target.disabilities |= disabilities
target.update_mutations() //update target's mutation overlays
var/mob/living/carbon/human/H = target
if(ishuman(target))
H.update_body()
spawn(duration)
target.mutations.Remove(mutations)
- target.disabilities &= ~disabilities
target.update_mutations()
if(ishuman(target))
H.update_body()
diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm
index 2c000a0d232..0140fbdf951 100644
--- a/code/datums/spells/horsemask.dm
+++ b/code/datums/spells/horsemask.dm
@@ -43,6 +43,6 @@
"Your face burns up, and shortly after the fire you realise you have the face of a horse!")
if(!target.unEquip(target.wear_mask))
qdel(target.wear_mask)
- target.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1)
+ target.equip_to_slot_if_possible(magichead, slot_wear_mask, TRUE, TRUE)
target.flash_eyes()
diff --git a/code/datums/spells/knock.dm b/code/datums/spells/knock.dm
index 95c16978638..88f5eec9474 100644
--- a/code/datums/spells/knock.dm
+++ b/code/datums/spells/knock.dm
@@ -13,6 +13,11 @@
action_icon_state = "knock"
sound = 'sound/magic/knock.ogg'
+// Knock doesn't need to generate an attack log for every turf, set `make_attack_logs` to FALSE and just create a custom one.
+/obj/effect/proc_holder/spell/aoe_turf/knock/perform(list/targets, recharge, mob/user)
+ add_attack_logs(user, user, "cast the spell [name]", ATKLOG_ALL)
+ return ..(targets, recharge, user, make_attack_logs = FALSE)
+
/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets, mob/user = usr)
for(var/turf/T in targets)
for(var/obj/machinery/door/door in T.contents)
@@ -30,8 +35,6 @@
SC.locked = 0
C.open()
- return
-
/obj/effect/proc_holder/spell/aoe_turf/knock/greater
name = "Greater Knock"
desc = "On first cast, will remove access restrictions on all airlocks on the station, and announce this spell's use to the station. On any further cast, will open all doors in sight. Cannot be refunded once bought!"
@@ -51,7 +54,7 @@
if(is_station_level(A.z))
A.req_access = list()
A.req_one_access = list()
- command_announcement.Announce("We have removed all access requirements on your station's airlocks. You can thank us later!", "Greetings!", 'sound/misc/notice2.ogg', , , "Space Wizard Federation Message")
+ GLOB.command_announcement.Announce("We have removed all access requirements on your station's airlocks. You can thank us later!", "Greetings!", 'sound/misc/notice2.ogg', , , "Space Wizard Federation Message")
else
..()
return
diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm
index 9db46b517db..9175fd677fb 100644
--- a/code/datums/spells/lichdom.dm
+++ b/code/datums/spells/lichdom.dm
@@ -28,7 +28,7 @@
config.continuous_rounds = 0
return ..()
-/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets,mob/user = usr)
+/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets, mob/user = usr)
if(!config.continuous_rounds)
existence_stops_round_end = 1
config.continuous_rounds = 1
@@ -36,7 +36,7 @@
for(var/mob/M in targets)
var/list/hand_items = list()
if(iscarbon(M))
- hand_items = list(M.get_active_hand(),M.get_inactive_hand())
+ hand_items = list(M.get_active_hand(), M.get_inactive_hand())
if(marked_item && !stat_allowed) //sanity, shouldn't happen without badminry
marked_item = null
@@ -74,12 +74,9 @@
var/mob/old_body = current_body
var/turf/body_turf = get_turf(old_body)
current_body = lich
- lich.Weaken(10+10*resurrections)
+ lich.Weaken(10 + 10 * resurrections)
++resurrections
- lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(lich), slot_shoes)
- lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), slot_w_uniform)
- lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), slot_wear_suit)
- lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), slot_head)
+ equip_lich(lich)
if(old_body && old_body.loc)
if(iscarbon(old_body))
@@ -95,7 +92,7 @@
if(!marked_item) //linking item to the spell
message = ""
for(var/obj/item in hand_items)
- if(ABSTRACT in item.flags || NODROP in item.flags)
+ if((ABSTRACT in item.flags) || (NODROP in item.flags))
continue
marked_item = item
to_chat(M, "You begin to focus your very being into the [item.name]...")
@@ -127,7 +124,10 @@
H.unEquip(H.head)
H.unEquip(H.shoes)
H.unEquip(H.head)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), slot_w_uniform)
+ equip_lich(H)
+
+/obj/effect/proc_holder/spell/targeted/lichdom/proc/equip_lich(mob/living/carbon/human/H)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), slot_w_uniform)
diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm
index 31066001270..11b0a75b275 100644
--- a/code/datums/spells/mime.dm
+++ b/code/datums/spells/mime.dm
@@ -141,6 +141,7 @@
else
user.mind.AddSpell(S)
to_chat(user, "You flip through the pages. Your understanding of the boundaries of reality increases. You can cast [spellname]!")
+ user.create_log(MISC_LOG, "learned the spell [spellname] ([S])")
user.create_attack_log("[key_name(user)] learned the spell [spellname] ([S]).")
onlearned(user)
diff --git a/code/datums/spells/mime_malaise.dm b/code/datums/spells/mime_malaise.dm
index 1c212c62125..1765b2f5741 100644
--- a/code/datums/spells/mime_malaise.dm
+++ b/code/datums/spells/mime_malaise.dm
@@ -49,6 +49,6 @@
equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/mime/nodrop, slot_wear_mask, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/under/mime/nodrop, slot_w_uniform, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/suit/suspenders/nodrop, slot_wear_suit, TRUE, TRUE)
- dna.SetSEState(MUTEBLOCK , TRUE, TRUE)
- genemutcheck(src, MUTEBLOCK , null, MUTCHK_FORCED)
- dna.default_blocks.Add(MUTEBLOCK)
+ dna.SetSEState(GLOB.muteblock , TRUE, TRUE)
+ genemutcheck(src, GLOB.muteblock , null, MUTCHK_FORCED)
+ dna.default_blocks.Add(GLOB.muteblock)
diff --git a/code/datums/spells/rathens.dm b/code/datums/spells/rathens.dm
index b2d35ff5393..4d98be324b2 100644
--- a/code/datums/spells/rathens.dm
+++ b/code/datums/spells/rathens.dm
@@ -21,14 +21,14 @@
A.remove(H)
A.forceMove(get_turf(H))
spawn()
- A.throw_at(get_edge_target_turf(H, pick(alldirs)), rand(1, 10), 5)
+ A.throw_at(get_edge_target_turf(H, pick(GLOB.alldirs)), rand(1, 10), 5)
H.visible_message("[H]'s [A.name] flies out of their body in a magical explosion!",\
"Your [A.name] flies out of your body in a magical explosion!")
H.Weaken(2)
else
var/obj/effect/decal/cleanable/blood/gibs/G = new/obj/effect/decal/cleanable/blood/gibs(get_turf(H))
spawn()
- G.throw_at(get_edge_target_turf(H, pick(alldirs)), rand(1, 10), 5)
+ G.throw_at(get_edge_target_turf(H, pick(GLOB.alldirs)), rand(1, 10), 5)
H.apply_damage(10, BRUTE, "chest")
to_chat(H, "You have no appendix, but something had to give! Holy shit, what was that?")
H.Weaken(3)
diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm
index aaef2229856..a0c41b57001 100644
--- a/code/datums/spells/summonitem.dm
+++ b/code/datums/spells/summonitem.dm
@@ -41,7 +41,7 @@
else
message = "You must hold the desired item in your hands to mark it for recall."
- else if(marked_item && marked_item in hand_items) //unlinking item to the spell
+ else if(marked_item && (marked_item in hand_items)) //unlinking item to the spell
message = "You remove the mark on [marked_item] to use elsewhere."
name = "Instant Summons"
marked_item = null
@@ -75,8 +75,6 @@
B.transfer_identity(C)
C.death()
add_attack_logs(target, C, "Magically debrained INTENT: [uppertext(target.a_intent)]")*/
- if(C.stomach_contents && item_to_retrieve in C.stomach_contents)
- C.stomach_contents -= item_to_retrieve
for(var/X in C.bodyparts)
var/obj/item/organ/external/part = X
if(item_to_retrieve in part.embedded_objects)
@@ -104,12 +102,12 @@
if(target.hand) //left active hand
- if(!target.equip_to_slot_if_possible(item_to_retrieve, slot_l_hand, 0, 1, 1))
- if(!target.equip_to_slot_if_possible(item_to_retrieve, slot_r_hand, 0, 1, 1))
+ if(!target.equip_to_slot_if_possible(item_to_retrieve, slot_l_hand, FALSE, TRUE))
+ if(!target.equip_to_slot_if_possible(item_to_retrieve, slot_r_hand, FALSE, TRUE))
butterfingers = 1
else //right active hand
- if(!target.equip_to_slot_if_possible(item_to_retrieve, slot_r_hand, 0, 1, 1))
- if(!target.equip_to_slot_if_possible(item_to_retrieve, slot_l_hand, 0, 1, 1))
+ if(!target.equip_to_slot_if_possible(item_to_retrieve, slot_r_hand, FALSE, TRUE))
+ if(!target.equip_to_slot_if_possible(item_to_retrieve, slot_l_hand, FALSE, TRUE))
butterfingers = 1
if(butterfingers)
item_to_retrieve.loc = target.loc
diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm
index d656bccac4a..c242a1aa52f 100644
--- a/code/datums/spells/touch_attacks.dm
+++ b/code/datums/spells/touch_attacks.dm
@@ -27,12 +27,12 @@
var/hand_handled = 1
attached_hand = new hand_path(src)
if(user.hand) //left active hand
- if(!user.equip_to_slot_if_possible(attached_hand, slot_l_hand, 0, 1, 1))
- if(!user.equip_to_slot_if_possible(attached_hand, slot_r_hand, 0, 1, 1))
+ if(!user.equip_to_slot_if_possible(attached_hand, slot_l_hand, FALSE, TRUE))
+ if(!user.equip_to_slot_if_possible(attached_hand, slot_r_hand, FALSE, TRUE))
hand_handled = 0
else //right active hand
- if(!user.equip_to_slot_if_possible(attached_hand, slot_r_hand, 0, 1, 1))
- if(!user.equip_to_slot_if_possible(attached_hand, slot_l_hand, 0, 1, 1))
+ if(!user.equip_to_slot_if_possible(attached_hand, slot_r_hand, FALSE, TRUE))
+ if(!user.equip_to_slot_if_possible(attached_hand, slot_l_hand, FALSE, TRUE))
hand_handled = 0
if(!hand_handled)
qdel(attached_hand)
diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm
index fb4b80ff69f..94383f1b1e2 100644
--- a/code/datums/spells/wizard.dm
+++ b/code/datums/spells/wizard.dm
@@ -97,11 +97,11 @@
/obj/effect/proc_holder/spell/targeted/genetic/mutate/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
- target.dna.SetSEState(HULKBLOCK, 1)
- genemutcheck(target, HULKBLOCK, null, MUTCHK_FORCED)
+ target.dna.SetSEState(GLOB.hulkblock, 1)
+ genemutcheck(target, GLOB.hulkblock, null, MUTCHK_FORCED)
spawn(duration)
- target.dna.SetSEState(HULKBLOCK, 0)
- genemutcheck(target, HULKBLOCK, null, MUTCHK_FORCED)
+ target.dna.SetSEState(GLOB.hulkblock, 0)
+ genemutcheck(target, GLOB.hulkblock, null, MUTCHK_FORCED)
..()
/obj/effect/proc_holder/spell/targeted/smoke
@@ -304,7 +304,7 @@
sound = 'sound/magic/blind.ogg'
/obj/effect/proc_holder/spell/targeted/genetic/blind
- disabilities = BLIND
+ mutations = list(BLINDNESS)
duration = 300
sound = 'sound/magic/blind.ogg'
@@ -423,7 +423,7 @@
M.Weaken(stun_amt)
to_chat(M, "You're thrown back by a mystical force!")
spawn(0)
- AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1)//So stuff gets tossed around at the same time.
+ AM.throw_at(throwtarget, ((clamp((maxthrow - (clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1)//So stuff gets tossed around at the same time.
/obj/effect/proc_holder/spell/targeted/sacred_flame
name = "Sacred Flame"
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 479694de4d7..61decede9bc 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -113,13 +113,13 @@
/datum/status_effect/hippocraticOath/on_apply()
//Makes the user passive, it's in their oath not to harm!
ADD_TRAIT(owner, TRAIT_PACIFISM, "hippocraticOath")
- var/datum/atom_hud/H = huds[DATA_HUD_MEDICAL_ADVANCED]
+ var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
H.add_hud_to(owner)
return ..()
/datum/status_effect/hippocraticOath/on_remove()
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "hippocraticOath")
- var/datum/atom_hud/H = huds[DATA_HUD_MEDICAL_ADVANCED]
+ var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
H.remove_hud_from(owner)
/datum/status_effect/hippocraticOath/tick()
@@ -190,7 +190,7 @@
L.adjustBrainLoss(-3.5)
L.adjustCloneLoss(-1) //Becasue apparently clone damage is the bastion of all health
if(ishuman(L))
- var/var/mob/living/carbon/human/H = L
+ var/mob/living/carbon/human/H = L
for(var/obj/item/organ/external/E in H.bodyparts)
if(prob(10))
E.mend_fracture()
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index db6aef6ea0e..d8b5e4d9cbe 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -107,7 +107,7 @@
if(needs_to_bleed)
var/turf/T = get_turf(owner)
new /obj/effect/temp_visual/bleed/explode(T)
- for(var/d in alldirs)
+ for(var/d in GLOB.alldirs)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(T, d)
playsound(T, "desceration", 200, 1, -1)
owner.adjustBruteLoss(bleed_damage)
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index 896f4f999a9..2580b1c9935 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -5,7 +5,7 @@
/datum/status_effect
var/id = "effect" //Used for screen alerts.
var/duration = -1 //How long the status effect lasts in DECISECONDS. Enter -1 for an effect that never ends unless removed through some means.
- var/tick_interval = 10 //How many deciseconds between ticks, approximately. Leave at 10 for every second.
+ var/tick_interval = 10 //How many deciseconds between ticks, approximately. Leave at 10 for every second. Setting this to -1 will stop processing if duration is also unlimited.
var/mob/living/owner //The mob affected by the status effect.
var/status_type = STATUS_EFFECT_UNIQUE //How many of the effect can be on one mob, and what happens when you try to add another
var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted
@@ -31,7 +31,8 @@
var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type)
A.attached_effect = src //so the alert can reference us, if it needs to
linked_alert = A //so we can reference the alert, if we need to
- START_PROCESSING(SSfastprocess, src)
+ if(duration > 0 || initial(tick_interval) > 0) //don't process if we don't care
+ START_PROCESSING(SSfastprocess, src)
return TRUE
/datum/status_effect/Destroy()
@@ -41,6 +42,9 @@
LAZYREMOVE(owner.status_effects, src)
on_remove()
owner = null
+ if(linked_alert)
+ linked_alert.attached_effect = null
+ linked_alert = null
return ..()
/datum/status_effect/process()
@@ -85,6 +89,13 @@
desc = "You don't feel any different..."
var/datum/status_effect/attached_effect
+/obj/screen/alert/status_effect/Destroy()
+ if(attached_effect)
+ attached_effect.linked_alert = null
+ attached_effect = null
+ return ..()
+
+
//////////////////
// HELPER PROCS //
//////////////////
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index f17e9840e4f..c8045dfe1e4 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -16,7 +16,7 @@
#define SUPPLY_MISC 8
#define SUPPLY_VEND 9
-var/list/all_supply_groups = list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY_ENGINEER,SUPPLY_MEDICAL,SUPPLY_SCIENCE,SUPPLY_ORGANIC,SUPPLY_MATERIALS,SUPPLY_MISC,SUPPLY_VEND)
+GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY_ENGINEER,SUPPLY_MEDICAL,SUPPLY_SCIENCE,SUPPLY_ORGANIC,SUPPLY_MATERIALS,SUPPLY_MISC,SUPPLY_VEND))
/proc/get_supply_group_name(var/cat)
switch(cat)
@@ -1204,7 +1204,7 @@ var/list/all_supply_groups = list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY_ENGINE
containername = "hydroponics crate"
announce_beacons = list("Hydroponics" = list("Hydroponics"))
-/datum/supply_packs/misc/hydroponics/hydrotank
+/datum/supply_packs/organic/hydroponics/hydrotank
name = "Hydroponics Watertank Crate"
contains = list(/obj/item/watertank)
cost = 10
@@ -1434,6 +1434,8 @@ var/list/all_supply_groups = list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY_ENGINE
contains = list(/obj/structure/filingcabinet/chestdrawer,
/obj/item/camera_film,
/obj/item/hand_labeler,
+ /obj/item/hand_labeler_refill,
+ /obj/item/hand_labeler_refill,
/obj/item/stack/tape_roll,
/obj/item/paper_bin,
/obj/item/pen,
@@ -1765,6 +1767,16 @@ var/list/all_supply_groups = list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY_ENGINE
cost = 20
containername = "polo supply crate"
+/datum/supply_packs/misc/boxing //For non log spamming cargo brawls!
+ name = "Boxing Supply Crate"
+ // 4 boxing gloves
+ contains = list(/obj/item/clothing/gloves/boxing/blue,
+ /obj/item/clothing/gloves/boxing/green,
+ /obj/item/clothing/gloves/boxing/yellow,
+ /obj/item/clothing/gloves/boxing)
+ cost = 15
+ containername = "boxing supply crate"
+
///////////// Station Goals
/datum/supply_packs/misc/station_goal
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index a5155cceb4a..4814e27380b 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -108,7 +108,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
return desc
/datum/uplink_item/proc/buy(var/obj/item/uplink/hidden/U, var/mob/user)
- ..()
if(!istype(U))
return 0
@@ -189,15 +188,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/storage/box/syndie_kit/fake_revolver
cost = 1
job = list("Clown")
-/*
-/datum/uplink_item/stealthy_weapons/romerol_kit
- name = "Romerol"
- reference = "ROM"
- desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. On death, these nodules take control of the dead body, causing limited revivification, along with slurred speech, aggression, and the ability to infect others with this agent."
- item = /obj/item/storage/box/syndie_kit/romerol
- cost = 25
- cant_discount = TRUE
-*/
//mime
/datum/uplink_item/jobspecific/caneshotgun
name = "Cane Shotgun and Assassination Shells"
@@ -248,6 +238,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 2
job = list("Chef")
+/datum/uplink_item/jobspecific/Chef_CQC
+ name = " A chefs manual to CQC"
+ desc = "An old manual teaching you how to bring your home advantage outside the kitchen."
+ reference = "CCQC"
+ item = /obj/item/CQC_manual/chef
+ cost = 12
+ job = list("Chef")
+
//Chaplain
/datum/uplink_item/jobspecific/voodoo
diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm
index 57d8c11f80b..558669df3c6 100644
--- a/code/datums/weather/weather_types/ash_storm.dm
+++ b/code/datums/weather/weather_types/ash_storm.dm
@@ -36,7 +36,7 @@
var/list/outside_areas = list()
var/list/eligible_areas = list()
for(var/z in impacted_z_levels)
- eligible_areas += space_manager.areas_in_z["[z]"]
+ eligible_areas += GLOB.space_manager.areas_in_z["[z]"]
for(var/i in 1 to eligible_areas.len)
var/area/place = eligible_areas[i]
if(place.outdoors)
diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm
index 85b8d3fd2af..2bfefa5624e 100644
--- a/code/datums/weather/weather_types/radiation_storm.dm
+++ b/code/datums/weather/weather_types/radiation_storm.dm
@@ -26,8 +26,8 @@
/datum/weather/rad_storm/telegraph()
..()
status_alarm(TRUE)
- pre_maint_all_access = maint_all_access
- if(!maint_all_access)
+ pre_maint_all_access = GLOB.maint_all_access
+ if(!GLOB.maint_all_access)
make_maint_all_access()
@@ -51,7 +51,7 @@
/datum/weather/rad_storm/end()
if(..())
return
- priority_announcement.Announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert")
+ GLOB.priority_announcement.Announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert")
status_alarm(FALSE)
if(!pre_maint_all_access)
revoke_maint_all_access()
diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm
index e3d90b8d075..dcde08d7ec1 100644
--- a/code/datums/wires/airlock.dm
+++ b/code/datums/wires/airlock.dm
@@ -166,9 +166,9 @@
//raises them if they are down (only if power's on)
if(!A.locked)
if(A.lock())
- A.audible_message("You hear a click from the bottom of the door.", null, 1)
+ A.audible_message("You hear a click from the bottom of the door.", hearing_distance = 1)
else if(A.unlock())
- A.audible_message("You hear a click from the bottom of the door.", null, 1)
+ A.audible_message("You hear a click from the bottom of the door.", hearing_distance = 1)
if(AIRLOCK_WIRE_BACKUP_POWER1)
//two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter).
diff --git a/code/datums/wires/nuclearbomb.dm b/code/datums/wires/nuclearbomb.dm
index 63687ad8839..3b8ff5db098 100644
--- a/code/datums/wires/nuclearbomb.dm
+++ b/code/datums/wires/nuclearbomb.dm
@@ -72,7 +72,7 @@
if(N.icon_state == "nuclearbomb2")
N.icon_state = "nuclearbomb1"
N.timing = 0
- bomb_set = 0
+ GLOB.bomb_set = 0
if(NUCLEARBOMB_WIRE_LIGHT)
N.lighthack = !N.lighthack
diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm
index 789a0472869..04a9509cfe2 100644
--- a/code/datums/wires/robot.dm
+++ b/code/datums/wires/robot.dm
@@ -15,16 +15,16 @@
switch(index)
if(BORG_WIRE_MAIN_POWER)
return "Main Power"
-
+
if(BORG_WIRE_LOCKED_DOWN)
return "Lockdown"
-
+
if(BORG_WIRE_CAMERA)
return "Camera"
-
+
if(BORG_WIRE_AI_CONTROL)
return "AI Control"
-
+
if(BORG_WIRE_LAWCHECK)
return "Law Check"
@@ -52,7 +52,7 @@
if(BORG_WIRE_AI_CONTROL) //Cut the AI wire to reset AI control
if(!mended)
if(R.connected_ai)
- R.connected_ai = null
+ R.disconnect_from_ai()
if(BORG_WIRE_CAMERA)
if(!isnull(R.camera) && !R.scrambledcodes)
@@ -74,8 +74,7 @@
switch(index)
if(BORG_WIRE_AI_CONTROL) //pulse the AI wire to make the borg reselect an AI
if(!R.emagged)
- R.connected_ai = select_active_ai()
- R.notify_ai(1)
+ R.connect_to_ai(select_active_ai())
if(BORG_WIRE_CAMERA)
if(!isnull(R.camera) && R.camera.can_use() && !R.scrambledcodes)
diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm
index b490d150efe..430b5ce88aa 100644
--- a/code/datums/wires/syndicatebomb.dm
+++ b/code/datums/wires/syndicatebomb.dm
@@ -96,7 +96,6 @@
if(BOMB_WIRE_ACTIVATE)
if(!mended && B.active)
holder.visible_message("[bicon(B)] The timer stops! The bomb has been defused!")
- B.active = FALSE
B.defused = TRUE
B.update_icon()
..()
diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm
index 07cf919db2d..09c874ce8a8 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -5,9 +5,9 @@
#define MAX_FLAG 65535
-var/list/same_wires = list()
+GLOBAL_LIST_EMPTY(same_wires)
// 12 colours, if you're adding more than 12 wires then add more colours here
-var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", "gold", "gray", "cyan", "navy", "purple", "pink")
+GLOBAL_LIST_INIT(wireColours, list("red", "blue", "green", "black", "orange", "brown", "gold", "gray", "cyan", "navy", "purple", "pink"))
/datum/wires
@@ -31,7 +31,6 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
src.holder = holder
if(!istype(holder, holder_type))
CRASH("Our holder is null/the wrong type!")
- return
// Generate new wires
if(random)
@@ -39,11 +38,11 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
// Get the same wires
else
// We don't have any wires to copy yet, generate some and then copy it.
- if(!same_wires[holder_type])
+ if(!GLOB.same_wires[holder_type])
GenerateWires()
- same_wires[holder_type] = src.wires.Copy()
+ GLOB.same_wires[holder_type] = src.wires.Copy()
else
- var/list/wires = same_wires[holder_type]
+ var/list/wires = GLOB.same_wires[holder_type]
src.wires = wires // Reference the wires list.
/datum/wires/Destroy()
@@ -51,7 +50,7 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
return ..()
/datum/wires/proc/GenerateWires()
- var/list/colours_to_pick = wireColours.Copy() // Get a copy, not a reference.
+ var/list/colours_to_pick = GLOB.wireColours.Copy() // Get a copy, not a reference.
var/list/indexes_to_pick = list()
//Generate our indexes
for(var/i = 1; i < MAX_FLAG && i < (1 << wire_count); i += i)
@@ -81,13 +80,13 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
ui = new(user, src, ui_key, "wires.tmpl", holder.name, window_x, window_y)
ui.open()
-/datum/wires/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state)
+/datum/wires/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.physical_state)
var/data[0]
var/list/replace_colours = null
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
- if(eyes && H.disabilities & COLOURBLIND)
+ if(eyes && (COLOURBLIND in H.mutations))
replace_colours = eyes.replace_colours
diff --git a/code/defines/procs/AStar.dm b/code/defines/procs/AStar.dm
index e593888c265..1f8c83f5f04 100644
--- a/code/defines/procs/AStar.dm
+++ b/code/defines/procs/AStar.dm
@@ -155,7 +155,7 @@ Actual Adjacent procs :
var/list/L = new()
var/turf/simulated/T
- for(var/dir in cardinal)
+ for(var/dir in GLOB.cardinal)
T = get_step(src,dir)
if(!T || (simulated_only && !istype(T)))
continue
diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm
index b7036f9fbdc..23b485ad252 100644
--- a/code/defines/procs/admin.dm
+++ b/code/defines/procs/admin.dm
@@ -7,7 +7,7 @@
/proc/key_name_helper(whom, include_name, include_link = FALSE, type = null)
if(include_link != FALSE && include_link != TRUE)
- log_runtime(EXCEPTION("Key_name was called with an incorrect include_link [include_link]"), src)
+ log_runtime(EXCEPTION("Key_name was called with an incorrect include_link [include_link]"))
var/mob/M
var/client/C
@@ -83,10 +83,6 @@
var/message = "[key_name(whom, 0)][isAntag(whom) ? "(ANTAG)" : ""][isLivingSSD(whom) ? "(SSD!)": ""]"
return message
-/proc/log_and_message_admins(var/message as text)
+/proc/log_and_message_admins(message)
log_admin("[key_name(usr)] " + message)
message_admins("[key_name_admin(usr)] " + message)
-
-/proc/admin_log_and_message_admins(var/message as text)
- log_admin("[key_name(usr)] " + message)
- message_admins("[key_name_admin(usr)] " + message, 1)
diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm
index 3a70d05029e..a2b80440ecb 100644
--- a/code/defines/procs/announce.dm
+++ b/code/defines/procs/announce.dm
@@ -1,7 +1,7 @@
-/var/datum/announcement/minor/minor_announcement = new()
-/var/datum/announcement/priority/priority_announcement = new(do_log = 0)
-/var/datum/announcement/priority/command/command_announcement = new(do_log = 0, do_newscast = 0)
-/var/datum/announcement/priority/command/event/event_announcement = new(do_log = 0, do_newscast = 0)
+GLOBAL_DATUM_INIT(minor_announcement, /datum/announcement/minor, new())
+GLOBAL_DATUM_INIT(priority_announcement, /datum/announcement/priority, new(do_log = 0))
+GLOBAL_DATUM_INIT(command_announcement, /datum/announcement/priority/command, new(do_log = 0, do_newscast = 0))
+GLOBAL_DATUM_INIT(event_announcement, /datum/announcement/priority/command/event, new(do_log = 0, do_newscast = 0))
/datum/announcement
var/title = "Attention"
diff --git a/code/defines/procs/dbcore.dm b/code/defines/procs/dbcore.dm
index 86862eb9fcc..90a5b0db40c 100644
--- a/code/defines/procs/dbcore.dm
+++ b/code/defines/procs/dbcore.dm
@@ -29,13 +29,6 @@
#define BLOB 14
// TODO: Investigate more recent type additions and see if I can handle them. - Nadrew
-
-// Deprecated! See global.dm for new configuration vars
-/*
-var/DB_SERVER = "" // This is the location of your MySQL server (localhost is USUALLY fine)
-var/DB_PORT = 3306 // This is the port your MySQL server is running on (3306 is the default)
-*/
-
DBConnection
var/_db_con // This variable contains a reference to the actual database connection.
var/dbi // This variable is a string containing the DBI MySQL requires.
@@ -79,12 +72,21 @@ DBConnection/proc/NewQuery(sql_query,cursor_handler=src.default_cursor) return n
DBQuery/New(sql_query,DBConnection/connection_handler,cursor_handler)
+ if(IsAdminAdvancedProcCall())
+ to_chat(usr, "DB query blocked: Advanced ProcCall detected.")
+ message_admins("[key_name(usr)] attempted to create a DB query via advanced proc-call")
+ log_admin("[key_name(usr)] attempted to create a DB query via advanced proc-call")
+ return
if(sql_query) src.sql = sql_query
if(connection_handler) src.db_connection = connection_handler
if(cursor_handler) src.default_cursor = cursor_handler
_db_query = _dm_db_new_query()
return ..()
+DBQuery/CanProcCall()
+ // dont even try it
+ return FALSE
+
DBQuery
var/sql // The sql query being executed.
diff --git a/code/defines/procs/radio.dm b/code/defines/procs/radio.dm
index 84d3ddaae78..7c0dc4de7f8 100644
--- a/code/defines/procs/radio.dm
+++ b/code/defines/procs/radio.dm
@@ -24,62 +24,9 @@
return freq_text
-/datum/reception
- var/obj/machinery/message_server/message_server = null
- var/telecomms_reception = TELECOMMS_RECEPTION_NONE
- var/message = ""
-
-/datum/receptions
- var/obj/machinery/message_server/message_server = null
- var/sender_reception = TELECOMMS_RECEPTION_NONE
- var/list/receiver_reception = new
-
/proc/get_message_server()
- if(message_servers)
- for(var/obj/machinery/message_server/MS in message_servers)
+ if(GLOB.message_servers)
+ for(var/obj/machinery/message_server/MS in GLOB.message_servers)
if(MS.active)
return MS
return null
-
-/proc/check_signal(var/datum/signal/signal)
- return signal && signal.data["done"]
-
-/proc/get_sender_reception(var/atom/sender, var/datum/signal/signal)
- return check_signal(signal) ? TELECOMMS_RECEPTION_SENDER : TELECOMMS_RECEPTION_NONE
-
-/proc/get_receiver_reception(var/receiver, var/datum/signal/signal)
- if(receiver && check_signal(signal))
- var/turf/pos = get_turf(receiver)
- // Maybe should get tie-in to the space manager?
- if(pos && (pos.z in signal.data["level"]))
- return TELECOMMS_RECEPTION_RECEIVER
- return TELECOMMS_RECEPTION_NONE
-
-/proc/get_reception(var/atom/sender, var/receiver, var/message = "", var/do_sleep = 1)
- var/datum/reception/reception = new
-
- // check if telecomms I/O route 1459 is stable
- reception.message_server = get_message_server()
-
- var/datum/signal/signal = sender.telecomms_process(do_sleep) // Be aware that this proc calls sleep, to simulate transmition delays
- reception.telecomms_reception |= get_sender_reception(sender, signal)
- reception.telecomms_reception |= get_receiver_reception(receiver, signal)
- reception.message = signal && signal.data["compression"] > 0 ? Gibberish(message, signal.data["compression"] + 50) : message
-
- return reception
-
-/proc/get_receptions(var/atom/sender, var/list/atom/receivers, var/do_sleep = 1)
- var/datum/receptions/receptions = new
- receptions.message_server = get_message_server()
-
- var/datum/signal/signal
- if(sender)
- signal = sender.telecomms_process(do_sleep)
- receptions.sender_reception = get_sender_reception(sender, signal)
-
- for(var/atom/receiver in receivers)
- if(!signal)
- signal = receiver.telecomms_process()
- receptions.receiver_reception[receiver] = get_receiver_reception(receiver, signal)
-
- return receptions
diff --git a/code/defines/procs/records.dm b/code/defines/procs/records.dm
index 256ae51dbf2..a74680ec578 100644
--- a/code/defines/procs/records.dm
+++ b/code/defines/procs/records.dm
@@ -20,7 +20,7 @@
G.fields["religion"] = "Unknown"
G.fields["photo_front"] = front
G.fields["photo_side"] = side
- data_core.general += G
+ GLOB.data_core.general += G
qdel(dummy)
return G
@@ -36,11 +36,11 @@
R.fields["ma_crim"] = "None"
R.fields["ma_crim_d"] = "No major crime convictions."
R.fields["notes"] = "No notes."
- data_core.security += R
+ GLOB.data_core.security += R
return R
/proc/find_security_record(field, value)
- return find_record(field, value, data_core.security)
+ return find_record(field, value, GLOB.data_core.security)
/proc/find_record(field, value, list/L)
for(var/datum/data/record/R in L)
diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm
index b2b643541ec..8f3eeeaa6fa 100644
--- a/code/defines/procs/statistics.dm
+++ b/code/defines/procs/statistics.dm
@@ -1,35 +1,3 @@
-/proc/sql_poll_players()
- if(!config.sql_enabled)
- return
- var/playercount = 0
- for(var/mob/M in GLOB.player_list)
- if(M.client)
- playercount += 1
- establish_db_connection()
- if(!dbcon.IsConnected())
- log_game("SQL ERROR during player polling. Failed to connect.")
- else
- var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
- var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, time) VALUES ([playercount], '[sqltime]')")
- if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during player polling. Error : \[[err]\]\n")
-
-
-/proc/sql_poll_admins()
- if(!config.sql_enabled)
- return
- var/admincount = GLOB.admins.len
- establish_db_connection()
- if(!dbcon.IsConnected())
- log_game("SQL ERROR during admin polling. Failed to connect.")
- else
- var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
- var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("legacy_population")] (admincount, time) VALUES ([admincount], '[sqltime]')")
- if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during admin polling. Error : \[[err]\]\n")
-
/proc/sql_report_round_start()
// TODO
if(!config.sql_enabled)
@@ -61,16 +29,17 @@
var/laname
var/lakey
if(H.lastattacker)
- laname = sanitizeSQL(H.lastattacker:real_name)
- lakey = sanitizeSQL(H.lastattacker:key)
+ laname = sanitizeSQL(H.lastattacker)
+ if(H.lastattackerckey)
+ lakey = sanitizeSQL(H.lastattackerckey)
var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
var/coord = "[H.x], [H.y], [H.z]"
// to_chat(world, "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.getBrainLoss()], [H.getOxyLoss()])")
establish_db_connection()
- if(!dbcon.IsConnected())
+ if(!GLOB.dbcon.IsConnected())
log_game("SQL ERROR during death reporting. Failed to connect.")
else
- var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, coord) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.getBruteLoss()], [H.getFireLoss()], [H.getBrainLoss()], [H.getOxyLoss()], '[coord]')")
+ var/DBQuery/query = GLOB.dbcon.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, coord) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.getBruteLoss()], [H.getFireLoss()], [H.getBrainLoss()], [H.getOxyLoss()], '[coord]')")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during death reporting. Error : \[[err]\]\n")
@@ -96,48 +65,40 @@
var/laname
var/lakey
if(H.lastattacker)
- laname = sanitizeSQL(H.lastattacker:real_name)
- lakey = sanitizeSQL(H.lastattacker:key)
+ laname = sanitizeSQL(H.lastattacker)
+ if(H.lastattackerckey)
+ lakey = sanitizeSQL(H.lastattackerckey)
var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
var/coord = "[H.x], [H.y], [H.z]"
// to_chat(world, "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])")
establish_db_connection()
- if(!dbcon.IsConnected())
+ if(!GLOB.dbcon.IsConnected())
log_game("SQL ERROR during death reporting. Failed to connect.")
else
- var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, coord) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.getBruteLoss()], [H.getFireLoss()], [H.getBrainLoss()], [H.getOxyLoss()], '[coord]')")
+ var/DBQuery/query = GLOB.dbcon.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, coord) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.getBruteLoss()], [H.getFireLoss()], [H.getBrainLoss()], [H.getOxyLoss()], '[coord]')")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during death reporting. Error : \[[err]\]\n")
-/proc/statistic_cycle()
- if(!config.sql_enabled)
- return
- while(1)
- sql_poll_players()
- sleep(600)
- sql_poll_admins()
- sleep(6000) //Poll every ten minutes
-
//This proc is used for feedback. It is executed at round end.
/proc/sql_commit_feedback()
- if(!blackbox)
+ if(!GLOB.blackbox)
log_game("Round ended without a blackbox recorder. No feedback was sent to the database.")
return
//content is a list of lists. Each item in the list is a list with two fields, a variable name and a value. Items MUST only have these two values.
- var/list/datum/feedback_variable/content = blackbox.get_round_feedback()
+ var/list/datum/feedback_variable/content = GLOB.blackbox.get_round_feedback()
if(!content)
log_game("Round ended without any feedback being generated. No feedback was sent to the database.")
return
establish_db_connection()
- if(!dbcon.IsConnected())
+ if(!GLOB.dbcon.IsConnected())
log_game("SQL ERROR during feedback reporting. Failed to connect.")
else
- var/DBQuery/max_query = dbcon.NewQuery("SELECT MAX(roundid) AS max_round_id FROM [format_table_name("feedback")]")
+ var/DBQuery/max_query = GLOB.dbcon.NewQuery("SELECT MAX(roundid) AS max_round_id FROM [format_table_name("feedback")]")
max_query.Execute()
var/newroundid
@@ -157,7 +118,7 @@
var/variable = item.get_variable()
var/value = item.get_value()
- var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("feedback")] (id, roundid, time, variable, value) VALUES (null, [newroundid], Now(), '[variable]', '[value]')")
+ var/DBQuery/query = GLOB.dbcon.NewQuery("INSERT INTO [format_table_name("feedback")] (id, roundid, time, variable, value) VALUES (null, [newroundid], Now(), '[variable]', '[value]')")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during feedback reporting. Error : \[[err]\]\n")
diff --git a/code/defines/vox_sounds.dm b/code/defines/vox_sounds.dm
index bb155337502..1d7bb9753a0 100644
--- a/code/defines/vox_sounds.dm
+++ b/code/defines/vox_sounds.dm
@@ -1,7 +1,7 @@
// List is required to compile the resources into the game when it loads.
// Dynamically loading it has bad results with sounds overtaking each other, even with the wait variable.
-var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
+GLOBAL_LIST_INIT(vox_sounds, list("," = 'sound/vox_fem/,.ogg',
"." = 'sound/vox_fem/..ogg',
"a" = 'sound/vox_fem/a.ogg',
"abortions" = 'sound/vox_fem/abortions.ogg',
@@ -1267,4 +1267,4 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"zero" = 'sound/vox_fem/zero.ogg',
"zone" = 'sound/vox_fem/zone.ogg',
"zulu" = 'sound/vox_fem/zulu.ogg'
-)
+))
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 97eca30cbfe..c33e7609685 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -13,35 +13,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
*/
-/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
-/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
-var/list/teleportlocs = list()
-/hook/startup/proc/process_teleport_locs()
- for(var/area/AR in world)
- if(AR.no_teleportlocs) continue
- if(teleportlocs.Find(AR.name)) continue
- var/turf/picked = safepick(get_area_turfs(AR.type))
- if(picked && is_station_level(picked.z))
- teleportlocs += AR.name
- teleportlocs[AR.name] = AR
-
- teleportlocs = sortAssoc(teleportlocs)
-
- return 1
-
-var/list/ghostteleportlocs = list()
-/hook/startup/proc/process_ghost_teleport_locs()
- for(var/area/AR in world)
- if(ghostteleportlocs.Find(AR.name)) continue
- var/list/turfs = get_area_turfs(AR.type)
- if(turfs.len)
- ghostteleportlocs += AR.name
- ghostteleportlocs[AR.name] = AR
-
- ghostteleportlocs = sortAssoc(ghostteleportlocs)
-
- return 1
-
/*-----------------------------------------------------------------------------*/
@@ -70,7 +41,7 @@ var/list/ghostteleportlocs = list()
power_environ = FALSE
valid_territory = FALSE
outdoors = TRUE
- ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg')
+ ambientsounds = SPACE_SOUNDS
/area/space/nearstation
icon_state = "space_near"
@@ -117,39 +88,33 @@ var/list/ghostteleportlocs = list()
/area/shuttle/escape
name = "\improper Emergency Shuttle"
- music = "music/escape.ogg"
icon_state = "shuttle2"
nad_allowed = TRUE
/area/shuttle/pod_1
name = "\improper Escape Pod One"
- music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
/area/shuttle/pod_2
name = "\improper Escape Pod Two"
- music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
/area/shuttle/pod_3
name = "\improper Escape Pod Three"
- music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
parallax_movedir = EAST
/area/shuttle/pod_4
name = "\improper Escape Pod Four"
- music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
parallax_movedir = EAST
/area/shuttle/escape_pod1
name = "\improper Escape Pod One"
- music = "music/escape.ogg"
nad_allowed = TRUE
/area/shuttle/escape_pod1/station
@@ -163,7 +128,6 @@ var/list/ghostteleportlocs = list()
/area/shuttle/escape_pod2
name = "\improper Escape Pod Two"
- music = "music/escape.ogg"
nad_allowed = TRUE
/area/shuttle/escape_pod2/station
@@ -177,7 +141,6 @@ var/list/ghostteleportlocs = list()
/area/shuttle/escape_pod3
name = "\improper Escape Pod Three"
- music = "music/escape.ogg"
nad_allowed = TRUE
/area/shuttle/escape_pod3/station
@@ -191,7 +154,6 @@ var/list/ghostteleportlocs = list()
/area/shuttle/escape_pod5 //Pod 4 was lost to meteors
name = "\improper Escape Pod Five"
- music = "music/escape.ogg"
nad_allowed = TRUE
/area/shuttle/escape_pod5/station
@@ -205,7 +167,6 @@ var/list/ghostteleportlocs = list()
/area/shuttle/mining
name = "\improper Mining Shuttle"
- music = "music/escape.ogg"
icon_state = "shuttle"
/area/shuttle/transport
@@ -246,7 +207,6 @@ var/list/ghostteleportlocs = list()
/area/shuttle/siberia
name = "\improper Labor Camp Shuttle"
- music = "music/escape.ogg"
icon_state = "shuttle"
/area/shuttle/specops
@@ -329,7 +289,6 @@ var/list/ghostteleportlocs = list()
/area/shuttle/research
name = "\improper Research Shuttle"
- music = "music/escape.ogg"
icon_state = "shuttle"
/area/shuttle/research/station
@@ -498,6 +457,7 @@ var/list/ghostteleportlocs = list()
requires_power = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
nad_allowed = TRUE
+ ambientsounds = HIGHSEC_SOUNDS
/area/syndicate_mothership/control
name = "\improper Syndicate Control Room"
@@ -519,6 +479,7 @@ var/list/ghostteleportlocs = list()
requires_power = FALSE
valid_territory = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
+ ambientsounds = MINING_SOUNDS
/area/asteroid/cave // -- TLE
name = "\improper Asteroid - Underground"
@@ -565,6 +526,7 @@ var/list/ghostteleportlocs = list()
/area/exploration/methlab
name = "\improper Abandoned Drug Lab"
icon_state = "green"
+ there_can_be_many = TRUE
//Abductors
/area/abductor_ship
@@ -633,7 +595,7 @@ var/list/ghostteleportlocs = list()
//Maintenance
/area/maintenance
- ambientsounds = list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg', 'sound/ambience/ambimaint5.ogg')
+ ambientsounds = MAINTENANCE_SOUNDS
valid_territory = FALSE
/area/maintenance/atmos_control
@@ -688,10 +650,6 @@ var/list/ghostteleportlocs = list()
name = "Engineering Maintenance"
icon_state = "amaint"
-/area/maintenance/engi_shuttle
- name = "Engineering Shuttle Access"
- icon_state = "maint_e_shuttle"
-
/area/maintenance/storage
name = "Atmospherics Maintenance"
icon_state = "green"
@@ -803,12 +761,11 @@ var/list/ghostteleportlocs = list()
/area/bridge
name = "\improper Bridge"
icon_state = "bridge"
- music = "signal"
+ ambientsounds = list('sound/ambience/signal.ogg')
/area/bridge/meeting_room
name = "\improper Heads of Staff Meeting Room"
icon_state = "meeting"
- music = null
/area/crew_quarters/captain
name = "\improper Captain's Office"
@@ -969,10 +926,12 @@ var/list/ghostteleportlocs = list()
name = "\improper Abandoned Library"
icon_state = "library"
+/area/chapel
+ icon_state = "chapel"
+ ambientsounds = HOLY_SOUNDS
+
/area/chapel/main
name = "\improper Chapel"
- icon_state = "chapel"
- ambientsounds = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/music/traitor.ogg')
/area/chapel/office
name = "\improper Chapel Office"
@@ -1107,7 +1066,7 @@ var/list/ghostteleportlocs = list()
//Engineering
/area/engine
- ambientsounds = list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg')
+ ambientsounds = ENGINEERING_SOUNDS
/area/engine/engine_smes
name = "\improper Engineering SMES"
@@ -1161,6 +1120,7 @@ var/list/ghostteleportlocs = list()
requires_power = FALSE
valid_territory = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT
+ ambientsounds = ENGINEERING_SOUNDS
/area/solar/auxport
name = "\improper Fore Port Solar Array"
@@ -1227,18 +1187,18 @@ var/list/ghostteleportlocs = list()
/area/teleporter
name = "\improper Teleporter"
icon_state = "teleporter"
- music = "signal"
+ ambientsounds = ENGINEERING_SOUNDS
/area/gateway
name = "\improper Gateway"
icon_state = "teleporter"
- music = "signal"
+ ambientsounds = ENGINEERING_SOUNDS
/area/AIsattele
name = "\improper Abandoned Teleporter"
icon_state = "teleporter"
- music = "signal"
- ambientsounds = list('sound/ambience/ambimalf.ogg')
+ ambientsounds = list('sound/ambience/ambimalf.ogg', 'sound/ambience/signal.ogg')
+ there_can_be_many = TRUE
/area/toxins/explab
name = "\improper E.X.P.E.R.I-MENTOR Lab"
@@ -1250,42 +1210,39 @@ var/list/ghostteleportlocs = list()
//MedBay
+/area/medical
+ ambientsounds = MEDICAL_SOUNDS
+
/area/medical/medbay
name = "\improper Medbay"
icon_state = "medbay"
- music = 'sound/ambience/signal.ogg'
//Medbay is a large area, these additional areas help level out APC load.
/area/medical/medbay2
name = "\improper Medbay"
icon_state = "medbay2"
- music = 'sound/ambience/signal.ogg'
/area/medical/medbay3
name = "\improper Medbay"
icon_state = "medbay3"
- music = 'sound/ambience/signal.ogg'
/area/medical/biostorage
name = "\improper Medical Storage"
icon_state = "medbaysecstorage"
- music = 'sound/ambience/signal.ogg'
/area/medical/reception
name = "\improper Medbay Reception"
icon_state = "medbay"
- music = 'sound/ambience/signal.ogg'
/area/medical/psych
name = "\improper Psych Room"
icon_state = "medbaypsych"
- music = 'sound/ambience/signal.ogg'
+ ambientsounds = list('sound/ambience/aurora_caelus_short.ogg')
/area/medical/medbreak
name = "\improper Break Room"
icon_state = "medbaybreak"
- music = 'sound/ambience/signal.ogg'
/area/medical/patients_rooms
name = "\improper Patient's Rooms"
@@ -1342,7 +1299,7 @@ var/list/ghostteleportlocs = list()
/area/medical/morgue
name = "\improper Morgue"
icon_state = "morgue"
- ambientsounds = list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg')
+ ambientsounds = SPOOKY_SOUNDS
/area/medical/chemistry
name = "\improper Chemistry"
@@ -1390,6 +1347,9 @@ var/list/ghostteleportlocs = list()
//Security
+/area/security
+ ambientsounds = HIGHSEC_SOUNDS
+
/area/security/main
name = "\improper Security Office"
icon_state = "securityoffice"
@@ -1522,6 +1482,7 @@ var/list/ghostteleportlocs = list()
/area/security/detectives_office
name = "\improper Detective's Office"
icon_state = "detective"
+ ambientsounds = list('sound/ambience/ambidet1.ogg', 'sound/ambience/ambidet2.ogg')
/area/security/range
name = "\improper Firing Range"
@@ -1748,6 +1709,7 @@ var/list/ghostteleportlocs = list()
/area/djstation
name = "\improper Ruskie DJ Station"
icon_state = "DJ"
+ there_can_be_many = TRUE
/area/djstation/solars
name = "\improper Ruskie DJ Station Solars"
@@ -1824,6 +1786,7 @@ var/list/ghostteleportlocs = list()
/area/derelict/teleporter
name = "\improper Derelict Teleporter"
icon_state = "teleporter"
+ there_can_be_many = TRUE
/area/derelict/eva
name = "Derelict EVA Storage"
@@ -1865,84 +1828,12 @@ var/list/ghostteleportlocs = list()
name = "Derelict Atmospherics"
icon_state = "red"
-//HALF-BUILT STATION (REPLACES DERELICT IN BAYCODE, ABOVE IS LEFT FOR DOWNSTREAM)
-
-/area/shuttle/constructionsite
- name = "\improper Construction Site Shuttle"
- icon_state = "yellow"
- parallax_movedir = EAST
-
-/area/shuttle/constructionsite/station
- name = "\improper Construction Site Shuttle"
-
-/area/shuttle/constructionsite/site
- name = "\improper Construction Site Shuttle"
-
-/area/constructionsite
- name = "\improper Construction Site"
- icon_state = "storage"
-
-/area/constructionsite/storage
- name = "\improper Construction Site Storage Area"
-
-/area/constructionsite/science
- name = "\improper Construction Site Research"
- icon_state = "medresearch"
-
-/area/constructionsite/bridge
- name = "\improper Construction Site Bridge"
- icon_state = "bridge"
-
-/area/constructionsite/hallway/center
- name = "\improper Construction Site Central Hallway"
- icon_state = "hallC"
-
-/area/constructionsite/hallway/engcore
- name = "\improper Construction Site Eng Core"
- icon_state = "green"
-
-/area/constructionsite/hallway/fore
- name = "\improper Construction Site Fore"
- icon_state = "green"
-
-/area/constructionsite/hallway/port
- name = "\improper Construction Site Port"
- icon_state = "hallP"
-
-/area/constructionsite/hallway/aft
- name = "\improper Construction Site Aft"
- icon_state = "hallA"
-
-/area/constructionsite/hallway/starboard
- name = "\improper Construction Site Starboard"
- icon_state = "hallS"
-
-/area/constructionsite/atmospherics
- name = "\improper Construction Site Atmospherics"
- icon_state = "atmos"
-
-/area/constructionsite/medical
- name = "\improper Construction Site Medbay"
- icon_state = "medbay"
-
-/area/constructionsite/ai
- name = "\improper Construction Computer Core"
- icon_state = "ai"
-
-/area/constructionsite/engineering
- name = "\improper Construction Site Engine Bay"
- icon_state = "engine"
-
-/area/solar/constructionsite
- name = "\improper Construction Site Solars"
- icon_state = "panelsA"
-
-
//Construction
/area/construction
name = "\improper Construction Area"
icon_state = "yellow"
+ ambientsounds = ENGINEERING_SOUNDS
/area/mining_construction
name = "Auxillary Base Construction"
@@ -2035,6 +1926,7 @@ var/list/ghostteleportlocs = list()
/area/ai_monitored/storage/eva
name = "EVA Storage"
icon_state = "eva"
+ ambientsounds = HIGHSEC_SOUNDS
/area/ai_monitored/storage/secure
name = "Secure Storage"
@@ -2045,7 +1937,7 @@ var/list/ghostteleportlocs = list()
icon_state = "storage"
/area/turret_protected/
- ambientsounds = list('sound/ambience/ambimalf.ogg')
+ ambientsounds = list('sound/ambience/ambimalf.ogg', 'sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg')
/area/turret_protected/ai_upload
name = "\improper AI Upload Chamber"
@@ -2107,16 +1999,14 @@ var/list/ghostteleportlocs = list()
// Telecommunications Satellite
/area/tcommsat
- ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
-
-/area/tcommsat/entrance
- name = "\improper Telecoms Teleporter"
- icon_state = "tcomsatentrance"
+ ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg', 'sound/ambience/ambitech.ogg',\
+ 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg', 'sound/ambience/ambimystery.ogg')
/area/tcommsat/chamber
name = "\improper Telecoms Central Compartment"
icon_state = "tcomsatcham"
+// These areas are needed for MetaStation's AI sat
/area/turret_protected/tcomsat
name = "\improper Telecoms Satellite"
icon_state = "tcomsatlob"
@@ -2158,6 +2048,7 @@ var/list/ghostteleportlocs = list()
name = "\improper Strange Location"
icon_state = "away"
report_alerts = FALSE
+ ambientsounds = AWAY_MISSION_SOUNDS
/area/awaymission/example
name = "\improper Strange Station"
@@ -2172,7 +2063,7 @@ var/list/ghostteleportlocs = list()
icon_state = "beach"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
requires_power = FALSE
- ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg')
+ ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg', 'sound/ambience/seag2.ogg', 'sound/ambience/seag2.ogg', 'sound/ambience/ambiodd.ogg', 'sound/ambience/ambinice.ogg')
/area/awaymission/undersea
name = "Undersea"
@@ -2285,7 +2176,7 @@ var/list/ghostteleportlocs = list()
*/
// CENTCOM
-var/list/centcom_areas = list (
+GLOBAL_LIST_INIT(centcom_areas, list(
/area/centcom,
/area/shuttle/escape_pod1/centcom,
/area/shuttle/escape_pod2/centcom,
@@ -2294,10 +2185,10 @@ var/list/centcom_areas = list (
/area/shuttle/transport1,
/area/shuttle/administration/centcom,
/area/shuttle/specops/centcom,
-)
+))
//SPACE STATION 13
-var/list/the_station_areas = list (
+GLOBAL_LIST_INIT(the_station_areas, list(
/area/shuttle/arrival,
/area/shuttle/escape,
/area/shuttle/escape_pod1/station,
@@ -2344,4 +2235,4 @@ var/list/the_station_areas = list (
/area/turret_protected/ai_upload, //do not try to simplify to "/area/turret_protected" --rastaf0
/area/turret_protected/ai_upload_foyer,
/area/turret_protected/ai,
-)
+))
diff --git a/code/game/area/ai_monitored.dm b/code/game/area/ai_monitored.dm
index 2ca607921ff..8f65ac634f4 100644
--- a/code/game/area/ai_monitored.dm
+++ b/code/game/area/ai_monitored.dm
@@ -3,16 +3,14 @@
var/obj/machinery/camera/motioncamera = null
-/area/ai_monitored/New()
- ..()
+/area/ai_monitored/LateInitialize()
+ . = ..()
// locate and store the motioncamera
- spawn (20) // spawn on a delay to let turfs/objs load
- for(var/obj/machinery/camera/M in src)
- if(M.isMotion())
- motioncamera = M
- M.area_motion = src
- return
- return
+ for(var/obj/machinery/camera/M in src)
+ if(M.isMotion())
+ motioncamera = M
+ M.area_motion = src
+ break
/area/ai_monitored/Entered(atom/movable/O)
..()
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index dbc0a8c567b..da80a6e775c 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -26,7 +26,6 @@
var/power_equip = TRUE
var/power_light = TRUE
var/power_environ = TRUE
- var/music = null
var/used_equip = FALSE
var/used_light = FALSE
var/used_environ = FALSE
@@ -56,12 +55,7 @@
var/global/global_uid = 0
var/uid
- var/list/ambientsounds = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg',\
- 'sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg',\
- 'sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg',\
- 'sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg',\
- 'sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg',\
- 'sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
+ var/list/ambientsounds = GENERIC_SOUNDS
var/fast_despawn = FALSE
var/can_get_auto_cryod = TRUE
@@ -110,7 +104,7 @@
/area/proc/reg_in_areas_in_z()
if(contents.len)
- var/list/areas_in_z = space_manager.areas_in_z
+ var/list/areas_in_z = GLOB.space_manager.areas_in_z
var/z
for(var/i in 1 to contents.len)
var/atom/thing = contents[i]
@@ -155,9 +149,9 @@
for(var/obj/machinery/alarm/AA in src)
AA.update_icon()
- air_alarm_repository.update_cache(src)
+ GLOB.air_alarm_repository.update_cache(src)
return 1
- air_alarm_repository.update_cache(src)
+ GLOB.air_alarm_repository.update_cache(src)
return 0
/area/proc/air_doors_close()
@@ -379,20 +373,24 @@
// Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
if(L && L.client && !L.client.ambience_playing && (L.client.prefs.sound & SOUND_BUZZ)) //split off the white noise from the rest of the ambience because of annoyance complaints - Kluys
- L.client.ambience_playing = 1
- L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ)
+ L.client.ambience_playing = TRUE
+ SEND_SOUND(L, sound('sound/ambience/shipambience.ogg', repeat = TRUE, wait = FALSE, volume = 35, channel = CHANNEL_BUZZ))
else if(L && L.client && !(L.client.prefs.sound & SOUND_BUZZ))
- L.client.ambience_playing = 0
+ L.client.ambience_playing = FALSE
if(prob(35) && L && L.client && (L.client.prefs.sound & SOUND_AMBIENCE))
var/sound = pick(ambientsounds)
if(!L.client.played)
- L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE)
- L.client.played = 1
- spawn(600) //ewww - this is very very bad
- if(L && L.client)
- L.client.played = 0
+ SEND_SOUND(L, sound(sound, repeat = FALSE, wait = FALSE, volume = 25, channel = CHANNEL_AMBIENCE))
+ L.client.played = TRUE
+ addtimer(CALLBACK(L.client, /client/proc/ResetAmbiencePlayed), 600)
+
+/**
+ * Reset the played var to false on the client
+ */
+/client/proc/ResetAmbiencePlayed()
+ played = FALSE
/area/proc/gravitychange(var/gravitystate = 0, var/area/A)
A.has_gravity = gravitystate
@@ -434,7 +432,7 @@
else
// There's a gravity generator on our z level
// This would do well when integrated with the z level manager
- if(T && gravity_generators["[T.z]"] && length(gravity_generators["[T.z]"]))
+ if(T && GLOB.gravity_generators["[T.z]"] && length(GLOB.gravity_generators["[T.z]"]))
return 1
return 0
diff --git a/code/game/area/areas/depot-areas.dm b/code/game/area/areas/depot-areas.dm
index 7a7c934df35..4a6606d836e 100644
--- a/code/game/area/areas/depot-areas.dm
+++ b/code/game/area/areas/depot-areas.dm
@@ -216,7 +216,8 @@
if(!silent)
announce_here("Depot Code BLUE", reason)
var/list/possible_bot_spawns = list()
- for(var/obj/effect/landmark/L in GLOB.landmarks_list)
+ for(var/thing in GLOB.landmarks_list)
+ var/obj/effect/landmark/L = thing
if(L.name == "syndi_depot_bot")
possible_bot_spawns |= L
if(possible_bot_spawns.len)
@@ -248,7 +249,8 @@
comms_online = TRUE
if(comms_online)
spawn(0)
- for(var/obj/effect/landmark/L in GLOB.landmarks_list)
+ for(var/thing in GLOB.landmarks_list)
+ var/obj/effect/landmark/L = thing
if(prob(50))
if(L.name == "syndi_depot_backup")
var/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/S = new /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space(get_turf(L))
@@ -290,7 +292,7 @@
if(!reactor.has_overloaded)
reactor.overload(containment_failure)
else
- log_debug("Depot: [src] called activate_self_destruct with no reactor.");
+ log_debug("Depot: [src] called activate_self_destruct with no reactor.")
message_admins("Syndicate Depot lacks reactor to initiate self-destruct. Must be destroyed manually.")
updateicon()
@@ -344,7 +346,8 @@
/area/syndicate_depot/core/proc/shields_up()
if(shield_list.len)
return
- for(var/obj/effect/landmark/L in GLOB.landmarks_list)
+ for(var/thing in GLOB.landmarks_list)
+ var/obj/effect/landmark/L = thing
if(L.name == "syndi_depot_shield")
var/obj/machinery/shieldwall/syndicate/S = new /obj/machinery/shieldwall/syndicate(L.loc)
shield_list += S.UID()
diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm
index 0b07fffda5e..b621bade493 100644
--- a/code/game/area/areas/mining.dm
+++ b/code/game/area/areas/mining.dm
@@ -7,7 +7,6 @@
/area/mine/explored
name = "Mine"
icon_state = "explored"
- music = null
always_unpowered = TRUE
requires_power = TRUE
poweralm = FALSE
@@ -15,7 +14,7 @@
power_equip = FALSE
power_light = FALSE
outdoors = TRUE
- ambientsounds = list('sound/ambience/ambimine.ogg')
+ ambientsounds = MINING_SOUNDS
flags = NONE
/area/mine/dangerous/explored/golem
@@ -24,7 +23,6 @@
/area/mine/unexplored
name = "Mine"
icon_state = "unexplored"
- music = null
always_unpowered = TRUE
requires_power = TRUE
poweralm = FALSE
@@ -32,7 +30,7 @@
power_equip = FALSE
power_light = FALSE
outdoors = TRUE
- ambientsounds = list('sound/ambience/ambimine.ogg')
+ ambientsounds = MINING_SOUNDS
flags = NONE
/area/mine/lobby
@@ -80,6 +78,7 @@
/area/mine/laborcamp/security
name = "Labor Camp Security"
icon_state = "security"
+ ambientsounds = HIGHSEC_SOUNDS
/area/mine/podbay
name = "Mining Podbay"
@@ -95,26 +94,24 @@
/area/lavaland/surface
name = "Lavaland"
icon_state = "explored"
- music = null
always_unpowered = TRUE
poweralm = FALSE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
requires_power = TRUE
- ambientsounds = list('sound/ambience/ambilava.ogg')
+ ambientsounds = MINING_SOUNDS
/area/lavaland/underground
name = "Lavaland Caves"
icon_state = "unexplored"
- music = null
always_unpowered = TRUE
requires_power = TRUE
poweralm = FALSE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
- ambientsounds = list('sound/ambience/ambilava.ogg')
+ ambientsounds = MINING_SOUNDS
/area/lavaland/surface/outdoors
name = "Lavaland Wastes"
diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm
index 5baf1fe315e..53544d8643b 100644
--- a/code/game/area/areas/ruins/lavaland.dm
+++ b/code/game/area/areas/ruins/lavaland.dm
@@ -5,6 +5,7 @@
/area/ruin/powered/clownplanet
icon_state = "dk_yellow"
+ ambientsounds = list('sound/music/clown.ogg')
/area/ruin/powered/animal_hospital
icon_state = "dk_yellow"
@@ -38,7 +39,7 @@
/area/ruin/unpowered/syndicate_lava_base
name = "Secret Base"
icon_state = "dk_yellow"
- ambientsounds = list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg')
+ ambientsounds = HIGHSEC_SOUNDS
report_alerts = FALSE
hide_attacklogs = TRUE
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index f9d66372df5..776a2bccd12 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -14,21 +14,18 @@
var/germ_level = GERM_LEVEL_AMBIENT // The higher the germ level, the more germ on the atom.
var/simulated = TRUE //filter for actions - used by lighting overlays
var/atom_say_verb = "says"
- var/dont_save = 0 // For atoms that are temporary by necessity - like lighting overlays
-
+ var/bubble_icon = "default" ///what icon the mob uses for speechbubbles
+ var/dont_save = FALSE // For atoms that are temporary by necessity - like lighting overlays
///Chemistry.
var/container_type = NONE
var/datum/reagents/reagents = null
//This atom's HUD (med/sec, etc) images. Associative list.
- var/list/image/hud_list = list()
+ var/list/image/hud_list
//HUD images that this atom can provide.
var/list/hud_possible
- ///Chemistry.
-
-
//Value used to increment ex_act() if reactionary_explosions is on
var/explosion_block = 0
@@ -38,9 +35,9 @@
//Detective Work, used for allowing a given atom to leave its fibers on stuff. Allowed by default
var/can_leave_fibers = TRUE
- var/allow_spin = 1 //Set this to 1 for a _target_ that is being thrown at; if an atom has this set to 1 then atoms thrown AT it will not spin; currently used for the singularity. -Fox
+ var/allow_spin = TRUE //Set this to 1 for a _target_ that is being thrown at; if an atom has this set to 1 then atoms thrown AT it will not spin; currently used for the singularity. -Fox
- var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
+ var/admin_spawned = FALSE //was this spawned by an admin? used for stat tracking stuff.
var/initialized = FALSE
@@ -52,8 +49,8 @@
//its inherent color, the colored paint applied on it, special color effect etc...
/atom/New(loc, ...)
- if(use_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New()
- _preloader.load(src)
+ if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
+ GLOB._preloader.load(src)
. = ..()
attempt_init(arglist(args))
@@ -67,7 +64,6 @@
// we were deleted
return
-
//Called after New if the map is being loaded. mapload = TRUE
//Called from base of New if the map is not being loaded. mapload = FALSE
//This base must be called or derivatives must set initialized to TRUE
@@ -101,7 +97,6 @@
return INITIALIZE_HINT_NORMAL
-
//called if Initialize returns INITIALIZE_HINT_LATELOAD
/atom/proc/LateInitialize()
return
@@ -114,34 +109,34 @@
return
/atom/proc/onCentcom()
+ . = FALSE
var/turf/T = get_turf(src)
if(!T)
- return 0
+ return
if(!is_admin_level(T.z))//if not, don't bother
- return 0
+ return
//check for centcomm shuttles
for(var/centcom_shuttle in list("emergency", "pod1", "pod2", "pod3", "pod4", "ferry"))
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(centcom_shuttle)
if(T in M.areaInstance)
- return 1
+ return TRUE
//finally check for centcom itself
- return istype(T.loc,/area/centcom)
+ return istype(T.loc, /area/centcom)
/atom/proc/onSyndieBase()
+ . = FALSE
var/turf/T = get_turf(src)
if(!T)
- return 0
+ return
if(!is_admin_level(T.z))//if not, don't bother
- return 0
+ return
if(istype(T.loc, /area/shuttle/syndicate_elite) || istype(T.loc, /area/syndicate_mothership))
- return 1
-
- return 0
+ return TRUE
/atom/Destroy()
if(alternate_appearances)
@@ -164,6 +159,34 @@
SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir)
dir = newdir
+/*
+ Sets the atom's pixel locations based on the atom's `dir` variable, and what pixel offset arguments are passed into it
+ If no arguments are supplied, `pixel_x` or `pixel_y` will be set to 0
+ Used primarily for when players attach mountable frames to walls (APC frame, fire alarm frame, etc.)
+*/
+/atom/proc/set_pixel_offsets_from_dir(pixel_north = 0, pixel_south = 0, pixel_east = 0, pixel_west = 0)
+ switch(dir)
+ if(NORTH)
+ pixel_y = pixel_north
+ if(SOUTH)
+ pixel_y = pixel_south
+ if(EAST)
+ pixel_x = pixel_east
+ if(WEST)
+ pixel_x = pixel_west
+ if(NORTHEAST)
+ pixel_y = pixel_north
+ pixel_x = pixel_east
+ if(NORTHWEST)
+ pixel_y = pixel_north
+ pixel_x = pixel_west
+ if(SOUTHEAST)
+ pixel_y = pixel_south
+ pixel_x = pixel_east
+ if(SOUTHWEST)
+ pixel_y = pixel_south
+ pixel_x = pixel_west
+
///Handle melee attack by a mech
/atom/proc/mech_melee_attack(obj/mecha/M)
return
@@ -202,9 +225,7 @@
else
return null
-/atom/proc/check_eye(user as mob)
- if(istype(user, /mob/living/silicon/ai)) // WHYYYY
- return 1
+/atom/proc/check_eye(mob/user)
return
/atom/proc/on_reagent_change()
@@ -219,11 +240,11 @@
/// Is this atom injectable into other atoms
/atom/proc/is_injectable(mob/user, allowmobs = TRUE)
- return reagents && (container_type & (INJECTABLE | REFILLABLE))
+ return reagents && (container_type & (INJECTABLE|REFILLABLE))
/// Can we draw from this atom with an injectable atom
/atom/proc/is_drawable(mob/user, allowmobs = TRUE)
- return reagents && (container_type & (DRAWABLE | DRAINABLE))
+ return reagents && (container_type & (DRAWABLE|DRAINABLE))
/// Can this atoms reagents be refilled
/atom/proc/is_refillable()
@@ -234,12 +255,12 @@
return reagents && (container_type & DRAINABLE)
/atom/proc/CheckExit()
- return 1
+ return TRUE
/atom/proc/HasProximity(atom/movable/AM as mob|obj)
return
-/atom/proc/emp_act(var/severity)
+/atom/proc/emp_act(severity)
return
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
@@ -249,13 +270,13 @@
/atom/proc/in_contents_of(container)//can take class or object instance as argument
if(ispath(container))
if(istype(src.loc, container))
- return 1
+ return TRUE
else if(src in container)
- return 1
- return
+ return TRUE
+ return FALSE
/*
- * atom/proc/search_contents_for(path,list/filter_path=null)
+ * atom/proc/search_contents_for(path, list/filter_path = null)
* Recursevly searches all atom contens (including contents contents and so on).
*
* ARGS: path - search atom contents for atoms of this type
@@ -264,7 +285,7 @@
* RETURNS: list of found atoms
*/
-/atom/proc/search_contents_for(path,list/filter_path=null)
+/atom/proc/search_contents_for(path, list/filter_path = null)
var/list/found = list()
for(var/atom/A in src)
if(istype(A, path))
@@ -276,7 +297,7 @@
if(!pass)
continue
if(A.contents.len)
- found += A.search_contents_for(path,filter_path)
+ found += A.search_contents_for(path, filter_path)
return found
@@ -397,43 +418,58 @@
/atom/proc/get_spooked()
return
-/atom/proc/add_hiddenprint(mob/living/M as mob)
- if(isnull(M)) return
- if(isnull(M.key)) return
+/**
+ Base proc, intended to be overriden.
+
+ This should only be called from one place: inside the slippery component.
+ Called after a human mob slips on this atom.
+
+ If you want the person who slipped to have something special done to them, put it here.
+*/
+/atom/proc/after_slip(mob/living/carbon/human/H)
+ return
+
+/atom/proc/add_hiddenprint(mob/living/M)
+ if(isnull(M))
+ return
+ if(isnull(M.key))
+ return
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!istype(H.dna, /datum/dna))
- return 0
+ return FALSE
if(H.gloves)
if(fingerprintslast != H.ckey)
//Add the list if it does not exist.
if(!fingerprintshidden)
fingerprintshidden = list()
- fingerprintshidden += text("\[[time_stamp()]\] (Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
+ fingerprintshidden += text("\[[time_stamp()]\] (Wearing gloves). Real name: [], Key: []", H.real_name, H.key)
fingerprintslast = H.ckey
- return 0
+ return FALSE
if(!fingerprints)
if(fingerprintslast != H.ckey)
//Add the list if it does not exist.
if(!fingerprintshidden)
fingerprintshidden = list()
- fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []",H.real_name, H.key)
+ fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []", H.real_name, H.key)
fingerprintslast = H.ckey
- return 1
+ return TRUE
else
if(fingerprintslast != M.ckey)
//Add the list if it does not exist.
if(!fingerprintshidden)
fingerprintshidden = list()
- fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []",M.real_name, M.key)
+ fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []", M.real_name, M.key)
fingerprintslast = M.ckey
return
//Set ignoregloves to add prints irrespective of the mob having gloves on.
-/atom/proc/add_fingerprint(mob/living/M as mob, ignoregloves = 0)
- if(isnull(M)) return
- if(isnull(M.key)) return
+/atom/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE)
+ if(isnull(M))
+ return
+ if(isnull(M.key))
+ return
if(ishuman(M))
//Add the list if it does not exist.
if(!fingerprintshidden)
@@ -447,7 +483,7 @@
if(fingerprintslast != M.key)
fingerprintshidden += "(Has no fingerprints) Real name: [M.real_name], Key: [M.key]"
fingerprintslast = M.key
- return 0 //Now, lets get to the dirty work.
+ return FALSE //Now, lets get to the dirty work.
//First, make sure their DNA makes sense.
var/mob/living/carbon/human/H = M
if(!istype(H.dna, /datum/dna) || !H.dna.uni_identity || (length(H.dna.uni_identity) != 32))
@@ -460,20 +496,20 @@
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.transfer_prints)
- ignoregloves = 1
+ ignoregloves = TRUE
//Now, deal with gloves.
if(!ignoregloves)
if(H.gloves && H.gloves != src)
if(fingerprintslast != H.ckey)
- fingerprintshidden += text("\[[]\](Wearing gloves). Real name: [], Key: []",time_stamp(), H.real_name, H.key)
+ fingerprintshidden += text("\[[]\](Wearing gloves). Real name: [], Key: []", time_stamp(), H.real_name, H.key)
fingerprintslast = H.ckey
H.gloves.add_fingerprint(M)
- return 0
+ return FALSE
//More adminstuffz
if(fingerprintslast != H.ckey)
- fingerprintshidden += text("\[[]\]Real name: [], Key: []",time_stamp(), H.real_name, H.key)
+ fingerprintshidden += text("\[[]\]Real name: [], Key: []", time_stamp(), H.real_name, H.key)
fingerprintslast = H.ckey
//Make the list if it does not exist.
@@ -486,18 +522,16 @@
// Add the fingerprints
fingerprints[full_print] = full_print
- return 1
+ return TRUE
else
//Smudge up dem prints some
if(fingerprintslast != M.ckey)
- fingerprintshidden += text("\[[]\]Real name: [], Key: []",time_stamp(), M.real_name, M.key)
+ fingerprintshidden += text("\[[]\]Real name: [], Key: []", time_stamp(), M.real_name, M.key)
fingerprintslast = M.ckey
return
-
-/atom/proc/transfer_fingerprints_to(var/atom/A)
-
+/atom/proc/transfer_fingerprints_to(atom/A)
// Make sure everything are lists.
if(!islist(A.fingerprints))
A.fingerprints = list()
@@ -516,7 +550,7 @@
A.fingerprintshidden |= fingerprintshidden.Copy() //admin
A.fingerprintslast = fingerprintslast
-var/list/blood_splatter_icons = list()
+GLOBAL_LIST_EMPTY(blood_splatter_icons)
/atom/proc/blood_splatter_index()
return "\ref[initial(icon)]-[initial(icon_state)]"
@@ -544,7 +578,7 @@ var/list/blood_splatter_icons = list()
/atom/proc/transfer_mob_blood_dna(mob/living/L)
var/new_blood_dna = L.get_blood_dna_list()
if(!new_blood_dna)
- return 0
+ return FALSE
return transfer_blood_dna(new_blood_dna)
/obj/effect/decal/cleanable/blood/splatter/transfer_mob_blood_dna(mob/living/L)
@@ -572,14 +606,13 @@ var/list/blood_splatter_icons = list()
var/old_length = blood_DNA.len
blood_DNA |= blood_dna
if(blood_DNA.len > old_length)
- return 1//some new blood DNA was added
-
+ return TRUE//some new blood DNA was added
//to add blood from a mob onto something, and transfer their dna info
/atom/proc/add_mob_blood(mob/living/M)
var/list/blood_dna = M.get_blood_dna_list()
if(!blood_dna)
- return 0
+ return FALSE
var/bloodcolor = "#A10808"
var/list/b_data = M.get_blood_data(M.get_blood_id())
if(b_data)
@@ -589,7 +622,7 @@ var/list/blood_splatter_icons = list()
//to add blood onto something, with blood dna info to include.
/atom/proc/add_blood(list/blood_dna, color)
- return 0
+ return FALSE
/obj/add_blood(list/blood_dna, color)
return transfer_blood_dna(blood_dna)
@@ -597,10 +630,10 @@ var/list/blood_splatter_icons = list()
/obj/item/add_blood(list/blood_dna, color)
var/blood_count = !blood_DNA ? 0 : blood_DNA.len
if(!..())
- return 0
+ return FALSE
if(!blood_count)//apply the blood-splatter overlay if it isn't already in there
add_blood_overlay(color)
- return 1 //we applied blood to the item
+ return TRUE //we applied blood to the item
/obj/item/clothing/gloves/add_blood(list/blood_dna, color)
. = ..()
@@ -612,25 +645,25 @@ var/list/blood_splatter_icons = list()
B = new /obj/effect/decal/cleanable/blood/splatter(src)
B.transfer_blood_dna(blood_dna) //give blood info to the blood decal.
B.basecolor = color
- return 1 //we bloodied the floor
+ return TRUE //we bloodied the floor
/mob/living/carbon/human/add_blood(list/blood_dna, color)
if(wear_suit)
wear_suit.add_blood(blood_dna, color)
wear_suit.blood_color = color
- update_inv_wear_suit(1)
+ update_inv_wear_suit()
else if(w_uniform)
w_uniform.add_blood(blood_dna, color)
w_uniform.blood_color = color
- update_inv_w_uniform(1)
+ update_inv_w_uniform()
if(head)
head.add_blood(blood_dna, color)
head.blood_color = color
- update_inv_head(0,0)
+ update_inv_head()
if(glasses)
glasses.add_blood(blood_dna, color)
glasses.blood_color = color
- update_inv_glasses(0)
+ update_inv_glasses()
if(gloves)
var/obj/item/clothing/gloves/G = gloves
G.add_blood(blood_dna, color)
@@ -642,20 +675,20 @@ var/list/blood_splatter_icons = list()
transfer_blood_dna(blood_dna)
verbs += /mob/living/carbon/human/proc/bloody_doodle
- update_inv_gloves(1) //handles bloody hands overlays and updating
- return 1
+ update_inv_gloves() //handles bloody hands overlays and updating
+ return TRUE
/obj/item/proc/add_blood_overlay(color)
if(initial(icon) && initial(icon_state))
//try to find a pre-processed blood-splatter. otherwise, make a new one
var/index = blood_splatter_index()
- var/icon/blood_splatter_icon = blood_splatter_icons[index]
+ var/icon/blood_splatter_icon = GLOB.blood_splatter_icons[index]
if(!blood_splatter_icon)
blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object
blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent)
blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
blood_splatter_icon = fcopy_rsc(blood_splatter_icon)
- blood_splatter_icons[index] = blood_splatter_icon
+ GLOB.blood_splatter_icons[index] = blood_splatter_icon
blood_overlay = image(blood_splatter_icon)
blood_overlay.color = color
@@ -681,7 +714,6 @@ var/list/blood_splatter_icons = list()
if(.)
transfer_blood = 0
-
/obj/item/clothing/shoes/clean_blood()
..()
bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_NOT_BLOODY = 0)
@@ -690,23 +722,42 @@ var/list/blood_splatter_icons = list()
var/mob/M = loc
M.update_inv_shoes()
-
-/mob/living/carbon/human/clean_blood()
- if(gloves)
+/mob/living/carbon/human/clean_blood(clean_hands = TRUE, clean_mask = TRUE, clean_feet = TRUE)
+ if(w_uniform && !(wear_suit && wear_suit.flags_inv & HIDEJUMPSUIT))
+ if(w_uniform.clean_blood())
+ update_inv_w_uniform()
+ if(gloves && !(wear_suit && wear_suit.flags_inv & HIDEGLOVES))
if(gloves.clean_blood())
- clean_blood()
- update_inv_gloves()
- gloves.germ_level = 0
- else
- ..() // Clear the Blood_DNA list
- if(bloody_hands)
- bloody_hands = 0
update_inv_gloves()
+ gloves.germ_level = 0
+ clean_hands = FALSE
+ if(shoes && !(wear_suit && wear_suit.flags_inv & HIDESHOES))
+ if(shoes.clean_blood())
+ update_inv_shoes()
+ clean_feet = FALSE
+ if(s_store && !(wear_suit && wear_suit.flags_inv & HIDESUITSTORAGE))
+ if(s_store.clean_blood())
+ update_inv_s_store()
+ if(lip_style && !(head && head.flags_inv & HIDEMASK))
+ lip_style = null
+ update_body()
+ if(glasses && !(wear_mask && wear_mask.flags_inv & HIDEEYES))
+ if(glasses.clean_blood())
+ update_inv_glasses()
+ if(l_ear && !(wear_mask && wear_mask.flags_inv & HIDEEARS))
+ if(l_ear.clean_blood())
+ update_inv_ears()
+ if(r_ear && !(wear_mask && wear_mask.flags_inv & HIDEEARS))
+ if(r_ear.clean_blood())
+ update_inv_ears()
+ if(belt)
+ if(belt.clean_blood())
+ update_inv_belt()
+ ..(clean_hands, clean_mask, clean_feet)
update_icons() //apply the now updated overlays to the mob
-
-/atom/proc/add_vomit_floor(toxvomit = 0, green = FALSE)
- playsound(src, 'sound/effects/splat.ogg', 50, 1)
+/atom/proc/add_vomit_floor(toxvomit = FALSE, green = FALSE)
+ playsound(src, 'sound/effects/splat.ogg', 50, TRUE)
if(!isspaceturf(src))
var/type = green ? /obj/effect/decal/cleanable/vomit/green : /obj/effect/decal/cleanable/vomit
var/vomit_reagent = green ? "green_vomit" : "vomit"
@@ -719,23 +770,24 @@ var/list/blood_splatter_icons = list()
// Make toxins vomit look different
if(toxvomit)
- this.icon_state = "vomittox_[pick(1,4)]"
+ this.icon_state = "vomittox_[pick(1, 4)]"
/atom/proc/get_global_map_pos()
- if(!islist(global_map) || isemptylist(global_map)) return
+ if(!islist(GLOB.global_map) || isemptylist(GLOB.global_map))
+ return
var/cur_x = null
var/cur_y = null
var/list/y_arr = null
- for(cur_x=1,cur_x<=global_map.len,cur_x++)
- y_arr = global_map[cur_x]
+ for(cur_x in 1 to GLOB.global_map.len)
+ y_arr = GLOB.global_map[cur_x]
cur_y = y_arr.Find(src.z)
if(cur_y)
break
// to_chat(world, "X = [cur_x]; Y = [cur_y]")
if(cur_x && cur_y)
- return list("x"=cur_x,"y"=cur_y)
+ return list("x" = cur_x, "y" = cur_y)
else
- return 0
+ return null
// Used to provide overlays when using this atom as a viewing focus
// (cameras, locker tint, etc.)
@@ -748,7 +800,7 @@ var/list/blood_splatter_icons = list()
return
/atom/proc/checkpass(passflag)
- return pass_flags&passflag
+ return pass_flags & passflag
/atom/proc/isinspace()
if(isspaceturf(get_turf(src)))
@@ -789,13 +841,22 @@ var/list/blood_splatter_icons = list()
/atom/proc/atom_say(message)
if(!message)
return
- audible_message("[src] [atom_say_verb], \"[message]\"")
+ var/list/speech_bubble_hearers = list()
+ for(var/mob/M in get_mobs_in_view(7, src))
+ M.show_message("[src] [atom_say_verb], \"[message]\"", 2, null, 1)
+ if(M.client)
+ speech_bubble_hearers += M.client
-/atom/proc/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
+ if(length(speech_bubble_hearers))
+ var/image/I = image('icons/mob/talk.dmi', src, "[bubble_icon][say_test(message)]", FLY_LAYER)
+ I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
+ INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_hearers, 30)
+
+/atom/proc/speech_bubble(bubble_state = "", bubble_loc = src, list/bubble_recipients = list())
return
/atom/vv_edit_var(var_name, var_value)
- if(!Debug2)
+ if(!GLOB.debug2)
admin_spawned = TRUE
. = ..()
switch(var_name)
@@ -848,7 +909,6 @@ var/list/blood_splatter_icons = list()
atom_colours[colour_priority] = coloration
update_atom_colour()
-
/*
Removes an instance of colour_type from the atom's atom_colours list
*/
@@ -863,7 +923,6 @@ var/list/blood_splatter_icons = list()
atom_colours[colour_priority] = null
update_atom_colour()
-
/*
Resets the atom's color to null, and then sets it to the highest priority
colour available
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 0370fad0367..00009c8eeca 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -1,6 +1,7 @@
/atom/movable
layer = 3
appearance_flags = TILE_BOUND
+ glide_size = 8 // Default, adjusted when mobs move based on their movement delays
var/last_move = null
var/anchored = 0
var/move_resist = MOVE_RESIST_DEFAULT
@@ -36,23 +37,25 @@
/atom/movable/attempt_init(loc, ...)
var/turf/T = get_turf(src)
- if(T && SSatoms.initialized != INITIALIZATION_INSSATOMS && space_manager.is_zlevel_dirty(T.z))
- space_manager.postpone_init(T.z, src)
+ if(T && SSatoms.initialized != INITIALIZATION_INSSATOMS && GLOB.space_manager.is_zlevel_dirty(T.z))
+ GLOB.space_manager.postpone_init(T.z, src)
return
. = ..()
/atom/movable/Destroy()
unbuckle_all_mobs(force = TRUE)
+
+ . = ..()
if(loc)
loc.handle_atom_del(src)
for(var/atom/movable/AM in contents)
qdel(AM)
+ LAZYCLEARLIST(client_mobs_in_contents)
loc = null
if(pulledby)
- if(pulledby.pulling == src)
- pulledby.pulling = null
- pulledby = null
- return ..()
+ pulledby.stop_pulling()
+ if(orbiting)
+ stop_orbit()
//Returns an atom's power cell, if it has one. Overload for individual items.
/atom/movable/proc/get_cell()
@@ -131,13 +134,14 @@
/atom/movable/proc/setLoc(var/T, var/teleported=0)
loc = T
-/atom/movable/Move(atom/newloc, direct = 0)
+/atom/movable/Move(atom/newloc, direct = 0, movetime)
if(!loc || !newloc) return 0
var/atom/oldloc = loc
if(loc != newloc)
+ glide_for(movetime)
if(!(direct & (direct - 1))) //Cardinal move
- . = ..()
+ . = ..(newloc, direct) // don't pass up movetime
else //Diagonal move, split it into cardinal moves
moving_diagonally = FIRST_DIAG_STEP
var/first_step_dir
@@ -203,7 +207,7 @@
src.move_speed = world.time - src.l_move_time
src.l_move_time = world.time
- if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct)) //movement failed due to buckled mob
+ if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct, movetime)) //movement failed due to buckled mob
. = 0
// Called after a successful Move(). By this point, we've already moved
@@ -216,12 +220,24 @@
update_parallax_contents()
return TRUE
+// Change glide size for the duration of one movement
+/atom/movable/proc/glide_for(movetime)
+ if(movetime)
+ glide_size = world.icon_size/max(DS2TICKS(movetime), 1)
+ spawn(movetime)
+ glide_size = initial(glide_size)
+ else
+ glide_size = initial(glide_size)
+
// Previously known as HasEntered()
// This is automatically called when something enters your square
/atom/movable/Crossed(atom/movable/AM, oldloc)
SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM)
SEND_SIGNAL(AM, COMSIG_CROSSED_MOVABLE, src)
+/atom/movable/Uncrossed(atom/movable/AM)
+ SEND_SIGNAL(src, COMSIG_MOVABLE_UNCROSSED, AM)
+
/atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump().
if(A && yes)
SEND_SIGNAL(src, COMSIG_MOVABLE_BUMP, A)
@@ -254,15 +270,8 @@
var/dest_z = (destturf ? destturf.z : null)
if(old_z != dest_z)
onTransitZ(old_z, dest_z)
- if(isturf(destination) && opacity)
- var/turf/new_loc = destination
- new_loc.reconsider_lights()
- if(isturf(old_loc) && opacity)
- old_loc.reconsider_lights()
-
- for(var/datum/light_source/L in light_sources)
- L.source_atom.update_light()
+ Moved(old_loc, NONE)
return 1
@@ -319,7 +328,6 @@
SSspacedrift.processing[src] = src
return 1
-
//called when src is thrown into hit_atom
/atom/movable/proc/throw_impact(atom/hit_atom, throwingdatum)
set waitfor = 0
@@ -428,10 +436,10 @@
/atom/movable/proc/water_act(volume, temperature, source, method = REAGENT_TOUCH) //amount of water acting : temperature of water in kelvin : object that called it (for shennagins)
return TRUE
-/atom/movable/proc/handle_buckled_mob_movement(newloc,direct)
+/atom/movable/proc/handle_buckled_mob_movement(newloc,direct,movetime)
for(var/m in buckled_mobs)
var/mob/living/buckled_mob = m
- if(!buckled_mob.Move(newloc, direct))
+ if(!buckled_mob.Move(newloc, direct, movetime))
forceMove(buckled_mob.loc)
last_move = buckled_mob.last_move
inertia_dir = last_move
@@ -490,7 +498,7 @@
target.fingerprintshidden += fingerprintshidden
target.fingerprintslast = fingerprintslast
-/atom/movable/proc/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect, end_pixel_y)
+/atom/movable/proc/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
if(!no_effect && (visual_effect_icon || used_item))
do_item_attack_animation(A, visual_effect_icon, used_item)
@@ -498,10 +506,6 @@
return //don't do an animation if attacking self
var/pixel_x_diff = 0
var/pixel_y_diff = 0
- var/final_pixel_y = initial(pixel_y)
- if(end_pixel_y)
- final_pixel_y = end_pixel_y
-
var/direction = get_dir(src, A)
if(direction & NORTH)
pixel_y_diff = 8
@@ -514,7 +518,7 @@
pixel_x_diff = -8
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
- animate(pixel_x = initial(pixel_x), pixel_y = final_pixel_y, time = 2)
+ animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, time = 2)
/atom/movable/proc/do_item_attack_animation(atom/A, visual_effect_icon, obj/item/used_item)
var/image/I
@@ -563,3 +567,6 @@
/atom/movable/proc/portal_destroyed(obj/effect/portal/P)
return
+
+/atom/movable/proc/decompile_act(obj/item/matter_decompiler/C, mob/user) // For drones to decompile mobs and objs. See drone for an example.
+ return FALSE
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 71e6867280c..6bd00d286fe 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -7,10 +7,10 @@
/* DATA HUD DATUMS */
/atom/proc/add_to_all_human_data_huds()
- for(var/datum/atom_hud/data/human/hud in huds) hud.add_to_hud(src)
+ for(var/datum/atom_hud/data/human/hud in GLOB.huds) hud.add_to_hud(src)
/atom/proc/remove_from_all_data_huds()
- for(var/datum/atom_hud/data/hud in huds) hud.remove_from_hud(src)
+ for(var/datum/atom_hud/data/hud in GLOB.huds) hud.remove_from_hud(src)
/datum/atom_hud/data
@@ -135,14 +135,12 @@
return "health-90"
else
return "health-100" //past this point, you're just in trouble
- return "0"
-
///HOOKS
//called when a human changes suit sensors
/mob/living/carbon/proc/update_suit_sensors()
- var/datum/atom_hud/data/human/medical/basic/B = huds[DATA_HUD_MEDICAL_BASIC]
+ var/datum/atom_hud/data/human/medical/basic/B = GLOB.huds[DATA_HUD_MEDICAL_BASIC]
B.update_suit_sensors(src)
@@ -220,22 +218,31 @@
var/perpname = get_visible_name(TRUE) //gets the name of the perp, works if they have an id or if their face is uncovered
if(!SSticker) return //wait till the game starts or the monkeys runtime....
if(perpname)
- var/datum/data/record/R = find_record("name", perpname, data_core.security)
+ var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security)
if(R)
switch(R.fields["criminal"])
- if("*Execute*")
+ if(SEC_RECORD_STATUS_EXECUTE)
holder.icon_state = "hudexecute"
return
- if("*Arrest*")
+ if(SEC_RECORD_STATUS_ARREST)
holder.icon_state = "hudwanted"
return
- if("Incarcerated")
+ if(SEC_RECORD_STATUS_SEARCH)
+ holder.icon_state = "hudsearch"
+ return
+ if(SEC_RECORD_STATUS_MONITOR)
+ holder.icon_state = "hudmonitor"
+ return
+ if(SEC_RECORD_STATUS_DEMOTE)
+ holder.icon_state = "huddemote"
+ return
+ if(SEC_RECORD_STATUS_INCARCERATED)
holder.icon_state = "hudprisoner"
return
- if("Parolled")
+ if(SEC_RECORD_STATUS_PAROLLED)
holder.icon_state = "hudparolled"
return
- if("Released")
+ if(SEC_RECORD_STATUS_RELEASED)
holder.icon_state = "hudreleased"
return
holder.icon_state = null
@@ -261,7 +268,6 @@
return "crit"
else
return "dead"
- return "dead"
//Sillycone hooks
/mob/living/silicon/proc/diag_hud_set_health()
@@ -391,7 +397,6 @@
return "max"
else
return "zero"
- return "zero"
/obj/machinery/hydroponics/proc/plant_hud_set_nutrient()
var/image/holder = hud_list[PLANT_NUTRIENT_HUD]
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index e6d80529651..1a92210f570 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -4,91 +4,35 @@
* @author N3X15
*/
-// What each index means:
-#define DNA_OFF_LOWERBOUND 1 // changed as lists start at 1 not 0
-#define DNA_OFF_UPPERBOUND 2
-#define DNA_ON_LOWERBOUND 3
-#define DNA_ON_UPPERBOUND 4
-
-// Define block bounds (off-low,off-high,on-low,on-high)
-// Used in setupgame.dm
-#define DNA_DEFAULT_BOUNDS list(1,2049,2050,4095)
-#define DNA_HARDER_BOUNDS list(1,3049,3050,4095)
-#define DNA_HARD_BOUNDS list(1,3490,3500,4095)
-
-// UI Indices (can change to mutblock style, if desired)
-#define DNA_UI_HAIR_R 1
-#define DNA_UI_HAIR_G 2
-#define DNA_UI_HAIR_B 3
-#define DNA_UI_HAIR2_R 4
-#define DNA_UI_HAIR2_G 5
-#define DNA_UI_HAIR2_B 6
-#define DNA_UI_BEARD_R 7
-#define DNA_UI_BEARD_G 8
-#define DNA_UI_BEARD_B 9
-#define DNA_UI_BEARD2_R 10
-#define DNA_UI_BEARD2_G 11
-#define DNA_UI_BEARD2_B 12
-#define DNA_UI_SKIN_TONE 13
-#define DNA_UI_SKIN_R 14
-#define DNA_UI_SKIN_G 15
-#define DNA_UI_SKIN_B 16
-#define DNA_UI_HACC_R 17
-#define DNA_UI_HACC_G 18
-#define DNA_UI_HACC_B 19
-#define DNA_UI_HEAD_MARK_R 20
-#define DNA_UI_HEAD_MARK_G 21
-#define DNA_UI_HEAD_MARK_B 22
-#define DNA_UI_BODY_MARK_R 23
-#define DNA_UI_BODY_MARK_G 24
-#define DNA_UI_BODY_MARK_B 25
-#define DNA_UI_TAIL_MARK_R 26
-#define DNA_UI_TAIL_MARK_G 27
-#define DNA_UI_TAIL_MARK_B 28
-#define DNA_UI_EYES_R 29
-#define DNA_UI_EYES_G 30
-#define DNA_UI_EYES_B 31
-#define DNA_UI_GENDER 32
-#define DNA_UI_BEARD_STYLE 33
-#define DNA_UI_HAIR_STYLE 34
-/*#define DNA_UI_BACC_STYLE 23*/
-#define DNA_UI_HACC_STYLE 35
-#define DNA_UI_HEAD_MARK_STYLE 36
-#define DNA_UI_BODY_MARK_STYLE 37
-#define DNA_UI_TAIL_MARK_STYLE 38
-#define DNA_UI_LENGTH 38 // Update this when you add something, or you WILL break shit.
-
-#define DNA_SE_LENGTH 55 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow.
-
// Defines which values mean "on" or "off".
// This is to make some of the more OP superpowers a larger PITA to activate,
// and to tell our new DNA datum which values to set in order to turn something
// on or off.
-var/global/list/dna_activity_bounds[DNA_SE_LENGTH]
-var/global/list/assigned_gene_blocks[DNA_SE_LENGTH]
+GLOBAL_LIST_INIT(dna_activity_bounds, new(DNA_SE_LENGTH))
+GLOBAL_LIST_INIT(assigned_gene_blocks, new(DNA_SE_LENGTH))
// Used to determine what each block means (admin hax and species stuff on /vg/, mostly)
-var/global/list/assigned_blocks[DNA_SE_LENGTH]
+GLOBAL_LIST_INIT(assigned_blocks, new(DNA_SE_LENGTH))
-var/global/list/datum/dna/gene/dna_genes[0]
+GLOBAL_LIST_EMPTY(dna_genes)
-var/global/list/good_blocks[0]
-var/global/list/bad_blocks[0]
+GLOBAL_LIST_EMPTY(good_blocks)
+GLOBAL_LIST_EMPTY(bad_blocks)
/datum/dna
// READ-ONLY, GETS OVERWRITTEN
// DO NOT FUCK WITH THESE OR BYOND WILL EAT YOUR FACE
- var/uni_identity="" // Encoded UI
- var/struc_enzymes="" // Encoded SE
- var/unique_enzymes="" // MD5 of player name
+ var/uni_identity = "" // Encoded UI
+ var/struc_enzymes = "" // Encoded SE
+ var/unique_enzymes = "" // MD5 of player name
// Original Encoded SE, for use with Ryetalin
- var/struc_enzymes_original="" // Encoded SE
+ var/struc_enzymes_original = "" // Encoded SE
var/list/SE_original[DNA_SE_LENGTH]
// Internal dirtiness checks
- var/dirtyUI=0
- var/dirtySE=0
+ var/dirtyUI = 0
+ var/dirtySE = 0
// Okay to read, but you're an idiot if you do.
// BLOCK = VALUE
@@ -106,10 +50,10 @@ var/global/list/bad_blocks[0]
// USE THIS WHEN COPYING STUFF OR YOU'LL GET CORRUPTION!
/datum/dna/proc/Clone()
var/datum/dna/new_dna = new()
- new_dna.unique_enzymes=unique_enzymes
- new_dna.struc_enzymes_original=struc_enzymes_original // will make clone's SE the same as the original, do we want this?
+ new_dna.unique_enzymes = unique_enzymes
+ new_dna.struc_enzymes_original = struc_enzymes_original // will make clone's SE the same as the original, do we want this?
new_dna.blood_type = blood_type
- new_dna.real_name=real_name
+ new_dna.real_name = real_name
new_dna.species = new species.type
for(var/b=1;b<=DNA_SE_LENGTH;b++)
new_dna.SE[b]=SE[b]
@@ -124,17 +68,17 @@ var/global/list/bad_blocks[0]
///////////////////////////////////////
// Create random UI.
-/datum/dna/proc/ResetUI(var/defer=0)
+/datum/dna/proc/ResetUI(defer = FALSE)
for(var/i=1,i<=DNA_UI_LENGTH,i++)
switch(i)
if(DNA_UI_SKIN_TONE)
- SetUIValueRange(DNA_UI_SKIN_TONE,rand(1,220),220,1) // Otherwise, it gets fucked
+ SetUIValueRange(DNA_UI_SKIN_TONE, rand(1, 220), 220, 1) // Otherwise, it gets fucked
else
UI[i]=rand(0,4095)
if(!defer)
UpdateUI()
-/datum/dna/proc/ResetUIFrom(var/mob/living/carbon/human/character)
+/datum/dna/proc/ResetUIFrom(mob/living/carbon/human/character)
// INITIALIZE!
ResetUI(1)
// Hair
@@ -191,83 +135,90 @@ var/global/list/bad_blocks[0]
UpdateUI()
// Set a DNA UI block's raw value.
-/datum/dna/proc/SetUIValue(var/block,var/value,var/defer=0)
- if(block<=0) return
- ASSERT(value>0)
- ASSERT(value<=4095)
+/datum/dna/proc/SetUIValue(block, value, defer = FALSE)
+ if(block <= 0)
+ return
+ ASSERT(value > 0)
+ ASSERT(value <= 4095)
UI[block]=value
- dirtyUI=1
+ dirtyUI = 1
if(!defer)
UpdateUI()
// Get a DNA UI block's raw value.
-/datum/dna/proc/GetUIValue(var/block)
- if(block<=0) return 0
+/datum/dna/proc/GetUIValue(block)
+ if(block <= 0)
+ return FALSE
return UI[block]
// Set a DNA UI block's value, given a value and a max possible value.
// Used in hair and facial styles (value being the index and maxvalue being the len of the hairstyle list)
-/datum/dna/proc/SetUIValueRange(var/block,var/value,var/maxvalue,var/defer=0)
- if(block<=0)
+/datum/dna/proc/SetUIValueRange(block, value, maxvalue, defer = FALSE)
+ if(block <= 0)
return
if(value == 0)
value = 1
- ASSERT(maxvalue<=4095)
+ ASSERT(maxvalue <= 4095)
var/range = (4095 / maxvalue)
if(value)
- SetUIValue(block,round(value * range),defer)
+ SetUIValue(block,round(value * range), defer)
// Getter version of above.
-/datum/dna/proc/GetUIValueRange(var/block,var/maxvalue)
- if(block<=0) return 0
+/datum/dna/proc/GetUIValueRange(block, maxvalue)
+ if(block <= 0)
+ return FALSE
var/value = GetUIValue(block)
- return round(1 +(value / 4096)*maxvalue)
+ return round(1 + (value / 4096) * maxvalue)
// Is the UI gene "on" or "off"?
// For UI, this is simply a check of if the value is > 2050.
-/datum/dna/proc/GetUIState(var/block)
- if(block<=0) return
+/datum/dna/proc/GetUIState(block)
+ if(block <= 0)
+ return
return UI[block] > 2050
// Set UI gene "on" (1) or "off" (0)
-/datum/dna/proc/SetUIState(var/block,var/on,var/defer=0)
- if(block<=0) return
+/datum/dna/proc/SetUIState(block, on, defer = FALSE)
+ if(block <= 0)
+ return
var/val
if(on)
- val=rand(2050,4095)
+ val = rand(2050, 4095)
else
- val=rand(1,2049)
- SetUIValue(block,val,defer)
+ val=rand(1, 2049)
+ SetUIValue(block, val, defer)
// Get a hex-encoded UI block.
-/datum/dna/proc/GetUIBlock(var/block)
+/datum/dna/proc/GetUIBlock(block)
return EncodeDNABlock(GetUIValue(block))
// Do not use this unless you absolutely have to.
// Set a block from a hex string. This is inefficient. If you can, use SetUIValue().
// Used in DNA modifiers.
-/datum/dna/proc/SetUIBlock(var/block,var/value,var/defer=0)
- if(block<=0) return
- return SetUIValue(block,hex2num(value),defer)
+/datum/dna/proc/SetUIBlock(block, value, defer = FALSE)
+ if(block <= 0)
+ return
+ return SetUIValue(block, hex2num(value), defer)
// Get a sub-block from a block.
-/datum/dna/proc/GetUISubBlock(var/block,var/subBlock)
- return copytext(GetUIBlock(block),subBlock,subBlock+1)
+/datum/dna/proc/GetUISubBlock(block, subBlock)
+ return copytext(GetUIBlock(block), subBlock, subBlock + 1)
// Do not use this unless you absolutely have to.
// Set a block from a hex string. This is inefficient. If you can, use SetUIValue().
// Used in DNA modifiers.
-/datum/dna/proc/SetUISubBlock(var/block,var/subBlock, var/newSubBlock, var/defer=0)
- if(block<=0) return
- var/oldBlock=GetUIBlock(block)
- var/newBlock=""
- for(var/i=1, i<=length(oldBlock), i++)
+/datum/dna/proc/SetUISubBlock(block, subBlock, newSubBlock, defer = FALSE)
+ if(block <= 0)
+ return
+ var/oldBlock = GetUIBlock(block)
+ var/newBlock = ""
+ for(var/i = 1, i <= length(oldBlock), i++)
if(i==subBlock)
- newBlock+=newSubBlock
+ newBlock += newSubBlock
else
- newBlock+=copytext(oldBlock,i,i+1)
- SetUIBlock(block,newBlock,defer)
+ newBlock += copytext(oldBlock, i, i + 1)
+ SetUIBlock(block, newBlock, defer)
///////////////////////////////////////
// STRUCTURAL ENZYMES
@@ -276,126 +227,134 @@ var/global/list/bad_blocks[0]
// "Zeroes out" all of the blocks.
/datum/dna/proc/ResetSE()
for(var/i = 1, i <= DNA_SE_LENGTH, i++)
- SetSEValue(i,rand(1,1024),1)
+ SetSEValue(i, rand(1, 1024), 1)
UpdateSE()
// Set a DNA SE block's raw value.
-/datum/dna/proc/SetSEValue(var/block,var/value,var/defer=0)
+/datum/dna/proc/SetSEValue(block, value, defer = FALSE)
- if(block<=0) return
- ASSERT(value>=0)
- ASSERT(value<=4095)
- SE[block]=value
- dirtySE=1
+ if(block<=0)
+ return
+ ASSERT(value >= 0)
+ ASSERT(value <= 4095)
+ SE[block] = value
+ dirtySE = 1
if(!defer)
UpdateSE()
//testing("SetSEBlock([block],[value],[defer]): [value] -> [GetSEValue(block)]")
// Get a DNA SE block's raw value.
-/datum/dna/proc/GetSEValue(var/block)
- if(block<=0) return 0
+/datum/dna/proc/GetSEValue(block)
+ if(block <= 0)
+ return FALSE
return SE[block]
// Set a DNA SE block's value, given a value and a max possible value.
// Might be used for species?
-/datum/dna/proc/SetSEValueRange(var/block,var/value,var/maxvalue)
- if(block<=0) return
- ASSERT(maxvalue<=4095)
+/datum/dna/proc/SetSEValueRange(block, value, maxvalue)
+ if(block <= 0)
+ return
+ ASSERT(maxvalue <= 4095)
var/range = round(4095 / maxvalue)
if(value)
- SetSEValue(block, value * range - rand(1,range-1))
+ SetSEValue(block, value * range - rand(1, range - 1))
// Getter version of above.
-/datum/dna/proc/GetSEValueRange(var/block,var/maxvalue)
- if(block<=0) return 0
+/datum/dna/proc/GetSEValueRange(block, maxvalue)
+ if(block <= 0)
+ return FALSE
var/value = GetSEValue(block)
- return round(1 +(value / 4096)*maxvalue)
+ return round(1 + (value / 4096) * maxvalue)
// Is the block "on" (1) or "off" (0)? (Un-assigned genes are always off.)
-/datum/dna/proc/GetSEState(var/block)
- if(block<=0) return 0
- var/list/BOUNDS=GetDNABounds(block)
- var/value=GetSEValue(block)
+/datum/dna/proc/GetSEState(block)
+ if(block <= 0)
+ return FALSE
+ var/list/BOUNDS = GetDNABounds(block)
+ var/value = GetSEValue(block)
return (value >= BOUNDS[DNA_ON_LOWERBOUND])
// Set a block "on" or "off".
-/datum/dna/proc/SetSEState(var/block,var/on,var/defer=0)
- if(block<=0) return
+/datum/dna/proc/SetSEState(block, on, defer = FALSE)
+ if(block <= 0)
+ return
var/list/BOUNDS=GetDNABounds(block)
var/val
if(on)
- val=rand(BOUNDS[DNA_ON_LOWERBOUND],BOUNDS[DNA_ON_UPPERBOUND])
+ val = rand(BOUNDS[DNA_ON_LOWERBOUND], BOUNDS[DNA_ON_UPPERBOUND])
else
- val=rand(1,BOUNDS[DNA_OFF_UPPERBOUND])
- SetSEValue(block,val,defer)
+ val = rand(1, BOUNDS[DNA_OFF_UPPERBOUND])
+ SetSEValue(block, val, defer)
// Get hex-encoded SE block.
-/datum/dna/proc/GetSEBlock(var/block)
+/datum/dna/proc/GetSEBlock(block)
return EncodeDNABlock(GetSEValue(block))
// Do not use this unless you absolutely have to.
// Set a block from a hex string. This is inefficient. If you can, use SetUIValue().
// Used in DNA modifiers.
-/datum/dna/proc/SetSEBlock(var/block,var/value,var/defer=0)
- if(block<=0) return
+/datum/dna/proc/SetSEBlock(block, value, defer = FALSE)
+ if(block <= 0)
+ return
var/nval=hex2num(value)
//testing("SetSEBlock([block],[value],[defer]): [value] -> [nval]")
- return SetSEValue(block,nval,defer)
+ return SetSEValue(block, nval, defer)
-/datum/dna/proc/GetSESubBlock(var/block,var/subBlock)
- return copytext(GetSEBlock(block),subBlock,subBlock+1)
+/datum/dna/proc/GetSESubBlock(block, subBlock)
+ return copytext(GetSEBlock(block), subBlock, subBlock + 1)
// Do not use this unless you absolutely have to.
// Set a sub-block from a hex character. This is inefficient. If you can, use SetUIValue().
// Used in DNA modifiers.
-/datum/dna/proc/SetSESubBlock(var/block,var/subBlock, var/newSubBlock, var/defer=0)
- if(block<=0) return
+/datum/dna/proc/SetSESubBlock(block, subBlock, newSubBlock, defer = FALSE)
+ if(block <= 0)
+ return
var/oldBlock=GetSEBlock(block)
- var/newBlock=""
- for(var/i=1, i<=length(oldBlock), i++)
+ var/newBlock = ""
+ for(var/i = 1, i <= length(oldBlock), i++)
if(i==subBlock)
newBlock+=newSubBlock
else
- newBlock+=copytext(oldBlock,i,i+1)
+ newBlock += copytext(oldBlock, i, i + 1)
//testing("SetSESubBlock([block],[subBlock],[newSubBlock],[defer]): [oldBlock] -> [newBlock]")
- SetSEBlock(block,newBlock,defer)
+ SetSEBlock(block, newBlock, defer)
-/proc/EncodeDNABlock(var/value)
- return add_zero2(num2hex(value,1), 3)
+/proc/EncodeDNABlock(value)
+ return add_zero2(num2hex(value, 1), 3)
/datum/dna/proc/UpdateUI()
- src.uni_identity=""
+ uni_identity = ""
for(var/block in UI)
uni_identity += EncodeDNABlock(block)
//testing("New UI: [uni_identity]")
- dirtyUI=0
+ dirtyUI = 0
/datum/dna/proc/UpdateSE()
//var/oldse=struc_enzymes
- struc_enzymes=""
+ struc_enzymes = ""
for(var/block in SE)
struc_enzymes += EncodeDNABlock(block)
//testing("Old SE: [oldse]")
//testing("New SE: [struc_enzymes]")
- dirtySE=0
+ dirtySE = 0
// BACK-COMPAT!
// Just checks our character has all the crap it needs.
-/datum/dna/proc/check_integrity(var/mob/living/carbon/human/character)
+/datum/dna/proc/check_integrity(mob/living/carbon/human/character)
if(character)
if(UI.len != DNA_UI_LENGTH)
ResetUIFrom(character)
- if(length(struc_enzymes)!= 3*DNA_SE_LENGTH)
+ if(length(struc_enzymes)!= 3 * DNA_SE_LENGTH)
ResetSE()
if(length(unique_enzymes) != 32)
unique_enzymes = md5(character.real_name)
else
- if(length(uni_identity) != 3*DNA_UI_LENGTH)
+ if(length(uni_identity) != 3 * DNA_UI_LENGTH)
uni_identity = "00600200A00E0110148FC01300B0095BD7FD3F4"
- if(length(struc_enzymes)!= 3*DNA_SE_LENGTH)
+ if(length(struc_enzymes)!= 3 * DNA_SE_LENGTH)
struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
// BACK-COMPAT!
@@ -413,7 +372,7 @@ var/global/list/bad_blocks[0]
SE_original = SE.Copy()
unique_enzymes = md5(character.real_name)
- reg_dna[unique_enzymes] = character.real_name
+ GLOB.reg_dna[unique_enzymes] = character.real_name
// Hmm, I wonder how to go about this without a huge convention break
/datum/dna/serialize()
diff --git a/code/game/dna/dna2_domutcheck.dm b/code/game/dna/dna2_domutcheck.dm
index 07979f40b7c..16eee549bf2 100644
--- a/code/game/dna/dna2_domutcheck.dm
+++ b/code/game/dna/dna2_domutcheck.dm
@@ -3,8 +3,8 @@
// M: Mob to mess with
// connected: Machine we're in, type unchecked so I doubt it's used beyond monkeying
// flags: See below, bitfield.
-/proc/domutcheck(var/mob/living/M, var/connected=null, var/flags=0)
- for(var/datum/dna/gene/gene in dna_genes)
+/proc/domutcheck(mob/living/M, connected = null, flags = 0)
+ for(var/datum/dna/gene/gene in GLOB.dna_genes)
if(!M || !M.dna)
return
if(!gene.block)
@@ -13,7 +13,7 @@
domutation(gene, M, connected, flags)
// Use this to force a mut check on a single gene!
-/proc/genemutcheck(var/mob/living/M, var/block, var/connected=null, var/flags=0)
+/proc/genemutcheck(mob/living/M, block, connected = null, flags = 0)
if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure.
var/mob/living/carbon/human/H = M
if(NO_DNA in H.dna.species.species_traits)
@@ -23,13 +23,13 @@
if(block < 0)
return
- var/datum/dna/gene/gene = assigned_gene_blocks[block]
+ var/datum/dna/gene/gene = GLOB.assigned_gene_blocks[block]
domutation(gene, M, connected, flags)
-/proc/domutation(var/datum/dna/gene/gene, var/mob/living/M, var/connected=null, var/flags=0)
+/proc/domutation(datum/dna/gene/gene, mob/living/M, connected = null, flags = 0)
if(!gene || !istype(gene))
- return 0
+ return FALSE
// Current state
var/gene_active = M.dna.GetSEState(gene.block)
@@ -37,7 +37,7 @@
// Sanity checks, don't skip.
if(!gene.can_activate(M,flags) && gene_active)
//testing("[M] - Failed to activate [gene.name] (can_activate fail).")
- return 0
+ return FALSE
var/defaultgenes // Do not mutate inherent species abilities
if(ishuman(M))
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 9ef5dbfcab0..435133a3796 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -9,58 +9,61 @@
t = "0[t]"
temp1 = t
if(length(t) > u)
- temp1 = copytext(t,2,u+1)
+ temp1 = copytext(t, 2, u + 1)
return temp1
// DNA Gene activation boundaries, see dna2.dm.
// Returns a list object with 4 numbers.
-/proc/GetDNABounds(var/block)
- var/list/BOUNDS=dna_activity_bounds[block]
+/proc/GetDNABounds(block)
+ var/list/BOUNDS = GLOB.dna_activity_bounds[block]
if(!istype(BOUNDS))
return DNA_DEFAULT_BOUNDS
return BOUNDS
// Give Random Bad Mutation to M
-/proc/randmutb(var/mob/living/M)
- if(!M || !M.dna) return
+/proc/randmutb(mob/living/M)
+ if(!M || !M.dna)
+ return
M.dna.check_integrity()
- var/block = pick(bad_blocks)
+ var/block = pick(GLOB.bad_blocks)
M.dna.SetSEState(block, 1)
// Give Random Good Mutation to M
-/proc/randmutg(var/mob/living/M)
- if(!M || !M.dna) return
+/proc/randmutg(mob/living/M)
+ if(!M || !M.dna)
+ return
M.dna.check_integrity()
- var/block = pick(good_blocks)
+ var/block = pick(GLOB.good_blocks)
M.dna.SetSEState(block, 1)
// Random Appearance Mutation
-/proc/randmuti(var/mob/living/M)
- if(!M || !M.dna) return
+/proc/randmuti(mob/living/M)
+ if(!M || !M.dna)
+ return
M.dna.check_integrity()
- M.dna.SetUIValue(rand(1,DNA_UI_LENGTH),rand(1,4095))
+ M.dna.SetUIValue(rand(1, DNA_UI_LENGTH), rand(1, 4095))
// Scramble UI or SE.
-/proc/scramble(var/UI, var/mob/M, var/prob)
- if(!M || !M.dna) return
+/proc/scramble(UI, mob/M, prob)
+ if(!M || !M.dna)
+ return
M.dna.check_integrity()
if(UI)
- for(var/i = 1, i <= DNA_UI_LENGTH-1, i++)
+ for(var/i = 1, i <= DNA_UI_LENGTH - 1, i++)
if(prob(prob))
- M.dna.SetUIValue(i,rand(1,4095),1)
+ M.dna.SetUIValue(i, rand(1, 4095), 1)
M.dna.UpdateUI()
M.UpdateAppearance()
else
- for(var/i = 1, i <= DNA_SE_LENGTH-1, i++)
+ for(var/i = 1, i <= DNA_SE_LENGTH - 1, i++)
if(prob(prob))
- M.dna.SetSEValue(i,rand(1,4095),1)
+ M.dna.SetSEValue(i, rand(1, 4095), 1)
M.dna.UpdateSE()
domutcheck(M, null)
- return
// I haven't yet figured out what the fuck this is supposed to do.
-/proc/miniscramble(input,rs,rd)
+/proc/miniscramble(input, rs, rd)
var/output
output = null
if(input == "C" || input == "D" || input == "E" || input == "F")
@@ -79,7 +82,7 @@
// input: YOUR TARGET
// rs: RAD STRENGTH
// rd: DURATION
-/proc/miniscrambletarget(input,rs,rd)
+/proc/miniscrambletarget(input, rs, rd)
var/output = null
switch(input)
if("0")
@@ -124,11 +127,11 @@
// Use mob.UpdateAppearance() instead.
// Simpler. Don't specify UI in order for the mob to use its own.
-/mob/proc/UpdateAppearance(var/list/UI=null)
- if(istype(src, /mob/living/carbon/human))
+/mob/proc/UpdateAppearance(list/UI = null)
+ if(istype(src, /mob/living/carbon/human)) // WHY?!
if(UI!=null)
- src.dna.UI=UI
- src.dna.UpdateUI()
+ dna.UI = UI
+ dna.UpdateUI()
dna.check_integrity()
var/mob/living/carbon/human/H = src
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
@@ -169,9 +172,9 @@
H.regenerate_icons()
- return 1
+ return TRUE
else
- return 0
+ return FALSE
/*
ORGAN WRITING PROCS
@@ -219,9 +222,9 @@
// In absence of eyes, possibly randomize the eye color DNA?
return
- SetUIValueRange(DNA_UI_EYES_R, color2R(eyes_organ.eye_colour), 255, 1)
- SetUIValueRange(DNA_UI_EYES_G, color2G(eyes_organ.eye_colour), 255, 1)
- SetUIValueRange(DNA_UI_EYES_B, color2B(eyes_organ.eye_colour), 255, 1)
+ SetUIValueRange(DNA_UI_EYES_R, color2R(eyes_organ.eye_colour), 255, 1)
+ SetUIValueRange(DNA_UI_EYES_G, color2G(eyes_organ.eye_colour), 255, 1)
+ SetUIValueRange(DNA_UI_EYES_B, color2B(eyes_organ.eye_colour), 255, 1)
/datum/dna/proc/head_traits_to_dna(obj/item/organ/external/head/head_organ)
if(!head_organ)
@@ -241,26 +244,26 @@
head_organ.ha_style = "None"
var/headacc = GLOB.head_accessory_styles_list.Find(head_organ.ha_style)
- SetUIValueRange(DNA_UI_HAIR_R, color2R(head_organ.hair_colour), 255, 1)
- SetUIValueRange(DNA_UI_HAIR_G, color2G(head_organ.hair_colour), 255, 1)
- SetUIValueRange(DNA_UI_HAIR_B, color2B(head_organ.hair_colour), 255, 1)
+ SetUIValueRange(DNA_UI_HAIR_R, color2R(head_organ.hair_colour), 255, 1)
+ SetUIValueRange(DNA_UI_HAIR_G, color2G(head_organ.hair_colour), 255, 1)
+ SetUIValueRange(DNA_UI_HAIR_B, color2B(head_organ.hair_colour), 255, 1)
- SetUIValueRange(DNA_UI_HAIR2_R, color2R(head_organ.sec_hair_colour), 255, 1)
- SetUIValueRange(DNA_UI_HAIR2_G, color2G(head_organ.sec_hair_colour), 255, 1)
- SetUIValueRange(DNA_UI_HAIR2_B, color2B(head_organ.sec_hair_colour), 255, 1)
+ SetUIValueRange(DNA_UI_HAIR2_R, color2R(head_organ.sec_hair_colour), 255, 1)
+ SetUIValueRange(DNA_UI_HAIR2_G, color2G(head_organ.sec_hair_colour), 255, 1)
+ SetUIValueRange(DNA_UI_HAIR2_B, color2B(head_organ.sec_hair_colour), 255, 1)
- SetUIValueRange(DNA_UI_BEARD_R, color2R(head_organ.facial_colour), 255, 1)
- SetUIValueRange(DNA_UI_BEARD_G, color2G(head_organ.facial_colour), 255, 1)
- SetUIValueRange(DNA_UI_BEARD_B, color2B(head_organ.facial_colour), 255, 1)
+ SetUIValueRange(DNA_UI_BEARD_R, color2R(head_organ.facial_colour), 255, 1)
+ SetUIValueRange(DNA_UI_BEARD_G, color2G(head_organ.facial_colour), 255, 1)
+ SetUIValueRange(DNA_UI_BEARD_B, color2B(head_organ.facial_colour), 255, 1)
- SetUIValueRange(DNA_UI_BEARD2_R, color2R(head_organ.sec_facial_colour), 255, 1)
- SetUIValueRange(DNA_UI_BEARD2_G, color2G(head_organ.sec_facial_colour), 255, 1)
- SetUIValueRange(DNA_UI_BEARD2_B, color2B(head_organ.sec_facial_colour), 255, 1)
+ SetUIValueRange(DNA_UI_BEARD2_R, color2R(head_organ.sec_facial_colour), 255, 1)
+ SetUIValueRange(DNA_UI_BEARD2_G, color2G(head_organ.sec_facial_colour), 255, 1)
+ SetUIValueRange(DNA_UI_BEARD2_B, color2B(head_organ.sec_facial_colour), 255, 1)
- SetUIValueRange(DNA_UI_HACC_R, color2R(head_organ.headacc_colour), 255, 1)
- SetUIValueRange(DNA_UI_HACC_G, color2G(head_organ.headacc_colour), 255, 1)
- SetUIValueRange(DNA_UI_HACC_B, color2B(head_organ.headacc_colour), 255, 1)
+ SetUIValueRange(DNA_UI_HACC_R, color2R(head_organ.headacc_colour), 255, 1)
+ SetUIValueRange(DNA_UI_HACC_G, color2G(head_organ.headacc_colour), 255, 1)
+ SetUIValueRange(DNA_UI_HACC_B, color2B(head_organ.headacc_colour), 255, 1)
- SetUIValueRange(DNA_UI_HAIR_STYLE, hair, GLOB.hair_styles_full_list.len, 1)
- SetUIValueRange(DNA_UI_BEARD_STYLE, beard, GLOB.facial_hair_styles_list.len, 1)
- SetUIValueRange(DNA_UI_HACC_STYLE, headacc, GLOB.head_accessory_styles_list.len, 1)
+ SetUIValueRange(DNA_UI_HAIR_STYLE, hair, GLOB.hair_styles_full_list.len, 1)
+ SetUIValueRange(DNA_UI_BEARD_STYLE, beard, GLOB.facial_hair_styles_list.len, 1)
+ SetUIValueRange(DNA_UI_HACC_STYLE, headacc, GLOB.head_accessory_styles_list.len, 1)
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index de42b5b253f..fb0ccff32cb 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -10,15 +10,15 @@
//list("data" = null, "owner" = null, "label" = null, "type" = null, "ue" = 0),
/datum/dna2/record
var/datum/dna/dna = null
- var/types=0
- var/name="Empty"
+ var/types = 0
+ var/name = "Empty"
// Stuff for cloners
- var/id=null
- var/implant=null
- var/ckey=null
- var/mind=null
- var/languages=null
+ var/id = null
+ var/implant = null
+ var/ckey = null
+ var/mind = null
+ var/languages = null
/datum/dna2/record/proc/GetData()
var/list/ser=list("data" = null, "owner" = null, "label" = null, "type" = null, "ue" = 0)
@@ -28,7 +28,7 @@
ser["data"] = dna.SE
else
ser["data"] = dna.UI
- ser["owner"] = src.dna.real_name
+ ser["owner"] = dna.real_name
ser["label"] = name
if(types & DNA2_BUF_UI)
ser["type"] = "ui"
@@ -54,13 +54,13 @@
desc = "It scans DNA structures."
icon = 'icons/obj/cryogenic2.dmi'
icon_state = "scanner_open"
- density = 1
- anchored = 1.0
+ density = TRUE
+ anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 50
active_power_usage = 300
interact_offline = 1
- var/locked = 0
+ var/locked = FALSE
var/mob/living/carbon/occupant = null
var/obj/item/reagent_containers/glass/beaker = null
var/opened = 0
@@ -106,27 +106,27 @@
/obj/machinery/dna_scannernew/AllowDrop()
return FALSE
-/obj/machinery/dna_scannernew/relaymove(mob/user as mob)
+/obj/machinery/dna_scannernew/relaymove(mob/user)
if(user.stat)
return
- src.go_out()
- return
+ go_out()
/obj/machinery/dna_scannernew/verb/eject()
set src in oview(1)
set category = null
set name = "Eject DNA Scanner"
- if(usr.stat != 0)
+ if(usr.incapacitated())
return
-
- eject_occupant()
-
+ eject_occupant(usr)
add_fingerprint(usr)
- return
-/obj/machinery/dna_scannernew/proc/eject_occupant()
- src.go_out()
+/obj/machinery/dna_scannernew/Destroy()
+ eject_occupant(null, TRUE)
+ return ..()
+
+/obj/machinery/dna_scannernew/proc/eject_occupant(user, force)
+ go_out(user, force)
for(var/obj/O in src)
if(!istype(O,/obj/item/circuitboard/clonescanner) && \
!istype(O,/obj/item/stock_parts) && \
@@ -142,14 +142,12 @@
set category = null
set name = "Enter DNA Scanner"
- if(usr.stat != 0)
- return
- if(usr.incapacitated()) //are you cuffed, dying, lying, stunned or other
+ if(usr.incapacitated() || usr.buckled) //are you cuffed, dying, lying, stunned or other
return
if(!ishuman(usr)) //Make sure they're a mob that has dna
to_chat(usr, "Try as you might, you can not climb up into the [src].")
return
- if(src.occupant)
+ if(occupant)
to_chat(usr, "The [src] is already occupied!")
return
if(usr.abiotic())
@@ -160,12 +158,11 @@
return
usr.stop_pulling()
usr.forceMove(src)
- src.occupant = usr
- src.icon_state = "scanner_occupied"
- src.add_fingerprint(usr)
- return
+ occupant = usr
+ icon_state = "scanner_occupied"
+ add_fingerprint(usr)
-/obj/machinery/dna_scannernew/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+/obj/machinery/dna_scannernew/MouseDrop_T(atom/movable/O, mob/user)
if(!istype(O))
return
if(O.loc == user) //no you can't pull things out of your ass
@@ -204,27 +201,27 @@
if(user.pulling == L)
user.stop_pulling()
-/obj/machinery/dna_scannernew/attackby(var/obj/item/item as obj, var/mob/user as mob, params)
- if(exchange_parts(user, item))
+/obj/machinery/dna_scannernew/attackby(obj/item/I, mob/user, params)
+ if(exchange_parts(user, I))
return
- else if(istype(item, /obj/item/reagent_containers/glass))
+ else if(istype(I, /obj/item/reagent_containers/glass))
if(beaker)
to_chat(user, "A beaker is already loaded into the machine.")
return
if(!user.drop_item())
- to_chat(user, "\The [item] is stuck to you!")
+ to_chat(user, "\The [I] is stuck to you!")
return
- beaker = item
- item.forceMove(src)
- user.visible_message("[user] adds \a [item] to \the [src]!", "You add \a [item] to \the [src]!")
+ beaker = I
+ I.forceMove(src)
+ user.visible_message("[user] adds \a [I] to \the [src]!", "You add \a [I] to \the [src]!")
return
- if(istype(item, /obj/item/grab))
- var/obj/item/grab/G = item
+ if(istype(I, /obj/item/grab))
+ var/obj/item/grab/G = I
if(!ismob(G.affecting))
return
- if(src.occupant)
+ if(occupant)
to_chat(user, "The scanner is already occupied!")
return
if(G.affecting.abiotic())
@@ -237,7 +234,7 @@
to_chat(usr, "Close the maintenance panel first.")
return
put_in(G.affecting)
- src.add_fingerprint(user)
+ add_fingerprint(user)
qdel(G)
return
return ..()
@@ -245,7 +242,7 @@
/obj/machinery/dna_scannernew/crowbar_act(mob/user, obj/item/I)
if(default_deconstruction_crowbar(user, I))
for(var/obj/thing in contents) // in case there is something in the scanner
- thing.forceMove(src.loc)
+ thing.forceMove(loc)
/obj/machinery/dna_scannernew/screwdriver_act(mob/user, obj/item/I)
if(occupant)
@@ -254,15 +251,15 @@
if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", I))
return TRUE
-/obj/machinery/dna_scannernew/relaymove(mob/user as mob)
+/obj/machinery/dna_scannernew/relaymove(mob/user)
if(user.incapacitated())
- return 0 //maybe they should be able to get out with cuffs, but whatever
+ return FALSE //maybe they should be able to get out with cuffs, but whatever
go_out()
-/obj/machinery/dna_scannernew/proc/put_in(var/mob/M)
+/obj/machinery/dna_scannernew/proc/put_in(mob/M)
M.forceMove(src)
- src.occupant = M
- src.icon_state = "scanner_occupied"
+ occupant = M
+ icon_state = "scanner_occupied"
// search for ghosts, if the corpse is empty and the scanner is connected to a cloner
if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \
@@ -271,20 +268,19 @@
|| locate(/obj/machinery/computer/cloning, get_step(src, WEST)))
occupant.notify_ghost_cloning(source = src)
- return
-/obj/machinery/dna_scannernew/proc/go_out()
- if(!src.occupant)
- to_chat(usr, "The scanner is empty!")
+/obj/machinery/dna_scannernew/proc/go_out(mob/user, force)
+ if(!occupant)
+ if(user)
+ to_chat(user, "The scanner is empty!")
return
-
- if(src.locked)
- to_chat(usr, "The scanner is locked!")
+ if(locked && !force)
+ if(user)
+ to_chat(user, "The scanner is locked!")
return
-
- src.occupant.forceMove(src.loc)
- src.occupant = null
- src.icon_state = "scanner_open"
+ occupant.forceMove(loc)
+ occupant = null
+ icon_state = "scanner_open"
/obj/machinery/dna_scannernew/ex_act(severity)
if(occupant)
@@ -301,18 +297,17 @@
// Checks if occupants can be irradiated/mutated - prevents exploits where wearing full rad protection would still let you gain mutations
/obj/machinery/dna_scannernew/proc/radiation_check()
if(!occupant)
- return 1
+ return TRUE
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
if(NO_DNA in H.dna.species.species_traits)
- return 1
+ return TRUE
var/radiation_protection = occupant.run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm.")
if(radiation_protection > NEGATE_MUTATION_THRESHOLD)
- return 1
-
- return 0
+ return TRUE
+ return FALSE
/obj/machinery/computer/scan_consolenew
name = "\improper DNA Modifier access console"
@@ -320,7 +315,7 @@
icon = 'icons/obj/computer.dmi'
icon_screen = "dna"
icon_keyboard = "med_key"
- density = 1
+ density = TRUE
circuit = /obj/item/circuitboard/scan_consolenew
var/selected_ui_block = 1.0
var/selected_ui_subblock = 1.0
@@ -332,22 +327,22 @@
var/radiation_intensity = 1.0
var/list/datum/dna2/record/buffers[3]
var/irradiating = 0
- var/injector_ready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete
+ var/injector_ready = FALSE //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete
var/obj/machinery/dna_scannernew/connected = null
var/obj/item/disk/data/disk = null
var/selected_menu_key = null
- anchored = 1
+ anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 400
- var/waiting_for_user_input=0 // Fix for #274 (Mash create block injector without answering dialog to make unlimited injectors) - N3X
+ var/waiting_for_user_input = 0 // Fix for #274 (Mash create block injector without answering dialog to make unlimited injectors) - N3X
-/obj/machinery/computer/scan_consolenew/attackby(obj/item/I as obj, mob/user as mob, params)
+/obj/machinery/computer/scan_consolenew/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/disk/data)) //INSERT SOME diskS
- if(!src.disk)
+ if(!disk)
user.drop_item()
I.forceMove(src)
- src.disk = I
+ disk = I
to_chat(user, "You insert [I].")
SSnanoui.update_uis(src) // update all UIs attached to src()
return
@@ -364,39 +359,30 @@
if(!isnull(connected))
break
spawn(250)
- src.injector_ready = 1
- return
- return
+ injector_ready = TRUE
-/obj/machinery/computer/scan_consolenew/proc/all_dna_blocks(var/list/buffer)
+/obj/machinery/computer/scan_consolenew/proc/all_dna_blocks(list/buffer)
var/list/arr = list()
for(var/i = 1, i <= buffer.len, i++)
arr += "[i]:[EncodeDNABlock(buffer[i])]"
return arr
-/obj/machinery/computer/scan_consolenew/proc/setInjectorBlock(var/obj/item/dnainjector/I, var/blk, var/datum/dna2/record/buffer)
+/obj/machinery/computer/scan_consolenew/proc/setInjectorBlock(obj/item/dnainjector/I, blk, datum/dna2/record/buffer)
var/pos = findtext(blk,":")
- if(!pos) return 0
+ if(!pos)
+ return FALSE
var/id = text2num(copytext(blk,1,pos))
- if(!id) return 0
+ if(!id)
+ return FALSE
I.block = id
I.buf = buffer
- return 1
+ return TRUE
-/*
-/obj/machinery/computer/scan_consolenew/process() //not really used right now
- if(stat & (NOPOWER|BROKEN))
- return
- if(!( src.status )) //remove this
- return
- return
-*/
-
-/obj/machinery/computer/scan_consolenew/attack_ai(user as mob)
- src.add_hiddenprint(user)
+/obj/machinery/computer/scan_consolenew/attack_ai(mob/user)
+ add_hiddenprint(user)
attack_hand(user)
-/obj/machinery/computer/scan_consolenew/attack_hand(user as mob)
+/obj/machinery/computer/scan_consolenew/attack_hand(mob/user)
if(isnull(connected))
for(dir in list(NORTH,EAST,SOUTH,WEST))
connected = locate(/obj/machinery/dna_scannernew, get_step(src, dir))
@@ -423,7 +409,7 @@
*
* @return nothing
*/
-/obj/machinery/computer/scan_consolenew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+/obj/machinery/computer/scan_consolenew/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
if(user == connected.occupant)
return
@@ -441,7 +427,7 @@
/obj/machinery/computer/scan_consolenew/ui_data(mob/user, datum/topic_state/state)
var/data[0]
data["selectedMenuKey"] = selected_menu_key
- data["locked"] = src.connected.locked
+ data["locked"] = connected.locked
data["hasOccupant"] = connected.occupant ? 1 : 0
data["isInjectorReady"] = injector_ready
@@ -460,7 +446,7 @@
data["disk"] = diskData
var/list/new_buffers = list()
- for(var/datum/dna2/record/buf in src.buffers)
+ for(var/datum/dna2/record/buf in buffers)
new_buffers += list(buf.GetData())
data["buffers"]=new_buffers
@@ -477,7 +463,7 @@
data["selectedUITargetHex"] = selected_ui_target_hex
var/occupantData[0]
- if(!src.connected.occupant || !src.connected.occupant.dna)
+ if(!connected.occupant || !connected.occupant.dna)
occupantData["name"] = null
occupantData["stat"] = null
occupantData["isViableSubject"] = null
@@ -492,7 +478,7 @@
occupantData["name"] = connected.occupant.dna.real_name
occupantData["stat"] = connected.occupant.stat
occupantData["isViableSubject"] = 1
- if((NOCLONE in connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna || (NO_DNA in connected.occupant.dna.species.species_traits))
+ if((NOCLONE in connected.occupant.mutations && connected.scan_level < 3) || !connected.occupant.dna || (NO_DNA in connected.occupant.dna.species.species_traits))
occupantData["isViableSubject"] = 0
occupantData["health"] = connected.occupant.health
occupantData["maxHealth"] = connected.occupant.maxHealth
@@ -501,7 +487,7 @@
occupantData["uniqueIdentity"] = connected.occupant.dna.uni_identity
occupantData["structuralEnzymes"] = connected.occupant.dna.struc_enzymes
occupantData["radiationLevel"] = connected.occupant.radiation
- data["occupant"] = occupantData;
+ data["occupant"] = occupantData
data["isBeakerLoaded"] = connected.beaker ? 1 : 0
data["beakerLabel"] = null
@@ -516,173 +502,173 @@
/obj/machinery/computer/scan_consolenew/Topic(href, href_list)
if(..())
- return 0 // don't update uis
+ return FALSE // don't update uis
if(!istype(usr.loc, /turf))
- return 0 // don't update uis
- if(!src || !src.connected)
- return 0 // don't update uis
+ return FALSE // don't update uis
+ if(!src || !connected)
+ return FALSE // don't update uis
if(irradiating) // Make sure that it isn't already irradiating someone...
- return 0 // don't update uis
+ return FALSE // don't update uis
add_fingerprint(usr)
if(href_list["selectMenuKey"])
selected_menu_key = href_list["selectMenuKey"]
- return 1 // return 1 forces an update to all Nano uis attached to src
+ return TRUE // return 1 forces an update to all Nano uis attached to src
if(href_list["toggleLock"])
- if((src.connected && src.connected.occupant))
- src.connected.locked = !( src.connected.locked )
- return 1 // return 1 forces an update to all Nano uis attached to src
+ if((connected && connected.occupant))
+ connected.locked = !(connected.locked)
+ return TRUE // return 1 forces an update to all Nano uis attached to src
if(href_list["pulseRadiation"])
- irradiating = src.radiation_duration
- var/lock_state = src.connected.locked
- src.connected.locked = 1//lock it
+ irradiating = radiation_duration
+ var/lock_state = connected.locked
+ connected.locked = TRUE //lock it
SSnanoui.update_uis(src) // update all UIs attached to src
- sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
+ sleep(10 * radiation_duration) // sleep for radiation_duration seconds
irradiating = 0
- src.connected.locked = lock_state
+ connected.locked = lock_state
- if(!src.connected.occupant)
- return 1 // return 1 forces an update to all Nano uis attached to src
+ if(!connected.occupant)
+ return TRUE // return 1 forces an update to all Nano uis attached to src
- var/radiation = (((src.radiation_intensity*3)+src.radiation_duration*3) / connected.damage_coeff)
- src.connected.occupant.apply_effect(radiation,IRRADIATE,0)
- if(src.connected.radiation_check())
- return 1
+ var/radiation = (((radiation_intensity * 3) + radiation_duration * 3) / connected.damage_coeff)
+ connected.occupant.apply_effect(radiation, IRRADIATE, 0)
+ if(connected.radiation_check())
+ return TRUE
if(prob(95))
if(prob(75))
- randmutb(src.connected.occupant)
+ randmutb(connected.occupant)
else
- randmuti(src.connected.occupant)
+ randmuti(connected.occupant)
else
if(prob(95))
- randmutg(src.connected.occupant)
+ randmutg(connected.occupant)
else
- randmuti(src.connected.occupant)
+ randmuti(connected.occupant)
- return 1 // return 1 forces an update to all Nano uis attached to src
+ return TRUE // return 1 forces an update to all Nano uis attached to src
if(href_list["radiationDuration"])
if(text2num(href_list["radiationDuration"]) > 0)
- if(src.radiation_duration < 20)
- src.radiation_duration += 2
+ if(radiation_duration < 20)
+ radiation_duration += 2
else
- if(src.radiation_duration > 2)
- src.radiation_duration -= 2
- return 1 // return 1 forces an update to all Nano uis attached to src
+ if(radiation_duration > 2)
+ radiation_duration -= 2
+ return TRUE // return 1 forces an update to all Nano uis attached to src
if(href_list["radiationIntensity"])
if(text2num(href_list["radiationIntensity"]) > 0)
- if(src.radiation_intensity < 10)
- src.radiation_intensity++
+ if(radiation_intensity < 10)
+ radiation_intensity++
else
- if(src.radiation_intensity > 1)
- src.radiation_intensity--
- return 1 // return 1 forces an update to all Nano uis attached to src
+ if(radiation_intensity > 1)
+ radiation_intensity--
+ return TRUE // return 1 forces an update to all Nano uis attached to src
////////////////////////////////////////////////////////
if(href_list["changeUITarget"] && text2num(href_list["changeUITarget"]) > 0)
- if(src.selected_ui_target < 15)
- src.selected_ui_target++
- src.selected_ui_target_hex = src.selected_ui_target
+ if(selected_ui_target < 15)
+ selected_ui_target++
+ selected_ui_target_hex = selected_ui_target
switch(selected_ui_target)
if(10)
- src.selected_ui_target_hex = "A"
+ selected_ui_target_hex = "A"
if(11)
- src.selected_ui_target_hex = "B"
+ selected_ui_target_hex = "B"
if(12)
- src.selected_ui_target_hex = "C"
+ selected_ui_target_hex = "C"
if(13)
- src.selected_ui_target_hex = "D"
+ selected_ui_target_hex = "D"
if(14)
- src.selected_ui_target_hex = "E"
+ selected_ui_target_hex = "E"
if(15)
- src.selected_ui_target_hex = "F"
+ selected_ui_target_hex = "F"
else
- src.selected_ui_target = 0
- src.selected_ui_target_hex = 0
- return 1 // return 1 forces an update to all Nano uis attached to src
+ selected_ui_target = 0
+ selected_ui_target_hex = 0
+ return TRUE // return 1 forces an update to all Nano uis attached to src
if(href_list["changeUITarget"] && text2num(href_list["changeUITarget"]) < 1)
- if(src.selected_ui_target > 0)
- src.selected_ui_target--
- src.selected_ui_target_hex = src.selected_ui_target
+ if(selected_ui_target > 0)
+ selected_ui_target--
+ selected_ui_target_hex = selected_ui_target
switch(selected_ui_target)
if(10)
- src.selected_ui_target_hex = "A"
+ selected_ui_target_hex = "A"
if(11)
- src.selected_ui_target_hex = "B"
+ selected_ui_target_hex = "B"
if(12)
- src.selected_ui_target_hex = "C"
+ selected_ui_target_hex = "C"
if(13)
- src.selected_ui_target_hex = "D"
+ selected_ui_target_hex = "D"
if(14)
- src.selected_ui_target_hex = "E"
+ selected_ui_target_hex = "E"
else
- src.selected_ui_target = 15
- src.selected_ui_target_hex = "F"
- return 1 // return 1 forces an update to all Nano uis attached to src
+ selected_ui_target = 15
+ selected_ui_target_hex = "F"
+ return TRUE // return 1 forces an update to all Nano uis attached to src
if(href_list["selectUIBlock"] && href_list["selectUISubblock"]) // This chunk of code updates selected block / sub-block based on click
var/select_block = text2num(href_list["selectUIBlock"])
var/select_subblock = text2num(href_list["selectUISubblock"])
if((select_block <= DNA_UI_LENGTH) && (select_block >= 1))
- src.selected_ui_block = select_block
+ selected_ui_block = select_block
if((select_subblock <= DNA_BLOCK_SIZE) && (select_subblock >= 1))
- src.selected_ui_subblock = select_subblock
- return 1 // return 1 forces an update to all Nano uis attached to src
+ selected_ui_subblock = select_subblock
+ return TRUE // return 1 forces an update to all Nano uis attached to src
if(href_list["pulseUIRadiation"])
- var/block = src.connected.occupant.dna.GetUISubBlock(src.selected_ui_block,src.selected_ui_subblock)
+ var/block = connected.occupant.dna.GetUISubBlock(selected_ui_block, selected_ui_subblock)
- irradiating = src.radiation_duration
- var/lock_state = src.connected.locked
- src.connected.locked = 1//lock it
+ irradiating = radiation_duration
+ var/lock_state = connected.locked
+ connected.locked = TRUE //lock it
SSnanoui.update_uis(src) // update all UIs attached to src
- sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
+ sleep(10 * radiation_duration) // sleep for radiation_duration seconds
irradiating = 0
- src.connected.locked = lock_state
+ connected.locked = lock_state
- if(!src.connected.occupant)
- return 1
+ if(!connected.occupant)
+ return TRUE
- if(prob((80 + (src.radiation_duration / 2))))
- var/radiation = (src.radiation_intensity+src.radiation_duration)
- src.connected.occupant.apply_effect(radiation,IRRADIATE,0)
+ if(prob((80 + (radiation_duration / 2))))
+ var/radiation = (radiation_intensity + radiation_duration)
+ connected.occupant.apply_effect(radiation,IRRADIATE,0)
- if(src.connected.radiation_check())
- return 1
+ if(connected.radiation_check())
+ return TRUE
- block = miniscrambletarget(num2text(selected_ui_target), src.radiation_intensity, src.radiation_duration)
- src.connected.occupant.dna.SetUISubBlock(src.selected_ui_block,src.selected_ui_subblock,block)
- src.connected.occupant.UpdateAppearance()
+ block = miniscrambletarget(num2text(selected_ui_target), radiation_intensity, radiation_duration)
+ connected.occupant.dna.SetUISubBlock(selected_ui_block, selected_ui_subblock, block)
+ connected.occupant.UpdateAppearance()
else
- var/radiation = ((src.radiation_intensity*2)+src.radiation_duration)
- src.connected.occupant.apply_effect(radiation,IRRADIATE,0)
- if(src.connected.radiation_check())
- return 1
+ var/radiation = ((radiation_intensity * 2) + radiation_duration)
+ connected.occupant.apply_effect(radiation, IRRADIATE, 0)
+ if(connected.radiation_check())
+ return TRUE
- if(prob(20+src.radiation_intensity))
- randmutb(src.connected.occupant)
- domutcheck(src.connected.occupant,src.connected)
+ if(prob(20 + radiation_intensity))
+ randmutb(connected.occupant)
+ domutcheck(connected.occupant, connected)
else
- randmuti(src.connected.occupant)
- src.connected.occupant.UpdateAppearance()
- return 1 // return 1 forces an update to all Nano uis attached to src
+ randmuti(connected.occupant)
+ connected.occupant.UpdateAppearance()
+ return TRUE // return 1 forces an update to all Nano uis attached to src
////////////////////////////////////////////////////////
if(href_list["injectRejuvenators"])
if(!connected.occupant)
- return 0
+ return FALSE
var/inject_amount = round(text2num(href_list["injectRejuvenators"]), 5) // round to nearest 5
if(inject_amount < 0) // Since the user can actually type the commands himself, some sanity checking
inject_amount = 0
@@ -690,7 +676,7 @@
inject_amount = 50
connected.beaker.reagents.trans_to(connected.occupant, inject_amount)
connected.beaker.reagents.reaction(connected.occupant)
- return 1 // return 1 forces an update to all Nano uis attached to src
+ return TRUE // return 1 forces an update to all Nano uis attached to src
////////////////////////////////////////////////////////
@@ -698,73 +684,73 @@
var/select_block = text2num(href_list["selectSEBlock"])
var/select_subblock = text2num(href_list["selectSESubblock"])
if((select_block <= DNA_SE_LENGTH) && (select_block >= 1))
- src.selected_se_block = select_block
+ selected_se_block = select_block
if((select_subblock <= DNA_BLOCK_SIZE) && (select_subblock >= 1))
- src.selected_se_subblock = select_subblock
+ selected_se_subblock = select_subblock
//testing("User selected block [selected_se_block] (sent [select_block]), subblock [selected_se_subblock] (sent [select_block]).")
- return 1 // return 1 forces an update to all Nano uis attached to src
+ return TRUE // return 1 forces an update to all Nano uis attached to src
if(href_list["pulseSERadiation"])
- var/block = src.connected.occupant.dna.GetSESubBlock(src.selected_se_block,src.selected_se_subblock)
+ var/block = connected.occupant.dna.GetSESubBlock(selected_se_block, selected_se_subblock)
//var/original_block=block
- //testing("Irradiating SE block [src.selected_se_block]:[src.selected_se_subblock] ([block])...")
+ //testing("Irradiating SE block [selected_se_block]:[selected_se_subblock] ([block])...")
- irradiating = src.radiation_duration
- var/lock_state = src.connected.locked
- src.connected.locked = 1 //lock it
+ irradiating = radiation_duration
+ var/lock_state = connected.locked
+ connected.locked = TRUE //lock it
SSnanoui.update_uis(src) // update all UIs attached to src
- sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
+ sleep(10 * radiation_duration) // sleep for radiation_duration seconds
irradiating = 0
- src.connected.locked = lock_state
+ connected.locked = lock_state
- if(src.connected.occupant)
- if(prob((80 + ((src.radiation_duration / 2) + (connected.precision_coeff ** 3)))))
- var/radiation = ((src.radiation_intensity+src.radiation_duration) / connected.damage_coeff)
- src.connected.occupant.apply_effect(radiation,IRRADIATE,0)
+ if(connected.occupant)
+ if(prob((80 + ((radiation_duration / 2) + (connected.precision_coeff ** 3)))))
+ var/radiation = ((radiation_intensity + radiation_duration) / connected.damage_coeff)
+ connected.occupant.apply_effect(radiation, IRRADIATE, 0)
- if(src.connected.radiation_check())
+ if(connected.radiation_check())
return 1
var/real_SE_block=selected_se_block
- block = miniscramble(block, src.radiation_intensity, src.radiation_duration)
+ block = miniscramble(block, radiation_intensity, radiation_duration)
if(prob(20))
- if(src.selected_se_block > 1 && src.selected_se_block < DNA_SE_LENGTH/2)
+ if(selected_se_block > 1 && selected_se_block < DNA_SE_LENGTH/2)
real_SE_block++
- else if(src.selected_se_block > DNA_SE_LENGTH/2 && src.selected_se_block < DNA_SE_LENGTH)
+ else if(selected_se_block > DNA_SE_LENGTH/2 && selected_se_block < DNA_SE_LENGTH)
real_SE_block--
- //testing("Irradiated SE block [real_SE_block]:[src.selected_se_subblock] ([original_block] now [block]) [(real_SE_block!=selected_se_block) ? "(SHIFTED)":""]!")
- connected.occupant.dna.SetSESubBlock(real_SE_block,selected_se_subblock,block)
- domutcheck(src.connected.occupant,src.connected)
+ //testing("Irradiated SE block [real_SE_block]:[selected_se_subblock] ([original_block] now [block]) [(real_SE_block!=selected_se_block) ? "(SHIFTED)":""]!")
+ connected.occupant.dna.SetSESubBlock(real_SE_block, selected_se_subblock, block)
+ domutcheck(connected.occupant, connected)
else
- var/radiation = (((src.radiation_intensity*2)+src.radiation_duration) / connected.damage_coeff)
- src.connected.occupant.apply_effect(radiation,IRRADIATE,0)
+ var/radiation = (((radiation_intensity * 2) + radiation_duration) / connected.damage_coeff)
+ connected.occupant.apply_effect(radiation, IRRADIATE, 0)
- if(src.connected.radiation_check())
+ if(connected.radiation_check())
return 1
- if(prob(80-src.radiation_duration))
+ if(prob(80 - radiation_duration))
//testing("Random bad mut!")
- randmutb(src.connected.occupant)
- domutcheck(src.connected.occupant,src.connected)
+ randmutb(connected.occupant)
+ domutcheck(connected.occupant, connected)
else
- randmuti(src.connected.occupant)
+ randmuti(connected.occupant)
//testing("Random identity mut!")
- src.connected.occupant.UpdateAppearance()
- return 1 // return 1 forces an update to all Nano uis attached to src
+ connected.occupant.UpdateAppearance()
+ return TRUE // return 1 forces an update to all Nano uis attached to src
if(href_list["ejectBeaker"])
if(connected.beaker)
var/obj/item/reagent_containers/glass/B = connected.beaker
B.forceMove(connected.loc)
connected.beaker = null
- return 1
+ return TRUE
if(href_list["ejectOccupant"])
- connected.eject_occupant()
- return 1
+ connected.eject_occupant(usr)
+ return TRUE
// Transfer Buffer Management
if(href_list["bufferOption"])
@@ -772,113 +758,113 @@
// These bufferOptions do not require a bufferId
if(bufferOption == "wipeDisk")
- if((isnull(src.disk)) || (src.disk.read_only))
- //src.temphtml = "Invalid disk. Please try again."
- return 0
+ if((isnull(disk)) || (disk.read_only))
+ //temphtml = "Invalid disk. Please try again."
+ return FALSE
- src.disk.buf=null
- //src.temphtml = "Data saved."
- return 1
+ disk.buf = null
+ //temphtml = "Data saved."
+ return TRUE
if(bufferOption == "ejectDisk")
- if(!src.disk)
+ if(!disk)
return
- src.disk.forceMove(get_turf(src))
- src.disk = null
- return 1
+ disk.forceMove(get_turf(src))
+ disk = null
+ return TRUE
// All bufferOptions from here on require a bufferId
if(!href_list["bufferId"])
- return 0
+ return FALSE
var/bufferId = text2num(href_list["bufferId"])
if(bufferId < 1 || bufferId > 3)
- return 0 // Not a valid buffer id
+ return FALSE // Not a valid buffer id
if(bufferOption == "saveUI")
- if(src.connected.occupant && src.connected.occupant.dna)
- var/datum/dna2/record/databuf=new
+ if(connected.occupant && connected.occupant.dna)
+ var/datum/dna2/record/databuf = new
databuf.types = DNA2_BUF_UI // DNA2_BUF_UE
- databuf.dna = src.connected.occupant.dna.Clone()
+ databuf.dna = connected.occupant.dna.Clone()
if(ishuman(connected.occupant))
databuf.dna.real_name=connected.occupant.name
databuf.name = "Unique Identifier"
- src.buffers[bufferId] = databuf
- return 1
+ buffers[bufferId] = databuf
+ return TRUE
if(bufferOption == "saveUIAndUE")
- if(src.connected.occupant && src.connected.occupant.dna)
- var/datum/dna2/record/databuf=new
+ if(connected.occupant && connected.occupant.dna)
+ var/datum/dna2/record/databuf = new
databuf.types = DNA2_BUF_UI|DNA2_BUF_UE
- databuf.dna = src.connected.occupant.dna.Clone()
+ databuf.dna = connected.occupant.dna.Clone()
if(ishuman(connected.occupant))
databuf.dna.real_name=connected.occupant.dna.real_name
databuf.name = "Unique Identifier + Unique Enzymes"
- src.buffers[bufferId] = databuf
- return 1
+ buffers[bufferId] = databuf
+ return TRUE
if(bufferOption == "saveSE")
- if(src.connected.occupant && src.connected.occupant.dna)
- var/datum/dna2/record/databuf=new
+ if(connected.occupant && connected.occupant.dna)
+ var/datum/dna2/record/databuf = new
databuf.types = DNA2_BUF_SE
- databuf.dna = src.connected.occupant.dna.Clone()
+ databuf.dna = connected.occupant.dna.Clone()
if(ishuman(connected.occupant))
- databuf.dna.real_name=connected.occupant.dna.real_name
+ databuf.dna.real_name = connected.occupant.dna.real_name
databuf.name = "Structural Enzymes"
- src.buffers[bufferId] = databuf
- return 1
+ buffers[bufferId] = databuf
+ return TRUE
if(bufferOption == "clear")
- src.buffers[bufferId]=new /datum/dna2/record()
- return 1
+ buffers[bufferId] = new /datum/dna2/record()
+ return TRUE
if(bufferOption == "changeLabel")
- var/datum/dna2/record/buf = src.buffers[bufferId]
+ var/datum/dna2/record/buf = buffers[bufferId]
var/text = sanitize(input(usr, "New Label:", "Edit Label", buf.name) as text|null)
buf.name = text
- src.buffers[bufferId] = buf
- return 1
+ buffers[bufferId] = buf
+ return TRUE
if(bufferOption == "transfer")
- if(!src.connected.occupant || (NOCLONE in src.connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna)
- return 1
+ if(!connected.occupant || (NOCLONE in connected.occupant.mutations && connected.scan_level < 3) || !connected.occupant.dna)
+ return TRUE
irradiating = 2
- var/lock_state = src.connected.locked
- src.connected.locked = 1//lock it
+ var/lock_state = connected.locked
+ connected.locked = TRUE //lock it
SSnanoui.update_uis(src) // update all UIs attached to src
sleep(2 SECONDS)
irradiating = 0
- src.connected.locked = lock_state
+ connected.locked = lock_state
var/radiation = (rand(20,50) / connected.damage_coeff)
- src.connected.occupant.apply_effect(radiation,IRRADIATE,0)
+ connected.occupant.apply_effect(radiation, IRRADIATE, 0)
- if(src.connected.radiation_check())
- return 1
+ if(connected.radiation_check())
+ return TRUE
- var/datum/dna2/record/buf = src.buffers[bufferId]
+ var/datum/dna2/record/buf = buffers[bufferId]
if((buf.types & DNA2_BUF_UI))
if((buf.types & DNA2_BUF_UE))
- src.connected.occupant.real_name = buf.dna.real_name
- src.connected.occupant.name = buf.dna.real_name
- src.connected.occupant.UpdateAppearance(buf.dna.UI.Copy())
+ connected.occupant.real_name = buf.dna.real_name
+ connected.occupant.name = buf.dna.real_name
+ connected.occupant.UpdateAppearance(buf.dna.UI.Copy())
else if(buf.types & DNA2_BUF_SE)
- src.connected.occupant.dna.SE = buf.dna.SE.Copy()
- src.connected.occupant.dna.UpdateSE()
- domutcheck(src.connected.occupant,src.connected)
- return 1
+ connected.occupant.dna.SE = buf.dna.SE.Copy()
+ connected.occupant.dna.UpdateSE()
+ domutcheck(connected.occupant, connected)
+ return TRUE
if(bufferOption == "createInjector")
if(injector_ready && !waiting_for_user_input)
var/success = 1
var/obj/item/dnainjector/I = new /obj/item/dnainjector
- var/datum/dna2/record/buf = src.buffers[bufferId]
+ var/datum/dna2/record/buf = buffers[bufferId]
buf = buf.copy()
if(href_list["createBlockInjector"])
waiting_for_user_input=1
@@ -893,35 +879,35 @@
I.buf = buf
waiting_for_user_input = 0
if(success)
- I.forceMove(src.loc)
+ I.forceMove(loc)
I.name += " ([buf.name])"
if(connected)
I.damage_coeff = connected.damage_coeff
- src.injector_ready = 0
+ injector_ready = FALSE
spawn(300)
- src.injector_ready = 1
- return 1
+ injector_ready = TRUE
+ return TRUE
if(bufferOption == "loadDisk")
- if((isnull(src.disk)) || (!src.disk.buf))
- //src.temphtml = "Invalid disk. Please try again."
- return 0
+ if((isnull(disk)) || (!disk.buf))
+ //temphtml = "Invalid disk. Please try again."
+ return FALSE
- src.buffers[bufferId]=src.disk.buf.copy()
- //src.temphtml = "Data loaded."
- return 1
+ buffers[bufferId] = disk.buf.copy()
+ //temphtml = "Data loaded."
+ return TRUE
if(bufferOption == "saveDisk")
- if((isnull(src.disk)) || (src.disk.read_only))
- //src.temphtml = "Invalid disk. Please try again."
- return 0
+ if((isnull(disk)) || (disk.read_only))
+ //temphtml = "Invalid disk. Please try again."
+ return FALSE
- var/datum/dna2/record/buf = src.buffers[bufferId]
+ var/datum/dna2/record/buf = buffers[bufferId]
- src.disk.buf = buf.copy()
- src.disk.name = "data disk - '[buf.dna.real_name]'"
- //src.temphtml = "Data saved."
- return 1
+ disk.buf = buf.copy()
+ disk.name = "data disk - '[buf.dna.real_name]'"
+ //temphtml = "Data saved."
+ return TRUE
/////////////////////////// DNA MACHINES
diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm
index 15e2a9cfff4..8b8a86009b9 100644
--- a/code/game/dna/genes/disabilities.dm
+++ b/code/game/dna/genes/disabilities.dm
@@ -7,114 +7,145 @@
/////////////////////
/datum/dna/gene/disability
- name="DISABILITY"
+ name = "DISABILITY"
// Mutation to give (or 0)
- var/mutation=0
-
- // Disability to give (or 0)
- var/disability=0
+ var/mutation = 0
// Activation message
- var/activation_message=""
+ var/activation_message = ""
// Yay, you're no longer growing 3 arms
- var/deactivation_message=""
+ var/deactivation_message = ""
-/datum/dna/gene/disability/can_activate(var/mob/M,var/flags)
- return 1 // Always set!
+/datum/dna/gene/disability/can_activate(mob/M, flags)
+ return TRUE // Always set!
-/datum/dna/gene/disability/activate(var/mob/living/M, var/connected, var/flags)
+/datum/dna/gene/disability/activate(mob/living/M, connected, flags)
..()
- if(mutation && !(mutation in M.mutations))
- M.mutations.Add(mutation)
- if(disability)
- M.disabilities|=disability
+ M.mutations |= mutation
if(activation_message)
to_chat(M, "[activation_message]")
else
testing("[name] has no activation message.")
-/datum/dna/gene/disability/deactivate(var/mob/living/M, var/connected, var/flags)
+/datum/dna/gene/disability/deactivate(mob/living/M, connected, flags)
..()
- if(mutation && (mutation in M.mutations))
- M.mutations.Remove(mutation)
- if(disability)
- M.disabilities &= ~disability
+ M.mutations.Remove(mutation)
if(deactivation_message)
to_chat(M, "[deactivation_message]")
else
testing("[name] has no deactivation message.")
/datum/dna/gene/disability/hallucinate
- name="Hallucinate"
- activation_message="Your mind says 'Hello'."
- deactivation_message ="Sanity returns. Or does it?"
+ name = "Hallucinate"
+ activation_message = "Your mind says 'Hello'."
+ deactivation_message = "Sanity returns. Or does it?"
instability = -GENE_INSTABILITY_MODERATE
- mutation=HALLUCINATE
+ mutation = HALLUCINATE
/datum/dna/gene/disability/hallucinate/New()
- block=HALLUCINATIONBLOCK
+ ..()
+ block = GLOB.hallucinationblock
+
+/datum/dna/gene/disability/hallucinate/OnMobLife(mob/living/carbon/human/H)
+ if(prob(1))
+ H.Hallucinate(20)
/datum/dna/gene/disability/epilepsy
- name="Epilepsy"
- activation_message="You get a headache."
- deactivation_message ="Your headache is gone, at last."
+ name = "Epilepsy"
+ activation_message = "You get a headache."
+ deactivation_message = "Your headache is gone, at last."
instability = -GENE_INSTABILITY_MODERATE
- disability=EPILEPSY
+ mutation = EPILEPSY
/datum/dna/gene/disability/epilepsy/New()
- block=EPILEPSYBLOCK
+ ..()
+ block = GLOB.epilepsyblock
+
+/datum/dna/gene/disability/epilepsy/OnMobLife(mob/living/carbon/human/H)
+ if((prob(1) && H.paralysis < 1))
+ H.visible_message("[H] starts having a seizure!","You have a seizure!")
+ H.Paralyse(10)
+ H.Jitter(1000)
/datum/dna/gene/disability/cough
- name="Coughing"
- activation_message="You start coughing."
- deactivation_message ="Your throat stops aching."
+ name = "Coughing"
+ activation_message = "You start coughing."
+ deactivation_message = "Your throat stops aching."
instability = -GENE_INSTABILITY_MINOR
- disability=COUGHING
+ mutation = COUGHING
/datum/dna/gene/disability/cough/New()
- block=COUGHBLOCK
+ ..()
+ block = GLOB.coughblock
+
+/datum/dna/gene/disability/cough/OnMobLife(mob/living/carbon/human/H)
+ if((prob(5) && H.paralysis <= 1))
+ H.drop_item()
+ H.emote("cough")
/datum/dna/gene/disability/clumsy
- name="Clumsiness"
- activation_message="You feel lightheaded."
- deactivation_message ="You regain some control of your movements"
+ name = "Clumsiness"
+ activation_message = "You feel lightheaded."
+ deactivation_message = "You regain some control of your movements"
instability = -GENE_INSTABILITY_MINOR
- mutation=CLUMSY
+ mutation = CLUMSY
/datum/dna/gene/disability/clumsy/New()
- block=CLUMSYBLOCK
+ ..()
+ block = GLOB.clumsyblock
/datum/dna/gene/disability/tourettes
- name="Tourettes"
- activation_message="You twitch."
- deactivation_message ="Your mouth tastes like soap."
+ name = "Tourettes"
+ activation_message = "You twitch."
+ deactivation_message = "Your mouth tastes like soap."
instability = -GENE_INSTABILITY_MODERATE
- disability=TOURETTES
+ mutation = TOURETTES
/datum/dna/gene/disability/tourettes/New()
- block=TWITCHBLOCK
+ ..()
+ block = GLOB.twitchblock
+
+/datum/dna/gene/disability/tourettes/OnMobLife(mob/living/carbon/human/H)
+ if((prob(10) && H.paralysis <= 1))
+ H.Stun(10)
+ switch(rand(1, 3))
+ if(1)
+ H.emote("twitch")
+ if(2 to 3)
+ H.say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]")
+ var/x_offset_old = H.pixel_x
+ var/y_offset_old = H.pixel_y
+ var/x_offset = H.pixel_x + rand(-2, 2)
+ var/y_offset = H.pixel_y + rand(-1, 1)
+ animate(H, pixel_x = x_offset, pixel_y = y_offset, time = 1)
+ animate(H, pixel_x = x_offset_old, pixel_y = y_offset_old, time = 1)
/datum/dna/gene/disability/nervousness
- name="Nervousness"
+ name = "Nervousness"
activation_message="You feel nervous."
deactivation_message ="You feel much calmer."
- disability=NERVOUS
+ mutation = NERVOUS
/datum/dna/gene/disability/nervousness/New()
- block=NERVOUSBLOCK
+ ..()
+ block = GLOB.nervousblock
+/datum/dna/gene/disability/nervousness/OnMobLife(mob/living/carbon/human/H)
+ if(prob(10))
+ H.Stuttering(10)
/datum/dna/gene/disability/blindness
- name="Blindness"
+ name = "Blindness"
activation_message = "You can't seem to see anything."
deactivation_message = "You can see now, in case you didn't notice..."
instability = -GENE_INSTABILITY_MAJOR
- disability = BLIND
+ mutation = BLINDNESS
/datum/dna/gene/disability/blindness/New()
- block = BLINDBLOCK
+ ..()
+ block = GLOB.blindblock
/datum/dna/gene/disability/blindness/activate(mob/M, connected, flags)
..()
@@ -130,51 +161,54 @@
activation_message = "You feel a peculiar prickling in your eyes while your perception of colour changes."
deactivation_message ="Your eyes tingle unsettlingly, though everything seems to become alot more colourful."
instability = -GENE_INSTABILITY_MODERATE
- disability = COLOURBLIND
+ mutation = COLOURBLIND
/datum/dna/gene/disability/colourblindness/New()
- block=COLOURBLINDBLOCK
+ ..()
+ block = GLOB.colourblindblock
-/datum/dna/gene/disability/colourblindness/activate(var/mob/M, var/connected, var/flags)
+/datum/dna/gene/disability/colourblindness/activate(mob/M, connected, flags)
..()
M.update_client_colour() //Handle the activation of the colourblindness on the mob.
M.update_icons() //Apply eyeshine as needed.
-/datum/dna/gene/disability/colourblindness/deactivate(var/mob/M, var/connected, var/flags)
+/datum/dna/gene/disability/colourblindness/deactivate(mob/M, connected, flags)
..()
M.update_client_colour() //Handle the deactivation of the colourblindness on the mob.
M.update_icons() //Remove eyeshine as needed.
/datum/dna/gene/disability/deaf
- name="Deafness"
+ name = "Deafness"
activation_message="It's kinda quiet."
deactivation_message ="You can hear again!"
instability = -GENE_INSTABILITY_MAJOR
- disability=DEAF
+ mutation = DEAF
/datum/dna/gene/disability/deaf/New()
- block=DEAFBLOCK
+ ..()
+ block = GLOB.deafblock
-/datum/dna/gene/disability/deaf/activate(var/mob/M, var/connected, var/flags)
+/datum/dna/gene/disability/deaf/activate(mob/M, connected, flags)
..()
M.MinimumDeafTicks(1)
/datum/dna/gene/disability/nearsighted
- name="Nearsightedness"
+ name = "Nearsightedness"
activation_message="Your eyes feel weird..."
deactivation_message ="You can see clearly now"
instability = -GENE_INSTABILITY_MODERATE
- disability=NEARSIGHTED
+ mutation = NEARSIGHTED
/datum/dna/gene/disability/nearsighted/New()
- block=GLASSESBLOCK
+ ..()
+ block = GLOB.glassesblock
/datum/dna/gene/disability/nearsighted/activate(mob/living/M, connected, flags)
- . = ..()
+ ..()
M.update_nearsighted_effects()
/datum/dna/gene/disability/nearsighted/deactivate(mob/living/M, connected, flags)
- . = ..()
+ ..()
M.update_nearsighted_effects()
/datum/dna/gene/disability/lisp
@@ -186,9 +220,9 @@
/datum/dna/gene/disability/lisp/New()
..()
- block=LISPBLOCK
+ block = GLOB.lispblock
-/datum/dna/gene/disability/lisp/OnSay(var/mob/M, var/message)
+/datum/dna/gene/disability/lisp/OnSay(mob/M, message)
return replacetext(message,"s","th")
/datum/dna/gene/disability/comic
@@ -196,10 +230,11 @@
desc = "This will only bring death and destruction."
activation_message = "Uh oh!"
deactivation_message = "Well thank god that's over with."
- mutation=COMIC
+ mutation = COMIC
/datum/dna/gene/disability/comic/New()
- block = COMICBLOCK
+ ..()
+ block = GLOB.comicblock
/datum/dna/gene/disability/wingdings
name = "Alien Voice"
@@ -210,9 +245,10 @@
mutation = WINGDINGS
/datum/dna/gene/disability/wingdings/New()
- block = WINGDINGSBLOCK
+ ..()
+ block = GLOB.wingdingsblock
-/datum/dna/gene/disability/wingdings/OnSay(var/mob/M, var/message)
+/datum/dna/gene/disability/wingdings/OnSay(mob/M, message)
var/list/chars = string2charlist(message)
var/garbled_message = ""
for(var/C in chars)
diff --git a/code/game/dna/genes/gene.dm b/code/game/dna/genes/gene.dm
index f74d0c7d2a0..1509cd098a4 100644
--- a/code/game/dna/genes/gene.dm
+++ b/code/game/dna/genes/gene.dm
@@ -11,63 +11,61 @@
/datum/dna/gene
// Display name
- var/name="BASE GENE"
+ var/name = "BASE GENE"
// Probably won't get used but why the fuck not
var/desc="Oh god who knows what this does."
// Set in initialize()!
// What gene activates this?
- var/block=0
+ var/block = 0
// Any of a number of GENE_ flags.
- var/flags=0
+ var/flags = 0
// Chance of the gene to cause adverse effects when active
- var/instability=0
+ var/instability = 0
/*
* Is the gene active in this mob's DNA?
*/
-/datum/dna/gene/proc/is_active(var/mob/M)
- return M.active_genes && type in M.active_genes
+/datum/dna/gene/proc/is_active(mob/M)
+ return M.active_genes && (type in M.active_genes)
// Return 1 if we can activate.
// HANDLE MUTCHK_FORCED HERE!
-/datum/dna/gene/proc/can_activate(var/mob/M, var/flags)
- return 0
+/datum/dna/gene/proc/can_activate(mob/M, flags)
+ return FALSE
// Called when the gene activates. Do your magic here.
-/datum/dna/gene/proc/activate(var/mob/living/M, var/connected, var/flags)
+/datum/dna/gene/proc/activate(mob/living/M, connected, flags)
M.gene_stability -= instability
- return
/**
* Called when the gene deactivates. Undo your magic here.
* Only called when the block is deactivated.
*/
-/datum/dna/gene/proc/deactivate(var/mob/living/M, var/connected, var/flags)
+/datum/dna/gene/proc/deactivate(mob/living/M, connected, flags)
M.gene_stability += instability
- return
// This section inspired by goone's bioEffects.
/**
* Called in each life() tick.
*/
-/datum/dna/gene/proc/OnMobLife(var/mob/M)
+/datum/dna/gene/proc/OnMobLife(mob/M)
return
/**
* Called when the mob dies
*/
-/datum/dna/gene/proc/OnMobDeath(var/mob/M)
+/datum/dna/gene/proc/OnMobDeath(mob/M)
return
/**
* Called when the mob says shit
*/
-/datum/dna/gene/proc/OnSay(var/mob/M, var/message)
+/datum/dna/gene/proc/OnSay(mob/M, message)
return message
/**
@@ -75,10 +73,9 @@
*
* @params M The subject.
* @params g Gender (m or f)
-* @params fat Fat? (0 or 1)
*/
-/datum/dna/gene/proc/OnDrawUnderlays(var/mob/M, var/g, var/fat)
- return 0
+/datum/dna/gene/proc/OnDrawUnderlays(mob/M, g)
+ return FALSE
/////////////////////
@@ -94,34 +91,34 @@
/datum/dna/gene/basic
- name="BASIC GENE"
+ name = "BASIC GENE"
// Mutation to give
- var/mutation=0
+ var/mutation = 0
// Activation probability
- var/activation_prob=100
+ var/activation_prob = 100
// Possible activation messages
- var/list/activation_messages=list()
+ var/list/activation_messages = list()
// Possible deactivation messages
- var/list/deactivation_messages=list()
+ var/list/deactivation_messages = list()
-/datum/dna/gene/basic/can_activate(var/mob/M,var/flags)
+/datum/dna/gene/basic/can_activate(mob/M, flags)
if(flags & MUTCHK_FORCED)
- return 1
+ return TRUE
// Probability check
return prob(activation_prob)
-/datum/dna/gene/basic/activate(var/mob/M)
+/datum/dna/gene/basic/activate(mob/M, connected, flags)
..()
M.mutations.Add(mutation)
if(activation_messages.len)
var/msg = pick(activation_messages)
to_chat(M, "[msg]")
-/datum/dna/gene/basic/deactivate(var/mob/M)
+/datum/dna/gene/basic/deactivate(mob/living/M, connected, flags)
..()
M.mutations.Remove(mutation)
if(deactivation_messages.len)
diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm
index e6c55f02d11..7615f737cd0 100644
--- a/code/game/dna/genes/goon_disabilities.dm
+++ b/code/game/dna/genes/goon_disabilities.dm
@@ -13,13 +13,13 @@
activation_message = "You feel unable to express yourself at all."
deactivation_message = "You feel able to speak freely again."
instability = -GENE_INSTABILITY_MODERATE
- disability = MUTE
+ mutation = MUTE
/datum/dna/gene/disability/mute/New()
..()
- block=MUTEBLOCK
+ block = GLOB.muteblock
-/datum/dna/gene/disability/mute/OnSay(var/mob/M, var/message)
+/datum/dna/gene/disability/mute/OnSay(mob/M, message)
return ""
////////////////////////////////////////
@@ -36,30 +36,29 @@
/datum/dna/gene/disability/radioactive/New()
..()
- block=RADBLOCK
+ block = GLOB.radblock
-/datum/dna/gene/disability/radioactive/can_activate(var/mob/M,var/flags)
+/datum/dna/gene/disability/radioactive/can_activate(mob/M, flags)
if(!..())
- return 0
+ return FALSE
if(ishuman(M))
var/mob/living/carbon/human/H = M
if((RADIMMUNE in H.dna.species.species_traits) && !(flags & MUTCHK_FORCED))
- return 0
- return 1
+ return FALSE
+ return TRUE
-/datum/dna/gene/disability/radioactive/OnMobLife(var/mob/living/owner)
- var/radiation_amount = abs(min(owner.radiation - 20,0))
- owner.apply_effect(radiation_amount, IRRADIATE)
- for(var/mob/living/L in range(1, owner))
- if(L == owner)
+/datum/dna/gene/disability/radioactive/OnMobLife(mob/living/carbon/human/H)
+ var/radiation_amount = abs(min(H.radiation - 20,0))
+ H.apply_effect(radiation_amount, IRRADIATE)
+ for(var/mob/living/L in range(1, H))
+ if(L == H)
continue
- to_chat(L, "You are enveloped by a soft green glow emanating from [owner].")
+ to_chat(L, "You are enveloped by a soft green glow emanating from [H].")
L.apply_effect(5, IRRADIATE)
- return
-/datum/dna/gene/disability/radioactive/OnDrawUnderlays(var/mob/M,var/g,var/fat)
- return "rads[fat]_s"
+/datum/dna/gene/disability/radioactive/OnDrawUnderlays(mob/M, g)
+ return "rads_s"
////////////////////////////////////////
// Other disabilities
@@ -76,7 +75,7 @@
/datum/dna/gene/disability/fat/New()
..()
- block=FATBLOCK
+ block = GLOB.fatblock
// WAS: /datum/bioEffect/chav
/datum/dna/gene/disability/speech/chav
@@ -88,9 +87,9 @@
/datum/dna/gene/disability/speech/chav/New()
..()
- block=CHAVBLOCK
+ block = GLOB.chavblock
-/datum/dna/gene/disability/speech/chav/OnSay(var/mob/M, var/message)
+/datum/dna/gene/disability/speech/chav/OnSay(mob/M, message)
// THIS ENTIRE THING BEGS FOR REGEX
message = replacetext(message,"dick","prat")
message = replacetext(message,"comdom","knob'ead")
@@ -127,9 +126,9 @@
/datum/dna/gene/disability/speech/swedish/New()
..()
- block=SWEDEBLOCK
+ block = GLOB.swedeblock
-/datum/dna/gene/disability/speech/swedish/OnSay(var/mob/M, var/message)
+/datum/dna/gene/disability/speech/swedish/OnSay(mob/M, message)
// svedish
message = replacetextEx(message,"W","V")
message = replacetextEx(message,"w","v")
@@ -157,10 +156,10 @@
/datum/dna/gene/disability/unintelligable/New()
..()
- block=SCRAMBLEBLOCK
+ block = GLOB.scrambleblock
-/datum/dna/gene/disability/unintelligable/OnSay(var/mob/M, var/message)
- var/prefix=copytext(message,1,2)
+/datum/dna/gene/disability/unintelligable/OnSay(mob/M, message)
+ var/prefix = copytext(message,1,2)
if(prefix == ";")
message = copytext(message,2)
else if(prefix in list(":","#"))
@@ -175,7 +174,7 @@
var/cword = pick(words)
words.Remove(cword)
var/suffix = copytext(cword,length(cword)-1,length(cword))
- while(length(cword)>0 && suffix in list(".",",",";","!",":","?"))
+ while(length(cword)>0 && (suffix in list(".",",",";","!",":","?")))
cword = copytext(cword,1 ,length(cword)-1)
suffix = copytext(cword,length(cword)-1,length(cword) )
if(length(cword))
@@ -197,7 +196,7 @@
/datum/dna/gene/disability/strong/New()
..()
- block=STRONGBLOCK
+ block = GLOB.strongblock
// WAS: /datum/bioEffect/horns
/datum/dna/gene/disability/horns
@@ -209,9 +208,9 @@
/datum/dna/gene/disability/horns/New()
..()
- block=HORNSBLOCK
+ block = GLOB.hornsblock
-/datum/dna/gene/disability/horns/OnDrawUnderlays(var/mob/M,var/g,var/fat)
+/datum/dna/gene/disability/horns/OnDrawUnderlays(mob/M, g)
return "horns_s"
////////////////////////////////////////////////////////////////////////
@@ -223,11 +222,11 @@
deactivation_messages = list("You no longer feel uncomfortably hot.")
mutation = IMMOLATE
- spelltype=/obj/effect/proc_holder/spell/targeted/immolate
+ spelltype = /obj/effect/proc_holder/spell/targeted/immolate
/datum/dna/gene/basic/grant_spell/immolate/New()
..()
- block = IMMOLATEBLOCK
+ block = GLOB.immolateblock
/obj/effect/proc_holder/spell/targeted/immolate
name = "Incendiary Mitochondria"
diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm
index f49a250b0fa..87bbdf97c5c 100644
--- a/code/game/dna/genes/goon_powers.dm
+++ b/code/game/dna/genes/goon_powers.dm
@@ -2,26 +2,28 @@
// WAS: /datum/bioEffect/alcres
/datum/dna/gene/basic/sober
- name="Sober"
- activation_messages=list("You feel unusually sober.")
+ name = "Sober"
+ activation_messages = list("You feel unusually sober.")
deactivation_messages = list("You feel like you could use a stiff drink.")
- mutation=SOBER
+ mutation = SOBER
/datum/dna/gene/basic/sober/New()
- block=SOBERBLOCK
+ ..()
+ block = GLOB.soberblock
//WAS: /datum/bioEffect/psychic_resist
/datum/dna/gene/basic/psychic_resist
- name="Psy-Resist"
+ name = "Psy-Resist"
desc = "Boosts efficiency in sectors of the brain commonly associated with meta-mental energies."
activation_messages = list("Your mind feels closed.")
deactivation_messages = list("You feel oddly exposed.")
- mutation=PSY_RESIST
+ mutation = PSY_RESIST
/datum/dna/gene/basic/psychic_resist/New()
- block=PSYRESISTBLOCK
+ ..()
+ block = GLOB.psyresistblock
/////////////////////////
// Stealth Enhancers
@@ -30,16 +32,16 @@
/datum/dna/gene/basic/stealth
instability = GENE_INSTABILITY_MODERATE
-/datum/dna/gene/basic/stealth/can_activate(var/mob/M, var/flags)
+/datum/dna/gene/basic/stealth/can_activate(mob/M, flags)
// Can only activate one of these at a time.
if(is_type_in_list(/datum/dna/gene/basic/stealth,M.active_genes))
testing("Cannot activate [type]: /datum/dna/gene/basic/stealth in M.active_genes.")
- return 0
- return ..(M,flags)
+ return FALSE
+ return ..()
-/datum/dna/gene/basic/stealth/deactivate(var/mob/M)
- ..(M)
- M.alpha=255
+/datum/dna/gene/basic/stealth/deactivate(mob/living/M, connected, flags)
+ ..()
+ M.alpha = 255
// WAS: /datum/bioEffect/darkcloak
/datum/dna/gene/basic/stealth/darkcloak
@@ -47,13 +49,14 @@
desc = "Enables the subject to bend low levels of light around themselves, creating a cloaking effect."
activation_messages = list("You begin to fade into the shadows.")
deactivation_messages = list("You become fully visible.")
- activation_prob=25
+ activation_prob = 25
mutation = CLOAK
/datum/dna/gene/basic/stealth/darkcloak/New()
- block=SHADOWBLOCK
+ ..()
+ block = GLOB.shadowblock
-/datum/dna/gene/basic/stealth/darkcloak/OnMobLife(var/mob/M)
+/datum/dna/gene/basic/stealth/darkcloak/OnMobLife(mob/M)
var/turf/simulated/T = get_turf(M)
if(!istype(T))
return
@@ -69,13 +72,14 @@
desc = "The subject becomes able to subtly alter light patterns to become invisible, as long as they remain still."
activation_messages = list("You feel one with your surroundings.")
deactivation_messages = list("You feel oddly visible.")
- activation_prob=25
+ activation_prob = 25
mutation = CHAMELEON
/datum/dna/gene/basic/stealth/chameleon/New()
- block=CHAMELEONBLOCK
+ ..()
+ block = GLOB.chameleonblock
-/datum/dna/gene/basic/stealth/chameleon/OnMobLife(var/mob/M)
+/datum/dna/gene/basic/stealth/chameleon/OnMobLife(mob/M)
if((world.time - M.last_movement) >= 30 && !M.stat && M.canmove && !M.restrained())
M.alpha -= 25
else
@@ -86,27 +90,27 @@
/datum/dna/gene/basic/grant_spell
var/obj/effect/proc_holder/spell/spelltype
-/datum/dna/gene/basic/grant_spell/activate(var/mob/M, var/connected, var/flags)
+/datum/dna/gene/basic/grant_spell/activate(mob/M, connected, flags)
M.AddSpell(new spelltype(null))
..()
- return 1
+ return TRUE
-/datum/dna/gene/basic/grant_spell/deactivate(var/mob/M, var/connected, var/flags)
+/datum/dna/gene/basic/grant_spell/deactivate(mob/M, connected, flags)
for(var/obj/effect/proc_holder/spell/S in M.mob_spell_list)
if(istype(S, spelltype))
M.RemoveSpell(S)
..()
- return 1
+ return TRUE
/datum/dna/gene/basic/grant_verb
var/verbtype
-/datum/dna/gene/basic/grant_verb/activate(var/mob/M, var/connected, var/flags)
+/datum/dna/gene/basic/grant_verb/activate(mob/M, connected, flags)
..()
M.verbs += verbtype
- return 1
+ return TRUE
-/datum/dna/gene/basic/grant_verb/deactivate(var/mob/M, var/connected, var/flags)
+/datum/dna/gene/basic/grant_verb/deactivate(mob/M, connected, flags)
..()
M.verbs -= verbtype
@@ -123,7 +127,7 @@
/datum/dna/gene/basic/grant_spell/cryo/New()
..()
- block = CRYOBLOCK
+ block = GLOB.cryoblock
/obj/effect/proc_holder/spell/targeted/cryokinesis
name = "Cryokinesis"
@@ -183,8 +187,6 @@
new/obj/effect/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis"))
- return
-
/obj/effect/self_deleting
density = 0
opacity = 0
@@ -193,12 +195,11 @@
desc = ""
//layer = 15
-/obj/effect/self_deleting/New(var/atom/location, var/icon/I, var/duration = 20, var/oname = "something")
- src.name = oname
+/obj/effect/self_deleting/New(atom/location, icon/I, duration = 20, oname = "something")
+ name = oname
loc=location
- src.icon = I
- spawn(duration)
- qdel(src)
+ icon = I
+ QDEL_IN(src, duration)
///////////////////////////////////////////////////////////////////////////////////////////
@@ -215,7 +216,7 @@
/datum/dna/gene/basic/grant_spell/mattereater/New()
..()
- block = EATBLOCK
+ block = GLOB.eatblock
/obj/effect/proc_holder/spell/targeted/eat
name = "Eat"
@@ -255,7 +256,7 @@
/obj/item/implant
)
-/obj/effect/proc_holder/spell/targeted/eat/proc/doHeal(var/mob/user)
+/obj/effect/proc_holder/spell/targeted/eat/proc/doHeal(mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
for(var/name in H.bodyparts_by_name)
@@ -300,12 +301,12 @@
perform(targets, user = user)
/obj/effect/proc_holder/spell/targeted/eat/proc/check_mouth(mob/user = usr)
- var/can_eat = 1
+ var/can_eat = TRUE
if(iscarbon(user))
var/mob/living/carbon/C = user
if((C.head && (C.head.flags_cover & HEADCOVERSMOUTH)) || (C.wear_mask && (C.wear_mask.flags_cover & MASKCOVERSMOUTH) && !C.wear_mask.mask_adjusted))
to_chat(C, "Your mouth is covered, preventing you from eating!")
- can_eat = 0
+ can_eat = FALSE
return can_eat
/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets, mob/user = usr)
@@ -320,17 +321,17 @@
if(!istype(limb))
to_chat(user, "You can't eat this part of them!")
revert_cast()
- return 0
+ return FALSE
if(istype(limb,/obj/item/organ/external/head))
// Bullshit, but prevents being unable to clone someone.
to_chat(user, "You try to put \the [limb] in your mouth, but [the_item.p_their()] ears tickle your throat!")
revert_cast()
- return 0
+ return FALSE
if(istype(limb,/obj/item/organ/external/chest))
// Bullshit, but prevents being able to instagib someone.
to_chat(user, "You try to put [the_item.p_their()] [limb] in your mouth, but it's too big to fit!")
revert_cast()
- return 0
+ return FALSE
user.visible_message("[user] begins stuffing [the_item]'s [limb.name] into [user.p_their()] gaping maw!")
var/oldloc = H.loc
if(!do_mob(user,H,EAT_MOB_DELAY))
@@ -350,7 +351,6 @@
playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0)
qdel(the_item)
doHeal(user)
- return
////////////////////////////////////////////////////////////////////////
@@ -368,7 +368,7 @@
/datum/dna/gene/basic/grant_spell/jumpy/New()
..()
- block = JUMPBLOCK
+ block = GLOB.jumpblock
/obj/effect/proc_holder/spell/targeted/leap
name = "Jump"
@@ -387,7 +387,7 @@
action_icon_state = "genetic_jump"
/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets, mob/user = usr)
- var/failure = 0
+ var/failure = FALSE
if(istype(user.loc,/mob/) || user.lying || user.stunned || user.buckled || user.stat)
to_chat(user, "You can't jump right now!")
return
@@ -397,7 +397,7 @@
for(var/mob/M in range(user, 1))
if(M.pulling == user)
if(!M.restrained() && M.stat == 0 && M.canmove && user.Adjacent(M))
- failure = 1
+ failure = TRUE
else
M.stop_pulling()
@@ -409,12 +409,12 @@
user.visible_message("[user] attempts to leap away but is slammed back down to the ground!",
"You attempt to leap away but are suddenly slammed back down to the ground!",
"You hear the flexing of powerful muscles and suddenly a crash as a body hits the floor.")
- return 0
+ return FALSE
var/prevLayer = user.layer
var/prevFlying = user.flying
user.layer = 9
- user.flying = 1
+ user.flying = TRUE
for(var/i=0, i<10, i++)
step(user, user.dir)
if(i < 5) user.pixel_y += 8
@@ -463,7 +463,7 @@
/datum/dna/gene/basic/grant_spell/polymorph/New()
..()
- block = POLYMORPHBLOCK
+ block = GLOB.polymorphblock
/obj/effect/proc_holder/spell/targeted/polymorph
name = "Polymorph"
@@ -508,11 +508,11 @@
activation_messages = list("You suddenly notice more about others than you did before.")
deactivation_messages = list("You no longer feel able to sense intentions.")
instability = GENE_INSTABILITY_MINOR
- mutation=EMPATH
+ mutation = EMPATH
/datum/dna/gene/basic/grant_spell/empath/New()
..()
- block = EMPATHBLOCK
+ block = GLOB.empathblock
/obj/effect/proc_holder/spell/targeted/empath
name = "Read Mind"
@@ -614,4 +614,3 @@
to_chat(M, "You sense [user.name] reading your mind.")
else if(prob(5) || M.mind.assigned_role=="Chaplain")
to_chat(M, "You sense someone intruding upon your thoughts...")
- return
diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm
index 9be8256eebe..583b2c75836 100644
--- a/code/game/dna/genes/monkey.dm
+++ b/code/game/dna/genes/monkey.dm
@@ -1,10 +1,11 @@
/datum/dna/gene/monkey
- name="Monkey"
+ name = "Monkey"
/datum/dna/gene/monkey/New()
- block=MONKEYBLOCK
+ ..()
+ block = GLOB.monkeyblock
-/datum/dna/gene/monkey/can_activate(var/mob/M,var/flags)
+/datum/dna/gene/monkey/can_activate(mob/M, flags)
return ishuman(M)
/datum/dna/gene/monkey/activate(mob/living/carbon/human/H, connected, flags)
@@ -21,7 +22,7 @@
H.regenerate_icons()
H.SetStunned(1)
- H.canmove = 0
+ H.canmove = FALSE
H.icon = null
H.invisibility = 101
var/has_primitive_form = H.dna.species.primitive_form // cache this
diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm
index f8b231372dc..d893c64565c 100644
--- a/code/game/dna/genes/powers.dm
+++ b/code/game/dna/genes/powers.dm
@@ -3,109 +3,121 @@
///////////////////////////////////
/datum/dna/gene/basic/nobreath
- name="No Breathing"
- activation_messages=list("You feel no need to breathe.")
- deactivation_messages=list("You feel the need to breathe, once more.")
+ name = "No Breathing"
+ activation_messages = list("You feel no need to breathe.")
+ deactivation_messages = list("You feel the need to breathe, once more.")
instability = GENE_INSTABILITY_MODERATE
mutation = BREATHLESS
- activation_prob=25
+ activation_prob = 25
/datum/dna/gene/basic/nobreath/New()
- block = BREATHLESSBLOCK
+ ..()
+ block = GLOB.breathlessblock
/datum/dna/gene/basic/regenerate
- name="Regenerate"
- activation_messages=list("Your wounds start healing.")
- deactivation_messages=list("Your regenerative powers feel like they've vanished.")
+ name = "Regenerate"
+ activation_messages = list("Your wounds start healing.")
+ deactivation_messages = list("Your regenerative powers feel like they've vanished.")
instability = GENE_INSTABILITY_MINOR
- mutation=REGEN
+ mutation = REGEN
/datum/dna/gene/basic/regenerate/New()
- block=REGENERATEBLOCK
+ ..()
+ block = GLOB.regenerateblock
+
+/datum/dna/gene/basic/regenerate/OnMobLife(mob/living/carbon/human/H)
+ H.adjustBruteLoss(-0.1, FALSE)
+ H.adjustFireLoss(-0.1)
/datum/dna/gene/basic/increaserun
- name="Super Speed"
- activation_messages=list("You feel swift and unencumbered.")
- deactivation_messages=list("You feel slow.")
+ name = "Super Speed"
+ activation_messages = list("You feel swift and unencumbered.")
+ deactivation_messages = list("You feel slow.")
instability = GENE_INSTABILITY_MINOR
- mutation=RUN
+ mutation = RUN
/datum/dna/gene/basic/increaserun/New()
- block=INCREASERUNBLOCK
+ ..()
+ block = GLOB.increaserunblock
-/datum/dna/gene/basic/increaserun/can_activate(var/mob/M,var/flags)
+/datum/dna/gene/basic/increaserun/can_activate(mob/M, flags)
if(!..())
- return 0
+ return FALSE
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.dna.species && H.dna.species.speed_mod && !(flags & MUTCHK_FORCED))
- return 0
- return 1
+ return FALSE
+ return TRUE
/datum/dna/gene/basic/heat_resist
- name="Heat Resistance"
- activation_messages=list("Your skin is icy to the touch.")
- deactivation_messages=list("Your skin no longer feels icy to the touch.")
+ name = "Heat Resistance"
+ activation_messages = list("Your skin is icy to the touch.")
+ deactivation_messages = list("Your skin no longer feels icy to the touch.")
instability = GENE_INSTABILITY_MODERATE
mutation = HEATRES
/datum/dna/gene/basic/heat_resist/New()
- block=COLDBLOCK
+ ..()
+ block = GLOB.coldblock
-/datum/dna/gene/basic/heat_resist/OnDrawUnderlays(var/mob/M,var/g,var/fat)
- return "cold[fat]_s"
+/datum/dna/gene/basic/heat_resist/OnDrawUnderlays(mob/M, g)
+ return "cold_s"
/datum/dna/gene/basic/cold_resist
- name="Cold Resistance"
- activation_messages=list("Your body is filled with warmth.")
- deactivation_messages=list("Your body is no longer filled with warmth.")
+ name = "Cold Resistance"
+ activation_messages = list("Your body is filled with warmth.")
+ deactivation_messages = list("Your body is no longer filled with warmth.")
instability = GENE_INSTABILITY_MODERATE
mutation = COLDRES
/datum/dna/gene/basic/cold_resist/New()
- block=FIREBLOCK
+ ..()
+ block = GLOB.fireblock
-/datum/dna/gene/basic/cold_resist/OnDrawUnderlays(var/mob/M,var/g,var/fat)
- return "fire[fat]_s"
+/datum/dna/gene/basic/cold_resist/OnDrawUnderlays(mob/M, g)
+ return "fire_s"
/datum/dna/gene/basic/noprints
- name="No Prints"
- activation_messages=list("Your fingers feel numb.")
- deactivation_messages=list("your fingers no longer feel numb.")
+ name = "No Prints"
+ activation_messages = list("Your fingers feel numb.")
+ deactivation_messages = list("your fingers no longer feel numb.")
instability = GENE_INSTABILITY_MINOR
- mutation=FINGERPRINTS
+ mutation = FINGERPRINTS
/datum/dna/gene/basic/noprints/New()
- block=NOPRINTSBLOCK
+ ..()
+ block = GLOB.noprintsblock
/datum/dna/gene/basic/noshock
- name="Shock Immunity"
- activation_messages=list("Your skin feels dry and unreactive.")
- deactivation_messages=list("Your skin no longer feels dry and unreactive.")
+ name = "Shock Immunity"
+ activation_messages = list("Your skin feels dry and unreactive.")
+ deactivation_messages = list("Your skin no longer feels dry and unreactive.")
instability = GENE_INSTABILITY_MODERATE
- mutation=NO_SHOCK
+ mutation = NO_SHOCK
/datum/dna/gene/basic/noshock/New()
- block=SHOCKIMMUNITYBLOCK
+ ..()
+ block = GLOB.shockimmunityblock
/datum/dna/gene/basic/midget
- name="Midget"
- activation_messages=list("Everything around you seems bigger now...")
+ name = "Midget"
+ activation_messages = list("Everything around you seems bigger now...")
deactivation_messages = list("Everything around you seems to shrink...")
instability = GENE_INSTABILITY_MINOR
- mutation=DWARF
+ mutation = DWARF
/datum/dna/gene/basic/midget/New()
- block=SMALLSIZEBLOCK
+ ..()
+ block = GLOB.smallsizeblock
-/datum/dna/gene/basic/midget/activate(var/mob/M, var/connected, var/flags)
- ..(M,connected,flags)
+/datum/dna/gene/basic/midget/activate(mob/M, connected, flags)
+ ..()
M.pass_flags |= PASSTABLE
M.resize = 0.8
M.update_transform()
-/datum/dna/gene/basic/midget/deactivate(var/mob/M, var/connected, var/flags)
+/datum/dna/gene/basic/midget/deactivate(mob/M, connected, flags)
..()
M.pass_flags &= ~PASSTABLE
M.resize = 1.25
@@ -113,55 +125,54 @@
// OLD HULK BEHAVIOR
/datum/dna/gene/basic/hulk
- name="Hulk"
- activation_messages=list("Your muscles hurt.")
- deactivation_messages=list("Your muscles shrink.")
+ name = "Hulk"
+ activation_messages = list("Your muscles hurt.")
+ deactivation_messages = list("Your muscles shrink.")
instability = GENE_INSTABILITY_MAJOR
- mutation=HULK
- activation_prob=15
+ mutation = HULK
+ activation_prob = 15
/datum/dna/gene/basic/hulk/New()
- block=HULKBLOCK
+ ..()
+ block = GLOB.hulkblock
-/datum/dna/gene/basic/hulk/activate(var/mob/M, var/connected, var/flags)
+/datum/dna/gene/basic/hulk/activate(mob/M, connected, flags)
..()
var/status = CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH
M.status_flags &= ~status
-/datum/dna/gene/basic/hulk/deactivate(var/mob/M, var/connected, var/flags)
+/datum/dna/gene/basic/hulk/deactivate(mob/M, connected, flags)
..()
M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH
-/datum/dna/gene/basic/hulk/OnDrawUnderlays(var/mob/M,var/g,var/fat)
+/datum/dna/gene/basic/hulk/OnDrawUnderlays(mob/M, g)
if(HULK in M.mutations)
- if(fat)
- return "hulk_[fat]_s"
- else
- return "hulk_[g]_s"
- return 0
+ return "hulk_[g]_s"
+ return FALSE
-/datum/dna/gene/basic/hulk/OnMobLife(var/mob/living/carbon/human/M)
+/datum/dna/gene/basic/hulk/OnMobLife(mob/living/carbon/human/M)
if(!istype(M))
return
if((HULK in M.mutations) && M.health <= 0)
M.mutations.Remove(HULK)
- M.dna.SetSEState(HULKBLOCK,0)
- genemutcheck(M, HULKBLOCK,null,MUTCHK_FORCED)
+ M.dna.SetSEState(GLOB.hulkblock,0)
+ genemutcheck(M, GLOB.hulkblock,null,MUTCHK_FORCED)
M.update_mutations() //update our mutation overlays
M.update_body()
M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH //temporary fix until the problem can be solved.
to_chat(M, "You suddenly feel very weak.")
/datum/dna/gene/basic/xray
- name="X-Ray Vision"
- activation_messages=list("The walls suddenly disappear.")
- deactivation_messages=list("the walls around you re-appear.")
+ name = "X-Ray Vision"
+ activation_messages = list("The walls suddenly disappear.")
+ deactivation_messages = list("the walls around you re-appear.")
instability = GENE_INSTABILITY_MAJOR
- mutation=XRAY
- activation_prob=15
+ mutation = XRAY
+ activation_prob = 15
/datum/dna/gene/basic/xray/New()
- block=XRAYBLOCK
+ ..()
+ block = GLOB.xrayblock
/datum/dna/gene/basic/xray/activate(mob/living/M, connected, flags)
..()
@@ -174,15 +185,16 @@
M.update_icons() //Remove eyeshine as needed.
/datum/dna/gene/basic/tk
- name="Telekenesis"
+ name = "Telekenesis"
activation_messages = list("You feel smarter.")
deactivation_messages = list("You feel dumber.")
instability = GENE_INSTABILITY_MAJOR
- mutation=TK
- activation_prob=15
+ mutation = TK
+ activation_prob = 15
/datum/dna/gene/basic/tk/New()
- block=TELEBLOCK
+ ..()
+ block = GLOB.teleblock
-/datum/dna/gene/basic/tk/OnDrawUnderlays(var/mob/M,var/g,var/fat)
- return "telekinesishead[fat]_s"
+/datum/dna/gene/basic/tk/OnDrawUnderlays(mob/M, g)
+ return "telekinesishead_s"
diff --git a/code/game/dna/genes/vg_disabilities.dm b/code/game/dna/genes/vg_disabilities.dm
index 79f1ca16411..c2ad1559b6a 100644
--- a/code/game/dna/genes/vg_disabilities.dm
+++ b/code/game/dna/genes/vg_disabilities.dm
@@ -8,11 +8,11 @@
/datum/dna/gene/disability/speech/loud/New()
..()
- block=LOUDBLOCK
+ block = GLOB.loudblock
-/datum/dna/gene/disability/speech/loud/OnSay(var/mob/M, var/message)
+/datum/dna/gene/disability/speech/loud/OnSay(mob/M, message)
message = replacetext(message,".","!")
message = replacetext(message,"?","?!")
message = replacetext(message,"!","!!")
@@ -28,15 +28,15 @@
/datum/dna/gene/disability/dizzy/New()
..()
- block=DIZZYBLOCK
+ block = GLOB.dizzyblock
-/datum/dna/gene/disability/dizzy/OnMobLife(var/mob/living/carbon/human/M)
+/datum/dna/gene/disability/dizzy/OnMobLife(mob/living/carbon/human/M)
if(!istype(M))
return
if(DIZZY in M.mutations)
M.Dizzy(300)
/datum/dna/gene/disability/dizzy/deactivate(mob/living/M, connected, flags)
- . = ..()
+ ..()
M.SetDizzy(0)
diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm
index 506ef5714f8..9092448e398 100644
--- a/code/game/dna/genes/vg_powers.dm
+++ b/code/game/dna/genes/vg_powers.dm
@@ -4,14 +4,14 @@
name = "Morphism"
desc = "Enables the subject to reconfigure their appearance to that of any human."
spelltype =/obj/effect/proc_holder/spell/targeted/morph
- activation_messages=list("Your body feels if can alter its appearance.")
+ activation_messages = list("Your body feels if can alter its appearance.")
deactivation_messages = list("Your body doesn't feel capable of altering its appearance.")
instability = GENE_INSTABILITY_MINOR
- mutation=MORPH
+ mutation = MORPH
/datum/dna/gene/basic/grant_spell/morph/New()
..()
- block = MORPHBLOCK
+ block = GLOB.morphblock
/obj/effect/proc_holder/spell/targeted/morph
name = "Morph"
@@ -29,7 +29,8 @@
action_icon_state = "genetic_morph"
/obj/effect/proc_holder/spell/targeted/morph/cast(list/targets, mob/user = usr)
- if(!ishuman(user)) return
+ if(!ishuman(user))
+ return
if(istype(user.loc,/mob/))
to_chat(user, "You can't change your appearance right now!")
@@ -173,24 +174,24 @@
M.update_dna()
- M.visible_message("[src] morphs and changes [p_their()] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")
+ M.visible_message("[M] morphs and changes [M.p_their()] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")
/datum/dna/gene/basic/grant_spell/remotetalk
- name="Telepathy"
- activation_messages=list("You feel you can project your thoughts.")
- deactivation_messages=list("You no longer feel you can project your thoughts.")
+ name = "Telepathy"
+ activation_messages = list("You feel you can project your thoughts.")
+ deactivation_messages = list("You no longer feel you can project your thoughts.")
instability = GENE_INSTABILITY_MINOR
- mutation=REMOTE_TALK
+ mutation = REMOTE_TALK
spelltype =/obj/effect/proc_holder/spell/targeted/remotetalk
/datum/dna/gene/basic/grant_spell/remotetalk/New()
..()
- block=REMOTETALKBLOCK
+ block = GLOB.remotetalkblock
-/datum/dna/gene/basic/grant_spell/remotetalk/activate(mob/user)
+/datum/dna/gene/basic/grant_spell/remotetalk/activate(mob/living/M, connected, flags)
..()
- user.AddSpell(new /obj/effect/proc_holder/spell/targeted/mindscan(null))
+ M.AddSpell(new /obj/effect/proc_holder/spell/targeted/mindscan(null))
/datum/dna/gene/basic/grant_spell/remotetalk/deactivate(mob/user)
..()
@@ -336,22 +337,23 @@
return ..()
/datum/dna/gene/basic/grant_spell/remoteview
- name="Remote Viewing"
- activation_messages=list("Your mind can see things from afar.")
- deactivation_messages=list("Your mind can no longer can see things from afar.")
+ name = "Remote Viewing"
+ activation_messages = list("Your mind can see things from afar.")
+ deactivation_messages = list("Your mind can no longer can see things from afar.")
instability = GENE_INSTABILITY_MINOR
- mutation=REMOTE_VIEW
+ mutation = REMOTE_VIEW
spelltype =/obj/effect/proc_holder/spell/targeted/remoteview
/datum/dna/gene/basic/grant_spell/remoteview/New()
- block=REMOTEVIEWBLOCK
+ ..()
+ block = GLOB.remoteviewblock
/obj/effect/proc_holder/spell/targeted/remoteview
name = "Remote View"
desc = "Spy on people from any range!"
- charge_max = 600
+ charge_max = 100
clothes_req = 0
stat_allowed = 0
@@ -363,18 +365,23 @@
/obj/effect/proc_holder/spell/targeted/remoteview/choose_targets(mob/user = usr)
var/list/targets = list()
- var/list/remoteviewers = new /list()
- for(var/mob/M in GLOB.living_mob_list)
+ var/list/remoteviewers = list()
+ for(var/mob/M in GLOB.alive_mob_list)
+ if(M == user)
+ continue
if(PSY_RESIST in M.mutations)
continue
if(REMOTE_VIEW in M.mutations)
remoteviewers += M
- if(!remoteviewers.len || remoteviewers.len == 1)
+ if(!LAZYLEN(remoteviewers))
to_chat(user, "No valid targets with remote view were found!")
start_recharge()
return
- targets += input("Choose the target to spy on.", "Targeting") as mob in remoteviewers
-
+ targets += input("Choose the target to spy on.", "Targeting") as null|anything in remoteviewers
+ if(!targets)
+ to_chat(user, "You decide against remote viewing.")
+ start_recharge()
+ return
perform(targets, user = user)
/obj/effect/proc_holder/spell/targeted/remoteview/cast(list/targets, mob/user = usr)
@@ -386,15 +393,15 @@
var/mob/target
- if(istype(H.l_hand, /obj/item/tk_grab) || istype(H.r_hand, /obj/item/tk_grab/))
+ if(istype(H.l_hand, /obj/item/tk_grab) || istype(H.r_hand, /obj/item/tk_grab))
to_chat(H, "Your mind is too busy with that telekinetic grab.")
H.remoteview_target = null
- H.reset_perspective(0)
+ H.reset_perspective()
return
if(H.client.eye != user.client.mob)
H.remoteview_target = null
- H.reset_perspective(0)
+ H.reset_perspective()
return
for(var/mob/living/L in targets)
@@ -405,4 +412,4 @@
H.reset_perspective(target)
else
H.remoteview_target = null
- H.reset_perspective(0)
+ H.reset_perspective()
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index ab34122ba90..641167c768c 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -1,7 +1,7 @@
//Few global vars to track the blob
-var/list/blobs = list()
-var/list/blob_cores = list()
-var/list/blob_nodes = list()
+GLOBAL_LIST_EMPTY(blobs)
+GLOBAL_LIST_EMPTY(blob_cores)
+GLOBAL_LIST_EMPTY(blob_nodes)
/datum/game_mode
var/list/blob_overminds = list()
@@ -46,7 +46,6 @@ var/list/blob_nodes = list()
var/datum/mind/blob = pick(possible_blobs)
infected_crew += blob
blob.special_role = SPECIAL_ROLE_BLOB
- update_blob_icons_added(blob)
blob.restricted_roles = restricted_jobs
log_game("[key_name(blob)] has been selected as a Blob")
possible_blobs -= blob
@@ -152,6 +151,7 @@ var/list/blob_nodes = list()
for(var/datum/mind/blob in infected_crew)
greet_blob(blob)
+ update_blob_icons_added(blob)
if(SSshuttle)
SSshuttle.emergencyNoEscape = 1
@@ -196,16 +196,16 @@ var/list/blob_nodes = list()
send_intercept(1)
declared = 1
if(1)
- event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
+ GLOB.event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
if(2)
send_intercept(2)
/datum/game_mode/proc/update_blob_icons_added(datum/mind/mob_mind)
- var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_BLOB]
+ var/datum/atom_hud/antag/antaghud = GLOB.huds[ANTAG_HUD_BLOB]
antaghud.join_hud(mob_mind.current)
set_antag_hud(mob_mind.current, "hudblob")
/datum/game_mode/proc/update_blob_icons_removed(datum/mind/mob_mind)
- var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_BLOB]
+ var/datum/atom_hud/antag/antaghud = GLOB.huds[ANTAG_HUD_BLOB]
antaghud.leave_hud(mob_mind.current)
set_antag_hud(mob_mind.current, null)
diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm
index 66131cfc9f9..b1ef70f6b4f 100644
--- a/code/game/gamemodes/blob/blob_finish.dm
+++ b/code/game/gamemodes/blob/blob_finish.dm
@@ -1,15 +1,15 @@
/datum/game_mode/blob/check_finished()
if(infected_crew.len > burst)//Some blobs have yet to burst
return 0
- if(blobwincount <= blobs.len)//Blob took over
+ if(blobwincount <= GLOB.blobs.len)//Blob took over
return 1
- if(!blob_cores.len) // blob is dead
+ if(!GLOB.blob_cores.len) // blob is dead
return 1
return ..()
/datum/game_mode/blob/declare_completion()
- if(blobwincount <= blobs.len)
+ if(blobwincount <= GLOB.blobs.len)
feedback_set_details("round_end_result","blob win - blob took over")
to_chat(world, "The blob has taken over the station!")
to_chat(world, "The entire station was eaten by the Blob")
@@ -21,7 +21,7 @@
to_chat(world, "Directive 7-12 has been successfully carried out preventing the Blob from spreading.")
log_game("Blob mode completed with a tie (station destroyed).")
- else if(!blob_cores.len)
+ else if(!GLOB.blob_cores.len)
feedback_set_details("round_end_result","blob loss - blob eliminated")
to_chat(world, "The staff has won!")
to_chat(world, "The alien organism has been eradicated from the station")
diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm
index 4f667c51d61..9c7fb99fe81 100644
--- a/code/game/gamemodes/blob/blob_report.dm
+++ b/code/game/gamemodes/blob/blob_report.dm
@@ -3,7 +3,6 @@
var/interceptname = ""
switch(report)
if(0)
- ..()
return
if(1)
interceptname = "Level 5-6 Biohazard Response Procedures"
@@ -20,7 +19,7 @@
intercepttext += "Message ends."
if(2)
var/nukecode = rand(10000, 99999)
- for(var/obj/machinery/nuclearbomb/bomb in world)
+ for(var/obj/machinery/nuclearbomb/bomb in GLOB.machines)
if(bomb && bomb.r_code)
if(is_station_level(bomb.z))
bomb.r_code = nukecode
@@ -42,7 +41,7 @@
to_chat(aiPlayer, "Laws Updated: [law]")
print_command_report(intercepttext, interceptname)
- event_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg', from = "[command_name()] Update")
+ GLOB.event_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg', from = "[command_name()] Update")
/datum/station_state
var/floor = 0
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index fb26ce91698..46b1972e565 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -8,6 +8,7 @@
icon = 'icons/mob/blob.dmi'
pass_flags = PASSBLOB
faction = list(ROLE_BLOB)
+ bubble_icon = "blob"
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = 360
@@ -51,11 +52,12 @@
speak_emote = list("pulses")
var/obj/structure/blob/factory/factory = null
var/list/human_overlays = list()
- var/is_zombie = 0
+ var/mob/living/carbon/human/oldguy
+ var/is_zombie = FALSE
/mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
- adjustBruteLoss(Clamp(0.01 * exposed_temperature, 1, 5))
+ adjustBruteLoss(clamp(0.01 * exposed_temperature, 1, 5))
/mob/living/simple_animal/hostile/blob/blobspore/CanPass(atom/movable/mover, turf/target, height=0)
@@ -85,8 +87,8 @@
is_zombie = TRUE
if(H.wear_suit)
var/obj/item/clothing/suit/armor/A = H.wear_suit
- if(A.armor && A.armor["melee"])
- maxHealth += A.armor["melee"] //That zombie's got armor, I want armor!
+ if(A.armor && A.armor.getRating("melee"))
+ maxHealth += A.armor.getRating("melee") //That zombie's got armor, I want armor!
maxHealth += 40
health = maxHealth
name = "blob zombie"
@@ -102,6 +104,7 @@
human_overlays = H.overlays
update_icons()
H.forceMove(src)
+ oldguy = H
visible_message("The corpse of [H.name] suddenly rises!")
/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
@@ -130,9 +133,9 @@
if(factory)
factory.spores -= src
factory = null
- if(contents)
- for(var/mob/M in contents)
- M.loc = get_turf(src)
+ if(oldguy)
+ oldguy.forceMove(get_turf(src))
+ oldguy = null
return ..()
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index 8c3af0be2ca..be794b9092b 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -13,7 +13,7 @@
var/selecting = 0
/obj/structure/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2, offspring)
- blob_cores += src
+ GLOB.blob_cores += src
START_PROCESSING(SSobj, src)
GLOB.poi_list |= src
adjustcolors(color) //so it atleast appears
@@ -38,7 +38,7 @@
/obj/structure/blob/core/Destroy()
- blob_cores -= src
+ GLOB.blob_cores -= src
if(overmind)
overmind.blob_core = null
overmind = null
@@ -75,7 +75,7 @@
else
for(var/i = 1; i < 8; i += i)
Pulse(0, i, color)
- for(var/b_dir in alldirs)
+ for(var/b_dir in GLOB.alldirs)
if(!prob(5))
continue
var/obj/structure/blob/normal/B = locate() in get_step(src, b_dir)
@@ -89,41 +89,40 @@
..()
-/obj/structure/blob/core/proc/create_overmind(var/client/new_overmind, var/override_delay)
+/obj/structure/blob/core/proc/create_overmind(client/new_overmind, override_delay)
if(overmind_get_delay > world.time && !override_delay)
return
- overmind_get_delay = world.time + 3000 // 5 minutes
+ overmind_get_delay = world.time + 5 MINUTES
if(overmind)
qdel(overmind)
+ INVOKE_ASYNC(src, .proc/get_new_overmind, new_overmind)
+
+/obj/structure/blob/core/proc/get_new_overmind(client/new_overmind)
var/mob/C = null
var/list/candidates = list()
-
- spawn()
- if(!new_overmind)
- if(is_offspring)
- candidates = pollCandidates("Do you want to play as a blob offspring?", ROLE_BLOB, 1)
- else
- candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1)
-
- if(candidates.len)
- C = pick(candidates)
+ if(!new_overmind)
+ if(is_offspring)
+ candidates = pollCandidates("Do you want to play as a blob offspring?", ROLE_BLOB, 1)
else
- C = new_overmind
+ candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1)
- if(C)
- var/mob/camera/blob/B = new(src.loc)
- B.key = C.key
- B.blob_core = src
- src.overmind = B
- color = overmind.blob_reagent_datum.color
- if(B.mind && !B.mind.special_role)
- B.mind.make_Overmind()
- spawn(0)
- if(is_offspring)
- B.is_offspring = TRUE
+ if(length(candidates))
+ C = pick(candidates)
+ else
+ C = new_overmind
+
+ if(C && !QDELETED(src))
+ var/mob/camera/blob/B = new(loc)
+ B.key = C.key
+ B.blob_core = src
+ overmind = B
+ color = overmind.blob_reagent_datum.color
+ if(B.mind && !B.mind.special_role)
+ B.mind.make_Overmind()
+ B.is_offspring = is_offspring
/obj/structure/blob/core/proc/lateblobtimer()
addtimer(CALLBACK(src, .proc/lateblobcheck), 50)
diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm
index b84e0a7a84c..d8fe4943586 100644
--- a/code/game/gamemodes/blob/blobs/node.dm
+++ b/code/game/gamemodes/blob/blobs/node.dm
@@ -7,7 +7,7 @@
point_return = 18
/obj/structure/blob/node/New(loc, var/h = 100)
- blob_nodes += src
+ GLOB.blob_nodes += src
START_PROCESSING(SSobj, src)
..(loc, h)
@@ -21,7 +21,7 @@
src.overlays += C
/obj/structure/blob/node/Destroy()
- blob_nodes -= src
+ GLOB.blob_nodes -= src
STOP_PROCESSING(SSobj, src)
return ..()
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index 74ed59d2469..316a136afc6 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -35,11 +35,15 @@
color = blob_reagent_datum.complementary_color
..()
+ START_PROCESSING(SSobj, src)
-/mob/camera/blob/Life(seconds, times_fired)
+/mob/camera/blob/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/mob/camera/blob/process()
if(!blob_core)
qdel(src)
- ..()
/mob/camera/blob/Login()
..()
@@ -53,7 +57,7 @@
/mob/camera/blob/proc/add_points(var/points)
if(points != 0)
- blob_points = Clamp(blob_points + points, 0, max_blob_points)
+ blob_points = clamp(blob_points + points, 0, max_blob_points)
if(hud_used)
hud_used.blobpwrdisplay.maptext = "
[round(src.blob_points)]
"
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index 548f2759ba0..6f2eed39499 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -22,10 +22,10 @@
set name = "Jump to Node"
set desc = "Transport back to a selected node."
- if(blob_nodes.len)
+ if(GLOB.blob_nodes.len)
var/list/nodes = list()
- for(var/i = 1; i <= blob_nodes.len; i++)
- var/obj/structure/blob/node/B = blob_nodes[i]
+ for(var/i = 1; i <= GLOB.blob_nodes.len; i++)
+ var/obj/structure/blob/node/B = GLOB.blob_nodes[i]
nodes["Blob Node #[i] ([get_location_name(B)])"] = B
var/node_name = input(src, "Choose a node to jump to.", "Node Jump") in nodes
var/obj/structure/blob/node/chosen_node = nodes[node_name]
@@ -357,7 +357,7 @@
if(!surrounding_turfs.len)
return
- for(var/mob/living/simple_animal/hostile/blob/blobspore/BS in GLOB.living_mob_list)
+ for(var/mob/living/simple_animal/hostile/blob/blobspore/BS in GLOB.alive_mob_list)
if(isturf(BS.loc) && get_dist(BS, T) <= 35)
BS.LoseTarget()
BS.Goto(pick(surrounding_turfs), BS.move_to_delay)
@@ -463,7 +463,7 @@
color = blob_reagent_datum.complementary_color
- for(var/obj/structure/blob/BL in blobs)
+ for(var/obj/structure/blob/BL in GLOB.blobs)
BL.adjustcolors(blob_reagent_datum.color)
for(var/mob/living/simple_animal/hostile/blob/BLO)
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index b97c8311507..5e2c3befc9a 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -18,8 +18,8 @@
/obj/structure/blob/New(loc)
..()
- blobs += src
- setDir(pick(cardinal))
+ GLOB.blobs += src
+ setDir(pick(GLOB.cardinal))
update_icon()
if(atmosblock)
air_update_turf(1)
@@ -29,8 +29,8 @@
if(atmosblock)
atmosblock = FALSE
air_update_turf(1)
- blobs -= src
- if(isturf(loc)) //Necessary because Expand() is retarded and spawns a blob and then deletes it
+ GLOB.blobs -= src
+ if(isturf(loc)) //Necessary because Expand() is screwed up and spawns a blob and then deletes it
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
return ..()
@@ -49,7 +49,7 @@
/obj/structure/blob/CanAStarPass(ID, dir, caller)
. = 0
- if(ismovableatom(caller))
+ if(ismovable(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSBLOB)
@@ -74,9 +74,6 @@
/obj/structure/blob/proc/Pulse(var/pulse = 0, var/origin_dir = 0, var/a_color)//Todo: Fix spaceblob expand
-
- set background = BACKGROUND_ENABLED
-
RegenHealth()
if(run_action())//If we can do something here then we dont need to pulse more
@@ -179,7 +176,7 @@
return 0
var/armor_protection = 0
if(damage_flag)
- armor_protection = armor[damage_flag]
+ armor_protection = armor.getRating(damage_flag)
damage_amount = round(damage_amount * (100 - armor_protection)*0.01, 0.1)
if(overmind && damage_flag)
damage_amount = overmind.blob_reagent_datum.damage_reaction(src, damage_amount, damage_type, damage_flag)
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index afad318a517..91dd553fe0d 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -2,7 +2,7 @@
#define LING_DEAD_GENETICDAMAGE_HEAL_CAP 50 //The lowest value of geneticdamage handle_changeling() can take it to while dead.
#define LING_ABSORB_RECENT_SPEECH 8 //The amount of recent spoken lines to gain on absorbing a mob
-var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")
+GLOBAL_LIST_INIT(possible_changeling_IDs, list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega"))
/datum/game_mode
var/list/datum/mind/changelings = list()
@@ -162,12 +162,12 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
update_change_icons_removed(changeling_mind)
/datum/game_mode/proc/update_change_icons_added(datum/mind/changeling)
- var/datum/atom_hud/antag/linghud = huds[ANTAG_HUD_CHANGELING]
+ var/datum/atom_hud/antag/linghud = GLOB.huds[ANTAG_HUD_CHANGELING]
linghud.join_hud(changeling.current)
set_antag_hud(changeling.current, "hudchangeling")
/datum/game_mode/proc/update_change_icons_removed(datum/mind/changeling)
- var/datum/atom_hud/antag/linghud = huds[ANTAG_HUD_CHANGELING]
+ var/datum/atom_hud/antag/linghud = GLOB.huds[ANTAG_HUD_CHANGELING]
linghud.leave_hud(changeling.current)
set_antag_hud(changeling.current, null)
@@ -253,9 +253,9 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
honorific = "Ms."
else
honorific = "Mr."
- if(possible_changeling_IDs.len)
- changelingID = pick(possible_changeling_IDs)
- possible_changeling_IDs -= changelingID
+ if(GLOB.possible_changeling_IDs.len)
+ changelingID = pick(GLOB.possible_changeling_IDs)
+ GLOB.possible_changeling_IDs -= changelingID
changelingID = "[honorific] [changelingID]"
else
changelingID = "[honorific] [rand(1,999)]"
diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm
index b6a0213f82f..9c33ffaaca5 100644
--- a/code/game/gamemodes/changeling/evolution_menu.dm
+++ b/code/game/gamemodes/changeling/evolution_menu.dm
@@ -1,4 +1,4 @@
-var/list/sting_paths
+GLOBAL_LIST_EMPTY(sting_paths)
// totally stolen from the new player panel. YAYY
/datum/action/changeling/evolution_menu
@@ -12,8 +12,8 @@ var/list/sting_paths
return
var/datum/changeling/changeling = usr.mind.changeling
- if(!sting_paths)
- sting_paths = init_subtypes(/datum/action/changeling)
+ if(!GLOB.sting_paths || !GLOB.sting_paths.len)
+ GLOB.sting_paths = init_subtypes(/datum/action/changeling)
var/dat = create_menu(changeling)
usr << browse(dat, "window=powers;size=600x700")//900x480
@@ -230,7 +230,7 @@ var/list/sting_paths
"}
var/i = 1
- for(var/datum/action/changeling/cling_power in sting_paths)
+ for(var/datum/action/changeling/cling_power in GLOB.sting_paths)
if(cling_power.dna_cost <= 0) //Let's skip the crap we start with. Keeps the evolution menu uncluttered.
continue
diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
index 4663fef8b97..28afcaa9c36 100644
--- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
+++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
@@ -49,7 +49,7 @@
/obj/item/organ/internal/cyberimp/eyes/shield/ling/on_life()
..()
var/obj/item/organ/internal/eyes/E = owner.get_int_organ(/obj/item/organ/internal/eyes)
- if(owner.eye_blind || owner.eye_blurry || (owner.disabilities & BLIND) || (owner.disabilities & NEARSIGHTED) || (E.damage > 0))
+ if(owner.eye_blind || owner.eye_blurry || (BLINDNESS in owner.mutations) || (NEARSIGHTED in owner.mutations) || (E && E.damage > 0))
owner.reagents.add_reagent("oculine", 1)
/obj/item/organ/internal/cyberimp/eyes/shield/ling/prepare_eat()
@@ -76,11 +76,11 @@
var/mob/living/carbon/human/H = owner
H.weakeyes = 1
if(!H.vision_type)
- H.vision_type = new /datum/vision_override/nightvision
+ H.set_sight(/datum/vision_override/nightvision)
/obj/item/organ/internal/cyberimp/eyes/thermals/ling/remove(mob/living/carbon/M, special = 0)
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.weakeyes = 0
- H.vision_type = null
+ H.set_sight(null)
..()
diff --git a/code/game/gamemodes/changeling/powers/chameleon_skin.dm b/code/game/gamemodes/changeling/powers/chameleon_skin.dm
index 7de16801153..4b53e5ce082 100644
--- a/code/game/gamemodes/changeling/powers/chameleon_skin.dm
+++ b/code/game/gamemodes/changeling/powers/chameleon_skin.dm
@@ -11,19 +11,19 @@
var/mob/living/carbon/human/H = user //SHOULD always be human, because req_human = 1
if(!istype(H)) // req_human could be done in can_sting stuff.
return
- if(H.dna.GetSEState(CHAMELEONBLOCK))
- H.dna.SetSEState(CHAMELEONBLOCK, 0)
- genemutcheck(H, CHAMELEONBLOCK, null, MUTCHK_FORCED)
+ if(H.dna.GetSEState(GLOB.chameleonblock))
+ H.dna.SetSEState(GLOB.chameleonblock, 0)
+ genemutcheck(H, GLOB.chameleonblock, null, MUTCHK_FORCED)
else
- H.dna.SetSEState(CHAMELEONBLOCK, 1)
- genemutcheck(H, CHAMELEONBLOCK, null, MUTCHK_FORCED)
+ H.dna.SetSEState(GLOB.chameleonblock, 1)
+ genemutcheck(H, GLOB.chameleonblock, null, MUTCHK_FORCED)
feedback_add_details("changeling_powers","CS")
return TRUE
/datum/action/changeling/chameleon_skin/Remove(mob/user)
var/mob/living/carbon/C = user
- if(C.dna.GetSEState(CHAMELEONBLOCK))
- C.dna.SetSEState(CHAMELEONBLOCK, 0)
- genemutcheck(C, CHAMELEONBLOCK, null, MUTCHK_FORCED)
+ if(C.dna.GetSEState(GLOB.chameleonblock))
+ C.dna.SetSEState(GLOB.chameleonblock, 0)
+ genemutcheck(C, GLOB.chameleonblock, null, MUTCHK_FORCED)
..()
diff --git a/code/game/gamemodes/changeling/powers/fakedeath.dm b/code/game/gamemodes/changeling/powers/fakedeath.dm
index d403059b0c7..61882b85287 100644
--- a/code/game/gamemodes/changeling/powers/fakedeath.dm
+++ b/code/game/gamemodes/changeling/powers/fakedeath.dm
@@ -16,11 +16,8 @@
user.emote("deathgasp")
user.timeofdeath = world.time
user.status_flags |= FAKEDEATH //play dead
- user.update_stat("fakedeath sting")
+ user.updatehealth("fakedeath sting")
user.update_canmove()
- user.med_hud_set_health()
- user.handle_hud_icons_health()
- user.med_hud_set_status()
user.mind.changeling.regenerating = TRUE
addtimer(CALLBACK(src, .proc/ready_to_regenerate, user), LING_FAKEDEATH_TIME)
diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm
index af375cad368..98336608da4 100644
--- a/code/game/gamemodes/changeling/powers/hivemind.dm
+++ b/code/game/gamemodes/changeling/powers/hivemind.dm
@@ -23,7 +23,7 @@
return
// HIVE MIND UPLOAD/DOWNLOAD DNA
-var/list/datum/dna/hivemind_bank = list()
+GLOBAL_LIST_EMPTY(hivemind_bank)
/datum/action/changeling/hivemind_upload
name = "Hive Channel DNA"
@@ -36,7 +36,7 @@ var/list/datum/dna/hivemind_bank = list()
var/datum/changeling/changeling = user.mind.changeling
var/list/names = list()
for(var/datum/dna/DNA in (changeling.absorbed_dna+changeling.protected_dna))
- if(!(DNA in hivemind_bank))
+ if(!(DNA in GLOB.hivemind_bank))
names += DNA.real_name
if(names.len <= 0)
@@ -51,7 +51,7 @@ var/list/datum/dna/hivemind_bank = list()
if(!chosen_dna)
return
- hivemind_bank += chosen_dna
+ GLOB.hivemind_bank += chosen_dna
to_chat(user, "We channel the DNA of [chosen_name] to the air.")
feedback_add_details("changeling_powers","HU")
return 1
@@ -75,7 +75,7 @@ var/list/datum/dna/hivemind_bank = list()
/datum/action/changeling/hivemind_download/sting_action(var/mob/user)
var/datum/changeling/changeling = user.mind.changeling
var/list/names = list()
- for(var/datum/dna/DNA in hivemind_bank)
+ for(var/datum/dna/DNA in GLOB.hivemind_bank)
if(!(DNA in changeling.absorbed_dna))
names[DNA.real_name] = DNA
diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm
index f9b214c513c..1f90f7eb702 100644
--- a/code/game/gamemodes/changeling/powers/humanform.dm
+++ b/code/game/gamemodes/changeling/powers/humanform.dm
@@ -24,8 +24,8 @@
if(!user)
return 0
to_chat(user, "We transform our appearance.")
- user.dna.SetSEState(MONKEYBLOCK,0,1)
- genemutcheck(user,MONKEYBLOCK,null,MUTCHK_FORCED)
+ user.dna.SetSEState(GLOB.monkeyblock,0,1)
+ genemutcheck(user,GLOB.monkeyblock,null,MUTCHK_FORCED)
if(istype(user))
user.set_species(chosen_dna.species.type)
user.dna = chosen_dna.Clone()
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index d225ac6886a..d12b970d884 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -95,8 +95,8 @@
user.unEquip(user.head)
user.unEquip(user.wear_suit)
- user.equip_to_slot_if_possible(new suit_type(user), slot_wear_suit, 1, 1, 1)
- user.equip_to_slot_if_possible(new helmet_type(user), slot_head, 1, 1, 1)
+ user.equip_to_slot_if_possible(new suit_type(user), slot_wear_suit, TRUE, TRUE)
+ user.equip_to_slot_if_possible(new helmet_type(user), slot_head, TRUE, TRUE)
var/datum/changeling/changeling = user.mind.changeling
changeling.chem_recharge_slowdown += recharge_slowdown
@@ -321,7 +321,7 @@
if(INTENT_GRAB)
C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!")
- add_attack_logs(src, C, "[src] has grabbed [C] and pulled them towards [H] with a tentacle")
+ add_attack_logs(H, C, "[H] grabbed [C] with a changeling tentacle")
C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(H, /mob/proc/tentacle_grab, C))
return 1
diff --git a/code/game/gamemodes/changeling/powers/spiders.dm b/code/game/gamemodes/changeling/powers/spiders.dm
index 82b2db6ac7b..778ec768e55 100644
--- a/code/game/gamemodes/changeling/powers/spiders.dm
+++ b/code/game/gamemodes/changeling/powers/spiders.dm
@@ -1,7 +1,7 @@
/datum/action/changeling/spiders
name = "Spread Infestation"
desc = "Our form divides, creating arachnids which will grow into deadly beasts."
- helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 5 DNA absorptions."
+ helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 5 stored DNA."
button_icon_state = "spread_infestation"
chemical_cost = 45
dna_cost = 1
diff --git a/code/game/gamemodes/changeling/powers/swap_form.dm b/code/game/gamemodes/changeling/powers/swap_form.dm
index e0fc1107729..0e02df12d88 100644
--- a/code/game/gamemodes/changeling/powers/swap_form.dm
+++ b/code/game/gamemodes/changeling/powers/swap_form.dm
@@ -18,7 +18,7 @@
if((NOCLONE || SKELETON || HUSK) in target.mutations)
to_chat(user, "DNA of [target] is ruined beyond usability!")
return
- if(!istype(target) || issmall(target) || NO_DNA in target.dna.species.species_traits)
+ if(!istype(target) || issmall(target) || (NO_DNA in target.dna.species.species_traits))
to_chat(user, "[target] is not compatible with this ability.")
return
if(target.mind.changeling)
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index 94bde26674b..fbfb75b8b6a 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -36,11 +36,9 @@
to_chat(user, "We haven't prepared our sting yet!")
if(!iscarbon(target))
return
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- if(H.isSynthetic())
- to_chat(user, "This won't work on synthetics.")
- return
+ if(ismachineperson(target))
+ to_chat(user, "This won't work on synthetics.")
+ return
if(!isturf(user.loc))
return
if(!AStar(user, target.loc, /turf/proc/Distance, user.mind.changeling.sting_range, simulated_only = 0))
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 2a42d531f0f..bf5fbb70731 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -1,4 +1,4 @@
-var/global/list/all_cults = list()
+GLOBAL_LIST_EMPTY(all_cults)
/datum/game_mode
var/list/datum/mind/cult = list()
@@ -84,8 +84,8 @@ var/global/list/all_cults = list()
var/survivors = 0
/datum/game_mode/cult/announce()
- to_chat(world, "The current game mode is - Cult!")
- to_chat(world, "Some crewmembers are attempting to start a cult! \nCultists - complete your objectives. Convert crewmembers to your cause by using the convert rune. Remember - there is no you, there is only the cult. \nPersonnel - Do not let the cult succeed in its mission. Brainwashing them with the chaplain's bible reverts them to whatever CentComm-allowed faith they had.")
+ to_chat(world, "The current game mode is - Cult!")
+ to_chat(world, "Some crew members are attempting to start a cult! \nCultists - complete your objectives. Convert crew members to your cause by using the convert rune. Remember - there is no you, there is only the cult. \nPersonnel - Do not let the cult succeed in its mission. Brainwashing them with the chaplain's bible reverts them to whatever CentComm-allowed faith they had.")
/datum/game_mode/cult/pre_setup()
@@ -110,11 +110,11 @@ var/global/list/all_cults = list()
modePlayer += cult
acolytes_needed = acolytes_needed + round((num_players_started() / 10))
- if(!summon_spots.len)
- while(summon_spots.len < SUMMON_POSSIBILITIES)
- var/area/summon = pick(return_sorted_areas() - summon_spots)
+ if(!GLOB.summon_spots.len)
+ while(GLOB.summon_spots.len < SUMMON_POSSIBILITIES)
+ var/area/summon = pick(return_sorted_areas() - GLOB.summon_spots)
if(summon && is_station_level(summon.z) && summon.valid_territory)
- summon_spots += summon
+ GLOB.summon_spots += summon
for(var/datum/mind/cult_mind in cult)
SEND_SOUND(cult_mind.current, 'sound/ambience/antag/bloodcult.ogg')
@@ -146,9 +146,9 @@ var/global/list/all_cults = list()
else
explanation = "Free objective."
if("eldergod")
- explanation = "Summon [SSticker.cultdat.entity_name] by invoking the 'Tear Reality' rune.The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin."
- to_chat(cult_mind.current, "Objective #[obj_count]: [explanation]")
- cult_mind.memory += "Objective #[obj_count]: [explanation] "
+ explanation = "Summon [SSticker.cultdat.entity_name] by invoking the 'Tear Reality' rune.The summoning can only be accomplished in [english_list(GLOB.summon_spots)] - where the veil is weak enough for the ritual to begin."
+ to_chat(cult_mind.current, "Objective #[obj_count]: [explanation]")
+ cult_mind.memory += "Objective #[obj_count]: [explanation] "
/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob)
@@ -189,6 +189,7 @@ var/global/list/all_cults = list()
C.Grant(cult_mind.current)
SEND_SOUND(cult_mind.current, 'sound/ambience/antag/bloodcult.ogg')
cult_mind.current.create_attack_log("Has been converted to the cult!")
+ cult_mind.current.create_log(CONVERSION_LOG, "converted to the cult")
if(jobban_isbanned(cult_mind.current, ROLE_CULTIST) || jobban_isbanned(cult_mind.current, ROLE_SYNDICATE))
replace_jobbanned_player(cult_mind.current, ROLE_CULTIST)
update_cult_icons_added(cult_mind)
@@ -209,17 +210,17 @@ var/global/list/all_cults = list()
update_cult_icons_removed(cult_mind)
if(show_message)
for(var/mob/M in viewers(cult_mind.current))
- to_chat(M, "[cult_mind.current] looks like [cult_mind.current.p_they()] just reverted to [cult_mind.current.p_their()] old faith!")
+ to_chat(M, "[cult_mind.current] looks like [cult_mind.current.p_they()] just reverted to [cult_mind.current.p_their()] old faith!")
/datum/game_mode/proc/update_cult_icons_added(datum/mind/cult_mind)
- var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT]
+ var/datum/atom_hud/antag/culthud = GLOB.huds[ANTAG_HUD_CULT]
culthud.join_hud(cult_mind.current)
set_antag_hud(cult_mind.current, "hudcultist")
/datum/game_mode/proc/update_cult_icons_removed(datum/mind/cult_mind)
- var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT]
+ var/datum/atom_hud/antag/culthud = GLOB.huds[ANTAG_HUD_CULT]
culthud.leave_hud(cult_mind.current)
set_antag_hud(cult_mind.current, null)
@@ -262,7 +263,7 @@ var/global/list/all_cults = list()
for(var/datum/mind/cult_mind in cult)
if(cult_mind.current && cult_mind.current.stat!=2)
var/area/A = get_area(cult_mind.current )
- if( is_type_in_list(A, centcom_areas))
+ if( is_type_in_list(A, GLOB.centcom_areas))
acolytes_survived++
else if(A == SSshuttle.emergency.areaInstance && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) //snowflaked into objectives because shitty bay shuttles had areas to auto-determine this
acolytes_survived++
@@ -283,11 +284,11 @@ var/global/list/all_cults = list()
if(!check_cult_victory())
feedback_set_details("round_end_result","cult win - cult win")
feedback_set("round_end_result",acolytes_survived)
- to_chat(world, " The cult wins! It has succeeded in serving its dark masters!")
+ to_chat(world, " The cult wins! It has succeeded in serving its dark masters!")
else
feedback_set_details("round_end_result","cult loss - staff stopped the cult")
feedback_set("round_end_result",acolytes_survived)
- to_chat(world, " The staff managed to stop the cult!")
+ to_chat(world, " The staff managed to stop the cult!")
var/text = "Cultists escaped: [acolytes_survived]"
@@ -298,7 +299,7 @@ var/global/list/all_cults = list()
switch(objectives[obj_count])
if("survive")
if(!check_survive())
- explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. Success!"
+ explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. Success!"
feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]")
else
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. Fail."
@@ -306,7 +307,7 @@ var/global/list/all_cults = list()
if("sacrifice")
if(sacrifice_target)
if(sacrifice_target in sacrificed)
- explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Success!"
+ explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Success!"
feedback_add_details("cult_objective","cult_sacrifice|SUCCESS")
else if(sacrifice_target && sacrifice_target.current)
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail."
@@ -316,7 +317,7 @@ var/global/list/all_cults = list()
feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED")
if("eldergod")
if(!eldergod)
- explanation = "Summon [SSticker.cultdat.entity_name]. Success!"
+ explanation = "Summon [SSticker.cultdat.entity_name]. Success!"
feedback_add_details("cult_objective","cult_narsie|SUCCESS")
else
explanation = "Summon [SSticker.cultdat.entity_name]. Fail."
@@ -331,45 +332,45 @@ var/global/list/all_cults = list()
if("convert")//convert half the crew
if(cult.len >= convert_target)
- explanation = "Convert [convert_target] crewmembers ([cult.len] cultists at round end). Success!"
+ explanation = "Convert [convert_target] crew members ([cult.len] cultists at round end). Success!"
feedback_add_details("cult_objective","cult_convertion|SUCCESS")
else
- explanation = "Convert [convert_target] crewmembers ([cult.len] total cultists). Fail!"
+ explanation = "Convert [convert_target] crew members ([cult.len] total cultists). Fail."
feedback_add_details("cult_objective","cult_convertion|FAIL")
if("bloodspill")//cover a large portion of the station in blood
if(max_spilled_blood >= spilltarget)
- explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). Success!"
+ explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). Success!"
feedback_add_details("cult_objective","cult_bloodspill|SUCCESS")
else
- explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). Fail!"
+ explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). Fail."
feedback_add_details("cult_objective","cult_bloodspill|FAIL")
if("harvest")
if(harvested > harvest_target)
- explanation = "Offer [harvest_target] humans for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Success!"
+ explanation = "Offer [harvest_target] humanoids for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Success!"
feedback_add_details("cult_objective","cult_harvest|SUCCESS")
else
- explanation = "Offer [harvest_target] humans for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Fail!"
+ explanation = "Offer [harvest_target] humanoids for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Fail."
feedback_add_details("cult_objective","cult_harvest|FAIL")
if("hijack")
if(!escaped_shuttle)
- explanation = "Do not let a single non-cultist board the Escape Shuttle. ([escaped_shuttle] escaped on the shuttle) ([escaped_pod] escaped on pods) Success!"
+ explanation = "Do not let a single non-cultist board the Escape Shuttle. ([escaped_shuttle] escaped on the shuttle) ([escaped_pod] escaped on pods) Success!"
feedback_add_details("cult_objective","cult_hijack|SUCCESS")
else
- explanation = "Do not let a single non-cultist board the Escape Shuttle. ([escaped_shuttle] escaped on the shuttle) ([escaped_pod] escaped on pods) Fail!"
+ explanation = "Do not let a single non-cultist board the Escape Shuttle. ([escaped_shuttle] escaped on the shuttle) ([escaped_pod] escaped on pods) Fail."
feedback_add_details("cult_objective","cult_hijack|FAIL")
if("massacre")
if(survivors < massacre_target)
- explanation = "Massacre the crew until less than [massacre_target] people are left on the station. ([survivors] humans left alive) Success!"
+ explanation = "Massacre the crew until less than [massacre_target] people are left on the station. ([survivors] humanoids left alive) Success!"
feedback_add_details("cult_objective","cult_massacre|SUCCESS")
else
- explanation = "Massacre the crew until less than [massacre_target] people are left on the station. ([survivors] humans left alive) Fail!"
+ explanation = "Massacre the crew until less than [massacre_target] people are left on the station. ([survivors] humanoids left alive) Fail."
feedback_add_details("cult_objective","cult_massacre|FAIL")
- text += " Objective #[obj_count]: [explanation]"
+ text += " Objective #[obj_count]: [explanation]"
to_chat(world, text)
..()
@@ -378,7 +379,7 @@ var/global/list/all_cults = list()
/datum/game_mode/proc/auto_declare_completion_cult()
if(cult.len || (SSticker && GAMEMODE_IS_CULT))
- var/text = "The cultists were:"
+ var/text = "The cultists were:"
for(var/datum/mind/cultist in cult)
text += " [cultist.key] was [cultist.name] ("
diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index 375a02251bc..0f637153f6c 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -23,8 +23,8 @@
if(!message)
return
- if((user.disabilities & MUTE) || user.mind.miming) //Under vow of silence/mute?
- user.visible_message("[user] appears to whisper to themselves.","You begin to whisper to yourself.") //Make them do *something* abnormal.
+ if((MUTE in user.mutations) || user.mind.miming) //Under vow of silence/mute?
+ user.visible_message("[user] appears to whisper to [user.p_them()]self.","You begin to whisper to yourself.") //Make them do *something* abnormal.
else
user.whisper("O bidai nabora se[pick("'","`")]sma!") // Otherwise book club sayings.
sleep(10)
@@ -32,11 +32,11 @@
if(!user)
return
- if(!((user.disabilities & MUTE) || user.mind.miming)) // If they aren't mute/miming, commence the whisperting
+ if(!((MUTE in user.mutations) || user.mind.miming)) // If they aren't mute/miming, commence the whisperting
user.whisper(message)
var/my_message
- if(istype(user, /mob/living/simple_animal/slaughter/cult)) //Harbringers of the Slaughter
- my_message = "Harbringer of the Slaughter: [message]"
+ if(istype(user, /mob/living/simple_animal/slaughter/cult)) //Harbingers of the Slaughter
+ my_message = "Harbinger of the Slaughter: [message]"
else
my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user.real_name]: [message]"
for(var/mob/M in GLOB.player_list)
@@ -46,3 +46,4 @@
to_chat(M, "(F) [my_message] ")
log_say("(CULT) [message]", user)
+ user.create_log(SAY_LOG, "(CULT) [message]")
diff --git a/code/game/gamemodes/cult/cult_datums.dm b/code/game/gamemodes/cult/cult_datums.dm
index 825f0c32f3b..73c7dc2cf03 100644
--- a/code/game/gamemodes/cult/cult_datums.dm
+++ b/code/game/gamemodes/cult/cult_datums.dm
@@ -72,36 +72,60 @@
/datum/cult_info/fire
- name = "Cult of Pyr'Kaeus"
+ name = "Cult of Kha'Rin"
theme = "fire"
- tome_icon = "firetome"
+ tome_icon = "helltome"
- entity_name = "Pyr'Kaeus"
+ entity_name = "Kha'Rin"
entity_title1 = "The Burning One"
entity_title2 = "The One Who Consumes"
entity_title3 = "The Harbinger of Fire"
- entity_icon_state = "narbee"
+ entity_icon_state = "kha'rin"
+ entity_spawn_animation = "kha'rin_spawn_anim"
- cult_wall_icon_state = "firecult"
- cult_floor_icon_state = "cultfire"
+ cult_wall_icon_state = "hellcult"
+ cult_floor_icon_state = "culthell"
+ cult_girder_icon_state = "hell_girder"
- artificer_name = "Igniting Ember"
- artificer_icon_state = "fireartificer"
+ artificer_name = "Summoner"
+ artificer_icon_state = "summoner"
- behemoth_name = "Devouring Hatred"
- behemoth_icon_state = "firejuggernaut"
+ behemoth_name = "Incarnation of Pain"
+ behemoth_icon_state = "incarnation_of_pain"
- wraith_name = "Living Flame"
- wraith_icon_state = "firewraith"
+ wraith_name = "Hell Knight"
+ wraith_icon_state = "hell_knight"
+ wraith_jaunt_out_animation = "infernal_rift_out"
+ wraith_jaunt_in_animation = "infernal_rift_in"
- juggernaut_name = "Pyre Armor"
- juggernaut_icon_state = "firejuggernaut"
+ juggernaut_name = "Incarnation of Pain"
+ juggernaut_icon_state = "incarnation_of_pain"
- harvester_name = "Coal Seeker"//or nipple pincher...
- harvester_icon_state = "fireharvester"
+ harvester_name = "Lost Soul"
+ harvester_icon_state = "lost_soul"
- shade_name = "Charred Soul"
- shade_icon_state = "shade"
+ shade_name = "Ifrit"
+ shade_icon_state = "ifrit"
+
+ pylon_icon_state = "hell_pylon"
+ pylon_icon_state_off = "hell_pylon_off"
+
+ forge_icon_state = "hell_forge"
+ forge_icon_state_off = "hell_forge_off"
+
+ altar_icon_state = "hell_altar"
+ altar_icon_state_off = "hell_altar_off"
+
+ archives_icon_state = "hell_archives"
+ archives_icon_state_off = "hell_archives_off"
+
+ runed_metal_icon_state = "sheet_runed_hell"
+
+ airlock_runed_icon_file = 'icons/obj/doors/airlocks/cult/runed/hell.dmi'
+ airlock_runed_overlays_file = 'icons/obj/doors/airlocks/cult/runed/hell-overlays.dmi'
+
+ airlock_unruned_icon_file = 'icons/obj/doors/airlocks/cult/unruned/hell.dmi'
+ airlock_unruned_overlays_file = 'icons/obj/doors/airlocks/cult/unruned/hell-overlays.dmi'
/datum/cult_info/death
name = "Cult of Mortality"
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index f9ee181356d..388b16d71af 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -105,7 +105,7 @@
/obj/item/clothing/suit/magusred
name = "magus robes"
- desc = "A set of armored robes worn by the followers of Nar-Sie"
+ desc = "A set of armored robes worn by the followers of Nar-Sie."
icon_state = "magusred"
item_state = "magusred"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -132,7 +132,7 @@
/obj/item/clothing/suit/hooded/cultrobes/cult_shield
name = "empowered cultist robe"
- desc = "Empowered garb which creates a powerful shield around the user."
+ desc = "An empowered garb which creates a powerful shield around the user."
icon_state = "cult_armour"
item_state = "cult_armour"
w_class = WEIGHT_CLASS_BULKY
@@ -144,7 +144,7 @@
/obj/item/clothing/head/hooded/cult_hoodie
name = "empowered cultist robe"
- desc = "Empowered garb which creates a powerful shield around the user."
+ desc = "An empowered garb which creates a powerful shield around the user."
icon_state = "cult_hoodalt"
armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10)
body_parts_covered = HEAD
@@ -213,8 +213,8 @@
list_reagents = list("unholywater" = 40)
/obj/item/clothing/glasses/night/cultblind
- desc = "May the master guide you through the darkness and shield you from the light."
name = "zealot's blindfold"
+ desc = "May the master guide you through the darkness and shield you from the light."
icon_state = "blindfold"
item_state = "blindfold"
see_in_dark = 8
@@ -247,7 +247,7 @@
to_chat(user, "We have exhausted our ability to curse the shuttle.")
return
if(locate(/obj/singularity/narsie) in GLOB.poi_list || locate(/mob/living/simple_animal/slaughter/cult) in GLOB.mob_list)
- to_chat(user, "Nar-Sie or his avatars are already on this plane, there is no delaying the end of all things.")
+ to_chat(user, "Nar-Sie or her avatars are already on this plane, there is no delaying the end of all things.")
return
if(SSshuttle.emergency.mode == SHUTTLE_CALL)
@@ -269,11 +269,11 @@
"The shuttle dispatcher was found dead with bloody symbols carved into their flesh. The shuttle will be delayed by two minutes.",
"Steve repeatedly touched a lightbulb until his hands fell off. The shuttle will be delayed by two minutes.")
var/message = pick(curses)
- command_announcement.Announce("[message]", "System Failure", 'sound/misc/notice1.ogg')
+ GLOB.command_announcement.Announce("[message]", "System Failure", 'sound/misc/notice1.ogg')
/obj/item/cult_shift
name = "veil shifter"
- desc = "This relic teleports you forward a medium distance."
+ desc = "This relic teleports you forward by a medium distance."
icon = 'icons/obj/cult.dmi'
icon_state ="shifter"
var/uses = 4
@@ -298,7 +298,7 @@
return
if(!iscultist(user))
user.unEquip(src, 1)
- step(src, pick(alldirs))
+ step(src, pick(GLOB.alldirs))
to_chat(user, "\The [src] flickers out of your hands, too eager to move!")
return
@@ -353,7 +353,7 @@
/obj/item/clothing/suit/cultrobesghost
name = "ghostly cult robes"
- desc = "A set of ethreal armored robes worn by the undead followers of a cult."
+ desc = "A set of ethereal armored robes worn by the undead followers of a cult."
icon_state = "cultrobesalt"
item_state = "cultrobesalt"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm
index caf607ce010..38bd1919c62 100644
--- a/code/game/gamemodes/cult/cult_objectives.dm
+++ b/code/game/gamemodes/cult/cult_objectives.dm
@@ -27,8 +27,8 @@
explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for [sacrifice_target.p_their()] blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
for(var/datum/mind/cult_mind in cult)
- to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
- cult_mind.memory += "Objective #[current_objective]: [explanation] "
+ to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
+ cult_mind.memory += "Objective #[current_objective]: [explanation] "
/datum/game_mode/cult/proc/bypass_phase()
@@ -89,8 +89,8 @@
for(var/datum/mind/cult_mind in cult)
if(cult_mind)
to_chat(cult_mind.current, "You and your acolytes have completed your task, but this place requires yet more preparation!")
- to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
- cult_mind.memory += "Objective #[current_objective]: [explanation] "
+ to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
+ cult_mind.memory += "Objective #[current_objective]: [explanation] "
message_admins("New Cult Objective: [new_objective]")
log_admin("New Cult Objective: [new_objective]")
@@ -104,8 +104,8 @@
for(var/datum/mind/cult_mind in cult)
if(cult_mind)
to_chat(cult_mind.current, "You and your acolytes suddenly feel the urge to do your best, but survive!")
- to_chat(cult_mind.current, "Objective Survive: [explanation]")
- cult_mind.memory += "Objective Survive: [explanation] "
+ to_chat(cult_mind.current, "Objective Survive: [explanation]")
+ cult_mind.memory += "Objective Survive: [explanation] "
/datum/game_mode/cult/proc/second_phase()
@@ -114,16 +114,16 @@
if(prob(40))//split the chance of this
objectives += "eldergod"
- explanation = "Summon [SSticker.cultdat.entity_name] on the Station via the use of the Tear Reality rune. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin."
+ explanation = "Summon [SSticker.cultdat.entity_name] on the Station via the use of the Tear Reality rune. The veil is weak enough in [english_list(GLOB.summon_spots)] for the ritual to begin."
else
objectives += "slaughter"
- explanation = "Bring the Slaughter via the rune 'Bring forth the slaughter'. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin."
+ explanation = "Bring the Slaughter via the rune 'Call Forth The Slaughter'. The veil is weak enough in [english_list(GLOB.summon_spots)] for the ritual to begin."
for(var/datum/mind/cult_mind in cult)
if(cult_mind)
to_chat(cult_mind.current, "You and your acolytes have succeeded in preparing the station for the ultimate ritual!")
- to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
- cult_mind.memory += "Objective #[current_objective]: [explanation] "
+ to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
+ cult_mind.memory += "Objective #[current_objective]: [explanation] "
/datum/game_mode/cult/proc/third_phase()
current_objective++
@@ -138,16 +138,16 @@
switch(last_objective)
if("harvest")
- explanation = "[SSticker.cultdat.entity_title1] hungers for their first meal of this never-ending day. Offer them [harvest_target] humans in sacrifice."
+ explanation = "[SSticker.cultdat.entity_title1] hungers for their first meal of this never-ending day. Offer them [harvest_target] humanoids in sacrifice."
if("hijack")
- explanation = "[SSticker.cultdat.entity_name] wishes for their troops to start the assault on Centcom immediately. Hijack the escape shuttle and don't let a single non-cultist board it."
+ explanation = "[SSticker.cultdat.entity_name] wishes for their troops to start the assault on CentCom immediately. Hijack the escape shuttle and don't let a single non-cultist board it."
if("massacre")
- explanation = "[SSticker.cultdat.entity_name] wants to watch you as you massacre the remaining humans on the station (until less than [massacre_target] humans are left alive)."
+ explanation = "[SSticker.cultdat.entity_name] wants to watch you as you massacre the remaining crew on the station (until less than [massacre_target] humans are left alive)."
for(var/datum/mind/cult_mind in cult)
if(cult_mind)
- to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
- cult_mind.memory += "Objective #[current_objective]: [explanation] "
+ to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
+ cult_mind.memory += "Objective #[current_objective]: [explanation] "
message_admins("Last Cult Objective: [last_objective]")
log_admin("Last Cult Objective: [last_objective]")
@@ -155,12 +155,12 @@
/datum/game_mode/cult/proc/get_possible_sac_targets()
var/list/possible_sac_targets = list()
for(var/mob/living/carbon/human/player in GLOB.player_list)
- if(player.mind && !is_convertable_to_cult(player.mind) && (player.stat != DEAD))
+ if(player.mind && !is_convertable_to_cult(player.mind) && (player.stat != DEAD) && (!player.mind.offstation_role) )
possible_sac_targets += player.mind
if(!possible_sac_targets.len)
//There are no living Unconvertables on the station. Looking for a Sacrifice Target among the ordinary crewmembers
for(var/mob/living/carbon/human/player in GLOB.player_list)
- if(is_secure_level(player.z)) //We can't sacrifice people that are on the centcom z-level
+ if(is_secure_level(player.z) || player.mind.offstation_role) //We can't sacrifice people that are on the centcom z-level or offstation roles
continue
if(player.mind && !(player.mind in cult) && (player.stat != DEAD))//make DAMN sure they are not dead
possible_sac_targets += player.mind
@@ -174,7 +174,7 @@
updated_memory = replacetext("[cult_mind.memory]", "[previous_target]", "[sacrifice_target]")
updated_memory = replacetext("[updated_memory]", "[previous_role]", "[sacrifice_target.assigned_role]")
cult_mind.memory = updated_memory
-
+
/datum/game_mode/cult/proc/pick_objective()
var/list/possible_objectives = list()
@@ -254,7 +254,7 @@
for(var/mob/living/L in GLOB.player_list)
if(L.stat != DEAD && !(L.mind in cult))
var/area/A = get_area(L)
- if(is_type_in_list(A.loc, centcom_areas))
+ if(is_type_in_list(A.loc, GLOB.centcom_areas))
escaped_shuttle++
if(!escaped_shuttle)
bonus = 1
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index de8846d292e..0e96dd92062 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -134,7 +134,7 @@
to_chat(user, "You may only dunk carbon-based creatures!")
return 0
if(G.affecting == LAVA_PROOF)
- to_chat(user, "Is immune to the lava!")
+ to_chat(user, "[G.affecting] is immune to lava!")
return 0
if(G.affecting.stat == DEAD)
to_chat(user, "[G.affecting] is dead!")
@@ -152,7 +152,7 @@
return 1
return ..()
-var/list/blacklisted_pylon_turfs = typecacheof(list(
+GLOBAL_LIST_INIT(blacklisted_pylon_turfs, typecacheof(list(
/turf/simulated/floor/engine/cult,
/turf/space,
/turf/simulated/floor/plating/lava,
@@ -160,7 +160,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
/turf/simulated/wall/cult,
/turf/simulated/wall/cult/artificer,
/turf/unsimulated/wall
- ))
+ )))
/obj/structure/cult/functional/pylon
name = "pylon"
@@ -214,7 +214,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
if(istype(T, /turf/simulated/floor/engine/cult))
cultturfs |= T
continue
- if(is_type_in_typecache(T, blacklisted_pylon_turfs))
+ if(is_type_in_typecache(T, GLOB.blacklisted_pylon_turfs))
continue
else
validturfs |= T
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 445050529af..823a9a8980e 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -50,7 +50,7 @@
if(iscultist(user) || user.stat == DEAD)
. += "The scriptures of [SSticker.cultdat.entity_title3]. Allows the scribing of runes and access to the knowledge archives of the cult of [SSticker.cultdat.entity_name]."
. += "Striking another cultist with it will purge holy water from them."
- . += "Striking a noncultist, however, will sear their flesh."
+ . += "Striking a non-cultist, however, will sear their flesh."
/obj/item/tome/attack(mob/living/M, mob/living/user)
if(!istype(M))
@@ -67,8 +67,8 @@
return
M.take_organ_damage(0, 15) //Used to be a random between 5 and 20
playsound(M, 'sound/weapons/sear.ogg', 50, 1)
- M.visible_message("[user] strikes [M] with the arcane tome!", \
- "[user] strikes you with the tome, searing your flesh!")
+ M.visible_message("[user] strikes [M] with [src]!", \
+ "[user] strikes you with [src], searing your flesh!")
flick("tome_attack", src)
user.do_attack_animation(M)
add_attack_logs(user, M, "Hit with [src]")
@@ -133,7 +133,7 @@
text += "Blood Boil When invoked, this rune will do a massive amount of damage to all non-cultist viewers, but it will also emit a small explosion upon invocation. \
It requires three invokers.
"
- text += "Leeching When invoked, this rune will transfer lifeforce from the victim to the invoker.
"
+ text += "Leeching When invoked, this rune will transfer life force from the victim to the invoker.
"
text += "Rite of Spectral Manifestation This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and [SSticker.cultdat.entity_title3]. \
However, the spirit's link to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, all summoned spirits will dissipate, dropping their items to the ground. You may manifest \
@@ -175,7 +175,7 @@
text += "Cult Robes Cult robes are heavily armored robes. These robes are produced by the Talisman of Arming.
"
- text += "Soulstone A soulstone is a simple piece of magic, produced either via the starter talisman or by sacrificing humans. Using it on an unconscious or dead human, or on a Shade, will trap their soul in the stone, allowing its use in construct shells. \
+ text += "Soulstone A soulstone is a simple piece of magic, produced either via the starter talisman or by sacrificing humans. Using it on an unconscious or dead humanoid, or on a Shade, will trap their soul in the stone, allowing its use in construct shells. \
The soul within can also be released as a Shade by using it in-hand.
"
text += "Construct Shell A construct shell is useless on its own, but placing a filled soulstone within it allows you to produce your choice of a Wraith, a Juggernaut, or an Artificer. \
@@ -206,7 +206,7 @@
if(GAMEMODE_IS_CULT)
if(!canbypass)//not an admin-tome, check things
if(!cult_mode.narsie_condition_cleared)
- to_chat(user, "There is still more to do before unleashing [SSticker.cultdat.entity_name] power!")
+ to_chat(user, "There is still more to do before unleashing [SSticker.cultdat.entity_name]'s' power!")
return 0
if(!cult_mode.eldergod)
to_chat(user, "\"I am already here. There is no need to try to summon me now.\"")
@@ -217,17 +217,17 @@
if(!((CULT_ELDERGOD in cult_mode.objectives) || (CULT_SLAUGHTER in cult_mode.objectives)))
to_chat(user, "[SSticker.cultdat.entity_name]'s power does not wish to be unleashed!")
return 0
- if(!(A in summon_spots))
- to_chat(user, "[SSticker.cultdat.entity_name] can only be summoned where the veil is weak - in [english_list(summon_spots)]!")
+ if(!(A in GLOB.summon_spots))
+ to_chat(user, "[SSticker.cultdat.entity_name] can only be summoned where the veil is weak - in [english_list(GLOB.summon_spots)]!")
return 0
- var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No")
+ var/confirm_final = alert(user, "This is the FINAL step to summon your deity's power. It is a long, painful ritual and the crew will be alerted to your presence.", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No")
if(confirm_final == "No" || confirm_final == null)
to_chat(user, "You decide to prepare further before scribing the rune.")
return 0
else
return 1
else//the game mode is not cult..but we ARE a cultist...ALL ON THE ADMINBUS
- var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No")
+ var/confirm_final = alert(user, "This is the FINAL step to summon your deity's power. It is a long, painful ritual and the crew will be alerted to your presence.", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No")
if(confirm_final == "No" || confirm_final == null)
to_chat(user, "You decide to prepare further before scribing the rune.")
return 0
@@ -278,10 +278,10 @@
if(ispath(rune_to_scribe, /obj/effect/rune/narsie) || ispath(rune_to_scribe, /obj/effect/rune/slaughter))//may need to change this - Fethas
if(finale_runes_ok(user,rune_to_scribe))
A = get_area(src)
- if(!(A in summon_spots)) // Check again to make sure they didn't move
- to_chat(user, "The ritual can only begin where the veil is weak - in [english_list(summon_spots)]!")
+ if(!(A in GLOB.summon_spots)) // Check again to make sure they didn't move
+ to_chat(user, "The ritual can only begin where the veil is weak - in [english_list(GLOB.summon_spots)]!")
return
- command_announcement.Announce("Figments from an eldritch god are being summoned somewhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg')
+ GLOB.command_announcement.Announce("Figments from an eldritch god are being summoned somewhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg')
for(var/B in spiral_range_turfs(1, user, 1))
var/turf/T = B
var/obj/machinery/shield/N = new(T)
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index d918bead0de..02cd7b6db65 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -1,5 +1,5 @@
-var/list/sacrificed = list()
-var/list/non_revealed_runes = (subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
+GLOBAL_LIST_EMPTY(sacrificed)
+GLOBAL_LIST_INIT(non_revealed_runes, (subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed))
/*
This file contains runes.
@@ -255,7 +255,7 @@ structure_check() searches for nearby cultist structures required for the invoca
qdel(paper_to_imbue)
rune_in_use = 0
-var/list/teleport_runes = list()
+GLOBAL_LIST_EMPTY(teleport_runes)
/obj/effect/rune/teleport
cultist_name = "Teleport"
cultist_desc = "warps everything above it to another chosen teleport rune."
@@ -270,10 +270,10 @@ var/list/teleport_runes = list()
var/area/A = get_area(src)
var/locname = initial(A.name)
listkey = set_keyword ? "[set_keyword] [locname]":"[locname]"
- teleport_runes += src
+ GLOB.teleport_runes += src
/obj/effect/rune/teleport/Destroy()
- teleport_runes -= src
+ GLOB.teleport_runes -= src
return ..()
/obj/effect/rune/teleport/invoke(var/list/invokers)
@@ -281,7 +281,7 @@ var/list/teleport_runes = list()
var/list/potential_runes = list()
var/list/teleportnames = list()
var/list/duplicaterunecount = list()
- for(var/R in teleport_runes)
+ for(var/R in GLOB.teleport_runes)
var/obj/effect/rune/teleport/T = R
var/resultkey = T.listkey
if(resultkey in teleportnames)
@@ -332,10 +332,12 @@ var/list/teleport_runes = list()
user.forceMove(get_turf(actual_selected_rune))
var/mob/living/carbon/human/H = user
if(user.z != T.z)
- H.bleed(5)
+ if(istype(H))
+ H.bleed(5)
user.apply_damage(5, BRUTE)
else
- H.bleed(rand(5,10))
+ if(istype(H))
+ H.bleed(rand(5,10))
else
fail_invoke()
@@ -349,7 +351,7 @@ var/list/teleport_runes = list()
req_cultists = 1
allow_excess_invokers = TRUE
rune_in_use = FALSE
-
+
/obj/effect/rune/convert/do_invoke_glow()
return
@@ -410,7 +412,7 @@ var/list/teleport_runes = list()
var/sacrifice_fulfilled
var/datum/game_mode/cult/cult_mode = SSticker.mode
if(offering.mind)
- sacrificed.Add(offering.mind)
+ GLOB.sacrificed.Add(offering.mind)
if(is_sacrifice_target(offering.mind))
sacrifice_fulfilled = TRUE
new /obj/effect/temp_visual/cult/sac(loc)
@@ -496,7 +498,7 @@ var/list/teleport_runes = list()
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
if((istype(I, /obj/item/tome) && iscultist(user)))
- user.visible_message("[user] begins erasing the [src]...", "You begin erasing the [src]...")
+ user.visible_message("[user] begins erasing [src]...", "You begin erasing [src]...")
if(do_after(user, 50, target = src)) //Prevents accidental erasures.
log_game("Summon Narsie rune erased by [key_name(user)] with a tome")
message_admins("[key_name_admin(user)] erased a Narsie rune with a tome")
@@ -532,7 +534,7 @@ var/list/teleport_runes = list()
/obj/effect/rune/slaughter/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
if((istype(I, /obj/item/tome) && iscultist(user)))
- user.visible_message("[user.name] begins erasing the [src]...", "You begin erasing the [src]...")
+ user.visible_message("[user.name] begins erasing [src]...", "You begin erasing [src]...")
if(do_after(user, 50, target = src)) //Prevents accidental erasures.
log_game("Summon demon rune erased by [key_name(user)] with a tome")
message_admins("[key_name_admin(user)] erased a demon rune with a tome")
@@ -647,7 +649,7 @@ var/list/teleport_runes = list()
mob_to_revive.Beam(mob_to_sacrifice,icon_state="sendbeam",time=20)
sleep(20)
if(!mob_to_sacrifice || !in_range(mob_to_sacrifice, src))
- mob_to_sacrifice.visible_message("[mob_to_sacrifice] disintegrates into a pile of bones")
+ mob_to_sacrifice.visible_message("[mob_to_sacrifice] disintegrates into a pile of bones.")
return
mob_to_sacrifice.dust()
if(!mob_to_revive || mob_to_revive.stat != DEAD)
@@ -689,7 +691,7 @@ var/list/teleport_runes = list()
if(3 to 6)
playsound(E, 'sound/effects/EMPulse.ogg', 50, 1)
for(var/M in invokers)
- to_chat(M, "Your hair stands on end as a shockwave eminates from the rune!")
+ to_chat(M, "Your hair stands on end as a shockwave emanates from the rune!")
if(7 to INFINITY)
playsound(E, 'sound/effects/EMPulse.ogg', 100, 1)
for(var/M in invokers)
@@ -720,7 +722,7 @@ var/list/teleport_runes = list()
log_game("Astral Communion rune failed - more than one user")
return list()
var/turf/T = get_turf(src)
- if(!user in T.contents)
+ if(!(user in T.contents))
to_chat(user, "You must be standing on top of [src]!")
log_game("Astral Communion rune failed - user not standing on rune")
return list()
@@ -806,6 +808,7 @@ var/list/teleport_runes = list()
allow_excess_invokers = 1
icon_state = "5"
invoke_damage = 5
+ var/summoning = FALSE
var/summontime = 0
/obj/effect/rune/summon/invoke(var/list/invokers)
@@ -817,6 +820,11 @@ var/list/teleport_runes = list()
var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of [SSticker.cultdat.entity_title3]") as null|anything in cultists
if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated())
return
+ if(summoning)
+ to_chat(user, "You are already summoning a target!")
+ fail_invoke()
+ return
+
if(!cultist_to_summon)
to_chat(user, "You require a summoning target!")
fail_invoke()
@@ -832,24 +840,27 @@ var/list/teleport_runes = list()
fail_invoke()
log_game("Summon Cultist rune failed - target in away mission")
return
- if((cultist_to_summon.reagents.has_reagent("holywater") || cultist_to_summon.restrained()) && invokers.len < 3)
- to_chat(user, "The summoning of [cultist_to_summon] is being blocked somehow! You need 3 chanters to counter it!")
+ var/hard_summon = (cultist_to_summon.reagents && cultist_to_summon.reagents.has_reagent("holywater")) || cultist_to_summon.restrained()
+ if(hard_summon && invokers.len < 3)
+ to_chat(user, "The summoning of [cultist_to_summon] is being blocked somehow! You need 3 invokers to counter it!")
fail_invoke()
new /obj/effect/temp_visual/cult/sparks(get_turf(cultist_to_summon)) //observer warning
log_game("Summon Cultist rune failed - holywater in target")
return
-
+ summoning = TRUE
..()
- if(cultist_to_summon.reagents.has_reagent("holywater") || cultist_to_summon.restrained())
+ if(hard_summon)
summontime = 20
- if(do_after(user, summontime, target = loc))
+ if(do_after(user, summontime, target = src))
+ summoning = FALSE // Here incase the proc stops after the qdel
cultist_to_summon.visible_message("[cultist_to_summon] suddenly disappears in a flash of red light!", \
"Overwhelming vertigo consumes you as you are hurled through the air!")
visible_message("A foggy shape materializes atop [src] and solidifies into [cultist_to_summon]!")
cultist_to_summon.forceMove(get_turf(src))
qdel(src)
+ summoning = FALSE
//Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby
/obj/effect/rune/blood_boil
@@ -979,7 +990,7 @@ var/list/teleport_runes = list()
..()
playsound(src, 'sound/misc/exit_blood.ogg', 50, 1)
- visible_message("A cloud of red mist forms above [src], and from within steps... a man.")
+ visible_message("A cloud of red mist forms above [src], and from within steps... a humanoid shape.")
to_chat(user, "Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...")
var/obj/machinery/shield/N = new(get_turf(src))
N.name = "Invoker's Shield"
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index c0c4f7280f5..60d2a7ff73b 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -61,17 +61,17 @@
/obj/item/paper/talisman/supply/invoke(mob/living/user, successfuluse = 1)
var/dat = list()
- dat += "There are [uses] bloody runes on the parchment. "
- dat += "Please choose the chant to be imbued into the fabric of reality. "
+ dat += "There are [uses] bloody runes on the parchment. "
+ dat += "Please choose the chant to be imbued into the fabric of reality. "
dat += ""
- dat += "N'ath reth sh'yro eth d'raggathnor! - Summons an arcane tome, used to scribe runes and communicate with other cultists. "
- dat += "Bar'tea eas! - Provides 5 runed metal. "
- dat += "Sas'so c'arta forbici! - Allows you to move to a selected teleportation rune. "
- dat += "Ta'gh fara'qha fel d'amar det! - Allows you to destroy technology in a short range. "
- dat += "Fuu ma'jin! - Allows you to stun a person by attacking them with the talisman. "
- dat += "Kla'atu barada nikt'o! - Two use talisman, first use makes all nearby runes invisible, second use reveals nearby hidden runes. "
- dat += "Kal'om neth! - Summons a soul stone, used to capture the spirits of dead or dying humans. "
- dat += "Daa'ig osk! - Summons a construct shell for use with soulstone-captured souls. It is too large to carry on your person. "
+ dat += "N'ath reth sh'yro eth d'raggathnor! - Summons an arcane tome, used to scribe runes and communicate with other cultists. "
+ dat += "Bar'tea eas! - Provides 5 runed metal. "
+ dat += "Sas'so c'arta forbici! - Allows you to move to a selected teleportation rune. "
+ dat += "Ta'gh fara'qha fel d'amar det! - Allows you to destroy technology in a short range. "
+ dat += "Fuu ma'jin! - Allows you to stun a person by attacking them with the talisman. "
+ dat += "Kla'atu barada nikt'o! - Two use talisman, first use makes all nearby runes invisible, second use reveals nearby hidden runes. "
+ dat += "Kal'om neth! - Summons a soul stone, used to capture the spirits of dead or dying humans. "
+ dat += "Daa'ig osk! - Summons a construct shell for use with soulstone-captured souls. It is too large to carry on your person. "
var/datum/browser/popup = new(user, "talisman", "", 400, 400)
popup.set_content(jointext(dat, ""))
popup.open()
@@ -132,7 +132,7 @@
var/list/potential_runes = list()
var/list/teleportnames = list()
var/list/duplicaterunecount = list()
- for(var/R in teleport_runes)
+ for(var/R in GLOB.teleport_runes)
var/obj/effect/rune/teleport/T = R
var/resultkey = T.listkey
if(resultkey in teleportnames)
@@ -290,7 +290,7 @@
/obj/item/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1)
. = ..()
var/mob/living/carbon/human/H = user
- user.visible_message("Otherworldly armor suddenly appears on [user]!", \
+ user.visible_message("Otherworldly equipment suddenly appears on [user]!", \
"You speak the words of the talisman, arming yourself!")
H.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), slot_wear_suit)
@@ -334,14 +334,14 @@
/obj/item/paper/talisman/construction/attack_self(mob/living/user)
if(iscultist(user))
- to_chat(user, "To use this talisman, place it upon a stack of metal sheets or plasteel sheets!.")
+ to_chat(user, "To use this talisman, place it upon a stack of metal sheets or plasteel sheets!")
else
to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?")
/obj/item/paper/talisman/construction/attack(obj/M,mob/living/user)
if(iscultist(user))
- to_chat(user, "This talisman will only work on a stack of metal sheets or plasteel sheets!!")
+ to_chat(user, "This talisman will only work on a stack of metal sheets or plasteel sheets!")
log_game("Construct talisman failed - not a valid target")
/obj/item/paper/talisman/construction/afterattack(obj/item/stack/sheet/target, mob/user, proximity_flag, click_parameters)
diff --git a/code/game/gamemodes/devil/devil.dm b/code/game/gamemodes/devil/devil.dm
index ab5f5796d2e..06933891ba6 100644
--- a/code/game/gamemodes/devil/devil.dm
+++ b/code/game/gamemodes/devil/devil.dm
@@ -1,4 +1,4 @@
-var/global/list/whiteness = list (
+GLOBAL_LIST_INIT(whiteness, list(
/obj/item/clothing/under/color/white = 2,
/obj/item/clothing/under/rank/bartender = 1,
/obj/item/clothing/under/rank/chef = 1,
@@ -21,7 +21,7 @@ var/global/list/whiteness = list (
/obj/item/clothing/under/noble_clothes = 1,
/obj/item/clothing/under/sl_suit = 1,
/obj/item/clothing/under/burial = 1
-)
+))
@@ -32,9 +32,9 @@ var/global/list/whiteness = list (
var/mob/living/carbon/human/H = attacker
if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = H.w_uniform
- if(whiteness[U.type])
+ if(GLOB.whiteness[U.type])
src.visible_message("[src] seems to have been harmed by the purity of [attacker]'s clothes.", "Unsullied white clothing is disrupting your form.")
- return whiteness[U.type] + 1
+ return GLOB.whiteness[U.type] + 1
if(BANE_TOOLBOX)
if(istype(weapon,/obj/item/storage/toolbox))
src.visible_message("The [weapon] seems unusually robust this time.", "The [weapon] is your unmaking!")
diff --git a/code/game/gamemodes/devil/devilinfo.dm b/code/game/gamemodes/devil/devilinfo.dm
index abd90172ee9..ecbeb54f7f7 100644
--- a/code/game/gamemodes/devil/devilinfo.dm
+++ b/code/game/gamemodes/devil/devilinfo.dm
@@ -13,8 +13,8 @@
#define DEVILRESURRECTTIME 600
-var/global/list/allDevils = list()
-var/global/list/lawlorify = list (
+GLOBAL_LIST_EMPTY(allDevils)
+GLOBAL_LIST_INIT(lawlorify, list (
LORE = list(
OBLIGATION_FOOD = "This devil seems to always offer it's victims food before slaughtering them.",
OBLIGATION_FIDDLE = "This devil will never turn down a musical challenge.",
@@ -77,7 +77,7 @@ var/global/list/lawlorify = list (
BANISH_DESTRUCTION = "If your corpse is destroyed, you will be unable to resurrect.",
BANISH_FUNERAL_GARB = "If your corpse is clad in funeral garments, you will be unable to resurrect."
)
- )
+ ))
/datum/devilinfo
var/datum/mind/owner = null
@@ -111,11 +111,11 @@ var/global/list/lawlorify = list (
return devil
/proc/devilInfo(name, saveDetails = 0)
- if(allDevils[lowertext(name)])
- return allDevils[lowertext(name)]
+ if(GLOB.allDevils[lowertext(name)])
+ return GLOB.allDevils[lowertext(name)]
else
var/datum/devilinfo/devil = randomDevilInfo(name)
- allDevils[lowertext(name)] = devil
+ GLOB.allDevils[lowertext(name)] = devil
devil.exists = saveDetails
return devil
@@ -444,9 +444,9 @@ var/global/list/lawlorify = list (
D.oldform.revive() // Heal the old body too, so the devil doesn't resurrect, then immediately regress into a dead body.
if(body.stat == DEAD) // Not sure why this would happen
create_new_body()
- else if(blobstart.len > 0)
+ else if(GLOB.blobstart.len > 0)
// teleport the body so repeated beatdowns aren't an option)
- body.forceMove(get_turf(pick(blobstart)))
+ body.forceMove(get_turf(pick(GLOB.blobstart)))
// give them the devil lawyer outfit in case they got stripped
if(ishuman(body))
var/mob/living/carbon/human/H = body
@@ -456,8 +456,8 @@ var/global/list/lawlorify = list (
check_regression()
/datum/devilinfo/proc/create_new_body()
- if(blobstart.len > 0)
- var/turf/targetturf = get_turf(pick(blobstart))
+ if(GLOB.blobstart.len > 0)
+ var/turf/targetturf = get_turf(pick(GLOB.blobstart))
var/mob/currentMob = owner.current
if(QDELETED(currentMob))
currentMob = owner.get_ghost()
@@ -511,10 +511,10 @@ var/global/list/lawlorify = list (
to_chat(owner, "However, your infernal form is not without weaknesses.")
to_chat(owner, "You may not use violence to coerce someone into selling their soul.")
to_chat(owner, "You may not directly and knowingly physically harm a devil, other than yourself.")
- to_chat(owner,lawlorify[LAW][bane])
- to_chat(owner,lawlorify[LAW][ban])
- to_chat(owner,lawlorify[LAW][obligation])
- to_chat(owner,lawlorify[LAW][banish])
+ to_chat(owner,GLOB.lawlorify[LAW][bane])
+ to_chat(owner,GLOB.lawlorify[LAW][ban])
+ to_chat(owner,GLOB.lawlorify[LAW][obligation])
+ to_chat(owner,GLOB.lawlorify[LAW][banish])
to_chat(owner, "
Remember, the crew can research your weaknesses if they find out your devil name. ")
diff --git a/code/game/gamemodes/devil/game_mode.dm b/code/game/gamemodes/devil/game_mode.dm
index f8b980f2dfd..74ff27468cc 100644
--- a/code/game/gamemodes/devil/game_mode.dm
+++ b/code/game/gamemodes/devil/game_mode.dm
@@ -17,7 +17,7 @@
to_chat(world,text)
/datum/game_mode/proc/auto_declare_completion_devils()
- /var/text = ""
+ var/text = ""
if(devils.len)
text += " The devils were:"
for(var/D in devils)
@@ -34,7 +34,7 @@
var/trueName= randomDevilName()
devil_mind.devilinfo = devilInfo(trueName, 1)
devil_mind.devilinfo.ascendable = ascendable
- devil_mind.store_memory("Your diabolical true name is [devil_mind.devilinfo.truename] [lawlorify[LAW][devil_mind.devilinfo.ban]] You may not use violence to coerce someone into selling their soul. You may not directly and knowingly physically harm a devil, other than yourself. [lawlorify[LAW][devil_mind.devilinfo.bane]] [lawlorify[LAW][devil_mind.devilinfo.obligation]] [lawlorify[LAW][devil_mind.devilinfo.banish]] ")
+ devil_mind.store_memory("Your diabolical true name is [devil_mind.devilinfo.truename] [GLOB.lawlorify[LAW][devil_mind.devilinfo.ban]] You may not use violence to coerce someone into selling their soul. You may not directly and knowingly physically harm a devil, other than yourself. [GLOB.lawlorify[LAW][devil_mind.devilinfo.bane]] [GLOB.lawlorify[LAW][devil_mind.devilinfo.obligation]] [GLOB.lawlorify[LAW][devil_mind.devilinfo.banish]] ")
devil_mind.devilinfo.link_with_mob(devil_mind.current)
if(devil_mind.assigned_role == "Clown")
to_chat(devil_mind.current, "Your infernal nature allows you to wield weapons without harming yourself.")
@@ -47,8 +47,8 @@
var/mob/living/silicon/S = devil_mind.current
S.laws.set_sixsixsix_law("You may not use violence to coerce someone into selling their soul.")
S.laws.set_sixsixsix_law("You may not directly and knowingly physically harm a devil, other than yourself.")
- S.laws.set_sixsixsix_law("[lawlorify[LAW][devil_mind.devilinfo.ban]]")
- S.laws.set_sixsixsix_law("[lawlorify[LAW][devil_mind.devilinfo.obligation]]")
+ S.laws.set_sixsixsix_law("[GLOB.lawlorify[LAW][devil_mind.devilinfo.ban]]")
+ S.laws.set_sixsixsix_law("[GLOB.lawlorify[LAW][devil_mind.devilinfo.obligation]]")
S.laws.set_sixsixsix_law("Accomplish your objectives at all costs.")
// unsure about the second "quantity" arg and how it fits with the antag refactor
@@ -76,18 +76,18 @@
return "Target is not a devil."
var/text = "The devil's true name is: [ply.devilinfo.truename]"
text += "The devil's bans were:"
- text += " [lawlorify[LORE][ply.devilinfo.ban]]"
- text += " [lawlorify[LORE][ply.devilinfo.bane]]"
- text += " [lawlorify[LORE][ply.devilinfo.obligation]]"
- text += " [lawlorify[LORE][ply.devilinfo.banish]]"
+ text += " [GLOB.lawlorify[LORE][ply.devilinfo.ban]]"
+ text += " [GLOB.lawlorify[LORE][ply.devilinfo.bane]]"
+ text += " [GLOB.lawlorify[LORE][ply.devilinfo.obligation]]"
+ text += " [GLOB.lawlorify[LORE][ply.devilinfo.banish]]"
return text
/datum/game_mode/proc/update_devil_icons_added(datum/mind/devil_mind)
- var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_DEVIL]
+ var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_DEVIL]
hud.join_hud(devil_mind.current)
set_antag_hud(devil_mind.current, "huddevil")
/datum/game_mode/proc/update_devil_icons_removed(datum/mind/devil_mind)
- var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_DEVIL]
+ var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_DEVIL]
hud.leave_hud(devil_mind.current)
set_antag_hud(devil_mind.current, null)
diff --git a/code/game/gamemodes/devil/true_devil/inventory.dm b/code/game/gamemodes/devil/true_devil/inventory.dm
index 437203e2e91..3f5446d88bc 100644
--- a/code/game/gamemodes/devil/true_devil/inventory.dm
+++ b/code/game/gamemodes/devil/true_devil/inventory.dm
@@ -5,7 +5,7 @@
return 1
return 0
-/mob/living/carbon/true_devil/update_inv_r_hand(var/update_icons=1)
+/mob/living/carbon/true_devil/update_inv_r_hand()
..()
if(r_hand)
var/t_state = r_hand.item_state
@@ -17,11 +17,10 @@
devil_overlays[DEVIL_R_HAND_LAYER] = I
else
devil_overlays[DEVIL_R_HAND_LAYER] = null
- if(update_icons)
- update_icons()
+ update_icons()
-/mob/living/carbon/true_devil/update_inv_l_hand(var/update_icons=1)
+/mob/living/carbon/true_devil/update_inv_l_hand()
..()
if(l_hand)
var/t_state = l_hand.item_state
@@ -33,8 +32,7 @@
devil_overlays[DEVIL_L_HAND_LAYER] = I
else
devil_overlays[DEVIL_L_HAND_LAYER] = null
- if(update_icons)
- update_icons()
+ update_icons()
/mob/living/carbon/true_devil/proc/remove_overlay(cache_index)
if(devil_overlays[cache_index])
diff --git a/code/game/gamemodes/factions.dm b/code/game/gamemodes/factions.dm
deleted file mode 100644
index 1780881a51d..00000000000
--- a/code/game/gamemodes/factions.dm
+++ /dev/null
@@ -1,97 +0,0 @@
-
-// Normal factions:
-
-/datum/faction
- var/name // the name of the faction
- var/desc // small paragraph explaining the traitor faction
-
- var/list/restricted_species = list() // only members of these species can be recruited.
- var/list/members = list() // a list of mind datums that belong to this faction
- var/max_op = 0 // the maximum number of members a faction can have (0 for no max)
-
-// Factions, members of the syndicate coalition:
-
-/datum/faction/syndicate
-
- var/list/alliances = list() // these alliances work together
- var/list/equipment = list() // associative list of equipment available for this faction and its prices
- var/friendly_identification // 0 to 2, the level of identification of fellow operatives or allied factions
- // 0 - no identification clues
- // 1 - faction gives key words and phrases
- // 2 - faction reveals complete identity/job of other agents
- var/operative_notes // some notes to pass onto each operative
-
- var/uplink_contents // the contents of the uplink
-
-/datum/faction/syndicate/proc/assign_objectives(var/datum/mind/traitor)
- ..()
-
-
-/* ----- Begin defining syndicate factions ------ */
-
-/datum/faction/syndicate/Cybersun_Industries
- name = "Cybersun Industries"
- desc = "Cybersun Industries is a well-known organization that bases its business model primarily on the research and development of human-enhancing computer \
- and mechanical technology. They are notorious for their aggressive corporate tactics, and have been known to subsidize the Gorlex Marauder warlords as a form of paid terrorism. \
- Their competent coverups and unchallenged mind-manipulation and augmentation technology makes them a large threat to Nanotrasen. In the recent years of \
- the syndicate coalition, Cybersun Industries have established themselves as the leaders of the coalition, succeededing the founding group, the Gorlex Marauders."
-
- alliances = list("MI13")
- friendly_identification = 1
- max_op = 3
-
- // Friendly to everyone. (with Tiger Cooperative too, only because they are a member of the coalition. This is the only reason why the Tiger Cooperative are even allowed in the coalition)
-
-/datum/faction/syndicate/Donk
- name = "Donk Corporation"
- desc = "Donk.co is led by a group of ex-pirates, who used to be at a state of all-out war against Waffle.co because of an obscure political scandal, but have recently come to a war limitation. \
- They now consist of a series of colonial governments and companies. They were the first to officially begin confrontations against Nanotrasen because of an incident where \
- Nanotrasen purposely swindled them out of a fortune, sending their controlled colonies into a terrible poverty. Their missions against Nanotrasen \
- revolve around stealing valuables and kidnapping and executing key personnel, ransoming their lives for money. They merged with a splinter-cell of Waffle.co who wanted to end \
- hostilities and formed the Gorlex Marauders."
-
- alliances = list("Gorlex Marauders")
- friendly_identification = 2
- operative_notes = "Most other syndicate operatives are not to be trusted, except fellow Donk members and members of the Gorlex Marauders. We do not approve of mindless killing of innocent workers; \"get in, get done, get out\" is our motto. Members of Waffle.co are to be killed on sight; they are not allowed to be on the station while we're around."
-
- // Neutral to everyone, friendly to Marauders
-
-/datum/faction/syndicate/Waffle
- name = "Waffle Corporation"
- desc = "Waffle.co is an interstellar company that produces the best waffles in the galaxy. Their waffles have been rumored to be dipped in the most exotic and addictive \
- drug known to man. They were involved in a political scandal with Donk.co, and have since been in constant war with them. Because of their constant exploits of the galactic \
- economy and stock market, they have been able to bribe their way into amassing a large arsenal of weapons of mass destruction. They target Nanotrasen because of their communistic \
- threat, and their economic threat. Their leaders often have a twisted sense of humor, often misleading and intentionally putting their operatives into harm for laughs.\
- A splinter-cell of Waffle.co merged with Donk.co and formed the Gorlex Marauders and have been a constant ally since. The Waffle.co has lost an overwhelming majority of its military to the Gorlex Marauders."
-
- alliances = list("Gorlex Marauders")
- friendly_identification = 2
- operative_notes = "Most other syndicate operatives are not to be trusted, except for members of the Gorlex Marauders. Do not trust fellow members of the Waffle.co (but try not to rat them out), as they might have been assigned opposing objectives. We encourage humorous terrorism against Nanotrasen; we like to see our operatives creatively kill people while getting the job done."
-
- // Neutral to everyone, friendly to Marauders
-
-
-/* ----- Begin defining miscellaneous factions ------ */
-
-/datum/faction/Wizard
- name = "Wizards Federation"
- desc = "The Wizards Federation is a mysterious organization of magically-talented individuals who act as an equal collective, and have no heirarchy. It is unknown how the wizards \
- are even able to communicate; some suggest a form of telepathic hive-mind. Not much is known about the wizards or their philosphies and motives. They appear to attack random \
- civilian, corporate, planetary, orbital, pretty much any sort of organized facility they come across. Members of the Wizards Federation are considered amongst the most dangerous \
- individuals in the known universe, and have been labeled threats to humanity by most governments. As such, they are enemies of both Nanotrasen and the Syndicate."
-
-/datum/faction/Cult
- name = "The Cult of the Elder Gods"
- desc = "The Cult of the Elder Gods is highly untrusted but otherwise elusive religious organization bent on the revival of the so-called \"Elder Gods\" into the mortal realm. Despite their obvious dangeorus practices, \
- no confirmed reports of violence by members of the Cult have been reported, only rumor and unproven claims. Their nature is unknown, but recent discoveries have hinted to the possibility \
- of being able to de-convert members of this cult through what has been dubbed \"religious warfare\"."
-
-
-// These can maybe be added into a game mode or a mob?
-
-/datum/faction/Exolitics
- name = "Exolitics United"
- desc = "The Exolitics are an ancient alien race with an energy-based anatomy. Their culture, communication, morales and knowledge is unknown. They are so radically different to humans that their \
- attempts of communication with other life forms is completely incomprehensible. Members of this alien race are capable of broadcasting subspace transmissions from their bodies. \
- The religious leaders of the Tiger Cooperative claim to have the technology to decypher and interpret their messages, which have been confirmed as religious propaganda. Their motives are unknown \
- but they are otherwise not considered much of a threat to anyone. They are virtually indestructable because of their nonphysical composition, and have the frighetning ability to make anything stop existing in a second."
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 258d6ea20c6..2d71df8c979 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -80,8 +80,8 @@
// feedback_set_details("revision","[revdata.revision]")
feedback_set_details("server_ip","[world.internet_address]:[world.port]")
generate_station_goals()
- start_state = new /datum/station_state()
- start_state.count()
+ GLOB.start_state = new /datum/station_state()
+ GLOB.start_state.count()
return 1
///process()
@@ -92,15 +92,15 @@
//Called by the gameticker
/datum/game_mode/proc/process_job_tasks()
var/obj/machinery/message_server/useMS = null
- if(message_servers)
- for(var/obj/machinery/message_server/MS in message_servers)
+ if(GLOB.message_servers)
+ for(var/obj/machinery/message_server/MS in GLOB.message_servers)
if(MS.active)
useMS = MS
break
for(var/mob/M in GLOB.player_list)
if(M.mind)
var/obj/item/pda/P=null
- for(var/obj/item/pda/check_pda in PDAs)
+ for(var/obj/item/pda/check_pda in GLOB.PDAs)
if(check_pda.owner==M.name)
P=check_pda
break
@@ -164,11 +164,11 @@
if(ishuman(M))
if(!M.stat)
surviving_humans++
- if(M.loc && M.loc.loc && M.loc.loc.type in escape_locations)
+ if(M.loc && M.loc.loc && (M.loc.loc.type in escape_locations))
escaped_humans++
if(!M.stat)
surviving_total++
- if(M.loc && M.loc.loc && M.loc.loc.type in escape_locations)
+ if(M.loc && M.loc.loc && (M.loc.loc.type in escape_locations))
escaped_total++
if(M.loc && M.loc.loc && M.loc.loc.type == SSshuttle.emergency.areaInstance.type && SSshuttle.emergency.mode >= SHUTTLE_ENDGAME)
@@ -292,7 +292,7 @@
/datum/game_mode/proc/get_living_heads()
. = list()
for(var/mob/living/carbon/human/player in GLOB.mob_list)
- var/list/real_command_positions = command_positions.Copy() - "Nanotrasen Representative"
+ var/list/real_command_positions = GLOB.command_positions.Copy() - "Nanotrasen Representative"
if(player.stat != DEAD && player.mind && (player.mind.assigned_role in real_command_positions))
. |= player.mind
@@ -303,7 +303,7 @@
/datum/game_mode/proc/get_all_heads()
. = list()
for(var/mob/player in GLOB.mob_list)
- var/list/real_command_positions = command_positions.Copy() - "Nanotrasen Representative"
+ var/list/real_command_positions = GLOB.command_positions.Copy() - "Nanotrasen Representative"
if(player.mind && (player.mind.assigned_role in real_command_positions))
. |= player.mind
@@ -313,7 +313,7 @@
/datum/game_mode/proc/get_living_sec()
. = list()
for(var/mob/living/carbon/human/player in GLOB.mob_list)
- if(player.stat != DEAD && player.mind && (player.mind.assigned_role in security_positions))
+ if(player.stat != DEAD && player.mind && (player.mind.assigned_role in GLOB.security_positions))
. |= player.mind
////////////////////////////////////////
@@ -322,14 +322,14 @@
/datum/game_mode/proc/get_all_sec()
. = list()
for(var/mob/living/carbon/human/player in GLOB.mob_list)
- if(player.mind && (player.mind.assigned_role in security_positions))
+ if(player.mind && (player.mind.assigned_role in GLOB.security_positions))
. |= player.mind
/datum/game_mode/proc/check_antagonists_topic(href, href_list[])
return 0
/datum/game_mode/New()
- newscaster_announcements = pick(newscaster_standard_feeds)
+ newscaster_announcements = pick(GLOB.newscaster_standard_feeds)
//////////////////////////
//Reports player logouts//
@@ -415,7 +415,7 @@ proc/display_roundstart_logout_report()
/proc/get_nuke_code()
var/nukecode = "ERROR"
- for(var/obj/machinery/nuclearbomb/bomb in world)
+ for(var/obj/machinery/nuclearbomb/bomb in GLOB.machines)
if(bomb && bomb.r_code && is_station_level(bomb.z))
nukecode = bomb.r_code
return nukecode
@@ -512,11 +512,11 @@ proc/display_roundstart_logout_report()
G.print_result()
/datum/game_mode/proc/update_eventmisc_icons_added(datum/mind/mob_mind)
- var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_EVENTMISC]
+ var/datum/atom_hud/antag/antaghud = GLOB.huds[ANTAG_HUD_EVENTMISC]
antaghud.join_hud(mob_mind.current)
set_antag_hud(mob_mind.current, "hudevent")
/datum/game_mode/proc/update_eventmisc_icons_removed(datum/mind/mob_mind)
- var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_EVENTMISC]
+ var/datum/atom_hud/antag/antaghud = GLOB.huds[ANTAG_HUD_EVENTMISC]
antaghud.leave_hud(mob_mind.current)
set_antag_hud(mob_mind.current, null)
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 2b4d095b327..142ae33c078 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -1,9 +1,8 @@
/*
VOX HEIST ROUNDTYPE
*/
-
-var/global/list/raider_spawn = list()
-var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective. Clumsy, rewrite sometime.
+GLOBAL_LIST_EMPTY(raider_spawn)
+GLOBAL_LIST_EMPTY(cortical_stacks) //Stacks for 'leave nobody behind' objective. Clumsy, rewrite sometime.
/datum/game_mode/
var/list/datum/mind/raiders = list() //Antags.
@@ -70,10 +69,10 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
//Spawn the vox!
for(var/datum/mind/raider in raiders)
- if(index > raider_spawn.len)
+ if(index > GLOB.raider_spawn.len)
index = 1
- raider.current.loc = raider_spawn[index]
+ raider.current.loc = GLOB.raider_spawn[index]
index++
create_vox(raider)
@@ -128,16 +127,16 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
//Now apply cortical stack.
var/obj/item/implant/cortical/I = new(vox)
I.implant(vox)
- cortical_stacks += I
+ GLOB.cortical_stacks += I
vox.equip_vox_raider()
vox.regenerate_icons()
/datum/game_mode/proc/is_raider_crew_safe()
- if(cortical_stacks.len == 0)
+ if(GLOB.cortical_stacks.len == 0)
return 0
- for(var/obj/stack in cortical_stacks)
+ for(var/obj/stack in GLOB.cortical_stacks)
if(get_area(stack) != locate(/area/shuttle/vox) && get_area(stack) != locate(/area/vox_station))
return 0 //this is stupid as fuck
return 1
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 9ca0025a0ab..a4b8c594b89 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -186,7 +186,7 @@
var/unlock_sound //Sound played when an ability is unlocked
var/uses
-/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.
@@ -224,14 +224,14 @@
/datum/action/innate/ai/nuke_station/proc/set_us_up_the_bomb()
to_chat(owner_AI, "Nuclear device armed.")
- event_announcement.Announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", new_sound = 'sound/AI/aimalf.ogg')
+ GLOB.event_announcement.Announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", new_sound = 'sound/AI/aimalf.ogg')
set_security_level("delta")
owner_AI.nuking = TRUE
var/obj/machinery/doomsday_device/DOOM = new /obj/machinery/doomsday_device(owner_AI)
owner_AI.doomsday_device = DOOM
owner_AI.doomsday_device.start()
for(var/obj/item/pinpointer/point in GLOB.pinpointer_list)
- for(var/mob/living/silicon/ai/A in ai_list)
+ for(var/mob/living/silicon/ai/A in GLOB.ai_list)
if((A.stat != DEAD) && A.nuking)
point.the_disk = A //The pinpointer now tracks the AI core
qdel(src)
@@ -256,7 +256,7 @@
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
SSshuttle.emergency.mode = SHUTTLE_DOCKED
SSshuttle.emergency.timer = world.time
- priority_announcement.Announce("Hostile environment resolved. You have 3 minutes to board the Emergency Shuttle.", "Priority Announcement", 'sound/AI/shuttledock.ogg')
+ GLOB.priority_announcement.Announce("Hostile environment resolved. You have 3 minutes to board the Emergency Shuttle.", "Priority Announcement", 'sound/AI/shuttledock.ogg')
return ..()
/obj/machinery/doomsday_device/proc/start()
@@ -271,12 +271,12 @@
/obj/machinery/doomsday_device/process()
var/turf/T = get_turf(src)
if(!T || !is_station_level(T.z))
- minor_announcement.Announce("DOOMSDAY DEVICE OUT OF STATION RANGE, ABORTING", "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4", 'sound/misc/notice1.ogg')
+ GLOB.minor_announcement.Announce("DOOMSDAY DEVICE OUT OF STATION RANGE, ABORTING", "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4", 'sound/misc/notice1.ogg')
SSshuttle.emergencyNoEscape = 0
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
SSshuttle.emergency.mode = SHUTTLE_DOCKED
SSshuttle.emergency.timer = world.time
- priority_announcement.Announce("Hostile environment resolved. You have 3 minutes to board the Emergency Shuttle.", "Priority Announcement", 'sound/AI/shuttledock.ogg')
+ GLOB.priority_announcement.Announce("Hostile environment resolved. You have 3 minutes to board the Emergency Shuttle.", "Priority Announcement", 'sound/AI/shuttledock.ogg')
qdel(src)
if(!timing)
STOP_PROCESSING(SSfastprocess, src)
@@ -289,7 +289,7 @@
else
if(!(sec_left % 60) && !announced)
var/message = "[sec_left] SECONDS UNTIL DOOMSDAY DEVICE ACTIVATION!"
- minor_announcement.Announce(message, "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4", 'sound/misc/notice1.ogg')
+ GLOB.minor_announcement.Announce(message, "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4", 'sound/misc/notice1.ogg')
announced = 10
announced = max(0, announced-1)
@@ -318,7 +318,7 @@
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/turret in GLOB.machines)
var/turf/T = get_turf(turret)
if(is_station_level(T.z))
@@ -352,10 +352,10 @@
post_status("alert", "lockdown")
- minor_announcement.Announce("Hostile runtime detected in door controllers. Isolation lockdown protocols are now in effect. Please remain calm.", "Network Alert")
+ GLOB.minor_announcement.Announce("Hostile runtime detected in door controllers. Isolation lockdown protocols are now in effect. Please remain calm.", "Network Alert")
to_chat(owner, "Lockdown Initiated. Network reset in 90 seconds.")
spawn(900)
- minor_announcement.Announce("Automatic system reboot complete. Have a secure day.","Network reset:")
+ GLOB.minor_announcement.Announce("Automatic system reboot complete. Have a secure day.","Network reset:")
//Destroy RCDs: Detonates all non-cyborg RCDs on the station.
/datum/AI_Module/large/destroy_rcd
@@ -613,7 +613,7 @@
var/turf/T = turfs[n]
if(!isfloorturf(T))
success = FALSE
- var/datum/camerachunk/C = cameranet.getCameraChunk(T.x, T.y, T.z)
+ var/datum/camerachunk/C = GLOB.cameranet.getCameraChunk(T.x, T.y, T.z)
if(!C.visibleTurfs[T])
alert_msg = "You don't have camera vision of this location!"
success = FALSE
@@ -652,7 +652,8 @@
button.desc = desc
/datum/action/innate/ai/blackout/Activate()
- for(var/obj/machinery/power/apc/apc in GLOB.apcs)
+ for(var/thing in GLOB.apcs)
+ var/obj/machinery/power/apc/apc
if(prob(30 * apc.overload))
apc.overload_lighting()
else
@@ -689,7 +690,7 @@
/datum/action/innate/ai/reactivate_cameras/Activate()
var/fixed_cameras = 0
- for(var/V in cameranet.cameras)
+ for(var/V in GLOB.cameranet.cameras)
if(!uses)
break
var/obj/machinery/camera/C = V
@@ -722,7 +723,7 @@
AI.update_sight()
var/upgraded_cameras = 0
- for(var/V in cameranet.cameras)
+ for(var/V in GLOB.cameranet.cameras)
var/obj/machinery/camera/C = V
if(C.assembly)
var/upgraded = FALSE
@@ -730,7 +731,7 @@
if(!C.isXRay())
C.upgradeXRay()
//Update what it can see.
- cameranet.updateVisibility(C, 0)
+ GLOB.cameranet.updateVisibility(C, 0)
upgraded = TRUE
if(!C.isEmpProof())
diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm
index f8ac70b31dc..5cd46ca89b5 100644
--- a/code/game/gamemodes/meteor/meteor.dm
+++ b/code/game/gamemodes/meteor/meteor.dm
@@ -13,7 +13,7 @@
/datum/game_mode/meteor/post_setup()
spawn(rand(waittime_l, waittime_h))
- command_announcement.Announce("The station is on the path of an incoming wave of meteors. Reinforce the hull and prepare damage control parties.", "Incoming Meteors", 'sound/effects/siren.ogg')
+ GLOB.command_announcement.Announce("The station is on the path of an incoming wave of meteors. Reinforce the hull and prepare damage control parties.", "Incoming Meteors", 'sound/effects/siren.ogg')
spawn(initialmeteordelay)
sendmeteors()
..()
@@ -25,7 +25,7 @@
var/waitduration = rand(3000,6000)
while(waveduration - world.time > 0)
sleep(max(65 - text2num("[wave]0") / 2, 40))
- spawn() spawn_meteors(6, meteors_normal)
+ spawn() spawn_meteors(6, GLOB.meteors_normal)
wave++
sleep(waitduration)
sendmeteors()
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 507fedddd32..0743a6f686d 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -1,18 +1,18 @@
//Meteors probability of spawning during a given wave
-/var/list/meteors_normal = list(/obj/effect/meteor/dust=3, /obj/effect/meteor/medium=8, /obj/effect/meteor/big=3, \
- /obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=3) //for normal meteor event
+GLOBAL_LIST_INIT(meteors_normal, list(/obj/effect/meteor/dust=3, /obj/effect/meteor/medium=8, /obj/effect/meteor/big=3, \
+ /obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=3)) //for normal meteor event
-/var/list/meteors_threatening = list(/obj/effect/meteor/medium=4, /obj/effect/meteor/big=8, \
- /obj/effect/meteor/flaming=3, /obj/effect/meteor/irradiated=3) //for threatening meteor event
+GLOBAL_LIST_INIT(meteors_threatening, list(/obj/effect/meteor/medium=4, /obj/effect/meteor/big=8, \
+ /obj/effect/meteor/flaming=3, /obj/effect/meteor/irradiated=3)) //for threatening meteor event
-/var/list/meteors_catastrophic = list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=75, \
- /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/tunguska = 1) //for catastrophic meteor event
+GLOBAL_LIST_INIT(meteors_catastrophic, list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=75, \
+ /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/tunguska = 1)) //for catastrophic meteor event
-/var/list/meteors_dust = list(/obj/effect/meteor/dust) //for space dust event
+GLOBAL_LIST_INIT(meteors_dust, list(/obj/effect/meteor/dust)) //for space dust event
-/var/list/meteors_gore = list(/obj/effect/meteor/gore) //Meaty Gore
+GLOBAL_LIST_INIT(meteors_gore, list(/obj/effect/meteor/gore)) //Meaty Gore
-/var/list/meteors_ops = list(/obj/effect/meteor/goreops) //Meaty Ops
+GLOBAL_LIST_INIT(meteors_ops, list(/obj/effect/meteor/goreops)) //Meaty Ops
///////////////////////////////
@@ -27,7 +27,7 @@
var/turf/pickedgoal
var/max_i = 10//number of tries to spawn meteor.
while(!istype(pickedstart, /turf/space))
- var/startSide = pick(cardinal)
+ var/startSide = pick(GLOB.cardinal)
pickedstart = spaceDebrisStartLoc(startSide, 1)
pickedgoal = spaceDebrisFinishLoc(startSide, 1)
max_i--
diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm
index ea22ba9f54e..60de5ba4238 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction.dm
@@ -47,7 +47,7 @@
/datum/game_mode/abduction/proc/make_abductor_team(team_number,preset_agent=null,preset_scientist=null)
//Team Name
- team_names[team_number] = "Mothership [pick(possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names
+ team_names[team_number] = "Mothership [pick(GLOB.possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names
//Team Objective
var/datum/objective/experiment/team_objective = new
team_objective.team = team_number
@@ -267,6 +267,7 @@
SSticker.mode.abductors -= abductor_mind
abductor_mind.special_role = null
abductor_mind.current.create_attack_log("No longer abductor")
+ abductor_mind.current.create_log(CONVERSION_LOG, "No longer abductor")
if(issilicon(abductor_mind.current))
to_chat(abductor_mind.current, "You have been turned into a robot! You are no longer an abductor.")
else
@@ -274,11 +275,11 @@
SSticker.mode.update_abductor_icons_removed(abductor_mind)
/datum/game_mode/proc/update_abductor_icons_added(datum/mind/alien_mind)
- var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR]
+ var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_ABDUCTOR]
hud.join_hud(alien_mind.current)
set_antag_hud(alien_mind.current, ((alien_mind in abductors) ? "abductor" : "abductee"))
/datum/game_mode/proc/update_abductor_icons_removed(datum/mind/alien_mind)
- var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR]
+ var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_ABDUCTOR]
hud.leave_hud(alien_mind.current)
set_antag_hud(alien_mind.current, null)
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index c27b230b3b2..a0519fcbe56 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -25,6 +25,11 @@
var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90)
sprite_sheets = null
+/obj/item/clothing/suit/armor/abductor/vest/Initialize(mapload)
+ . = ..()
+ stealth_armor = getArmor(arglist(stealth_armor))
+ combat_armor = getArmor(arglist(combat_armor))
+
/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop()
flags ^= NODROP
if(ismob(loc))
@@ -475,8 +480,8 @@ Congratulations! You are now trained for invasive xenobiology research!"}
H.update_inv_r_hand()
/obj/item/abductor_baton/proc/StunAttack(mob/living/L,mob/living/user)
- user.lastattacked = L
- L.lastattacker = user
+ L.lastattacker = user.real_name
+ L.lastattackerckey = user.ckey
L.Stun(7)
L.Weaken(7)
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index 23d9792ca4c..e23e37c349e 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -69,7 +69,7 @@
active = 0
if(initial(uses) == 1)
uses = initial(uses)
- var/datum/atom_hud/abductor/hud = huds[DATA_HUD_ABDUCTOR]
+ var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR]
hud.remove_from_hud(owner)
clear_mind_control()
. = ..()
@@ -78,7 +78,7 @@
..()
if(special != 2 && uses) // Special 2 means abductor surgery
Start()
- var/datum/atom_hud/abductor/hud = huds[DATA_HUD_ABDUCTOR]
+ var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR]
hud.add_to_hud(owner)
update_gland_hud()
@@ -277,14 +277,14 @@
..()
if(ishuman(owner))
owner.gene_stability += GENE_INSTABILITY_MODERATE // give them this gene for free
- owner.dna.SetSEState(SHOCKIMMUNITYBLOCK, TRUE)
- genemutcheck(owner, SHOCKIMMUNITYBLOCK, null, MUTCHK_FORCED)
+ owner.dna.SetSEState(GLOB.shockimmunityblock, TRUE)
+ genemutcheck(owner, GLOB.shockimmunityblock, null, MUTCHK_FORCED)
/obj/item/organ/internal/heart/gland/electric/remove(mob/living/carbon/M, special = 0)
if(ishuman(owner))
owner.gene_stability -= GENE_INSTABILITY_MODERATE // but return it to normal once it's removed
- owner.dna.SetSEState(SHOCKIMMUNITYBLOCK, FALSE)
- genemutcheck(owner, SHOCKIMMUNITYBLOCK, null, MUTCHK_FORCED)
+ owner.dna.SetSEState(GLOB.shockimmunityblock, FALSE)
+ genemutcheck(owner, GLOB.shockimmunityblock, null, MUTCHK_FORCED)
return ..()
/obj/item/organ/internal/heart/gland/electric/activate()
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index 951ee6806de..6fb401d31e9 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -73,7 +73,7 @@
var/mob/camera/aiEye/remote/remote_eye = C.remote_control
var/obj/machinery/abductor/pad/P = target
- if(cameranet.checkTurfVis(remote_eye.loc))
+ if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
P.PadToLoc(remote_eye.loc)
/datum/action/innate/teleport_out
@@ -98,7 +98,7 @@
var/mob/camera/aiEye/remote/remote_eye = C.remote_control
var/obj/machinery/abductor/pad/P = target
- if(cameranet.checkTurfVis(remote_eye.loc))
+ if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
P.MobToLoc(remote_eye.loc,C)
/datum/action/innate/vest_mode_swap
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
index 04dda244a0c..d7354b87c5c 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
@@ -166,7 +166,6 @@
eject_abductee()
SendBack(H)
return "Specimen braindead - disposed."
- return "ERROR"
/obj/machinery/abductor/experiment/proc/SendBack(mob/living/carbon/human/H)
@@ -176,7 +175,7 @@
H.uncuff()
return
//Area not chosen / It's not safe area - teleport to arrivals
- H.forceMove(pick(latejoin))
+ H.forceMove(pick(GLOB.latejoin))
H.uncuff()
return
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
index 85c120186e4..24e43b6583f 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
@@ -12,7 +12,7 @@
/obj/machinery/abductor/pad/proc/Send()
if(teleport_target == null)
- teleport_target = teleportlocs[pick(teleportlocs)]
+ teleport_target = GLOB.teleportlocs[pick(GLOB.teleportlocs)]
flick("alien-pad", src)
for(var/mob/living/target in loc)
target.forceMove(teleport_target)
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index fa797ac929b..f99a00567ae 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -590,8 +590,6 @@
GrantBorerActions()
RemoveInfestActions()
forceMove(get_turf(host))
-
- reset_perspective(null)
machine = null
host.reset_perspective(null)
diff --git a/code/game/gamemodes/miniantags/borer/borer_event.dm b/code/game/gamemodes/miniantags/borer/borer_event.dm
index f925a59d9fc..f5a3b7aa4af 100644
--- a/code/game/gamemodes/miniantags/borer/borer_event.dm
+++ b/code/game/gamemodes/miniantags/borer/borer_event.dm
@@ -12,11 +12,11 @@
/datum/event/borer_infestation/announce()
if(successSpawn)
- command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
+ GLOB.command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
/datum/event/borer_infestation/start()
var/list/vents = list()
- for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in SSair.atmos_machinery)
if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
//Stops cortical borers getting stuck in small networks. See: Security, Virology
if(temp_vent.parent.other_atmosmch.len > 50)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index defa0de633d..8da5b4468d7 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -61,6 +61,7 @@
icon = 'icons/mob/swarmer.dmi'
desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely."
speak_emote = list("tones")
+ bubble_icon = "swarmer"
health = 40
maxHealth = 40
status_flags = CANPUSH
@@ -119,7 +120,7 @@
..()
add_language("Swarmer", 1)
verbs -= /mob/living/verb/pulled
- for(var/datum/atom_hud/data/diagnostic/diag_hud in huds)
+ for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
diag_hud.add_to_hud(src)
updatename()
@@ -330,7 +331,7 @@
to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.")
return FALSE
-/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+/obj/machinery/tcomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.")
return FALSE
@@ -362,6 +363,10 @@
to_chat(S, "This cryopod control computer should be preserved, it contains useful items and information about the inhabitants. Aborting.")
return FALSE
+/obj/structure/spacepoddoor/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ to_chat(S, "Disrupting this energy field would overload us. Aborting.")
+ return FALSE
+
/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
var/isonshuttle = istype(loc, /area/shuttle)
for(var/turf/T in range(1, src))
@@ -421,13 +426,13 @@
return FALSE
/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- . = ..()
var/turf/here = get_turf(src)
for(var/A in here.contents)
var/obj/structure/cable/C = A
if(istype(C))
to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
return FALSE
+ return ..()
/obj/item/deactivated_swarmer/IntegrateAmount()
return 50
@@ -604,7 +609,7 @@
if(!istype(L, /mob/living/simple_animal/hostile/swarmer))
playsound(loc,'sound/effects/snap.ogg',50, 1, -1)
L.electrocute_act(0, src, 1, TRUE, TRUE)
- if(isrobot(L) || L.isSynthetic())
+ if(isrobot(L) || ismachineperson(L))
L.Weaken(5)
qdel(src)
..()
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm
index 0d5ba13d682..fbceda6bd94 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm
@@ -8,14 +8,14 @@
swarmer_report += "
Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come \
through."
print_command_report(swarmer_report, "Classified [command_name()] Update")
- event_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg')
+ GLOB.event_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg')
/datum/event/spawn_swarmer/start()
if(find_swarmer())
return 0
- if(!the_gateway)
+ if(!GLOB.the_gateway)
return 0
- new /obj/effect/mob_spawn/swarmer(get_turf(the_gateway))
+ new /obj/effect/mob_spawn/swarmer(get_turf(GLOB.the_gateway))
/datum/event/spawn_swarmer/proc/find_swarmer()
diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm
index 387cd03aceb..f647ae5a6d1 100644
--- a/code/game/gamemodes/miniantags/guardian/guardian.dm
+++ b/code/game/gamemodes/miniantags/guardian/guardian.dm
@@ -3,6 +3,7 @@
real_name = "Guardian Spirit"
desc = "A mysterious being that stands by it's charge, ever vigilant."
speak_emote = list("intones")
+ bubble_icon = "guardian"
response_help = "passes through"
response_disarm = "flails at"
response_harm = "punches"
@@ -112,7 +113,7 @@
summoner.death()
-/mob/living/simple_animal/hostile/guardian/handle_hud_icons_health()
+/mob/living/simple_animal/hostile/guardian/update_health_hud()
if(summoner)
var/resulthealth
if(iscarbon(summoner))
@@ -121,8 +122,6 @@
resulthealth = round((summoner.health / summoner.maxHealth) * 100)
if(hud_used)
hud_used.guardianhealthdisplay.maptext = "
[resulthealth]%
"
- med_hud_set_health()
- med_hud_set_status()
/mob/living/simple_animal/hostile/guardian/adjustHealth(amount, updating_health = TRUE) //The spirit is invincible, but passes on damage to the summoner
var/damage = amount * damage_transfer
@@ -164,7 +163,7 @@
if(loc == summoner)
forceMove(get_turf(summoner))
new /obj/effect/temp_visual/guardian/phase(loc)
- src.client.eye = loc
+ reset_perspective()
cooldown = world.time + 30
/mob/living/simple_animal/hostile/guardian/proc/Recall(forced = FALSE)
@@ -182,15 +181,19 @@
input = stripped_input(src, "Please enter a message to tell your summoner.", "Guardian", "")
else
input = message
- if(!input) return
+ if(!input)
+ return
- for(var/mob/M in GLOB.mob_list)
- if(M == summoner)
- to_chat(M, "[src]: [input]")
- log_say("(GUARDIAN to [key_name(M)]) [input]", src)
- else if(M in GLOB.dead_mob_list && M.client && M.stat == DEAD && !isnewplayer(M))
- to_chat(M, "Guardian Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]")
+ // Show the message to the host and to the guardian.
+ to_chat(summoner, "[src]: [input]")
to_chat(src, "[src]: [input]")
+ log_say("(GUARDIAN to [key_name(summoner)]) [input]", src)
+ create_log(SAY_LOG, "GUARDIAN to HOST: [input]", summoner)
+
+ // Show the message to any ghosts/dead players.
+ for(var/mob/M in GLOB.dead_mob_list)
+ if(M && M.client && M.stat == DEAD && !isnewplayer(M))
+ to_chat(M, "Guardian Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]")
//override set to true if message should be passed through instead of going to host communication
/mob/living/simple_animal/hostile/guardian/say(message, override = FALSE)
@@ -208,18 +211,24 @@
set category = "Guardian"
set desc = "Communicate telepathically with your guardian."
var/input = stripped_input(src, "Please enter a message to tell your guardian.", "Message", "")
- if(!input) return
+ if(!input)
+ return
- for(var/mob/M in GLOB.mob_list)
- if(istype(M, /mob/living/simple_animal/hostile/guardian))
- var/mob/living/simple_animal/hostile/guardian/G = M
- if(G.summoner == src)
- to_chat(G, "[src]: [input]")
- log_say("(GUARDIAN to [key_name(G)]) [input]", src)
+ // Find the guardian in our host's contents.
+ var/mob/living/simple_animal/hostile/guardian/G = locate() in contents
+ if(!G)
+ return
- else if(M in GLOB.dead_mob_list && M.client && M.stat == DEAD && !isnewplayer(M))
- to_chat(M, "Guardian Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]")
+ // Show the message to our guardian and to host.
+ to_chat(G, "[src]: [input]")
to_chat(src, "[src]: [input]")
+ log_say("(GUARDIAN to [key_name(G)]) [input]", src)
+ create_log(SAY_LOG, "HOST to GUARDIAN: [input]", G)
+
+ // Show the message to any ghosts/dead players.
+ for(var/mob/M in GLOB.dead_mob_list)
+ if(M && M.client && M.stat == DEAD && !isnewplayer(M))
+ to_chat(M, "Guardian Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]")
/mob/living/proc/guardian_recall()
set name = "Recall Guardian"
@@ -286,7 +295,7 @@
var/name_list = list("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces")
/obj/item/guardiancreator/attack_self(mob/living/user)
- for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.living_mob_list)
+ for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.alive_mob_list)
if(G.summoner == user)
to_chat(user, "You already have a [mob_name]!")
return
@@ -296,11 +305,12 @@
if(used == TRUE)
to_chat(user, "[used_message]")
return
+ used = TRUE // Set this BEFORE the popup to prevent people using the injector more than once, polling ghosts multiple times, and receiving multiple guardians.
var/choice = alert(user, "[confirmation_message]",, "Yes", "No")
if(choice == "No")
to_chat(user, "You decide against using the [name].")
+ used = FALSE
return
- used = TRUE
to_chat(user, "[use_message]")
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the [mob_name] of [user.real_name]?", ROLE_GUARDIAN, 0, 100)
var/mob/dead/observer/theghost = null
diff --git a/code/game/gamemodes/miniantags/guardian/types/fire.dm b/code/game/gamemodes/miniantags/guardian/types/fire.dm
index 09a202afb91..bf8a908e979 100644
--- a/code/game/gamemodes/miniantags/guardian/types/fire.dm
+++ b/code/game/gamemodes/miniantags/guardian/types/fire.dm
@@ -35,7 +35,7 @@
new /obj/effect/hallucination/delusion(target.loc, target, force_kind = "custom", duration = 200, skip_nearby = 0, custom_icon = icon_state, custom_icon_file = icon)
else
if(prob(45))
- if(ismovableatom(target))
+ if(ismovable(target))
var/atom/movable/M = target
if(!M.anchored && M != summoner)
new /obj/effect/temp_visual/guardian/phase/out(get_turf(M))
diff --git a/code/game/gamemodes/miniantags/guardian/types/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm
index bf2c92ffb28..c3f8046f0a9 100644
--- a/code/game/gamemodes/miniantags/guardian/types/healer.dm
+++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm
@@ -33,7 +33,7 @@
/mob/living/simple_animal/hostile/guardian/healer/Life(seconds, times_fired)
..()
- var/datum/atom_hud/medsensor = huds[DATA_HUD_MEDICAL_ADVANCED]
+ var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
medsensor.add_hud_to(src)
/mob/living/simple_animal/hostile/guardian/healer/Stat()
@@ -51,7 +51,7 @@
if(iscarbon(target))
changeNext_move(CLICK_CD_MELEE)
if(heal_cooldown <= world.time && !stat)
- var/mob/living/carbon/C = target
+ var/mob/living/carbon/human/C = target
C.adjustBruteLoss(-5, robotic=1)
C.adjustFireLoss(-5, robotic=1)
C.adjustOxyLoss(-5)
@@ -65,7 +65,7 @@
if(loc == summoner)
if(toggle)
a_intent = INTENT_HARM
- hud_used.action_intent.icon_state = a_intent;
+ hud_used.action_intent.icon_state = a_intent
speed = 0
damage_transfer = 0.7
if(adminseal)
@@ -76,7 +76,7 @@
toggle = FALSE
else
a_intent = INTENT_HELP
- hud_used.action_intent.icon_state = a_intent;
+ hud_used.action_intent.icon_state = a_intent
speed = 1
damage_transfer = 1
if(adminseal)
@@ -130,7 +130,7 @@
if(beacon) //Check that the beacon still exists and is in a safe place. No instant kills.
if(beacon.air)
var/datum/gas_mixture/Z = beacon.air
- if(Z.oxygen >= 16 && !Z.toxins && Z.carbon_dioxide < 10 && !Z.trace_gases.len)
+ if(Z.oxygen >= 16 && !Z.toxins && Z.carbon_dioxide < 10 && !Z.sleeping_agent)
if((Z.temperature > 270) && (Z.temperature < 360))
var/pressure = Z.return_pressure()
if((pressure > 20) && (pressure < 550))
diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm
index ef90f44f4a0..a122351a4bb 100644
--- a/code/game/gamemodes/miniantags/morph/morph.dm
+++ b/code/game/gamemodes/miniantags/morph/morph.dm
@@ -136,7 +136,7 @@
for(var/atom/movable/AM in src)
AM.forceMove(loc)
if(prob(90))
- step(AM, pick(alldirs))
+ step(AM, pick(GLOB.alldirs))
// Only execute the below if we successfully died
if(!.)
return FALSE
diff --git a/code/game/gamemodes/miniantags/morph/morph_event.dm b/code/game/gamemodes/miniantags/morph/morph_event.dm
index 28183e7d22e..e9465492a27 100644
--- a/code/game/gamemodes/miniantags/morph/morph_event.dm
+++ b/code/game/gamemodes/miniantags/morph/morph_event.dm
@@ -15,9 +15,9 @@
var/datum/mind/player_mind = new /datum/mind(key_of_morph)
player_mind.active = 1
- if(!xeno_spawn)
+ if(!GLOB.xeno_spawn)
return kill()
- var/mob/living/simple_animal/hostile/morph/S = new /mob/living/simple_animal/hostile/morph(pick(xeno_spawn))
+ var/mob/living/simple_animal/hostile/morph/S = new /mob/living/simple_animal/hostile/morph(pick(GLOB.xeno_spawn))
player_mind.transfer_to(S)
player_mind.assigned_role = SPECIAL_ROLE_MORPH
player_mind.special_role = SPECIAL_ROLE_MORPH
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
index 34bf06f07f7..91ed583efc7 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
@@ -265,8 +265,8 @@
if(!istype(T, /turf/simulated/floor/plating) && !istype(T, /turf/simulated/floor/engine/cult) && istype(T, /turf/simulated/floor) && prob(15))
var/turf/simulated/floor/floor = T
- if(floor.intact)
- floor.builtin_tile.loc = floor
+ if(floor.intact && floor.floor_tile)
+ new floor.floor_tile(floor)
floor.broken = 0
floor.burnt = 0
floor.make_plating(1)
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm
index 1f902a51806..5e5f0f87a79 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm
@@ -26,13 +26,15 @@
var/datum/mind/player_mind = new /datum/mind(key_of_revenant)
player_mind.active = 1
var/list/spawn_locs = list()
- for(var/obj/effect/landmark/L in GLOB.landmarks_list)
+ for(var/thing in GLOB.landmarks_list)
+ var/obj/effect/landmark/L = thing
if(isturf(L.loc))
switch(L.name)
if("revenantspawn")
spawn_locs += L.loc
if(!spawn_locs) //If we can't find any revenant spawns, try the carp spawns
- for(var/obj/effect/landmark/L in GLOB.landmarks_list)
+ for(var/thing in GLOB.landmarks_list)
+ var/obj/effect/landmark/L = thing
if(isturf(L.loc))
switch(L.name)
if("carpspawn")
diff --git a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm
index ab54f6991b1..ed0a4a908ed 100644
--- a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm
+++ b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm
@@ -35,8 +35,8 @@
animation.dir = dir
ExtinguishMob()
- if(pulling && bloodcrawl == BLOODCRAWL_EAT)
- if(istype(pulling, /mob/living/))
+ if(pulling && HAS_TRAIT(src, TRAIT_BLOODCRAWL_EAT))
+ if(isliving(pulling))
var/mob/living/victim = pulling
if(victim.stat == CONSCIOUS)
visible_message("[victim] kicks free of [B] just before entering it!")
@@ -76,13 +76,17 @@
adjustToxLoss(-1000)
if(istype(src, /mob/living/simple_animal/slaughter)) //rason, do not want humans to get this
-
var/mob/living/simple_animal/slaughter/demon = src
demon.devoured++
to_chat(kidnapped, "You feel teeth sink into your flesh, and the--")
kidnapped.adjustBruteLoss(1000)
kidnapped.forceMove(src)
demon.consumed_mobs.Add(kidnapped)
+ if(ishuman(kidnapped))
+ var/mob/living/carbon/human/H = kidnapped
+ if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under))
+ var/obj/item/clothing/under/U = H.w_uniform
+ U.sensor_mode = SENSOR_OFF
else
kidnapped.ghostize()
qdel(kidnapped)
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index 1f525e93076..d7e53bdae28 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -35,7 +35,6 @@
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
var/boost = 0
- bloodcrawl = BLOODCRAWL_EAT
var/devoured = 0
@@ -46,8 +45,8 @@
var/gorecooldown = 0
var/vialspawned = FALSE
loot = list(/obj/effect/decal/cleanable/blood/innards, /obj/effect/decal/cleanable/blood, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic, /obj/item/organ/internal/heart/demon)
- var/playstyle_string = "You are the Slaughter Demon, a terrible creature from another existence. You have a single desire: To kill. \
- You may Ctrl+Click on blood pools to travel through them, appearing and dissaapearing from the station at will. \
+ var/playstyle_string = "You are the Slaughter Demon, a terrible creature from another existence. You have a single desire: to kill. \
+ You may Ctrl+Click on blood pools to travel through them, appearing and dissapearing from the station at will. \
Pulling a dead or critical mob while you enter a pool will pull them in with you, allowing you to feast. \
You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. "
del_on_death = 1
@@ -59,6 +58,7 @@
/mob/living/simple_animal/slaughter/New()
..()
remove_from_all_data_huds()
+ ADD_TRAIT(src, TRAIT_BLOODCRAWL_EAT, "bloodcrawl_eat")
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
AddSpell(bloodspell)
whisper_action = new()
@@ -111,8 +111,8 @@
// Cult slaughter demon
/mob/living/simple_animal/slaughter/cult //Summoned as part of the cult objective "Bring the Slaughter"
- name = "harbringer of the slaughter"
- real_name = "harbringer of the Slaughter"
+ name = "harbinger of the slaughter"
+ real_name = "harbinger of the Slaughter"
desc = "An awful creature from beyond the realms of madness."
maxHealth = 500
health = 500
@@ -120,14 +120,14 @@
melee_damage_lower = 60
environment_smash = ENVIRONMENT_SMASH_RWALLS //Smashes through EVERYTHING - r-walls included
faction = list("cult")
- playstyle_string = "You are a Harbringer of the Slaughter. Brought forth by the servants of Nar-Sie, you have a single purpose: slaughter the heretics \
+ playstyle_string = "You are a Harbinger of the Slaughter. Brought forth by the servants of Nar-Sie, you have a single purpose: slaughter the heretics \
who do not worship your master. You may use the ability 'Blood Crawl' near a pool of blood to enter it and become incorporeal. Using the ability again near a blood pool will allow you \
to emerge from it. You are fast, powerful, and almost invincible. By dragging a dead or unconscious body into a blood pool with you, you will consume it after a time and fully regain \
- your health. You may use the Sense Victims in your Cultist tab to locate a random, living heretic."
+ your health. You may use the ability 'Sense Victims' in your Cultist tab to locate a random, living heretic."
/obj/effect/proc_holder/spell/targeted/sense_victims
name = "Sense Victims"
- desc = "Sense the location of heratics"
+ desc = "Sense the location of heretics"
charge_max = 0
clothes_req = 0
range = 20
@@ -139,7 +139,7 @@
/obj/effect/proc_holder/spell/targeted/sense_victims/cast(list/targets, mob/user)
var/list/victims = targets
- for(var/mob/living/L in GLOB.living_mob_list)
+ for(var/mob/living/L in GLOB.alive_mob_list)
if(!L.stat && !iscultist(L) && L.key && L != usr)
victims.Add(L)
if(!targets.len)
@@ -171,8 +171,8 @@
var/client/C = M.client
S.key = C.key
- S.mind.assigned_role = "Harbringer of the Slaughter"
- S.mind.special_role = "Harbringer of the Slaughter"
+ S.mind.assigned_role = "Harbinger of the Slaughter"
+ S.mind.special_role = "Harbinger of the Slaughter"
to_chat(S, playstyle_string)
SSticker.mode.add_cultist(S.mind)
var/obj/effect/proc_holder/spell/targeted/sense_victims/SV = new
@@ -247,33 +247,37 @@
user.visible_message("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!", \
"An unnatural hunger consumes you. You raise [src] to your mouth and devour it!")
playsound(user, 'sound/misc/demon_consume.ogg', 50, 1)
- for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
- if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl)
- qdel(src)
- return
- if(user.bloodcrawl == 0)
+ // Eating the heart for the first time. Gives basic bloodcrawling. This is the only time we need to insert the heart.
+ if(!HAS_TRAIT(user, TRAIT_BLOODCRAWL))
user.visible_message("[user]'s eyes flare a deep crimson!", \
"You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!")
- user.bloodcrawl = BLOODCRAWL
- else if(user.bloodcrawl == BLOODCRAWL)
- to_chat(user, "You feel diffr- CONSUME THEM! ")
- user.bloodcrawl = BLOODCRAWL_EAT
- else
- to_chat(user, "...and you don't feel any different.")
+ ADD_TRAIT(user, TRAIT_BLOODCRAWL, "bloodcrawl")
+ user.drop_item()
+ insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E.
+ return TRUE
- user.drop_item()
- insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E
+ // Eating a 2nd heart. Gives the ability to drag people into blood and eat them.
+ if(HAS_TRAIT(user, TRAIT_BLOODCRAWL))
+ to_chat(user, "You feel differ- CONSUME THEM! ")
+ ADD_TRAIT(user, TRAIT_BLOODCRAWL_EAT, "bloodcrawl_eat")
+ qdel(src) // Replacing their demon heart with another demon heart is pointless, just delete this one and return.
+ return TRUE
+
+ // Eating any more than 2 demon hearts does nothing.
+ to_chat(user, "...and you don't feel any different.")
+ qdel(src)
/obj/item/organ/internal/heart/demon/insert(mob/living/carbon/M, special = 0)
- ..()
+ . = ..()
if(M.mind)
M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null))
/obj/item/organ/internal/heart/demon/remove(mob/living/carbon/M, special = 0)
..()
if(M.mind)
- M.bloodcrawl = 0
+ REMOVE_TRAIT(M, TRAIT_BLOODCRAWL, "bloodcrawl")
+ REMOVE_TRAIT(M, TRAIT_BLOODCRAWL_EAT, "bloodcrawl_eat")
M.mind.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl)
/obj/item/organ/internal/heart/demon/Stop()
@@ -308,7 +312,7 @@
if(M.revive())
M.grab_ghost(force = TRUE)
playsound(get_turf(src), feast_sound, 50, 1, -1)
- to_chat(M, "You leave the [src]'s warm embrace, and feel ready to take on the world.")
+ to_chat(M, "You leave [src]'s warm embrace, and feel ready to take on the world.")
..(M)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index bdc5f718ac6..5fed8ae00f4 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -68,6 +68,7 @@ proc/issyndicate(mob/living/M as mob)
for(var/datum/objective/nuclear/O in operative_mind.objectives)
operative_mind.objectives -= O
operative_mind.current.create_attack_log("No longer nuclear operative")
+ operative_mind.current.create_log(CONVERSION_LOG, "No longer nuclear operative")
if(issilicon(operative_mind.current))
to_chat(operative_mind.current, "You have been turned into a robot! You are no longer a Syndicate operative.")
else
@@ -78,12 +79,12 @@ proc/issyndicate(mob/living/M as mob)
////////////////////////////////////////////////////////////////////////////////////////
/datum/game_mode/proc/update_synd_icons_added(datum/mind/synd_mind)
- var/datum/atom_hud/antag/opshud = huds[ANTAG_HUD_OPS]
+ var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS]
opshud.join_hud(synd_mind.current)
set_antag_hud(synd_mind.current, "hudoperative")
/datum/game_mode/proc/update_synd_icons_removed(datum/mind/synd_mind)
- var/datum/atom_hud/antag/opshud = huds[ANTAG_HUD_OPS]
+ var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS]
opshud.leave_hud(synd_mind.current)
set_antag_hud(synd_mind.current, null)
@@ -94,7 +95,8 @@ proc/issyndicate(mob/living/M as mob)
var/list/turf/synd_spawn = list()
- for(var/obj/effect/landmark/A in GLOB.landmarks_list)
+ for(var/thing in GLOB.landmarks_list)
+ var/obj/effect/landmark/A = thing
if(A.name == "Syndicate-Spawn")
synd_spawn += get_turf(A)
qdel(A)
@@ -139,7 +141,7 @@ proc/issyndicate(mob/living/M as mob)
/datum/game_mode/nuclear/proc/scale_telecrystals()
var/danger
danger = GLOB.player_list.len
- while(!IsMultiple(++danger, 10)) //Increments danger up to the nearest multiple of ten
+ while(!ISMULTIPLE(++danger, 10)) //Increments danger up to the nearest multiple of ten
total_tc += danger * NUKESCALINGMODIFIER
@@ -402,7 +404,7 @@ proc/issyndicate(mob/living/M as mob)
else
text += "body destroyed"
text += ")"
- for(var/obj/item/uplink/H in world_uplinks)
+ for(var/obj/item/uplink/H in GLOB.world_uplinks)
if(H && H.uplink_owner && H.uplink_owner==syndicate.key)
TC_uses += H.used_TC
purchases += H.purchase_log
@@ -437,19 +439,19 @@ proc/issyndicate(mob/living/M as mob)
for(var/datum/mind/M in SSticker.mode.syndicates)
foecount++
if(!M || !M.current)
- score_opkilled++
+ GLOB.score_opkilled++
continue
if(M.current.stat == DEAD)
- score_opkilled++
+ GLOB.score_opkilled++
else if(M.current.restrained())
- score_arrested++
+ GLOB.score_arrested++
- if(foecount == score_arrested)
- score_allarrested = 1
+ if(foecount == GLOB.score_arrested)
+ GLOB.score_allarrested = 1
- for(var/obj/machinery/nuclearbomb/nuke in world)
+ for(var/obj/machinery/nuclearbomb/nuke in GLOB.machines)
if(nuke.r_code == "Nope") continue
var/turf/T = get_turf(nuke)
var/area/A = T.loc
@@ -458,25 +460,25 @@ proc/issyndicate(mob/living/M as mob)
var/list/fiftythousand_penalty = list(/area/security/main, /area/security/brig, /area/security/armoury, /area/security/checkpoint2)
if(is_type_in_list(A, thousand_penalty))
- score_nuked_penalty = 1000
+ GLOB.score_nuked_penalty = 1000
else if(is_type_in_list(A, fiftythousand_penalty))
- score_nuked_penalty = 50000
+ GLOB.score_nuked_penalty = 50000
else if(istype(A, /area/engine))
- score_nuked_penalty = 100000
+ GLOB.score_nuked_penalty = 100000
else
- score_nuked_penalty = 10000
+ GLOB.score_nuked_penalty = 10000
break
- var/killpoints = score_opkilled * 250
- var/arrestpoints = score_arrested * 1000
- score_crewscore += killpoints
- score_crewscore += arrestpoints
- if(score_nuked)
- score_crewscore -= score_nuked_penalty
+ var/killpoints = GLOB.score_opkilled * 250
+ var/arrestpoints = GLOB.score_arrested * 1000
+ GLOB.score_crewscore += killpoints
+ GLOB.score_crewscore += arrestpoints
+ if(GLOB.score_nuked)
+ GLOB.score_crewscore -= GLOB.score_nuked_penalty
@@ -490,13 +492,16 @@ proc/issyndicate(mob/living/M as mob)
for(var/datum/mind/M in SSticker.mode.syndicates)
foecount++
- for(var/mob/living/C in world)
+ for(var/mob in GLOB.mob_living_list)
+ var/mob/living/C = mob
if(ishuman(C) || isAI(C) || isrobot(C))
- if(C.stat == 2) continue
- if(!C.client) continue
+ if(C.stat == DEAD)
+ continue
+ if(!C.client)
+ continue
crewcount++
- var/obj/item/disk/nuclear/N = locate() in world
+ var/obj/item/disk/nuclear/N = locate() in GLOB.poi_list
if(istype(N))
var/atom/disk_loc = N.loc
while(!isturf(disk_loc))
@@ -524,11 +529,11 @@ proc/issyndicate(mob/living/M as mob)
dat += " "
- dat += "Operatives Arrested: [score_arrested] ([score_arrested * 1000] Points) "
- dat += "All Operatives Arrested: [score_allarrested ? "Yes" : "No"] (Score tripled) "
+ dat += "Operatives Arrested: [GLOB.score_arrested] ([GLOB.score_arrested * 1000] Points) "
+ dat += "All Operatives Arrested: [GLOB.score_allarrested ? "Yes" : "No"] (Score tripled) "
- dat += "Operatives Killed: [score_opkilled] ([score_opkilled * 1000] Points) "
- dat += "Station Destroyed: [score_nuked ? "Yes" : "No"] (-[score_nuked_penalty] Points) "
+ dat += "Operatives Killed: [GLOB.score_opkilled] ([GLOB.score_opkilled * 1000] Points) "
+ dat += "Station Destroyed: [GLOB.score_nuked ? "Yes" : "No"] (-[GLOB.score_nuked_penalty] Points) "
dat += ""
return dat
diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm
index 35c26408c5b..48116911640 100644
--- a/code/game/gamemodes/nuclear/nuclear_challenge.dm
+++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm
@@ -48,7 +48,7 @@
if(!check_allowed(user) || !war_declaration)
return
- event_announcement.Announce(war_declaration, "Declaration of War", 'sound/effects/siren.ogg')
+ GLOB.event_announcement.Announce(war_declaration, "Declaration of War", 'sound/effects/siren.ogg')
to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.")
to_chat(user, "Your bonus telecrystals have been split between your team's uplinks.")
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index eec24d0e1ed..8e38f106cc7 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -5,7 +5,7 @@
#define NUKE_UNWRENCHED 4
#define NUKE_MOBILE 5
-var/bomb_set
+GLOBAL_VAR(bomb_set)
/obj/machinery/nuclearbomb
name = "\improper Nuclear Fission Explosive"
@@ -48,11 +48,10 @@ var/bomb_set
/obj/machinery/nuclearbomb/process()
if(timing)
- bomb_set = 1 //So long as there is one nuke timing, it means one nuke is armed.
+ GLOB.bomb_set = 1 //So long as there is one nuke timing, it means one nuke is armed.
timeleft = max(timeleft - 2, 0) // 2 seconds per process()
if(timeleft <= 0)
- spawn
- explode()
+ INVOKE_ASYNC(src, .proc/explode)
SSnanoui.update_uis(src)
return
@@ -195,7 +194,7 @@ var/bomb_set
/obj/machinery/nuclearbomb/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "nuclear_bomb.tmpl", "Nuke Control Panel", 450, 550, state = physical_state)
+ ui = new(user, src, ui_key, "nuclear_bomb.tmpl", "Nuke Control Panel", 450, 550, state = GLOB.physical_state)
ui.open()
ui.set_auto_update(1)
@@ -310,13 +309,13 @@ var/bomb_set
message_admins("[key_name_admin(usr)] engaged a nuclear bomb (JMP)")
if(!is_syndicate)
set_security_level("delta")
- bomb_set = 1 //There can still be issues with this resetting when there are multiple bombs. Not a big deal though for Nuke/N
+ GLOB.bomb_set = 1 //There can still be issues with this resetting when there are multiple bombs. Not a big deal though for Nuke/N
else
- bomb_set = 0
+ GLOB.bomb_set = 0
else
if(!is_syndicate)
set_security_level(previous_level)
- bomb_set = 0
+ GLOB.bomb_set = 0
if(!lighthack)
icon_state = "nuclearbomb1"
if(href_list["safety"])
@@ -325,7 +324,7 @@ var/bomb_set
if(!is_syndicate)
set_security_level(previous_level)
timing = 0
- bomb_set = 0
+ GLOB.bomb_set = 0
if(href_list["anchor"])
if(removal_stage == NUKE_MOBILE)
anchored = 0
@@ -347,6 +346,9 @@ var/bomb_set
/obj/machinery/nuclearbomb/blob_act(obj/structure/blob/B)
if(timing == -1.0)
return
+ if(timing) //boom
+ INVOKE_ASYNC(src, .proc/explode)
+ return
qdel(src)
/obj/machinery/nuclearbomb/tesla_act(power, explosive)
@@ -369,7 +371,7 @@ var/bomb_set
SSticker.mode.explosion_in_progress = 1
sleep(100)
- enter_allowed = 0
+ GLOB.enter_allowed = 0
var/off_station = 0
var/turf/bomb_location = get_turf(src)
@@ -453,9 +455,9 @@ var/bomb_set
STOP_PROCESSING(SSobj, src)
return ..()
- if(blobstart.len > 0)
+ if(GLOB.blobstart.len > 0)
GLOB.poi_list.Remove(src)
- var/obj/item/disk/nuclear/NEWDISK = new(pick(blobstart))
+ var/obj/item/disk/nuclear/NEWDISK = new(pick(GLOB.blobstart))
transfer_fingerprints_to(NEWDISK)
message_admins("[src] has been destroyed at ([diskturf.x], [diskturf.y], [diskturf.z] - JMP). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - JMP).")
log_game("[src] has been destroyed in ([diskturf.x], [diskturf.y], [diskturf.z]). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).")
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index f193856b3d9..e8f4c22e377 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -88,6 +88,7 @@
name = "advanced pinpointer"
desc = "A larger version of the normal pinpointer, this unit features a helpful quantum entanglement detection system to locate various objects that do not broadcast a locator signal."
var/mode = 0 // Mode 0 locates disk, mode 1 locates coordinates.
+ var/modelocked = FALSE // If true, user cannot change mode.
var/turf/location = null
var/obj/target = null
@@ -121,6 +122,10 @@
if(usr.stat || usr.restrained())
return
+ if(modelocked)
+ to_chat(usr, "[src] is locked. It can only track one specific target.")
+ return
+
active = 0
icon_state = icon_off
target = null
@@ -156,7 +161,7 @@
if("Item")
var/list/item_names[0]
var/list/item_paths[0]
- for(var/objective in potential_theft_objectives)
+ for(var/objective in GLOB.potential_theft_objectives)
var/datum/theft_objective/T = objective
var/name = initial(T.name)
item_names += name
@@ -215,7 +220,7 @@
if(mode) //Check in case the mode changes while operating
worklocation()
return
- if(bomb_set) //If the bomb is set, lead to the shuttle
+ if(GLOB.bomb_set) //If the bomb is set, lead to the shuttle
mode = 1 //Ensures worklocation() continues to work
worklocation()
playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) //Plays a beep
@@ -244,7 +249,7 @@
if(!mode)
workdisk()
return
- if(!bomb_set)
+ if(!GLOB.bomb_set)
mode = 0
workdisk()
playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index eb667d4994d..0b46264cb33 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -1,6 +1,6 @@
GLOBAL_LIST_EMPTY(all_objectives)
-var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datum/theft_objective/steal - /datum/theft_objective/number - /datum/theft_objective/unique
+GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) - /datum/theft_objective/steal - /datum/theft_objective/number - /datum/theft_objective/unique))
/datum/objective
var/datum/mind/owner = null //Who owns the objective.
@@ -67,7 +67,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
/datum/objective/assassinate/check_completion()
if(target && target.current)
- if(target.current.stat == DEAD || iszombie(target))
+ if(target.current.stat == DEAD)
return 1
if(issilicon(target.current) || isbrain(target.current)) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
return 1
@@ -111,7 +111,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
/datum/objective/maroon/check_completion()
if(target && target.current)
- if(target.current.stat == DEAD || iszombie(target))
+ if(target.current.stat == DEAD)
return 1
if(!target.current.ckey)
return 1
@@ -168,7 +168,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
if(!target) //If it's a free objective.
return 1
if(target.current)
- if(target.current.stat == DEAD || iszombie(target))
+ if(target.current.stat == DEAD)
return 0
if(issilicon(target.current))
return 0
@@ -231,7 +231,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
return 0
/datum/objective/block
- explanation_text = "Do not allow any lifeforms, be it organic or synthetic to escape on the shuttle alive. AIs, Cyborgs, and pAIs are not considered alive."
+ explanation_text = "Do not allow any lifeforms, be it organic or synthetic to escape on the shuttle alive. AIs, Cyborgs, Maintenance drones, and pAIs are not considered alive."
martyr_compatible = 1
/datum/objective/block/check_completion()
@@ -243,15 +243,14 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
return 0
var/area/A = SSshuttle.emergency.areaInstance
- var/list/protected_mobs = list(/mob/living/silicon/ai, /mob/living/silicon/pai, /mob/living/silicon/robot)
for(var/mob/living/player in GLOB.player_list)
- if(player.type in protected_mobs)
- continue
+ if(issilicon(player))
+ continue // If they're silicon, they're not considered alive, skip them.
if(player.mind && player.stat != DEAD)
if(get_area(player) == A)
- return 0
+ return 0 // If there are any other organic mobs on the shuttle, you failed the objective.
return 1
@@ -263,7 +262,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
return 0
if(isbrain(owner.current))
return 0
- if(!owner.current || owner.current.stat == DEAD || iszombie(owner))
+ if(!owner.current || owner.current.stat == DEAD)
return 0
if(SSticker.force_ending) //This one isn't their fault, so lets just assume good faith
return 1
@@ -318,7 +317,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
explanation_text = "Die a glorious death."
/datum/objective/die/check_completion()
- if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current) || iszombie(owner))
+ if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current))
return 1
if(issilicon(owner.current) && owner.current != owner.original)
return 1
@@ -359,7 +358,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
var/loop=50
while(!steal_target && loop > 0)
loop--
- var/thefttype = pick(potential_theft_objectives)
+ var/thefttype = pick(GLOB.potential_theft_objectives)
var/datum/theft_objective/O = new thefttype
if(owner.assigned_role in O.protected_jobs)
continue
@@ -377,7 +376,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
/datum/objective/steal/proc/select_target()
- var/list/possible_items_all = potential_theft_objectives+"custom"
+ var/list/possible_items_all = GLOB.potential_theft_objectives+"custom"
var/new_target = input("Select target:", "Objective target", null) as null|anything in possible_items_all
if(!new_target) return
if(new_target == "custom")
@@ -400,6 +399,9 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
if(!steal_target)
return 1 // Free Objective
+ if(!owner.current)
+ return FALSE
+
var/list/all_items = owner.current.GetAllContents()
for(var/obj/I in all_items)
@@ -476,7 +478,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
n_p++
target_amount = min(target_amount, n_p)
- explanation_text = "Absorb [target_amount] compatible genomes."
+ explanation_text = "Acquire [target_amount] compatible genomes. The 'Extract DNA Sting' can be used to stealthily get genomes without killing somebody."
return target_amount
/datum/objective/absorb/check_completion()
@@ -571,9 +573,10 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
// /vg/; Vox Inviolate for humans :V
/datum/objective/minimize_casualties
explanation_text = "Minimise casualties."
+
/datum/objective/minimize_casualties/check_completion()
- if(owner.kills.len>5) return 0
- return 1
+ return TRUE
+
//Vox heist objectives.
@@ -779,16 +782,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
explanation_text = "Follow the Inviolate. Minimise death and loss of resources."
/datum/objective/heist/inviolate_death/check_completion()
- var/vox_allowed_kills = 3 // The number of people the vox can accidently kill. Mostly a counter to people killing themselves if a raider touches them to force fail.
- var/vox_total_kills = 0
-
- var/datum/game_mode/heist/H = SSticker.mode
- for(var/datum/mind/raider in H.raiders)
- vox_total_kills += raider.kills.len // Kills are listed in the mind; uses this to calculate vox kills
-
- if(vox_total_kills > vox_allowed_kills) return 0
- return 1
-
+ return TRUE
// Traders
// These objectives have no check_completion, they exist only to tell Sol Traders what to aim for.
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index ac0b3705198..b09bb7a851f 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -218,7 +218,7 @@
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
SSshuttle.emergency.mode = SHUTTLE_DOCKED
SSshuttle.emergency.timer = world.time
- command_announcement.Announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg')
+ GLOB.command_announcement.Announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg')
return ..()
if(finished != 0)
return TRUE
@@ -229,7 +229,7 @@
//Deals with converting players to the revolution//
///////////////////////////////////////////////////
/datum/game_mode/proc/add_revolutionary(datum/mind/rev_mind)
- if(rev_mind.assigned_role in command_positions)
+ if(rev_mind.assigned_role in GLOB.command_positions)
return 0
var/mob/living/carbon/human/H = rev_mind.current//Check to see if the potential rev is implanted
if(ismindshielded(H))
@@ -244,6 +244,7 @@
rev_mind.current.Stun(5)
to_chat(rev_mind.current, " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!")
rev_mind.current.create_attack_log("Has been converted to the revolution!")
+ rev_mind.current.create_log(CONVERSION_LOG, "converted to the revolution")
rev_mind.special_role = SPECIAL_ROLE_REV
update_rev_icons_added(rev_mind)
if(jobban_isbanned(rev_mind.current, ROLE_REV) || jobban_isbanned(rev_mind.current, ROLE_SYNDICATE))
@@ -262,7 +263,7 @@
revolutionaries -= rev_mind
rev_mind.special_role = null
rev_mind.current.create_attack_log("Has renounced the revolution!")
-
+ rev_mind.current.create_log(CONVERSION_LOG, "renounced the revolution")
if(beingborged)
to_chat(rev_mind.current, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing[remove_head ? "." : " but the name of the one who flashed you."]")
message_admins("[key_name_admin(rev_mind.current)] [ADMIN_QUE(rev_mind.current,"?")] ([ADMIN_FLW(rev_mind.current,"FLW")]) has been borged while being a [remove_head ? "leader" : " member"] of the revolution.")
@@ -283,7 +284,7 @@
//Adds the rev hud to a new convert//
/////////////////////////////////////
/datum/game_mode/proc/update_rev_icons_added(datum/mind/rev_mind)
- var/datum/atom_hud/antag/revhud = huds[ANTAG_HUD_REV]
+ var/datum/atom_hud/antag/revhud = GLOB.huds[ANTAG_HUD_REV]
revhud.join_hud(rev_mind.current)
set_antag_hud(rev_mind.current, ((rev_mind in head_revolutionaries) ? "hudheadrevolutionary" : "hudrevolutionary"))
@@ -291,7 +292,7 @@
//Removes the hud from deconverted revs//
/////////////////////////////////////////
/datum/game_mode/proc/update_rev_icons_removed(datum/mind/rev_mind)
- var/datum/atom_hud/antag/revhud = huds[ANTAG_HUD_REV]
+ var/datum/atom_hud/antag/revhud = GLOB.huds[ANTAG_HUD_REV]
revhud.leave_hud(rev_mind.current)
set_antag_hud(rev_mind.current, null)
@@ -335,7 +336,7 @@
if(head_revolutionaries.len || GAMEMODE_IS_REVOLUTION)
var/num_revs = 0
var/num_survivors = 0
- for(var/mob/living/carbon/survivor in GLOB.living_mob_list)
+ for(var/mob/living/carbon/survivor in GLOB.alive_mob_list)
if(survivor.ckey)
num_survivors++
if(survivor.mind)
@@ -372,35 +373,35 @@
for(var/datum/mind/M in SSticker.mode.head_revolutionaries)
foecount++
if(!M || !M.current)
- score_opkilled++
+ GLOB.score_opkilled++
continue
if(M.current.stat == DEAD)
- score_opkilled++
+ GLOB.score_opkilled++
else if(M.current.restrained())
- score_arrested++
+ GLOB.score_arrested++
- if(foecount == score_arrested)
- score_allarrested = 1
+ if(foecount == GLOB.score_arrested)
+ GLOB.score_allarrested = 1
- for(var/mob/living/carbon/human/player in world)
+ for(var/mob/living/carbon/human/player in GLOB.mob_living_list)
if(player.mind)
var/role = player.mind.assigned_role
if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director"))
if(player.stat == DEAD)
- score_deadcommand++
+ GLOB.score_deadcommand++
- var/arrestpoints = score_arrested * 1000
- var/killpoints = score_opkilled * 500
- var/comdeadpts = score_deadcommand * 500
- if(score_traitorswon)
- score_crewscore -= 10000
+ var/arrestpoints = GLOB.score_arrested * 1000
+ var/killpoints = GLOB.score_opkilled * 500
+ var/comdeadpts = GLOB.score_deadcommand * 500
+ if(GLOB.score_traitorswon)
+ GLOB.score_crewscore -= 10000
- score_crewscore += arrestpoints
- score_crewscore += killpoints
- score_crewscore -= comdeadpts
+ GLOB.score_crewscore += arrestpoints
+ GLOB.score_crewscore += killpoints
+ GLOB.score_crewscore -= comdeadpts
/datum/game_mode/revolution/get_scoreboard_stats()
@@ -414,7 +415,7 @@
for(var/datum/mind/M in SSticker.mode:revolutionaries)
if(M.current && M.current.stat != DEAD)
revcount++
- for(var/mob/living/carbon/human/player in world)
+ for(var/mob/living/carbon/human/player in GLOB.mob_living_list)
if(player.mind)
var/role = player.mind.assigned_role
if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director"))
@@ -424,7 +425,8 @@
if(player.mind in SSticker.mode.revolutionaries) continue
loycount++
- for(var/mob/living/silicon/X in world)
+ for(var/beepboop in GLOB.silicon_mob_list)
+ var/mob/living/silicon/X = beepboop
if(X.stat != DEAD)
loycount++
@@ -438,12 +440,12 @@
dat += "Number of Surviving Loyal Crew: [loycount] "
dat += " "
- dat += "Revolution Heads Arrested: [score_arrested] ([score_arrested * 1000] Points) "
- dat += "All Revolution Heads Arrested: [score_allarrested ? "Yes" : "No"] (Score tripled) "
+ dat += "Revolution Heads Arrested: [GLOB.score_arrested] ([GLOB.score_arrested * 1000] Points) "
+ dat += "All Revolution Heads Arrested: [GLOB.score_allarrested ? "Yes" : "No"] (Score tripled) "
- dat += "Revolution Heads Slain: [score_opkilled] ([score_opkilled * 500] Points) "
- dat += "Command Staff Slain: [score_deadcommand] (-[score_deadcommand * 500] Points) "
- dat += "Revolution Successful: [score_traitorswon ? "Yes" : "No"] (-[score_traitorswon * 10000] Points) "
+ dat += "Revolution Heads Slain: [GLOB.score_opkilled] ([GLOB.score_opkilled * 500] Points) "
+ dat += "Command Staff Slain: [GLOB.score_deadcommand] (-[GLOB.score_deadcommand * 500] Points) "
+ dat += "Revolution Successful: [GLOB.score_traitorswon ? "Yes" : "No"] (-[GLOB.score_traitorswon * 10000] Points) "
dat += ""
return dat
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index 5dd462296b9..69eaef9051b 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -1,8 +1,8 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-var/hsboxspawn = 1
-var/list
- hrefs = list(
+// Someone needs to properly path this file, or just delete it since its unticked and was last properly touched >4 years ago
+GLOBAL_VAR_INIT(hsboxspawn, 1)
+GLOBAL_LIST_INIT(sandbox_hrefs, list(
"hsbsuit" = "Suit Up (Space Travel Gear)",
"hsbmetal" = "Spawn 50 Metal",
"hsbglass" = "Spawn 50 Glass",
@@ -13,7 +13,7 @@ var/list
"hsbfueltank" = "Spawn Welding Fuel Tank",
"hsbwater tank" = "Spawn Water Tank",
"hsbtoolbox" = "Spawn Toolbox",
- "hsbmedkit" = "Spawn Medical Kit")
+ "hsbmedkit" = "Spawn Medical Kit"))
mob
var/datum/hSB/sandbox = null
@@ -39,8 +39,8 @@ datum/hSB
hsbpanel += "Administration Tools: "
hsbpanel += "- Toggle Object Spawning
- The bad:
+ The Bad
+ Dead bodies on Station: [GLOB.score_deadcrew] (-[GLOB.score_deadcrew * 25] Points)
+ Uncleaned Messes: [GLOB.score_mess] (-[GLOB.score_mess] Points)
+ Station Power Issues: [GLOB.score_powerloss] (-[GLOB.score_powerloss * 20] Points)
+ AI Destroyed: [GLOB.score_deadaipenalty ? "Yes" : "No"] (-[GLOB.score_deadaipenalty * 250] Points)
- Dead bodies on Station: [score_deadcrew] (-[score_deadcrew * 25] Points)
- Uncleaned Messes: [score_mess] (-[score_mess] Points)
- Station Power Issues: [score_powerloss] (-[score_powerloss * 20] Points)
- Rampant Diseases: [score_disease] (-[score_disease * 30] Points)
- AI Destroyed: [score_deadaipenalty ? "Yes" : "No"] (-[score_deadaipenalty * 250] Points)
The Weird
-
- Food Eaten: [score_foodeaten] bites/sips
- Times a Clown was Abused: [score_clownabuse]
+ Food Eaten: [GLOB.score_foodeaten] bites/sips
+ Times a Clown was Abused: [GLOB.score_clownabuse]
"}
- if(score_escapees)
- dat += {"Richest Escapee: [score_richestname], [score_richestjob]: $[num2text(score_richestcash,50)] ([score_richestkey])
- Most Battered Escapee: [score_dmgestname], [score_dmgestjob]: [score_dmgestdamage] damage ([score_dmgestkey]) "}
+ if(GLOB.score_escapees)
+ dat += {"Richest Escapee: [GLOB.score_richestname], [GLOB.score_richestjob]: $[num2text(GLOB.score_richestcash,50)] ([GLOB.score_richestkey])
+ Most Battered Escapee: [GLOB.score_dmgestname], [GLOB.score_dmgestjob]: [GLOB.score_dmgestdamage] damage ([GLOB.score_dmgestkey]) "}
else
if(SSshuttle.emergency.mode <= SHUTTLE_STRANDED)
dat += "The station wasn't evacuated! "
@@ -212,27 +217,41 @@
dat += {"
- FINAL SCORE: [score_crewscore]
+ FINAL SCORE: [GLOB.score_crewscore]
"}
var/score_rating = "The Aristocrats!"
- switch(score_crewscore)
- if(-99999 to -50000) score_rating = "Even the Singularity Deserves Better"
- if(-49999 to -5000) score_rating = "Singularity Fodder"
- if(-4999 to -1000) score_rating = "You're All Fired"
- if(-999 to -500) score_rating = "A Waste of Perfectly Good Oxygen"
- if(-499 to -250) score_rating = "A Wretched Heap of Scum and Incompetence"
- if(-249 to -100) score_rating = "Outclassed by Lab Monkeys"
- if(-99 to -21) score_rating = "The Undesirables"
- if(-20 to 20) score_rating = "Ambivalently Average"
- if(21 to 99) score_rating = "Not Bad, but Not Good"
- if(100 to 249) score_rating = "Skillful Servants of Science"
- if(250 to 499) score_rating = "Best of a Good Bunch"
- if(500 to 999) score_rating = "Lean Mean Machine Thirteen"
- if(1000 to 4999) score_rating = "Promotions for Everyone"
- if(5000 to 9999) score_rating = "Ambassadors of Discovery"
- if(10000 to 49999) score_rating = "The Pride of Science Itself"
- if(50000 to INFINITY) score_rating = "Nanotrasen's Finest"
+ switch(GLOB.score_crewscore)
+ if(-99999 to SINGULARITY_DESERVES_BETTER) score_rating = "Even the Singularity Deserves Better"
+ if(SINGULARITY_DESERVES_BETTER+1 to SINGULARITY_FODDER) score_rating = "Singularity Fodder"
+ if(SINGULARITY_FODDER+1 to ALL_FIRED) score_rating = "You're All Fired"
+ if(ALL_FIRED+1 to WASTE_OF_OXYGEN) score_rating = "A Waste of Perfectly Good Oxygen"
+ if(WASTE_OF_OXYGEN+1 to HEAP_OF_SCUM) score_rating = "A Wretched Heap of Scum and Incompetence"
+ if(HEAP_OF_SCUM+1 to LAB_MONKEYS) score_rating = "Outclassed by Lab Monkeys"
+ if(LAB_MONKEYS+1 to UNDESIREABLES) score_rating = "The Undesirables"
+ if(UNDESIREABLES+1 to SERVANTS_OF_SCIENCE-1) score_rating = "Ambivalently Average"
+ if(SERVANTS_OF_SCIENCE to GOOD_BUNCH-1) score_rating = "Skillful Servants of Science"
+ if(GOOD_BUNCH to MACHINE_THIRTEEN-1) score_rating = "Best of a Good Bunch"
+ if(MACHINE_THIRTEEN to PROMOTIONS_FOR_EVERYONE-1) score_rating = "Lean Mean Machine Thirteen"
+ if(PROMOTIONS_FOR_EVERYONE to AMBASSADORS_OF_DISCOVERY-1) score_rating = "Promotions for Everyone"
+ if(AMBASSADORS_OF_DISCOVERY to PRIDE_OF_SCIENCE-1) score_rating = "Ambassadors of Discovery"
+ if(PRIDE_OF_SCIENCE to NANOTRANSEN_FINEST-1) score_rating = "The Pride of Science Itself"
+ if(NANOTRANSEN_FINEST to INFINITY) score_rating = "Nanotrasen's Finest"
dat += "RATING: [score_rating]"
src << browse(dat, "window=roundstats;size=500x600")
+
+ #undef SINGULARITY_DESERVES_BETTER
+ #undef SINGULARITY_FODDER
+ #undef ALL_FIRED
+ #undef WASTE_OF_OXYGEN
+ #undef HEAP_OF_SCUM
+ #undef LAB_MONKEYS
+ #undef UNDESIREABLES
+ #undef SERVANTS_OF_SCIENCE
+ #undef GOOD_BUNCH
+ #undef MACHINE_THIRTEEN
+ #undef PROMOTIONS_FOR_EVERYONE
+ #undef AMBASSADORS_OF_DISCOVERY
+ #undef PRIDE_OF_SCIENCE
+ #undef NANOTRANSEN_FINEST
diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm
index 507aaec0135..f6ba6504381 100644
--- a/code/game/gamemodes/setupgame.dm
+++ b/code/game/gamemodes/setupgame.dm
@@ -5,11 +5,11 @@
var/assigned = pick(blocksLeft)
blocksLeft.Remove(assigned)
if(good)
- good_blocks += assigned
+ GLOB.good_blocks += assigned
else
- bad_blocks += assigned
- assigned_blocks[assigned]=name
- dna_activity_bounds[assigned]=activity_bounds
+ GLOB.bad_blocks += assigned
+ GLOB.assigned_blocks[assigned]=name
+ GLOB.dna_activity_bounds[assigned]=activity_bounds
//Debug message_admins("[name] assigned to block #[assigned].")
// testing("[name] assigned to block #[assigned].")
return assigned
@@ -17,9 +17,9 @@
/proc/setupgenetics()
if(prob(50))
- BLOCKADD = rand(-300,300)
+ GLOB.blockadd = rand(-300,300)
if(prob(75))
- DIFFMUT = rand(0,20)
+ GLOB.diffmut = rand(0,20)
//Thanks to nexis for the fancy code
@@ -34,70 +34,70 @@
//message_admins("Assigning DNA blocks:")
// Standard muts
- BLINDBLOCK = getAssignedBlock("BLIND", numsToAssign)
- COLOURBLINDBLOCK = getAssignedBlock("COLOURBLIND", numsToAssign)
- DEAFBLOCK = getAssignedBlock("DEAF", numsToAssign)
- HULKBLOCK = getAssignedBlock("HULK", numsToAssign, DNA_HARD_BOUNDS, good=1)
- TELEBLOCK = getAssignedBlock("TELE", numsToAssign, DNA_HARD_BOUNDS, good=1)
- FIREBLOCK = getAssignedBlock("FIRE", numsToAssign, DNA_HARDER_BOUNDS, good=1)
- XRAYBLOCK = getAssignedBlock("XRAY", numsToAssign, DNA_HARDER_BOUNDS, good=1)
- CLUMSYBLOCK = getAssignedBlock("CLUMSY", numsToAssign)
- FAKEBLOCK = getAssignedBlock("FAKE", numsToAssign)
- COUGHBLOCK = getAssignedBlock("COUGH", numsToAssign)
- GLASSESBLOCK = getAssignedBlock("GLASSES", numsToAssign)
- EPILEPSYBLOCK = getAssignedBlock("EPILEPSY", numsToAssign)
- TWITCHBLOCK = getAssignedBlock("TWITCH", numsToAssign)
- NERVOUSBLOCK = getAssignedBlock("NERVOUS", numsToAssign)
- WINGDINGSBLOCK = getAssignedBlock("WINGDINGS", numsToAssign)
+ GLOB.blindblock = getAssignedBlock("BLINDNESS", numsToAssign)
+ GLOB.colourblindblock = getAssignedBlock("COLOURBLIND", numsToAssign)
+ GLOB.deafblock = getAssignedBlock("DEAF", numsToAssign)
+ GLOB.hulkblock = getAssignedBlock("HULK", numsToAssign, DNA_HARD_BOUNDS, good=1)
+ GLOB.teleblock = getAssignedBlock("TELE", numsToAssign, DNA_HARD_BOUNDS, good=1)
+ GLOB.fireblock = getAssignedBlock("FIRE", numsToAssign, DNA_HARDER_BOUNDS, good=1)
+ GLOB.xrayblock = getAssignedBlock("XRAY", numsToAssign, DNA_HARDER_BOUNDS, good=1)
+ GLOB.clumsyblock = getAssignedBlock("CLUMSY", numsToAssign)
+ GLOB.fakeblock = getAssignedBlock("FAKE", numsToAssign)
+ GLOB.coughblock = getAssignedBlock("COUGH", numsToAssign)
+ GLOB.glassesblock = getAssignedBlock("GLASSES", numsToAssign)
+ GLOB.epilepsyblock = getAssignedBlock("EPILEPSY", numsToAssign)
+ GLOB.twitchblock = getAssignedBlock("TWITCH", numsToAssign)
+ GLOB.nervousblock = getAssignedBlock("NERVOUS", numsToAssign)
+ GLOB.wingdingsblock = getAssignedBlock("WINGDINGS", numsToAssign)
// Bay muts
- BREATHLESSBLOCK = getAssignedBlock("BREATHLESS", numsToAssign, DNA_HARD_BOUNDS, good=1)
- REMOTEVIEWBLOCK = getAssignedBlock("REMOTEVIEW", numsToAssign, DNA_HARDER_BOUNDS, good=1)
- REGENERATEBLOCK = getAssignedBlock("REGENERATE", numsToAssign, DNA_HARDER_BOUNDS, good=1)
- INCREASERUNBLOCK = getAssignedBlock("INCREASERUN", numsToAssign, DNA_HARDER_BOUNDS, good=1)
- REMOTETALKBLOCK = getAssignedBlock("REMOTETALK", numsToAssign, DNA_HARDER_BOUNDS, good=1)
- MORPHBLOCK = getAssignedBlock("MORPH", numsToAssign, DNA_HARDER_BOUNDS, good=1)
- COLDBLOCK = getAssignedBlock("COLD", numsToAssign, good=1)
- HALLUCINATIONBLOCK = getAssignedBlock("HALLUCINATION", numsToAssign)
- NOPRINTSBLOCK = getAssignedBlock("NOPRINTS", numsToAssign, DNA_HARD_BOUNDS, good=1)
- SHOCKIMMUNITYBLOCK = getAssignedBlock("SHOCKIMMUNITY", numsToAssign, good=1)
- SMALLSIZEBLOCK = getAssignedBlock("SMALLSIZE", numsToAssign, DNA_HARD_BOUNDS, good=1)
+ GLOB.breathlessblock = getAssignedBlock("BREATHLESS", numsToAssign, DNA_HARD_BOUNDS, good=1)
+ GLOB.remoteviewblock = getAssignedBlock("REMOTEVIEW", numsToAssign, DNA_HARDER_BOUNDS, good=1)
+ GLOB.regenerateblock = getAssignedBlock("REGENERATE", numsToAssign, DNA_HARDER_BOUNDS, good=1)
+ GLOB.increaserunblock = getAssignedBlock("INCREASERUN", numsToAssign, DNA_HARDER_BOUNDS, good=1)
+ GLOB.remotetalkblock = getAssignedBlock("REMOTETALK", numsToAssign, DNA_HARDER_BOUNDS, good=1)
+ GLOB.morphblock = getAssignedBlock("MORPH", numsToAssign, DNA_HARDER_BOUNDS, good=1)
+ GLOB.coldblock = getAssignedBlock("COLD", numsToAssign, good=1)
+ GLOB.hallucinationblock = getAssignedBlock("HALLUCINATION", numsToAssign)
+ GLOB.noprintsblock = getAssignedBlock("NOPRINTS", numsToAssign, DNA_HARD_BOUNDS, good=1)
+ GLOB.shockimmunityblock = getAssignedBlock("SHOCKIMMUNITY", numsToAssign, good=1)
+ GLOB.smallsizeblock = getAssignedBlock("SMALLSIZE", numsToAssign, DNA_HARD_BOUNDS, good=1)
//
// Goon muts
/////////////////////////////////////////////
// Disabilities
- LISPBLOCK = getAssignedBlock("LISP", numsToAssign)
- MUTEBLOCK = getAssignedBlock("MUTE", numsToAssign)
- RADBLOCK = getAssignedBlock("RAD", numsToAssign)
- FATBLOCK = getAssignedBlock("FAT", numsToAssign)
- CHAVBLOCK = getAssignedBlock("CHAV", numsToAssign)
- SWEDEBLOCK = getAssignedBlock("SWEDE", numsToAssign)
- SCRAMBLEBLOCK = getAssignedBlock("SCRAMBLE", numsToAssign)
- STRONGBLOCK = getAssignedBlock("STRONG", numsToAssign, good=1)
- HORNSBLOCK = getAssignedBlock("HORNS", numsToAssign)
- COMICBLOCK = getAssignedBlock("COMIC", numsToAssign)
+ GLOB.lispblock = getAssignedBlock("LISP", numsToAssign)
+ GLOB.muteblock = getAssignedBlock("MUTE", numsToAssign)
+ GLOB.radblock = getAssignedBlock("RAD", numsToAssign)
+ GLOB.fatblock = getAssignedBlock("FAT", numsToAssign)
+ GLOB.chavblock = getAssignedBlock("CHAV", numsToAssign)
+ GLOB.swedeblock = getAssignedBlock("SWEDE", numsToAssign)
+ GLOB.scrambleblock = getAssignedBlock("SCRAMBLE", numsToAssign)
+ GLOB.strongblock = getAssignedBlock("STRONG", numsToAssign, good=1)
+ GLOB.hornsblock = getAssignedBlock("HORNS", numsToAssign)
+ GLOB.comicblock = getAssignedBlock("COMIC", numsToAssign)
// Powers
- SOBERBLOCK = getAssignedBlock("SOBER", numsToAssign, good=1)
- PSYRESISTBLOCK = getAssignedBlock("PSYRESIST", numsToAssign, DNA_HARD_BOUNDS, good=1)
- SHADOWBLOCK = getAssignedBlock("SHADOW", numsToAssign, DNA_HARDER_BOUNDS, good=1)
- CHAMELEONBLOCK = getAssignedBlock("CHAMELEON", numsToAssign, DNA_HARDER_BOUNDS, good=1)
- CRYOBLOCK = getAssignedBlock("CRYO", numsToAssign, DNA_HARD_BOUNDS, good=1)
- EATBLOCK = getAssignedBlock("EAT", numsToAssign, DNA_HARD_BOUNDS, good=1)
- JUMPBLOCK = getAssignedBlock("JUMP", numsToAssign, DNA_HARD_BOUNDS, good=1)
- IMMOLATEBLOCK = getAssignedBlock("IMMOLATE", numsToAssign)
- EMPATHBLOCK = getAssignedBlock("EMPATH", numsToAssign, DNA_HARD_BOUNDS, good=1)
- POLYMORPHBLOCK = getAssignedBlock("POLYMORPH", numsToAssign, DNA_HARDER_BOUNDS, good=1)
+ GLOB.soberblock = getAssignedBlock("SOBER", numsToAssign, good=1)
+ GLOB.psyresistblock = getAssignedBlock("PSYRESIST", numsToAssign, DNA_HARD_BOUNDS, good=1)
+ GLOB.shadowblock = getAssignedBlock("SHADOW", numsToAssign, DNA_HARDER_BOUNDS, good=1)
+ GLOB.chameleonblock = getAssignedBlock("CHAMELEON", numsToAssign, DNA_HARDER_BOUNDS, good=1)
+ GLOB.cryoblock = getAssignedBlock("CRYO", numsToAssign, DNA_HARD_BOUNDS, good=1)
+ GLOB.eatblock = getAssignedBlock("EAT", numsToAssign, DNA_HARD_BOUNDS, good=1)
+ GLOB.jumpblock = getAssignedBlock("JUMP", numsToAssign, DNA_HARD_BOUNDS, good=1)
+ GLOB.immolateblock = getAssignedBlock("IMMOLATE", numsToAssign)
+ GLOB.empathblock = getAssignedBlock("EMPATH", numsToAssign, DNA_HARD_BOUNDS, good=1)
+ GLOB.polymorphblock = getAssignedBlock("POLYMORPH", numsToAssign, DNA_HARDER_BOUNDS, good=1)
//
// /vg/ Blocks
/////////////////////////////////////////////
// Disabilities
- LOUDBLOCK = getAssignedBlock("LOUD", numsToAssign)
- DIZZYBLOCK = getAssignedBlock("DIZZY", numsToAssign)
+ GLOB.loudblock = getAssignedBlock("LOUD", numsToAssign)
+ GLOB.dizzyblock = getAssignedBlock("DIZZY", numsToAssign)
//
@@ -105,7 +105,7 @@
/////////////////////////////////////////////.
// Monkeyblock is always last.
- MONKEYBLOCK = DNA_SE_LENGTH
+ GLOB.monkeyblock = DNA_SE_LENGTH
// And the genes that actually do the work. (domutcheck improvements)
var/list/blocks_assigned[DNA_SE_LENGTH]
@@ -114,7 +114,7 @@
if(G.block)
if(G.block in blocks_assigned)
warning("DNA2: Gene [G.name] trying to use already-assigned block [G.block] (used by [english_list(blocks_assigned[G.block])])")
- dna_genes.Add(G)
+ GLOB.dna_genes.Add(G)
var/list/assignedToBlock[0]
if(blocks_assigned[G.block])
assignedToBlock=blocks_assigned[G.block]
@@ -124,31 +124,15 @@
// I WILL HAVE A LIST OF GENES THAT MATCHES THE RANDOMIZED BLOCKS GODDAMNIT!
for(var/block=1;block<=DNA_SE_LENGTH;block++)
- var/name = assigned_blocks[block]
- for(var/datum/dna/gene/gene in dna_genes)
+ var/name = GLOB.assigned_blocks[block]
+ for(var/datum/dna/gene/gene in GLOB.dna_genes)
if(gene.name == name || gene.block == block)
- if(gene.block in assigned_gene_blocks)
- warning("DNA2: Gene [gene.name] trying to add to already assigned gene block list (used by [english_list(assigned_gene_blocks[block])])")
- assigned_gene_blocks[block] = gene
+ if(gene.block in GLOB.assigned_gene_blocks)
+ warning("DNA2: Gene [gene.name] trying to add to already assigned gene block list (used by [english_list(GLOB.assigned_gene_blocks[block])])")
+ GLOB.assigned_gene_blocks[block] = gene
//testing("DNA2: [numsToAssign.len] blocks are unused: [english_list(numsToAssign)]")
-/proc/setupfactions()
-
- // Populate the factions list:
- for(var/x in typesof(/datum/faction))
- var/datum/faction/F = new x
- if(!F.name)
- qdel(F)
- continue
- else
- SSticker.factions.Add(F)
- SSticker.availablefactions.Add(F)
-
- // Populate the syndicate coalition:
- for(var/datum/faction/syndicate/S in SSticker.factions)
- SSticker.syndicate_coalition.Add(S)
-
/proc/setupcult()
var/static/datum/cult_info/picked_cult // Only needs to get picked once
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index b4b4b265711..b46bc3c6c51 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -101,7 +101,7 @@ Made by Xhuis
shadowlings--
var/thrall_scaling = round(num_players() / 3)
- required_thralls = Clamp(thrall_scaling, 15, 25)
+ required_thralls = clamp(thrall_scaling, 15, 25)
thrall_ratio = required_thralls / 15
warning_threshold = round(0.66 * required_thralls)
@@ -158,6 +158,7 @@ Made by Xhuis
new_thrall_mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL
update_shadow_icons_added(new_thrall_mind)
new_thrall_mind.current.create_attack_log("Became a thrall")
+ new_thrall_mind.current.create_log(CONVERSION_LOG, "Became a thrall")
new_thrall_mind.current.add_language("Shadowling Hivemind")
new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_shadow_walk(null))
new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall(null))
@@ -171,7 +172,7 @@ Made by Xhuis
replace_jobbanned_player(new_thrall_mind.current, ROLE_SHADOWLING)
if(!victory_warning_announced && (length(shadowling_thralls) >= warning_threshold))//are the slings very close to winning?
victory_warning_announced = TRUE //then let's give the station a warning
- command_announcement.Announce("Large concentration of psychic bluespace energy detected by long-ranged scanners. Shadowling ascension event imminent. Prevent it at all costs!", "Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg')
+ GLOB.command_announcement.Announce("Large concentration of psychic bluespace energy detected by long-ranged scanners. Shadowling ascension event imminent. Prevent it at all costs!", "Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg')
return 1
/datum/game_mode/proc/remove_thrall(datum/mind/thrall_mind, var/kill = 0)
@@ -179,6 +180,7 @@ Made by Xhuis
return 0 //If there is no mind, the mind isn't a thrall, or the mind's mob isn't alive, return
shadowling_thralls.Remove(thrall_mind)
thrall_mind.current.create_attack_log("Dethralled")
+ thrall_mind.current.create_log(CONVERSION_LOG, "Dethralled")
thrall_mind.special_role = null
update_shadow_icons_removed(thrall_mind)
for(var/obj/effect/proc_holder/spell/S in thrall_mind.spell_list)
@@ -192,8 +194,8 @@ Made by Xhuis
return 1
var/mob/living/M = thrall_mind.current
if(issilicon(M))
- M.audible_message("[M] lets out a short blip.", \
- "You have been turned into a robot! You are no longer a thrall! Though you try, you cannot remember anything about your servitude...")
+ M.audible_message("[M] lets out a short blip.")
+ to_chat(M, "You have been turned into a robot! You are no longer a thrall! Though you try, you cannot remember anything about your servitude...")
else
M.visible_message("[M] looks like [M.p_their()] mind is [M.p_their()] own again!", \
"A piercing white light floods your eyes. Your mind is your own again! Though you try, you cannot remember anything about the shadowlings or your time \
@@ -236,13 +238,14 @@ Made by Xhuis
update_shadow_icons_removed(ling_mind)
shadows.Remove(ling_mind)
ling_mind.current.create_attack_log("Deshadowlinged")
+ ling_mind.current.create_log(CONVERSION_LOG, "Deshadowlinged")
ling_mind.special_role = null
for(var/obj/effect/proc_holder/spell/S in ling_mind.spell_list)
ling_mind.RemoveSpell(S)
var/mob/living/M = ling_mind.current
if(issilicon(M))
- M.audible_message("[M] lets out a short blip.", \
- "You have been turned into a robot! You are no longer a shadowling! Though you try, you cannot remember anything about your time as one...")
+ M.audible_message("[M] lets out a short blip.")
+ to_chat(M, "You have been turned into a robot! You are no longer a shadowling! Though you try, you cannot remember anything about your time as one...")
else
M.visible_message("[M] screams and contorts!", \
"THE LIGHT-- YOUR MIND-- BURNS--")
@@ -322,12 +325,12 @@ Made by Xhuis
*/
/datum/game_mode/proc/update_shadow_icons_added(datum/mind/shadow_mind)
- var/datum/atom_hud/antag/shadow_hud = huds[ANTAG_HUD_SHADOW]
+ var/datum/atom_hud/antag/shadow_hud = GLOB.huds[ANTAG_HUD_SHADOW]
shadow_hud.join_hud(shadow_mind.current)
set_antag_hud(shadow_mind.current, ((shadow_mind in shadows) ? "hudshadowling" : "hudshadowlingthrall"))
/datum/game_mode/proc/update_shadow_icons_removed(datum/mind/shadow_mind) //This should never actually occur, but it's here anyway.
- var/datum/atom_hud/antag/shadow_hud = huds[ANTAG_HUD_SHADOW]
+ var/datum/atom_hud/antag/shadow_hud = GLOB.huds[ANTAG_HUD_SHADOW]
shadow_hud.leave_hud(shadow_mind.current)
set_antag_hud(shadow_mind.current, null)
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index 1671c4a03b0..27267d2ec02 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -175,7 +175,6 @@
range = -1
include_user = 1
clothes_req = 0
- var/datum/vision_override/vision_path = /datum/vision_override/nightvision
action_icon_state = "darksight"
/obj/effect/proc_holder/spell/targeted/shadow_vision/cast(list/targets, mob/user = usr)
@@ -185,10 +184,10 @@
var/mob/living/carbon/human/H = target
if(!H.vision_type)
to_chat(H, "You shift the nerves in your eyes, allowing you to see in the dark.")
- H.vision_type = new vision_path
+ H.set_sight(/datum/vision_override/nightvision)
else
to_chat(H, "You return your vision to normal.")
- H.vision_type = null
+ H.set_sight(null)
/obj/effect/proc_holder/spell/targeted/shadow_vision/thrall
desc = "Thrall Darksight"
@@ -375,7 +374,7 @@
to_chat(target, "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.")
- for(M in GLOB.living_mob_list)
+ for(M in GLOB.alive_mob_list)
if(is_thrall(M))
thralls++
to_chat(M, "You feel hooks sink into your mind and pull.")
@@ -413,7 +412,7 @@
else if(thralls >= victory_threshold)
to_chat(target, "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls.")
to_chat(target, "You may find Ascendance in the Shadowling Evolution tab.")
- for(M in GLOB.living_mob_list)
+ for(M in GLOB.alive_mob_list)
if(is_shadow(M))
var/obj/effect/proc_holder/spell/targeted/collective_mind/CM
if(CM in M.mind.spell_list)
@@ -716,7 +715,7 @@
if(SSshuttle.emergency.mode == SHUTTLE_CALL)
var/more_minutes = 6000
var/timer = SSshuttle.emergency.timeLeft(1) + more_minutes
- event_announcement.Announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 10 minutes and the shuttle is unable to be recalled.", "System Failure", 'sound/misc/notice1.ogg')
+ GLOB.event_announcement.Announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 10 minutes and the shuttle is unable to be recalled.", "System Failure", 'sound/misc/notice1.ogg')
SSshuttle.emergency.setTimer(timer)
SSshuttle.emergency.canRecall = FALSE
user.mind.spell_list.Remove(src) //Can only be used once!
diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
index 514a16174b1..5fc5e1e78cc 100644
--- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
@@ -1,5 +1,5 @@
//In here: Hatch and Ascendance
-var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "Noaey'gief", "Mii`mahza", "Amerziox", "Gyrg-mylin", "Kanet'pruunance", "Vigistaezian") //Unpronouncable 2: electric boogalo)
+GLOBAL_LIST_INIT(possibleShadowlingNames, list("U'ruan", "Y`shej", "Nex", "Hel-uae", "Noaey'gief", "Mii`mahza", "Amerziox", "Gyrg-mylin", "Kanet'pruunance", "Vigistaezian")) //Unpronouncable 2: electric boogalo)
/obj/effect/proc_holder/spell/targeted/shadowling_hatch
name = "Hatch"
desc = "Casts off your disguise."
@@ -66,8 +66,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
H.status_flags = temp_flags
sleep(10)
playsound(H.loc, 'sound/effects/ghost.ogg', 100, 1)
- var/newNameId = pick(possibleShadowlingNames)
- possibleShadowlingNames.Remove(newNameId)
+ var/newNameId = pick(GLOB.possibleShadowlingNames)
+ GLOB.possibleShadowlingNames.Remove(newNameId)
H.real_name = newNameId
H.name = user.real_name
H.SetStunned(0)
@@ -161,7 +161,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
for(var/mob/living/M in orange(7, H))
M.Weaken(10)
to_chat(M, "An immense pressure slams you onto the ground!")
- for(var/obj/machinery/power/apc/A in GLOB.apcs)
+ for(var/thing in GLOB.apcs)
+ var/obj/machinery/power/apc/A = thing
A.overload_lighting()
var/mob/living/simple_animal/ascendant_shadowling/A = new /mob/living/simple_animal/ascendant_shadowling(H.loc)
A.announce("VYSHA NERADA YEKHEZET U'RUU!!", 5, 'sound/hallucinations/veryfar_noise.ogg')
diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm
index de9f8fc0eb7..4175883fc1a 100644
--- a/code/game/gamemodes/steal_items.dm
+++ b/code/game/gamemodes/steal_items.dm
@@ -76,12 +76,12 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/aicard/C)
/datum/theft_objective/blueprints
name = "the station blueprints"
- typepath = /obj/item/areaeditor/blueprints
+ typepath = /obj/item/areaeditor/blueprints/ce
protected_jobs = list("Chief Engineer")
altitems = list(/obj/item/photo)
/datum/objective_item/steal/blueprints/check_special_completion(obj/item/I)
- if(istype(I, /obj/item/areaeditor/blueprints))
+ if(istype(I, /obj/item/areaeditor/blueprints/ce))
return 1
if(istype(I, /obj/item/photo))
var/obj/item/photo/P = I
@@ -89,11 +89,6 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/aicard/C)
return 1
return 0
-/datum/theft_objective/voidsuit
- name = "a nasa voidsuit"
- typepath = /obj/item/clothing/suit/space/nasavoid
- protected_jobs = list("Research Director")
-
/datum/theft_objective/capmedal
name = "the medal of captaincy"
typepath = /obj/item/clothing/accessory/medal/gold/captain
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 30f559c7ee2..c7ab4490f48 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -102,7 +102,7 @@
var/TC_uses = 0
var/uplink_true = 0
var/purchases = ""
- for(var/obj/item/uplink/H in world_uplinks)
+ for(var/obj/item/uplink/H in GLOB.world_uplinks)
if(H && H.uplink_owner && H.uplink_owner==traitor.key)
TC_uses += H.used_TC
uplink_true=1
diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm
index ac5ddc92f98..3caf860383d 100644
--- a/code/game/gamemodes/vampire/vampire.dm
+++ b/code/game/gamemodes/vampire/vampire.dm
@@ -227,6 +227,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
if(istype(spell, /obj/effect/proc_holder/spell))
owner.mind.AddSpell(spell)
powers += spell
+ owner.update_sight() // Life updates conditionally, so we need to update sight here in case the vamp gets new vision based on his powers. Maybe one day refactor to be more OOP and on the vampire's ability datum.
/datum/vampire/proc/get_ability(path)
for(var/P in powers)
@@ -244,6 +245,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
powers -= ability
owner.mind.spell_list.Remove(ability)
qdel(ability)
+ owner.update_sight() // Life updates conditionally, so we need to update sight here in case the vamp loses his vision based powers. Maybe one day refactor to be more OOP and on the vampire's ability datum.
/datum/vampire/proc/update_owner(var/mob/living/carbon/human/current) //Called when a vampire gets cloned. This updates vampire.owner to the new body.
if(current.mind && current.mind.vampire && current.mind.vampire.owner && (current.mind.vampire.owner != current))
@@ -348,6 +350,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
SSticker.mode.vampires -= vampire_mind
vampire_mind.special_role = null
vampire_mind.current.create_attack_log("De-vampired")
+ vampire_mind.current.create_log(CONVERSION_LOG, "De-vampired")
if(vampire_mind.vampire)
vampire_mind.vampire.remove_vampire_powers()
QDEL_NULL(vampire_mind.vampire)
@@ -359,12 +362,12 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
//prepare for copypaste
/datum/game_mode/proc/update_vampire_icons_added(datum/mind/vampire_mind)
- var/datum/atom_hud/antag/vamp_hud = huds[ANTAG_HUD_VAMPIRE]
+ var/datum/atom_hud/antag/vamp_hud = GLOB.huds[ANTAG_HUD_VAMPIRE]
vamp_hud.join_hud(vampire_mind.current)
set_antag_hud(vampire_mind.current, ((vampire_mind in vampires) ? "hudvampire" : "hudvampirethrall"))
/datum/game_mode/proc/update_vampire_icons_removed(datum/mind/vampire_mind)
- var/datum/atom_hud/antag/vampire_hud = huds[ANTAG_HUD_VAMPIRE]
+ var/datum/atom_hud/antag/vampire_hud = GLOB.huds[ANTAG_HUD_VAMPIRE]
vampire_hud.leave_hud(vampire_mind.current)
set_antag_hud(vampire_mind.current, null)
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index 24e47577c31..07c61628337 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -243,7 +243,7 @@
scramble(1, H, 100)
H.real_name = random_name(H.gender, H.dna.species.name) //Give them a name that makes sense for their species.
H.sync_organ_dna(assimilate = 1)
- H.update_body(0)
+ H.update_body()
H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
H.reset_markings() //...Or markings.
H.dna.ResetUIFrom(H)
@@ -354,10 +354,10 @@
var/datum/objective/protect/serve_objective = new
serve_objective.owner = user.mind
serve_objective.target = H.mind
- serve_objective.explanation_text = "You have been Enthralled by [user]. Follow [user.p_their()] every command."
+ serve_objective.explanation_text = "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command."
H.mind.objectives += serve_objective
- to_chat(H, "You have been Enthralled by [user]. Follow [user.p_their()] every command.")
+ to_chat(H, "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command.")
to_chat(user, "You have successfully Enthralled [H]. If [H.p_they()] refuse[H.p_s()] to do as you say just adminhelp.")
H.Stun(2)
add_attack_logs(user, H, "Vampire-thralled")
@@ -397,7 +397,7 @@
/obj/effect/proc_holder/spell/vampire/bats/choose_targets(mob/user = usr)
var/list/turf/locs = new
- for(var/direction in alldirs) //looking for bat spawns
+ for(var/direction in GLOB.alldirs) //looking for bat spawns
if(locs.len == num_bats) //we found 2 locations and thats all we need
break
var/turf/T = get_step(usr, direction) //getting a loc in that direction
@@ -507,13 +507,13 @@
to_chat(user, "You cannot find darkness to step to.")
return
+ turfs = list(pick(turfs)) // Pick a single turf for the vampire to jump to.
perform(turfs, user = user)
+// `targets` should only ever contain the 1 valid turf we're jumping to, even though its a list, that's just how the cast() proc works.
/obj/effect/proc_holder/spell/vampire/shadowstep/cast(list/targets, mob/user = usr)
spawn(0)
- var/turf/picked = pick(targets)
-
- if(!picked || !isturf(picked))
+ if(!LAZYLEN(targets)) // If for some reason the turf got deleted.
return
var/mob/living/U = user
U.ExtinguishMob()
@@ -525,7 +525,7 @@
animation.alpha = 127
animation.layer = 5
//animation.master = src
- user.forceMove(picked)
+ user.forceMove(targets[1])
spawn(10)
qdel(animation)
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 0068a20f468..09b228bdd0c 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -226,7 +226,7 @@
user.ghostize(1)
/////////////////////Multiverse Blade////////////////////
-var/global/list/multiverse = list()
+GLOBAL_LIST_EMPTY(multiverse)
/obj/item/multisword
name = "multiverse sword"
@@ -252,11 +252,11 @@ var/global/list/multiverse = list()
/obj/item/multisword/New()
..()
- multiverse |= src
+ GLOB.multiverse |= src
/obj/item/multisword/Destroy()
- multiverse.Remove(src)
+ GLOB.multiverse.Remove(src)
return ..()
/obj/item/multisword/attack(mob/living/M as mob, mob/living/user as mob) //to prevent accidental friendly fire or out and out grief.
@@ -303,7 +303,7 @@ var/global/list/multiverse = list()
evil = FALSE
else
cooldown = world.time + cooldown_between_uses
- for(var/obj/item/multisword/M in multiverse)
+ for(var/obj/item/multisword/M in GLOB.multiverse)
if(M.assigned == assigned)
M.cooldown = cooldown
@@ -470,7 +470,7 @@ var/global/list/multiverse = list()
M.equip_to_slot_or_del(sword, slot_r_hand)
if("cyborg")
- if(!ismachine(M))
+ if(!ismachineperson(M))
for(var/obj/item/organ/O in M.bodyparts)
O.robotize(make_tough = 1)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
@@ -809,7 +809,7 @@ var/global/list/multiverse = list()
return
return ..()
-/obj/item/voodoo/check_eye(mob/user as mob)
+/obj/item/voodoo/check_eye(mob/user)
if(loc != user)
user.reset_perspective(null)
user.unset_machine()
@@ -842,7 +842,7 @@ var/global/list/multiverse = list()
user.unset_machine()
if("r_leg","l_leg")
to_chat(user, "You move the doll's legs around.")
- var/turf/T = get_step(target,pick(cardinal))
+ var/turf/T = get_step(target,pick(GLOB.cardinal))
target.Move(T)
if("r_arm","l_arm")
//use active hand on random nearby mob
@@ -866,7 +866,7 @@ var/global/list/multiverse = list()
possible = list()
if(!link)
return
- for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
+ for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
if(md5(H.dna.uni_identity) in link.fingerprints)
possible |= H
diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm
index 57a4f4e17de..cc52b431249 100644
--- a/code/game/gamemodes/wizard/raginmages.dm
+++ b/code/game/gamemodes/wizard/raginmages.dm
@@ -145,7 +145,7 @@
/datum/game_mode/wizard/raginmages/proc/makeBody(var/mob/dead/observer/G)
if(!G || !G.key)
return // Let's not steal someone's soul here
- var/mob/living/carbon/human/new_character = new(pick(latejoin))
+ var/mob/living/carbon/human/new_character = new(pick(GLOB.latejoin))
G.client.prefs.copy_to(new_character)
new_character.key = G.key
return new_character
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
index 4f2d20b373a..82f6d833d16 100644
--- a/code/game/gamemodes/wizard/rightandwrong.dm
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -109,6 +109,7 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE)
H.mind.add_antag_datum(/datum/antagonist/survivalist/guns)
H.create_attack_log("was made into a survivalist, and trusts no one!")
+ H.create_log(CONVERSION_LOG, "was made into a survivalist")
var/gun_type = pick(GLOB.summoned_guns)
var/obj/item/gun/G = new gun_type(get_turf(H))
@@ -130,6 +131,7 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE)
H.mind.add_antag_datum(/datum/antagonist/survivalist/magic)
H.create_attack_log("was made into a survivalist, and trusts no one!")
+ H.create_log(CONVERSION_LOG, "was made into a survivalist")
var/magic_type = pick(GLOB.summoned_magic)
var/lucky = FALSE
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index cf0ce4843f0..4bda254d930 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -69,9 +69,6 @@
to_chat(user, "\"Come now, do not capture your fellow's soul.\"")
return ..()
- M.create_attack_log("Has had their soul captured with [src.name] by [key_name(user)]")
- user.create_attack_log("Used the [src.name] to capture the soul of [key_name(M)]")
-
if(optional)
if(!M.ckey)
to_chat(user, "They have no soul!")
@@ -283,7 +280,7 @@
SH.mind.transfer_to(C)
if(iscultist(C))
var/datum/action/innate/cultcomm/CC = new()
- CC.Grant(C) //We have to grant the cult comms again because they're lost during the mind transfer.
+ CC.Grant(C) //We have to grant the cult comms again because they're lost during the mind transfer.
qdel(T)
qdel(SH)
to_chat(C, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.")
@@ -353,7 +350,7 @@
/obj/item/soulstone/proc/get_shade_type()
return /mob/living/simple_animal/shade/cult
-
+
/obj/item/soulstone/anybody/get_shade_type()
return /mob/living/simple_animal/shade
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index f97f14a9975..d1695a86603 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -1,39 +1,37 @@
/datum/spellbook_entry
var/name = "Entry Name"
-
+ var/is_ragin_restricted = FALSE // FALSE if this is buyable on ragin mages, TRUE if it's not.
var/spell_type = null
var/desc = ""
var/category = "Offensive"
var/log_name = "XX" //What it shows up as in logs
var/cost = 2
- var/refundable = 1
- var/surplus = -1 // -1 for infinite, not used by anything atm
+ var/refundable = TRUE
var/obj/effect/proc_holder/spell/S = null //Since spellbooks can be used by only one person anyway we can track the actual spell
var/buy_word = "Learn"
var/limit //used to prevent a spellbook_entry from being bought more than X times with one wizard spellbook
-/datum/spellbook_entry/proc/IsSpellAvailable() // For config prefs / gamemode restrictions - these are round applied
- return 1
-
/datum/spellbook_entry/proc/CanBuy(mob/living/carbon/human/user, obj/item/spellbook/book) // Specific circumstances
- if(book.uses= aspell.level_max)
to_chat(user, "This spell cannot be improved further.")
- return 0
+ return FALSE
else
aspell.name = initial(aspell.name)
aspell.spell_level++
- aspell.charge_max = round(initial(aspell.charge_max) - aspell.spell_level * (initial(aspell.charge_max) - aspell.cooldown_min)/ aspell.level_max)
+ aspell.charge_max = round(initial(aspell.charge_max) - aspell.spell_level * (initial(aspell.charge_max) - aspell.cooldown_min) / aspell.level_max)
if(aspell.charge_max < aspell.charge_counter)
aspell.charge_counter = aspell.charge_max
switch(aspell.spell_level)
@@ -51,37 +49,39 @@
aspell.name = "Instant [aspell.name]"
if(aspell.spell_level >= aspell.level_max)
to_chat(user, "This spell cannot be strengthened any further.")
- return 1
+ return TRUE
//No same spell found - just learn it
- feedback_add_details("wizard_spell_learned",log_name)
- user.mind.AddSpell(S)
- to_chat(user, "You have learned [S.name].")
- return 1
+ feedback_add_details("wizard_spell_learned", log_name)
+ user.mind.AddSpell(newspell)
+ to_chat(user, "You have learned [newspell.name].")
+ return TRUE
/datum/spellbook_entry/proc/CanRefund(mob/living/carbon/human/user, obj/item/spellbook/book)
if(!refundable)
- return 0
+ return FALSE
if(!S)
S = new spell_type()
for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list)
if(initial(S.name) == initial(aspell.name))
- return 1
- return 0
+ return TRUE
+ return FALSE
/datum/spellbook_entry/proc/Refund(mob/living/carbon/human/user, obj/item/spellbook/book) //return point value or -1 for failure
var/area/wizard_station/A = locate()
if(!(user in A.contents))
- to_chat(user, "You can only refund spells at the wizard lair")
+ to_chat(user, "You can only refund spells at the wizard lair.")
return -1
- if(!S)
+ if(!S) //This happens when the spell's source is from another spellbook, from loadouts, or adminery, this create a new template temporary spell
S = new spell_type()
var/spell_levels = 0
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
user.mind.spell_list.Remove(aspell)
- QDEL_NULL(S)
- return cost * (spell_levels+1)
+ qdel(aspell)
+ if(S) //If we created a temporary spell above, delete it now.
+ qdel(S)
+ return cost * (spell_levels + 1)
return -1
/datum/spellbook_entry/proc/GetInfo()
@@ -214,12 +214,7 @@
spell_type = /obj/effect/proc_holder/spell/targeted/lichdom
log_name = "LD"
category = "Defensive"
-
-/datum/spellbook_entry/lichdom/IsSpellAvailable()
- if(SSticker.mode.name == "ragin' mages")
- return FALSE
- else
- return TRUE
+ is_ragin_restricted = TRUE
/datum/spellbook_entry/magicm
name = "Magic Missile"
@@ -321,14 +316,7 @@
desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilities to frustrate you."
cost = 0
log_name = "SGH"
-
-/datum/spellbook_entry/summon/ghosts/IsSpellAvailable()
- if(!SSticker.mode) // In case spellbook is placed on map
- return FALSE
- if(SSticker.mode.name == "ragin' mages")
- return FALSE
- else
- return TRUE
+ is_ragin_restricted = TRUE
/datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/spellbook/book)
new /datum/event/wizard/ghost()
@@ -341,14 +329,7 @@
name = "Summon Guns"
desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. There is a good chance that they will shoot each other first."
log_name = "SG"
-
-/datum/spellbook_entry/summon/guns/IsSpellAvailable()
- if(!SSticker.mode) // In case spellbook is placed on map
- return FALSE
- if(SSticker.mode.name == "ragin' mages")
- return FALSE
- else
- return TRUE
+ is_ragin_restricted = TRUE
/datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user, obj/item/spellbook/book)
feedback_add_details("wizard_spell_learned", log_name)
@@ -362,14 +343,7 @@
name = "Summon Magic"
desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time."
log_name = "SU"
-
-/datum/spellbook_entry/summon/magic/IsSpellAvailable()
- if(!SSticker.mode) // In case spellbook is placed on map
- return FALSE
- if(SSticker.mode.name == "ragin' mages")
- return FALSE
- else
- return TRUE
+ is_ragin_restricted = TRUE
/datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user, obj/item/spellbook/book)
feedback_add_details("wizard_spell_learned", log_name)
@@ -396,8 +370,6 @@
dat += "[name]"
dat += " Cost:[cost] "
dat += "[desc] "
- if(surplus>=0)
- dat += "[surplus] left. "
return dat
//Artefacts
@@ -448,7 +420,7 @@
//Weapons and Armors
/datum/spellbook_entry/item/battlemage
name = "Battlemage Armour"
- desc = "An ensorceled suit of armour, protected by a powerful shield. The shield can completely negate sixteen attacks before being permanently depleted."
+ desc = "An ensorceled suit of armour, protected by a powerful shield. The shield can completely negate sixteen attacks before being permanently depleted. Despite appearance it is NOT spaceproof."
item_path = /obj/item/clothing/suit/space/hardsuit/shielded/wizard
limit = 1
category = "Weapons and Armors"
@@ -571,6 +543,48 @@
category = "Summons"
limit = 1
+//Spell loadouts datum, list of loadouts is in wizloadouts.dm
+/datum/spellbook_entry/loadout
+ name = "Standard Loadout"
+ cost = 10
+ category = "Standard"
+ refundable = FALSE
+ buy_word = "Summon"
+ var/list/items_path = list()
+ var/list/spells_path = list()
+ var/destroy_spellbook = FALSE //Destroy the spellbook when bought, for loadouts containing non-standard items/spells, otherwise wiz can refund spells
+
+/datum/spellbook_entry/loadout/GetInfo()
+ var/dat = ""
+ dat += "[name]"
+ if(cost > 0)
+ dat += " Cost:[cost] "
+ else
+ dat += " No Cost "
+ dat += "[desc] "
+ return dat
+
+/datum/spellbook_entry/loadout/Buy(mob/living/carbon/human/user, obj/item/spellbook/book)
+ if(destroy_spellbook)
+ var/response = alert(user, "The [src] loadout cannot be refunded once bought. Are you sure this is what you want?", "No refunds!", "No", "Yes")
+ if(response == "No")
+ return FALSE
+ to_chat(user, "[book] crumbles to ashes as you acquire its knowledge.")
+ qdel(book)
+ else if(items_path.len)
+ var/response = alert(user, "The [src] loadout contains items that will not be refundable if bought. Are you sure this is what you want?", "No refunds!", "No", "Yes")
+ if(response == "No")
+ return FALSE
+ if(items_path.len)
+ var/obj/item/storage/box/wizard/B = new(src)
+ for(var/path in items_path)
+ new path(B)
+ user.put_in_hands(B)
+ for(var/path in spells_path)
+ var/obj/effect/proc_holder/spell/S = new path()
+ LearnSpell(user, book, S)
+ return TRUE
+
/obj/item/spellbook
name = "spell book"
desc = "The legendary book of spells of the wizard."
@@ -587,19 +601,21 @@
var/mob/living/carbon/human/owner
var/list/datum/spellbook_entry/entries = list()
var/list/categories = list()
- var/list/main_categories = list("Spells", "Magical Items")
+ var/list/main_categories = list("Spells", "Magical Items", "Loadouts")
var/list/spell_categories = list("Offensive", "Defensive", "Mobility", "Assistance", "Rituals")
var/list/item_categories = list("Artefacts", "Weapons and Armors", "Staves", "Summons")
+ var/list/loadout_categories = list("Standard", "Unique")
/obj/item/spellbook/proc/initialize()
- var/entry_types = subtypesof(/datum/spellbook_entry) - /datum/spellbook_entry/item - /datum/spellbook_entry/summon
+ var/entry_types = subtypesof(/datum/spellbook_entry) - /datum/spellbook_entry/item - /datum/spellbook_entry/summon - /datum/spellbook_entry/loadout
for(var/T in entry_types)
var/datum/spellbook_entry/E = new T
- if(E.IsSpellAvailable())
- entries |= E
- categories |= E.category
- else
+ if(GAMEMODE_IS_WIZARD && E.is_ragin_restricted)
qdel(E)
+ continue
+ entries |= E
+ categories |= E.category
+
main_tab = main_categories[1]
tab = categories[1]
@@ -676,6 +692,12 @@
if("Summons")
dat += "Magical items geared towards bringing in outside forces to aid you.
"
dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased. "
+ if("Standard")
+ dat += "These battle-tested spell sets are easy to use and provide good balance between offense and defense.
"
+ dat += "They all cost, and are worth, 10 spell points. You are able to refund any of the spells included as long as you stay in the wizard den. "
+ if("Unique")
+ dat += "These esoteric loadouts usually contain spells or items that cannot be bought elsewhere in this spellbook.
"
+ dat += "Recommended for experienced wizards looking for something new. No refunds once purchased! "
return dat
/obj/item/spellbook/proc/wrap(content)
@@ -720,23 +742,24 @@
cat_dat[main_category] = ""
dat += "
"
var/datum/spellbook_entry/E
@@ -801,6 +824,8 @@
tab = spell_categories[1]
else if(main_tab == "Magical Items")
tab = item_categories[1]
+ else if(main_tab == "Loadouts")
+ tab = loadout_categories[1]
else if(href_list["page"])
tab = sanitize(href_list["page"])
attack_self(H)
@@ -837,6 +862,7 @@
else
user.mind.AddSpell(S)
to_chat(user, "you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!")
+ user.create_log(MISC_LOG, "learned the spell [spellname] ([S])")
user.create_attack_log("[key_name(user)] learned the spell [spellname] ([S]).")
onlearned(user)
@@ -954,7 +980,7 @@
magichead.voicechange = 1 //NEEEEIIGHH
if(!user.unEquip(user.wear_mask))
qdel(user.wear_mask)
- user.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1)
+ user.equip_to_slot_if_possible(magichead, slot_wear_mask, TRUE, TRUE)
qdel(src)
else
to_chat(user, "I say thee neigh")
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index ba310ed0e8f..a0bb4c349af 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -30,14 +30,14 @@
wizard.assigned_role = SPECIAL_ROLE_WIZARD //So they aren't chosen for other jobs.
wizard.special_role = SPECIAL_ROLE_WIZARD
wizard.original = wizard.current
- if(wizardstart.len == 0)
+ if(GLOB.wizardstart.len == 0)
to_chat(wizard.current, "A starting location for you could not be found, please report this bug!")
return 0
return 1
/datum/game_mode/wizard/pre_setup()
for(var/datum/mind/wiz in wizards)
- wiz.current.loc = pick(wizardstart)
+ wiz.current.loc = pick(GLOB.wizardstart)
..()
return 1
@@ -59,6 +59,7 @@
SSticker.mode.wizards -= wizard_mind
wizard_mind.special_role = null
wizard_mind.current.create_attack_log("De-wizarded")
+ wizard_mind.current.create_log(CONVERSION_LOG, "De-wizarded")
wizard_mind.current.spellremove(wizard_mind.current)
wizard_mind.current.faction = list("Station")
if(issilicon(wizard_mind.current))
@@ -68,12 +69,12 @@
SSticker.mode.update_wiz_icons_removed(wizard_mind)
/datum/game_mode/proc/update_wiz_icons_added(datum/mind/wiz_mind)
- var/datum/atom_hud/antag/wizhud = huds[ANTAG_HUD_WIZ]
+ var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ]
wizhud.join_hud(wiz_mind.current)
set_antag_hud(wiz_mind.current, ((wiz_mind in wizards) ? "hudwizard" : "apprentice"))
/datum/game_mode/proc/update_wiz_icons_removed(datum/mind/wiz_mind)
- var/datum/atom_hud/antag/wizhud = huds[ANTAG_HUD_WIZ]
+ var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ]
wizhud.leave_hud(wiz_mind.current)
set_antag_hud(wiz_mind.current, null)
@@ -134,22 +135,31 @@
qdel(wizard_mob.r_store)
qdel(wizard_mob.l_store)
- wizard_mob.equip_to_slot_or_del(new /obj/item/radio/headset(wizard_mob), slot_l_ear)
- wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(wizard_mob), slot_w_uniform)
- wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(wizard_mob), slot_shoes)
- if(!isplasmaman(wizard_mob)) //handled in the species file for plasmen on the afterjob equip proc for now
- wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(wizard_mob), slot_wear_suit)
+ if(isplasmaman(wizard_mob))
+ wizard_mob.equipOutfit(new /datum/outfit/plasmaman/wizard)
+ wizard_mob.internal = wizard_mob.r_hand
+ wizard_mob.update_action_buttons_icon()
+ else
+ wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(wizard_mob), slot_w_uniform)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(wizard_mob), slot_head)
+ wizard_mob.dna.species.after_equip_job(null, wizard_mob)
+ wizard_mob.rejuvenate() //fix any damage taken by naked vox/plasmamen/etc while round setups
+ wizard_mob.equip_to_slot_or_del(new /obj/item/radio/headset(wizard_mob), slot_l_ear)
+ wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(wizard_mob), slot_shoes)
+ wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(wizard_mob), slot_wear_suit)
wizard_mob.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel(wizard_mob), slot_back)
- wizard_mob.equip_to_slot_or_del(new /obj/item/storage/box/survival(wizard_mob), slot_in_backpack)
+ if(wizard_mob.dna.species.speciesbox)
+ wizard_mob.equip_to_slot_or_del(new wizard_mob.dna.species.speciesbox(wizard_mob), slot_in_backpack)
+ else
+ wizard_mob.equip_to_slot_or_del(new /obj/item/storage/box/survival(wizard_mob), slot_in_backpack)
wizard_mob.equip_to_slot_or_del(new /obj/item/teleportation_scroll(wizard_mob), slot_r_store)
var/obj/item/spellbook/spellbook = new /obj/item/spellbook(wizard_mob)
spellbook.owner = wizard_mob
- wizard_mob.equip_to_slot_or_del(spellbook, slot_r_hand)
+ wizard_mob.equip_to_slot_or_del(spellbook, slot_l_hand)
wizard_mob.faction = list("wizard")
- wizard_mob.dna.species.after_equip_job(null, wizard_mob)
+
to_chat(wizard_mob, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.")
to_chat(wizard_mob, "The spellbook is bound to you, and others cannot use it.")
@@ -157,7 +167,7 @@
wizard_mob.mind.store_memory("Remember: do not forget to prepare your spells.")
wizard_mob.update_icons()
wizard_mob.gene_stability += DEFAULT_GENE_STABILITY //magic
- return 1
+ return TRUE
// Checks if the game should end due to all wizards and apprentices being dead, or MMI'd/Borged
/datum/game_mode/wizard/check_finished()
diff --git a/code/game/gamemodes/wizard/wizloadouts.dm b/code/game/gamemodes/wizard/wizloadouts.dm
new file mode 100644
index 00000000000..c050b27f273
--- /dev/null
+++ b/code/game/gamemodes/wizard/wizloadouts.dm
@@ -0,0 +1,73 @@
+//Contains wizard loadouts and associated unique spells
+
+//Standard loadouts, which are meant to be suggestions for beginners. Should always be worth exactly 10 spell points, and only contain standard wizard spells/items.
+/datum/spellbook_entry/loadout/mutant
+ name = "Offense Focus : Mutant"
+ desc = "A spellset focused around the Mutate spell as its main source of damage, which provides stun protection, laser eyes, and strong punches. \
+ Ethereal Jaunt and Blink provide escape and mobility, while Magic Missile and Disintegrate can be used together for dangerous or key targets. \
+ As this set lacks any form of healing or resurrection, healing items should be acquired from the station, and you should be careful to avoid being hurt in the first place.
\
+ Provides Mutate, Ethereal Jaunt, Blink, Magic Missile, and Disintegrate."
+ log_name = "OM"
+ spells_path = list(/obj/effect/proc_holder/spell/targeted/genetic/mutate, /obj/effect/proc_holder/spell/targeted/ethereal_jaunt, /obj/effect/proc_holder/spell/targeted/turf_teleport/blink, \
+ /obj/effect/proc_holder/spell/targeted/projectile/magic_missile, /obj/effect/proc_holder/spell/targeted/touch/disintegrate)
+
+/datum/spellbook_entry/loadout/lich
+ name = "Defense Focus : Lich"
+ desc = "This spellset uses the Bind Soul spell to safeguard your life as a lich and allow for more dangerous offensive spells to be used. \
+ Ethereal Jaunt provides escape, Fireball and Rod Form are your offensive spells, and Disable Tech and Greater Forcewall provides utility in disabling sec equipment or blocking their path. \
+ Care should be taken in hiding the item you choose as your phylactery after using Bind Soul, as you cannot revive if it destroyed or too far from your body!
\
+ Provides Bind Soul, Ethereal Jaunt, Fireball, Rod Form, Disable Tech, and Greater Forcewall."
+ log_name = "DL"
+ spells_path = list(/obj/effect/proc_holder/spell/targeted/lichdom, /obj/effect/proc_holder/spell/targeted/ethereal_jaunt, /obj/effect/proc_holder/spell/fireball, \
+ /obj/effect/proc_holder/spell/targeted/rod_form, /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech, /obj/effect/proc_holder/spell/targeted/forcewall/greater)
+ is_ragin_restricted = TRUE
+
+/datum/spellbook_entry/loadout/wands
+ name = "Utility Focus : Wands"
+ desc = "This set contain a Belt of Wands, providing offensive, defensive, and utility wands. Wands have limited charges, but can be partially recharged with the Charge spell included. \
+ Ethereal Jaunt and Blink provide escape and mobility, while Disintegrate and Repulse can be used to annihilate or push away anyone that gets too close to you. \
+ Do not lose any of your wands to the station's crew, as they are extremely deadly even in their hands. Remember that the Revive wand can be used on yourself for a full heal!
\
+ Provides a Belt of Wands, Charge, Ethereal Jaunt, Blink, Repulse, and Disintegrate."
+ log_name = "UW"
+ items_path = list(/obj/item/storage/belt/wands/full)
+ spells_path = list(/obj/effect/proc_holder/spell/targeted/charge, /obj/effect/proc_holder/spell/targeted/ethereal_jaunt, /obj/effect/proc_holder/spell/targeted/turf_teleport/blink, \
+ /obj/effect/proc_holder/spell/aoe_turf/repulse, /obj/effect/proc_holder/spell/targeted/touch/disintegrate)
+
+//Unique loadouts, which are more gimmicky. Should contain some unique spell or item that separates it from just buying standard wiz spells, and be balanced around a 10 spell point cost.
+/datum/spellbook_entry/loadout/mimewiz
+ name = "Silencio"
+ desc = "...
\
+ Provides Finger Gun and Invisible Greater Wall manuals, Mime Robes, a Cane and Duct Tape, Ethereal Jaunt, Blink, Teleport, Mime Malaise, Knock, and Stop Time."
+ log_name = "SHH"
+ items_path = list(/obj/item/spellbook/oneuse/mime/fingergun, /obj/item/spellbook/oneuse/mime/greaterwall, /obj/item/clothing/suit/wizrobe/mime, /obj/item/clothing/head/wizard/mime, \
+ /obj/item/clothing/mask/gas/mime/wizard, /obj/item/clothing/shoes/sandal/marisa, /obj/item/cane, /obj/item/stack/tape_roll)
+ spells_path = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt, /obj/effect/proc_holder/spell/targeted/turf_teleport/blink, /obj/effect/proc_holder/spell/targeted/area_teleport/teleport, \
+ /obj/effect/proc_holder/spell/targeted/touch/mime_malaise, /obj/effect/proc_holder/spell/aoe_turf/knock, /obj/effect/proc_holder/spell/aoe_turf/conjure/timestop)
+ category = "Unique"
+ destroy_spellbook = TRUE
+
+/datum/spellbook_entry/loadout/mimewiz/Buy(mob/living/carbon/human/user, obj/item/spellbook/book)
+ if(user.mind)
+ user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null))
+ user.mind.miming = TRUE
+ ..()
+
+/datum/spellbook_entry/loadout/gunreaper
+ name = "Gunslinging Reaper"
+ desc = "Cloned over and over, the souls aboard this station yearn for a deserved rest. \
+ Bring them to the afterlife, one trigger pull at a time. \
+ You will likely need to scavenge additional ammo or weapons aboard the station.
\
+ Provides a .357 Revolver, 4 speedloaders of ammo, Ethereal Jaunt, Blink, Summon Item, No Clothes, and Bind Soul, with a unique outfit."
+ log_name = "GR"
+ items_path = list(/obj/item/gun/projectile/revolver, /obj/item/ammo_box/a357, /obj/item/ammo_box/a357, /obj/item/ammo_box/a357, /obj/item/ammo_box/a357, /obj/item/clothing/under/syndicate)
+ spells_path = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt, /obj/effect/proc_holder/spell/targeted/turf_teleport/blink, \
+ /obj/effect/proc_holder/spell/targeted/summonitem, /obj/effect/proc_holder/spell/noclothes, /obj/effect/proc_holder/spell/targeted/lichdom/gunslinger)
+ category = "Unique"
+ destroy_spellbook = TRUE
+ is_ragin_restricted = TRUE
+
+/obj/effect/proc_holder/spell/targeted/lichdom/gunslinger/equip_lich(mob/living/carbon/human/H)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(H), slot_gloves)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(H), slot_w_uniform)
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 7f93fd9fef6..d5a59a36872 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -20,8 +20,6 @@
else
return check_access_list(acc)
- return 0
-
/obj/item/proc/GetAccess()
return list()
diff --git a/code/game/jobs/job/central.dm b/code/game/jobs/job/central.dm
index 796db23b36e..f91460ba234 100644
--- a/code/game/jobs/job/central.dm
+++ b/code/game/jobs/job/central.dm
@@ -34,6 +34,9 @@
/obj/item/implant/dust
)
backpack = /obj/item/storage/backpack/satchel
+ backpack_contents = list(
+ /obj/item/stamp/centcom = 1,
+ )
box = /obj/item/storage/box/centcomofficer
cybernetic_implants = list(
/obj/item/organ/internal/cyberimp/chest/nutriment/plus
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index 03ac85c8d57..d5c5089c8af 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -12,9 +12,6 @@
var/department_flag = 0
var/department_head = list()
- //Players will be allowed to spawn in as jobs that are set to "Station"
- var/list/faction = list("Station")
-
//How many players can be this job
var/total_positions = 0
@@ -53,6 +50,8 @@
var/exp_type = ""
var/disabilities_allowed = 1
+ var/transfer_allowed = TRUE // If false, ID computer will always discourage transfers to this job, even if player is eligible
+ var/hidden_from_job_prefs = FALSE // if true, job preferences screen never shows this job.
var/admin_only = 0
var/spawn_ert = 0
@@ -171,9 +170,9 @@
if(box && H.dna.species.speciesbox)
box = H.dna.species.speciesbox
- if(allow_loadout && H.client && (H.client.prefs.gear && H.client.prefs.gear.len))
- for(var/gear in H.client.prefs.gear)
- var/datum/gear/G = gear_datums[gear]
+ if(allow_loadout && H.client && (H.client.prefs.loadout_gear && H.client.prefs.loadout_gear.len))
+ for(var/gear in H.client.prefs.loadout_gear)
+ var/datum/gear/G = GLOB.gear_datums[gear]
if(G)
var/permitted = FALSE
@@ -210,7 +209,7 @@
if(gear_leftovers.len)
for(var/datum/gear/G in gear_leftovers)
- var/atom/placed_in = H.equip_or_collect(G.spawn_item(null, H.client.prefs.gear[G.display_name]))
+ var/atom/placed_in = H.equip_or_collect(G.spawn_item(null, H.client.prefs.loadout_gear[G.display_name]))
if(istype(placed_in))
if(isturf(placed_in))
to_chat(H, "Placing [G.display_name] on [placed_in]!")
@@ -265,6 +264,8 @@
PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
/datum/job/proc/would_accept_job_transfer_from_player(mob/player)
+ if(!transfer_allowed)
+ return FALSE
if(!guest_jobbans(title)) // actually checks if job is a whitelisted position
return TRUE
if(!istype(player))
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 259afa12c9e..2d1b091a10d 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -30,7 +30,7 @@
l_ear = /obj/item/radio/headset/heads/cmo
id = /obj/item/card/id/cmo
suit_store = /obj/item/flashlight/pen
- l_hand = /obj/item/storage/firstaid/adv
+ l_hand = /obj/item/storage/firstaid/doctor
pda = /obj/item/pda/heads/cmo
backpack_contents = list(
/obj/item/melee/classic_baton/telescopic = 1
@@ -68,7 +68,7 @@
l_ear = /obj/item/radio/headset/headset_med
id = /obj/item/card/id/medical
suit_store = /obj/item/flashlight/pen
- l_hand = /obj/item/storage/firstaid/adv
+ l_hand = /obj/item/storage/firstaid/doctor
pda = /obj/item/pda/medical
backpack = /obj/item/storage/backpack/medic
@@ -315,4 +315,3 @@
satchel = /obj/item/storage/backpack/satchel_med
dufflebag = /obj/item/storage/backpack/duffel/medical
box = /obj/item/storage/box/engineer
-
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 20364b57677..a32656598df 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -149,7 +149,7 @@
if(visualsOnly)
return
- H.dna.SetSEState(SOBERBLOCK,1)
+ H.dna.SetSEState(GLOB.soberblock,1)
H.mutations += SOBER
H.check_mutations = 1
@@ -217,7 +217,7 @@
glasses = /obj/item/clothing/glasses/hud/health/sunglasses
id = /obj/item/card/id/security
suit_store = /obj/item/flashlight/pen
- l_hand = /obj/item/storage/firstaid/adv
+ l_hand = /obj/item/storage/firstaid/doctor
pda = /obj/item/pda/medical
implants = list(/obj/item/implant/mindshield)
backpack = /obj/item/storage/backpack/medic
diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm
index 5325f077f4f..c510518716a 100644
--- a/code/game/jobs/job/silicon.dm
+++ b/code/game/jobs/job/silicon.dm
@@ -17,15 +17,15 @@
return 0
/datum/job/ai/is_position_available()
- return (empty_playable_ai_cores.len != 0)
+ return (GLOB.empty_playable_ai_cores.len != 0)
/datum/job/cyborg
title = "Cyborg"
flag = JOB_CYBORG
department_flag = JOBCAT_ENGSEC
- total_positions = 1
- spawn_positions = 1
+ total_positions = 2
+ spawn_positions = 2
supervisors = "your laws and the AI" //Nodrak
department_head = list("AI")
selection_color = "#ddffdd"
diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm
index 4e773d42ad9..1d627f131b2 100644
--- a/code/game/jobs/job/supervisor.dm
+++ b/code/game/jobs/job/supervisor.dm
@@ -1,4 +1,4 @@
-var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
+GLOBAL_DATUM_INIT(captain_announcement, /datum/announcement/minor, new(do_newscast = 0)) // Why the hell are captain announcements minor
/datum/job/captain
title = "Captain"
flag = JOB_CAPTAIN
@@ -23,7 +23,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
/datum/job/captain/announce(mob/living/carbon/human/H)
. = ..()
- captain_announcement.Announce("All hands, Captain [H.real_name] on deck!")
+ GLOB.captain_announcement.Announce("All hands, Captain [H.real_name] on deck!")
/datum/outfit/job/captain
name = "Captain"
@@ -112,6 +112,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
selection_color = "#ddddff"
req_admin_notify = 1
is_command = 1
+ transfer_allowed = FALSE
minimal_player_age = 21
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_FORENSICS_LOCKERS,
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_EVA, ACCESS_HEADS,
@@ -155,6 +156,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
selection_color = "#ddddff"
req_admin_notify = 1
is_command = 1
+ transfer_allowed = FALSE
minimal_player_age = 21
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_FORENSICS_LOCKERS,
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_EVA, ACCESS_HEADS,
@@ -198,6 +200,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
selection_color = "#ddddff"
req_admin_notify = 1
is_legal = 1
+ transfer_allowed = FALSE
minimal_player_age = 30
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_FORENSICS_LOCKERS,
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_EVA, ACCESS_HEADS,
@@ -220,6 +223,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
id = /obj/item/card/id/nanotrasen
l_pocket = /obj/item/flash
+ r_pocket = /obj/item/clothing/accessory/lawyers_badge
pda = /obj/item/pda/heads/magistrate
backpack_contents = list(
/obj/item/melee/classic_baton/telescopic = 1
@@ -230,7 +234,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
-//var/global/lawyer = 0//Checks for another lawyer //This changed clothes on 2nd lawyer, both IA get the same dreds.
+//GLOBAL_VAR_INIT(lawyer, 0) //Checks for another lawyer //This changed clothes on 2nd lawyer, both IA get the same dreds. | This was deprecated back in 2014, and its now 2020
/datum/job/lawyer
title = "Internal Affairs Agent"
flag = JOB_LAWYER
@@ -259,9 +263,12 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
glasses = /obj/item/clothing/glasses/hud/security/sunglasses/read_only
id = /obj/item/card/id/security
l_pocket = /obj/item/laser_pointer
- r_pocket = /obj/item/flash
+ r_pocket = /obj/item/clothing/accessory/lawyers_badge
l_hand = /obj/item/storage/briefcase
pda = /obj/item/pda/lawyer
+ backpack_contents = list(
+ /obj/item/flash = 1
+ )
implants = list(/obj/item/implant/mindshield)
satchel = /obj/item/storage/backpack/satchel_sec
dufflebag = /obj/item/storage/backpack/duffel/security
diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm
index 7d4f5ccc622..09328865b59 100644
--- a/code/game/jobs/job/support.dm
+++ b/code/game/jobs/job/support.dm
@@ -33,9 +33,9 @@
if(visualsOnly)
return
- H.dna.SetSEState(SOBERBLOCK,1)
- genemutcheck(H, SOBERBLOCK, null, MUTCHK_FORCED)
- H.dna.default_blocks.Add(SOBERBLOCK)
+ H.dna.SetSEState(GLOB.soberblock,1)
+ genemutcheck(H, GLOB.soberblock, null, MUTCHK_FORCED)
+ H.dna.default_blocks.Add(GLOB.soberblock)
H.check_mutations = 1
@@ -282,17 +282,17 @@
if(visualsOnly)
return
- if(ismachine(H))
+ if(ismachineperson(H))
var/obj/item/organ/internal/cyberimp/brain/clown_voice/implant = new
implant.insert(H)
- H.dna.SetSEState(CLUMSYBLOCK, TRUE)
- genemutcheck(H, CLUMSYBLOCK, null, MUTCHK_FORCED)
- H.dna.default_blocks.Add(CLUMSYBLOCK)
- if(!ismachine(H))
- H.dna.SetSEState(COMICBLOCK, TRUE)
- genemutcheck(H, COMICBLOCK, null, MUTCHK_FORCED)
- H.dna.default_blocks.Add(COMICBLOCK)
+ H.dna.SetSEState(GLOB.clumsyblock, TRUE)
+ genemutcheck(H, GLOB.clumsyblock, null, MUTCHK_FORCED)
+ H.dna.default_blocks.Add(GLOB.clumsyblock)
+ if(!ismachineperson(H))
+ H.dna.SetSEState(GLOB.comicblock, TRUE)
+ genemutcheck(H, GLOB.comicblock, null, MUTCHK_FORCED)
+ H.dna.default_blocks.Add(GLOB.comicblock)
H.check_mutations = TRUE
H.add_language("Clownish")
@@ -450,3 +450,24 @@
/obj/item/storage/box/lip_stick = 1,
/obj/item/storage/box/barber = 1
)
+
+/datum/job/explorer
+ title = "Explorer"
+ flag = JOB_EXPLORER
+ department_flag = JOBCAT_SUPPORT
+ total_positions = 0
+ spawn_positions = 0
+ supervisors = "the head of personnel"
+ selection_color = "#dddddd"
+ access = list(ACCESS_MAINT_TUNNELS, ACCESS_GATEWAY, ACCESS_EVA, ACCESS_EXTERNAL_AIRLOCKS)
+ minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_GATEWAY, ACCESS_EVA, ACCESS_EXTERNAL_AIRLOCKS)
+ outfit = /datum/outfit/job/explorer
+ hidden_from_job_prefs = TRUE
+
+/datum/outfit/job/explorer
+ // This outfit is never used, because there are no slots for this job.
+ // To get it, you have to go to the HOP and ask for a transfer to it.
+ name = "Explorer"
+ jobtype = /datum/job/explorer
+ uniform = /obj/item/clothing/under/color/random
+ shoes = /obj/item/clothing/shoes/black
diff --git a/code/game/jobs/job/syndicate.dm b/code/game/jobs/job/syndicate.dm
index f7c5659f86c..f1bf52cbc8a 100644
--- a/code/game/jobs/job/syndicate.dm
+++ b/code/game/jobs/job/syndicate.dm
@@ -51,7 +51,7 @@
U.implant(H)
U.hidden_uplink.uses = 500
H.faction += "syndicate"
- var/datum/atom_hud/antag/opshud = huds[ANTAG_HUD_OPS]
+ var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS]
opshud.join_hud(H.mind.current)
H.mind.offstation_role = TRUE
set_antag_hud(H.mind.current, "hudoperative")
diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm
index 7823b4b6f4a..f0e6f9bff42 100644
--- a/code/game/jobs/job_exp.dm
+++ b/code/game/jobs/job_exp.dm
@@ -1,6 +1,6 @@
// Playtime requirements for special roles (hours)
-var/global/list/role_playtime_requirements = list(
+GLOBAL_LIST_INIT(role_playtime_requirements, list(
// NT ROLES
ROLE_PAI = 0,
ROLE_POSIBRAIN = 5, // Same as cyborg job.
@@ -35,7 +35,7 @@ var/global/list/role_playtime_requirements = list(
ROLE_RAIDER = 10,
ROLE_ALIEN = 10,
ROLE_ABDUCTOR = 10,
-)
+))
// Client Verbs
@@ -113,7 +113,7 @@ var/global/list/role_playtime_requirements = list(
var/isexempt = text2num(play_records[EXP_TYPE_EXEMPT])
if(isexempt)
return 0
- var/minimal_player_hrs = role_playtime_requirements[role]
+ var/minimal_player_hrs = GLOB.role_playtime_requirements[role]
if(!minimal_player_hrs)
return 0
var/req_mins = minimal_player_hrs * 60
@@ -163,7 +163,7 @@ var/global/list/role_playtime_requirements = list(
return "[key] has no records."
var/return_text = "
"
var/list/exp_data = list()
- for(var/category in exp_jobsmap)
+ for(var/category in GLOB.exp_jobsmap)
if(text2num(play_records[category]))
exp_data[category] = text2num(play_records[category])
else
@@ -238,7 +238,7 @@ var/global/list/role_playtime_requirements = list(
/client/proc/update_exp_client(var/minutes, var/announce_changes = 0)
if(!src ||!ckey)
return
- var/DBQuery/exp_read = dbcon.NewQuery("SELECT exp FROM [format_table_name("player")] WHERE ckey='[ckey]'")
+ var/DBQuery/exp_read = GLOB.dbcon.NewQuery("SELECT exp FROM [format_table_name("player")] WHERE ckey='[ckey]'")
if(!exp_read.Execute())
var/err = exp_read.ErrorMsg()
log_game("SQL ERROR during exp_update_client read. Error : \[[err]\]\n")
@@ -252,7 +252,7 @@ var/global/list/role_playtime_requirements = list(
if(!hasread)
return
var/list/play_records = list()
- for(var/rtype in exp_jobsmap)
+ for(var/rtype in GLOB.exp_jobsmap)
if(text2num(read_records[rtype]))
play_records[rtype] = text2num(read_records[rtype])
else
@@ -270,9 +270,9 @@ var/global/list/role_playtime_requirements = list(
added_living += minutes
if(announce_changes)
to_chat(mob,"You got: [minutes] Living EXP!")
- for(var/category in exp_jobsmap)
- if(exp_jobsmap[category]["titles"])
- if(myrole in exp_jobsmap[category]["titles"])
+ for(var/category in GLOB.exp_jobsmap)
+ if(GLOB.exp_jobsmap[category]["titles"])
+ if(myrole in GLOB.exp_jobsmap[category]["titles"])
play_records[category] += minutes
if(announce_changes)
to_chat(mob,"You got: [minutes] [category] EXP!")
@@ -290,13 +290,13 @@ var/global/list/role_playtime_requirements = list(
var/new_exp = list2params(play_records)
prefs.exp = new_exp
new_exp = sanitizeSQL(new_exp)
- var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("player")] SET exp = '[new_exp]',lastseen = Now() WHERE ckey='[ckey]'")
+ var/DBQuery/update_query = GLOB.dbcon.NewQuery("UPDATE [format_table_name("player")] SET exp = '[new_exp]',lastseen = Now() WHERE ckey='[ckey]'")
if(!update_query.Execute())
var/err = update_query.ErrorMsg()
log_game("SQL ERROR during exp_update_client write 1. Error : \[[err]\]\n")
message_admins("SQL ERROR during exp_update_client write 1. Error : \[[err]\]\n")
return
- var/DBQuery/update_query_history = dbcon.NewQuery("INSERT INTO [format_table_name("playtime_history")] (ckey, date, time_living, time_ghost) VALUES ('[ckey]',CURDATE(),[added_living],[added_ghost]) ON DUPLICATE KEY UPDATE time_living=time_living+VALUES(time_living),time_ghost=time_ghost+VALUES(time_ghost)")
+ var/DBQuery/update_query_history = GLOB.dbcon.NewQuery("INSERT INTO [format_table_name("playtime_history")] (ckey, date, time_living, time_ghost) VALUES ('[ckey]',CURDATE(),[added_living],[added_ghost]) ON DUPLICATE KEY UPDATE time_living=time_living+VALUES(time_living),time_ghost=time_ghost+VALUES(time_ghost)")
if(!update_query_history.Execute())
var/err = update_query_history.ErrorMsg()
log_game("SQL ERROR during exp_update_client write 2. Error : \[[err]\]\n")
diff --git a/code/game/jobs/job_scaling.dm b/code/game/jobs/job_scaling.dm
deleted file mode 100644
index c062fe6c216..00000000000
--- a/code/game/jobs/job_scaling.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-/hook/roundstart/proc/jobscaling()
- sleep(10 SECONDS) // give everyone time to finish spawning, and the lag to die down
- var/playercount = length(GLOB.clients)
- var/highpop_trigger = 80
-
- if(playercount >= highpop_trigger)
- log_debug("Playercount: [playercount] versus trigger: [highpop_trigger] - loading highpop job config");
- SSjobs.LoadJobs("config/jobs_highpop.txt")
- else
- log_debug("Playercount: [playercount] versus trigger: [highpop_trigger] - keeping standard job config");
- return 1
diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm
index b0d70fb3003..81cc54aa3c3 100644
--- a/code/game/jobs/jobs.dm
+++ b/code/game/jobs/jobs.dm
@@ -1,9 +1,8 @@
-var/list/assistant_occupations = list(
-)
+GLOBAL_LIST_EMPTY(assistant_occupations)
-var/list/command_positions = list(
+GLOBAL_LIST_INIT(command_positions, list(
"Captain",
"Head of Personnel",
"Head of Security",
@@ -11,18 +10,18 @@ var/list/command_positions = list(
"Research Director",
"Chief Medical Officer",
"Nanotrasen Representative"
-)
+))
-var/list/engineering_positions = list(
+GLOBAL_LIST_INIT(engineering_positions, list(
"Chief Engineer",
"Station Engineer",
"Life Support Specialist",
"Mechanic"
-)
+))
-var/list/medical_positions = list(
+GLOBAL_LIST_INIT(medical_positions, list(
"Chief Medical Officer",
"Medical Doctor",
"Geneticist",
@@ -31,18 +30,18 @@ var/list/medical_positions = list(
"Virologist",
"Paramedic",
"Coroner"
-)
+))
-var/list/science_positions = list(
+GLOBAL_LIST_INIT(science_positions, list(
"Research Director",
"Scientist",
"Geneticist", //Part of both medical and science
"Roboticist",
-)
+))
//BS12 EDIT
-var/list/support_positions = list(
+GLOBAL_LIST_INIT(support_positions, list(
"Head of Personnel",
"Bartender",
"Botanist",
@@ -59,20 +58,21 @@ var/list/support_positions = list(
"Barber",
"Magistrate",
"Nanotrasen Representative",
- "Blueshield"
-)
+ "Blueshield",
+ "Explorer"
+))
-var/list/supply_positions = list(
+GLOBAL_LIST_INIT(supply_positions, list(
"Head of Personnel",
"Quartermaster",
"Cargo Technician",
"Shaft Miner"
-)
+))
-var/list/service_positions = support_positions - supply_positions + list("Head of Personnel")
+GLOBAL_LIST_INIT(service_positions, (support_positions - supply_positions + list("Head of Personnel")))
-var/list/security_positions = list(
+GLOBAL_LIST_INIT(security_positions, list(
"Head of Security",
"Warden",
"Detective",
@@ -80,21 +80,21 @@ var/list/security_positions = list(
"Brig Physician",
"Security Pod Pilot",
"Magistrate"
-)
+))
-var/list/civilian_positions = list(
+GLOBAL_LIST_INIT(civilian_positions, list(
"Civilian"
-)
+))
-var/list/nonhuman_positions = list(
+GLOBAL_LIST_INIT(nonhuman_positions, list(
"AI",
"Cyborg",
"Drone",
"pAI"
-)
+))
-var/list/whitelisted_positions = list(
+GLOBAL_LIST_INIT(whitelisted_positions, list(
"Blueshield",
"Nanotrasen Representative",
"Barber",
@@ -102,11 +102,11 @@ var/list/whitelisted_positions = list(
"Brig Physician",
"Magistrate",
"Security Pod Pilot",
-)
+))
/proc/guest_jobbans(var/job)
- return (job in whitelisted_positions)
+ return (job in GLOB.whitelisted_positions)
/proc/get_job_datums()
var/list/occupations = list()
@@ -130,7 +130,7 @@ var/list/whitelisted_positions = list(
return titles
-var/global/list/exp_jobsmap = list(
+GLOBAL_LIST_INIT(exp_jobsmap, list(
EXP_TYPE_LIVING = list(), // all living mobs
EXP_TYPE_CREW = list(titles = command_positions | engineering_positions | medical_positions | science_positions | support_positions | supply_positions | security_positions | civilian_positions | list("AI","Cyborg") | whitelisted_positions), // crew positions
EXP_TYPE_SPECIAL = list(), // antags, ERT, etc
@@ -145,4 +145,4 @@ var/global/list/exp_jobsmap = list(
EXP_TYPE_SILICON = list(titles = list("AI","Cyborg")),
EXP_TYPE_SERVICE = list(titles = service_positions),
EXP_TYPE_WHITELIST = list(titles = whitelisted_positions) // karma-locked jobs
-)
+))
diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm
index 503dd33258e..46b98ce1030 100644
--- a/code/game/jobs/whitelist.dm
+++ b/code/game/jobs/whitelist.dm
@@ -1,15 +1,16 @@
#define WHITELISTFILE "data/whitelist.txt"
-var/list/whitelist = list()
+GLOBAL_LIST_EMPTY(whitelist)
-/hook/startup/proc/loadWhitelist()
+/proc/init_whitelists()
if(config.usewhitelist)
load_whitelist()
- return 1
+ if(config.usealienwhitelist)
+ load_alienwhitelist()
/proc/load_whitelist()
- whitelist = file2list(WHITELISTFILE)
- if(!whitelist.len) whitelist = null
+ GLOB.whitelist = file2list(WHITELISTFILE)
+ if(!GLOB.whitelist.len) GLOB.whitelist = null
/*
/proc/check_whitelist(mob/M, var/rank)
if(!whitelist)
@@ -25,11 +26,11 @@ var/list/whitelist = list()
return 1
if(check_rights(R_ADMIN, 0, M))
return 1
- if(!dbcon.IsConnected())
+ if(!GLOB.dbcon.IsConnected())
to_chat(usr, "Unable to connect to whitelist database. Please try again later. ")
return 0
else
- var/DBQuery/query = dbcon.NewQuery("SELECT job FROM [format_table_name("whitelist")] WHERE ckey='[M.ckey]'")
+ var/DBQuery/query = GLOB.dbcon.NewQuery("SELECT job FROM [format_table_name("whitelist")] WHERE ckey='[M.ckey]'")
query.Execute()
@@ -46,19 +47,14 @@ var/list/whitelist = list()
-/var/list/alien_whitelist = list()
-
-/hook/startup/proc/loadAlienWhitelist()
- if(config.usealienwhitelist)
- load_alienwhitelist()
- return 1
+GLOBAL_LIST_EMPTY(alien_whitelist)
/proc/load_alienwhitelist()
var/text = file2text("config/alienwhitelist.txt")
if(!text)
log_config("Failed to load config/alienwhitelist.txt\n")
else
- alien_whitelist = splittext(text, "\n")
+ GLOB.alien_whitelist = splittext(text, "\n")
//todo: admin aliens
/proc/is_alien_whitelisted(mob/M, var/species)
@@ -70,13 +66,13 @@ var/list/whitelist = list()
return 1
if(check_rights(R_ADMIN, 0))
return 1
- if(!alien_whitelist)
+ if(!GLOB.alien_whitelist)
return 0
- if(!dbcon.IsConnected())
+ if(!GLOB.dbcon.IsConnected())
to_chat(usr, "Unable to connect to whitelist database. Please try again later. ")
return 0
else
- var/DBQuery/query = dbcon.NewQuery("SELECT species FROM [format_table_name("whitelist")] WHERE ckey='[M.ckey]'")
+ var/DBQuery/query = GLOB.dbcon.NewQuery("SELECT species FROM [format_table_name("whitelist")] WHERE ckey='[M.ckey]'")
query.Execute()
while(query.NextRow())
diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm
index 097d2e26da2..d9243005ead 100644
--- a/code/game/machinery/Freezer.dm
+++ b/code/game/machinery/Freezer.dm
@@ -118,7 +118,7 @@
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/machinery/atmospherics/unary/cold_sink/freezer/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/atmospherics/unary/cold_sink/freezer/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["on"] = on ? 1 : 0
data["gasPressure"] = round(air_contents.return_pressure())
@@ -287,7 +287,7 @@
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/machinery/atmospherics/unary/heat_reservoir/heater/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/atmospherics/unary/heat_reservoir/heater/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["on"] = on ? 1 : 0
data["gasPressure"] = round(air_contents.return_pressure())
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index 7317099b8dc..3bcb9675c50 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -136,7 +136,7 @@
/obj/machinery/optable/wrench_act(mob/user, obj/item/I)
. = TRUE
- if(!I.tool_start_check(user, 0))
+ if(!I.tool_start_check(src, user, 0))
return
if(I.use_tool(src, user, 20, volume = I.tool_volume))
to_chat(user, "You deconstruct the table.")
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index 3185cdcddd4..332df41f086 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -30,15 +30,11 @@
/obj/machinery/pdapainter/New()
..()
var/blocked = list(/obj/item/pda/silicon/ai, /obj/item/pda/silicon/robot, /obj/item/pda/silicon/pai, /obj/item/pda/heads,
- /obj/item/pda/clear, /obj/item/pda/syndicate)
+ /obj/item/pda/clear, /obj/item/pda/syndicate, /obj/item/pda/chameleon, /obj/item/pda/chameleon/broken)
- for(var/P in typesof(/obj/item/pda)-blocked)
- var/obj/item/pda/D = new P
-
- //D.name = "PDA Style [colorlist.len+1]" //Gotta set the name, otherwise it all comes up as "PDA"
- D.name = D.icon_state //PDAs don't have unique names, but using the sprite names works.
-
- src.colorlist += D
+ for(var/thing in typesof(/obj/item/pda) - blocked)
+ var/obj/item/pda/P = thing
+ colorlist[initial(P.icon_state)] = initial(P.desc)
/obj/machinery/pdapainter/Destroy()
QDEL_NULL(storedpda)
@@ -104,8 +100,8 @@
if(!in_range(src, user))
return
- storedpda.icon_state = P.icon_state
- storedpda.desc = P.desc
+ storedpda.icon_state = P
+ storedpda.desc = colorlist[P]
else
to_chat(user, "The [src] is empty.")
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 81409b5de86..e4d0befa61e 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -23,6 +23,7 @@
var/initial_bin_rating = 1
var/min_health = -25
var/controls_inside = FALSE
+ var/auto_eject_dead = FALSE
idle_power_usage = 1250
active_power_usage = 2500
@@ -81,8 +82,19 @@
go_out()
/obj/machinery/sleeper/process()
- if(filtering > 0)
- if(beaker)
+ for(var/mob/M as mob in src) // makes sure that simple mobs don't get stuck inside a sleeper when they resist out of occupant's grasp
+ if(M == occupant)
+ continue
+ else
+ M.forceMove(loc)
+
+ if(occupant)
+ if(auto_eject_dead && occupant.stat == DEAD)
+ playsound(loc, 'sound/machines/buzz-sigh.ogg', 40)
+ go_out()
+ return
+
+ if(filtering > 0 && beaker)
// To prevent runtimes from drawing blood from runtime, and to prevent getting IPC blood.
if(!istype(occupant) || !occupant.dna || (NO_BLOOD in occupant.dna.species.species_traits))
filtering = 0
@@ -94,7 +106,6 @@
occupant.reagents.trans_to(beaker, 3)
occupant.transfer_blood_to(beaker, 1)
- if(occupant)
for(var/A in occupant.reagents.addiction_list)
var/datum/reagent/R = A
@@ -106,12 +117,6 @@
occupant.reagents.addiction_list.Remove(R)
qdel(R)
- for(var/mob/M as mob in src) // makes sure that simple mobs don't get stuck inside a sleeper when they resist out of occupant's grasp
- if(M == occupant)
- continue
- else
- M.forceMove(loc)
-
updateDialog()
return
@@ -201,6 +206,7 @@
data["maxchem"] = max_chem
data["minhealth"] = min_health
data["dialysis"] = filtering
+ data["auto_eject_dead"] = auto_eject_dead
if(beaker)
data["isBeakerLoaded"] = 1
if(beaker.reagents)
@@ -255,12 +261,22 @@
inject_chemical(usr,href_list["chemical"],text2num(href_list["amount"]))
else
to_chat(usr, "This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!")
+
if(href_list["removebeaker"])
remove_beaker()
+
if(href_list["togglefilter"])
toggle_filter()
+
if(href_list["ejectify"])
eject()
+
+ if(href_list["auto_eject_dead_on"])
+ auto_eject_dead = TRUE
+
+ if(href_list["auto_eject_dead_off"])
+ auto_eject_dead = FALSE
+
add_fingerprint(usr)
return 1
@@ -510,7 +526,7 @@
if(panel_open)
to_chat(usr, "Close the maintenance panel first.")
return
- if(usr.incapacitated()) //are you cuffed, dying, lying, stunned or other
+ if(usr.incapacitated() || usr.buckled) //are you cuffed, dying, lying, stunned or other
return
if(usr.has_buckled_mobs()) //mob attached to us
to_chat(usr, "[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.")
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 6b6f3087ad2..1ee30b6e9d0 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -314,9 +314,9 @@
occupantData["intOrgan"] = intOrganData
- occupantData["blind"] = (occupant.disabilities & BLIND)
- occupantData["colourblind"] = (occupant.disabilities & COLOURBLIND)
- occupantData["nearsighted"] = (occupant.disabilities & NEARSIGHTED)
+ occupantData["blind"] = (BLINDNESS in occupant.mutations)
+ occupantData["colourblind"] = (COLOURBLIND in occupant.mutations)
+ occupantData["nearsighted"] = (NEARSIGHTED in occupant.mutations)
data["occupant"] = occupantData
return data
@@ -425,6 +425,7 @@
var/AN = ""
var/open = ""
var/infected = ""
+ var/dead = ""
var/robot = ""
var/imp = ""
var/bled = ""
@@ -439,6 +440,8 @@
splint = "Splinted:"
if(e.status & ORGAN_BROKEN)
AN = "[e.broken_description]:"
+ if(e.status & ORGAN_DEAD)
+ dead = "DEAD:"
if(e.is_robotic())
robot = "Robotic:"
if(e.open)
@@ -454,9 +457,9 @@
infected = "Acute Infection:"
if(INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300)
infected = "Acute Infection+:"
- if(INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_TWO + 400)
+ if(INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_TWO + 399)
infected = "Acute Infection++:"
- if(INFECTION_LEVEL_THREE to INFINITY)
+ if(INFECTION_LEVEL_TWO + 400 to INFINITY)
infected = "Septic:"
var/unknown_body = 0
@@ -467,11 +470,14 @@
imp += "Unknown body present:"
if(!AN && !open && !infected & !imp)
AN = "None:"
- dat += "
\nBlood Type: [active2.fields["blood_type"]]
\nDNA: [active2.fields["b_dna"]] \n
@@ -532,7 +532,7 @@
if(stat & (BROKEN|NOPOWER))
return ..(severity)
- for(var/datum/data/record/R in data_core.medical)
+ for(var/datum/data/record/R in GLOB.data_core.medical)
if(prob(10/severity))
switch(rand(1,6))
if(1)
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index 55107809ce3..f2e4c5a7a52 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -18,7 +18,7 @@
var/noserver = "ALERT: No server detected."
var/incorrectkey = "ALERT: Incorrect decryption key!"
var/defaultmsg = "Welcome. Please select an option."
- var/rebootmsg = "%$&(£: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!"
+ var/rebootmsg = "%$&(�: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!"
//Computer properties
var/screen = 0 // 0 = Main menu, 1 = Message Logs, 2 = Hacked screen, 3 = Custom Message
var/hacking = 0 // Is it being hacked into by the AI/Cyborg
@@ -54,7 +54,7 @@
MK.loc = src.loc
playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
// Will help make emagging the console not so easy to get away with.
- MK.info += "
£%@%(*$%&(£&?*(%&£/{}"
+ MK.info += "
�%@%(*$%&(�&?*(%&�/{}"
update_icon()
spawn(100*length(src.linkedServer.decryptkey))
UnmagConsole()
@@ -75,8 +75,8 @@
..()
//Is the server isn't linked to a server, and there's a server available, default it to the first one in the list.
if(!linkedServer)
- if(message_servers && message_servers.len > 0)
- linkedServer = message_servers[1]
+ if(GLOB.message_servers && GLOB.message_servers.len > 0)
+ linkedServer = GLOB.message_servers[1]
return
/obj/machinery/computer/message_monitor/attack_hand(var/mob/user as mob)
@@ -288,11 +288,11 @@
if(auth) linkedServer.active = !linkedServer.active
//Find a server
if(href_list["find"])
- if(message_servers && message_servers.len > 1)
- src.linkedServer = input(usr,"Please select a server.", "Select a server.", null) as null|anything in message_servers
+ if(GLOB.message_servers && GLOB.message_servers.len > 1)
+ src.linkedServer = input(usr,"Please select a server.", "Select a server.", null) as null|anything in GLOB.message_servers
message = "NOTICE: Server selected."
- else if(message_servers && message_servers.len > 0)
- linkedServer = message_servers[1]
+ else if(GLOB.message_servers && GLOB.message_servers.len > 0)
+ linkedServer = GLOB.message_servers[1]
message = "NOTICE: Only Single Server Detected - Server selected."
else
message = noserver
@@ -396,13 +396,13 @@
if("Recepient")
//Get out list of viable PDAs
var/list/obj/item/pda/sendPDAs = list()
- for(var/obj/item/pda/P in PDAs)
+ for(var/obj/item/pda/P in GLOB.PDAs)
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
if(!PM || !PM.can_receive())
continue
sendPDAs += P
- if(PDAs && PDAs.len > 0)
+ if(GLOB.PDAs && GLOB.PDAs.len > 0)
customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortAtom(sendPDAs)
else
customrecepient = null
@@ -436,7 +436,7 @@
return src.attack_hand(usr)
var/obj/item/pda/PDARec = null
- for(var/obj/item/pda/P in PDAs)
+ for(var/obj/item/pda/P in GLOB.PDAs)
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
if(!PM || !PM.can_receive())
@@ -486,11 +486,11 @@
/obj/item/paper/monitorkey/New()
..()
spawn(10)
- if(message_servers)
- for(var/obj/machinery/message_server/server in message_servers)
+ if(GLOB.message_servers)
+ for(var/obj/machinery/message_server/server in GLOB.message_servers)
if(!isnull(server))
if(!isnull(server.decryptkey))
- info = "
Daily Key Reset
The new message monitor key is '[server.decryptkey]'. Please keep this a secret and away from the clown. If necessary, change the password to a more secure one."
+ info = "
"
- if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ if(istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1))
P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
\nSex: [active1.fields["sex"]]
\nAge: [active1.fields["age"]]
@@ -300,7 +300,7 @@
..(severity)
return
- for(var/datum/data/record/R in data_core.security)
+ for(var/datum/data/record/R in GLOB.data_core.security)
if(prob(10/severity))
switch(rand(1,6))
if(1)
@@ -310,7 +310,7 @@
if(3)
R.fields["age"] = rand(5, 85)
if(4)
- R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released")
+ R.fields["criminal"] = pick(SEC_RECORD_STATUS_NONE, SEC_RECORD_STATUS_ARREST, SEC_RECORD_STATUS_INCARCERATED, SEC_RECORD_STATUS_PAROLLED, SEC_RECORD_STATUS_RELEASED)
if(5)
R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
if(6)
diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm
index 23658a3e939..2ba3b25b6f6 100644
--- a/code/game/machinery/computer/specops_shuttle.dm
+++ b/code/game/machinery/computer/specops_shuttle.dm
@@ -4,12 +4,12 @@
#define SPECOPS_DOCK_AREATYPE "/area/shuttle/specops/centcom" //Type of the spec ops shuttle area for dock
#define SPECOPS_RETURN_DELAY 6000 //Time between the shuttle is capable of moving.
-var/specops_shuttle_moving_to_station = 0
-var/specops_shuttle_moving_to_centcom = 0
-var/specops_shuttle_at_station = 0
-var/specops_shuttle_can_send = 1
-var/specops_shuttle_time = 0
-var/specops_shuttle_timeleft = 0
+GLOBAL_VAR_INIT(specops_shuttle_moving_to_station, 0)
+GLOBAL_VAR_INIT(specops_shuttle_moving_to_centcom, 0)
+GLOBAL_VAR_INIT(specops_shuttle_at_station, 0)
+GLOBAL_VAR_INIT(specops_shuttle_can_send, 1)
+GLOBAL_VAR_INIT(specops_shuttle_time, 0)
+GLOBAL_VAR_INIT(specops_shuttle_timeleft, 0)
/obj/machinery/computer/specops_shuttle
name = "\improper Spec. Ops. shuttle console"
@@ -33,16 +33,16 @@ var/specops_shuttle_timeleft = 0
if(announcer)
announcer.autosay(message, "A.L.I.C.E.", "Response Team", list(1,2))
- while(specops_shuttle_time - world.timeofday > 0)
- var/ticksleft = specops_shuttle_time - world.timeofday
+ while(GLOB.specops_shuttle_time - world.timeofday > 0)
+ var/ticksleft = GLOB.specops_shuttle_time - world.timeofday
if(ticksleft > 1e5)
- specops_shuttle_time = world.timeofday + 10 // midnight rollover
- specops_shuttle_timeleft = (ticksleft / 10)
+ GLOB.specops_shuttle_time = world.timeofday + 10 // midnight rollover
+ GLOB.specops_shuttle_timeleft = (ticksleft / 10)
//All this does is announce the time before launch.
if(announcer)
- var/rounded_time_left = round(specops_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
+ var/rounded_time_left = round(GLOB.specops_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
if(rounded_time_left in message_tracker)//If that time is in the list for message announce.
message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\""
if(rounded_time_left==0)
@@ -53,10 +53,10 @@ var/specops_shuttle_timeleft = 0
sleep(5)
- specops_shuttle_moving_to_station = 0
- specops_shuttle_moving_to_centcom = 0
+ GLOB.specops_shuttle_moving_to_station = 0
+ GLOB.specops_shuttle_moving_to_centcom = 0
- specops_shuttle_at_station = 1
+ GLOB.specops_shuttle_at_station = 1
var/area/start_location = locate(/area/shuttle/specops/station)
var/area/end_location = locate(/area/shuttle/specops/centcom)
@@ -91,9 +91,9 @@ var/specops_shuttle_timeleft = 0
var/mob/M = locate(/mob) in T
to_chat(M, "You have arrived at Central Command. Operation has ended!")
- specops_shuttle_at_station = 0
+ GLOB.specops_shuttle_at_station = 0
- for(var/obj/machinery/computer/specops_shuttle/S in world)
+ for(var/obj/machinery/computer/specops_shuttle/S in GLOB.machines)
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
qdel(announcer)
@@ -110,16 +110,16 @@ var/specops_shuttle_timeleft = 0
//message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD"
//announcer.autosay(message, "A.L.I.C.E.", "Response Team")
- while(specops_shuttle_time - world.timeofday > 0)
- var/ticksleft = specops_shuttle_time - world.timeofday
+ while(GLOB.specops_shuttle_time - world.timeofday > 0)
+ var/ticksleft = GLOB.specops_shuttle_time - world.timeofday
if(ticksleft > 1e5)
- specops_shuttle_time = world.timeofday + 10 // midnight rollover
- specops_shuttle_timeleft = (ticksleft / 10)
+ GLOB.specops_shuttle_time = world.timeofday + 10 // midnight rollover
+ GLOB.specops_shuttle_timeleft = (ticksleft / 10)
//All this does is announce the time before launch.
if(announcer)
- var/rounded_time_left = round(specops_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
+ var/rounded_time_left = round(GLOB.specops_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
if(rounded_time_left in message_tracker)//If that time is in the list for message announce.
message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\""
if(rounded_time_left==0)
@@ -130,11 +130,11 @@ var/specops_shuttle_timeleft = 0
sleep(5)
- specops_shuttle_moving_to_station = 0
- specops_shuttle_moving_to_centcom = 0
+ GLOB.specops_shuttle_moving_to_station = 0
+ GLOB.specops_shuttle_moving_to_centcom = 0
- specops_shuttle_at_station = 1
- if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
+ GLOB.specops_shuttle_at_station = 1
+ if(GLOB.specops_shuttle_moving_to_station || GLOB.specops_shuttle_moving_to_centcom) return
if(!specops_can_move())
to_chat(usr, "The Special Operations shuttle is unable to leave.")
@@ -160,10 +160,12 @@ var/specops_shuttle_timeleft = 0
sleep(10)
var/spawn_marauder[] = new()
- for(var/obj/effect/landmark/L in world)
+ for(var/thing in GLOB.landmarks_list)
+ var/obj/effect/landmark/L = thing
if(L.name == "Marauder Entry")
spawn_marauder.Add(L.loc)
- for(var/obj/effect/landmark/L in world)
+ for(var/thing in GLOB.landmarks_list)
+ var/obj/effect/landmark/L = thing
if(L.name == "Marauder Exit")
var/obj/effect/portal/P = new(L.loc, pick(spawn_marauder))
//P.invisibility = 101//So it is not seen by anyone.
@@ -233,15 +235,15 @@ var/specops_shuttle_timeleft = 0
var/mob/M = locate(/mob) in T
to_chat(M, "You have arrived to [station_name()]. Commence operation!")
- for(var/obj/machinery/computer/specops_shuttle/S in world)
+ for(var/obj/machinery/computer/specops_shuttle/S in GLOB.machines)
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
qdel(announcer)
/proc/specops_can_move()
- if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom)
+ if(GLOB.specops_shuttle_moving_to_station || GLOB.specops_shuttle_moving_to_centcom)
return 0
- for(var/obj/machinery/computer/specops_shuttle/S in world)
+ for(var/obj/machinery/computer/specops_shuttle/S in GLOB.machines)
if(world.timeofday <= S.specops_shuttle_timereset)
return 0
return 1
@@ -275,8 +277,8 @@ var/specops_shuttle_timeleft = 0
dat = temp
else
dat += {" Special Operations Shuttle
- \nLocation: [specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom ? "Departing for [station_name()] in ([specops_shuttle_timeleft] seconds.)":specops_shuttle_at_station ? "Station":"Dock"]
- [specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom ? "\n*The Special Ops. shuttle is already leaving.* \n ":specops_shuttle_at_station ? "\nShuttle standing by... \n ":"\nDepart to [station_name()] \n "]
+ \nLocation: [GLOB.specops_shuttle_moving_to_station || GLOB.specops_shuttle_moving_to_centcom ? "Departing for [station_name()] in ([GLOB.specops_shuttle_timeleft] seconds.)":GLOB.specops_shuttle_at_station ? "Station":"Dock"]
+ [GLOB.specops_shuttle_moving_to_station || GLOB.specops_shuttle_moving_to_centcom ? "\n*The Special Ops. shuttle is already leaving.* \n ":GLOB.specops_shuttle_at_station ? "\nShuttle standing by... \n ":"\nDepart to [station_name()] \n "]
\nClose"}
user << browse(dat, "window=computer;size=575x450")
@@ -291,7 +293,7 @@ var/specops_shuttle_timeleft = 0
usr.machine = src
if(href_list["sendtodock"])
- if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
+ if(!GLOB.specops_shuttle_at_station|| GLOB.specops_shuttle_moving_to_station || GLOB.specops_shuttle_moving_to_centcom) return
if(!specops_can_move())
to_chat(usr, "Central Command will not allow the Special Operations shuttle to return yet.")
@@ -306,13 +308,13 @@ var/specops_shuttle_timeleft = 0
temp += "Shuttle departing.
OK"
updateUsrDialog()
- specops_shuttle_moving_to_centcom = 1
- specops_shuttle_time = world.timeofday + SPECOPS_MOVETIME
+ GLOB.specops_shuttle_moving_to_centcom = 1
+ GLOB.specops_shuttle_time = world.timeofday + SPECOPS_MOVETIME
spawn(0)
specops_return()
else if(href_list["sendtostation"])
- if(specops_shuttle_at_station || specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
+ if(GLOB.specops_shuttle_at_station || GLOB.specops_shuttle_moving_to_station || GLOB.specops_shuttle_moving_to_centcom) return
if(!specops_can_move())
to_chat(usr, "The Special Operations shuttle is unable to leave.")
@@ -326,9 +328,9 @@ var/specops_shuttle_timeleft = 0
var/area/centcom/specops/special_ops = locate()
if(special_ops)
special_ops.readyalert()//Trigger alarm for the spec ops area.
- specops_shuttle_moving_to_station = 1
+ GLOB.specops_shuttle_moving_to_station = 1
- specops_shuttle_time = world.timeofday + SPECOPS_MOVETIME
+ GLOB.specops_shuttle_time = world.timeofday + SPECOPS_MOVETIME
spawn(0)
specops_process()
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index fb630d7a251..607918442ea 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -20,7 +20,7 @@
/obj/machinery/computer/station_alert/New()
..()
alarm_monitor = new monitor_type(src)
- alarm_monitor.register(src, /obj/machinery/computer/station_alert/update_icon)
+ alarm_monitor.register(src, /obj/machinery/computer/station_alert/.proc/update_icon)
/obj/machinery/computer/station_alert/Destroy()
alarm_monitor.unregister(src)
diff --git a/code/game/machinery/computer/store.dm b/code/game/machinery/computer/store.dm
index f49d91c53b3..856e2322f71 100644
--- a/code/game/machinery/computer/store.dm
+++ b/code/game/machinery/computer/store.dm
@@ -102,11 +102,11 @@ th.cost.toomuch {background:maroon;}
"}
- for(var/datum/storeitem/item in centcomm_store.items)
+ for(var/datum/storeitem/item in GLOB.centcomm_store.items)
var/cost_class="affordable"
if(item.cost>balance)
cost_class="toomuch"
- var/itemID=centcomm_store.items.Find(item)
+ var/itemID=GLOB.centcomm_store.items.Find(item)
var/row_color="light"
if(itemID%2 == 0)
row_color="dark"
@@ -143,7 +143,7 @@ th.cost.toomuch {background:maroon;}
if(href_list["buy"])
var/itemID = text2num(href_list["buy"])
- var/datum/storeitem/item = centcomm_store.items[itemID]
+ var/datum/storeitem/item = GLOB.centcomm_store.items[itemID]
var/sure = alert(usr,"Are you sure you wish to purchase [item.name] for $[item.cost]?","You sure?","Yes","No") in list("Yes","No")
if(!Adjacent(usr))
to_chat(usr, "You are not close enough to do that.")
@@ -151,7 +151,7 @@ th.cost.toomuch {background:maroon;}
if(sure=="No")
updateUsrDialog()
return
- if(!centcomm_store.PlaceOrder(usr,itemID))
+ if(!GLOB.centcomm_store.PlaceOrder(usr,itemID))
to_chat(usr, "Unable to charge your account.")
else
to_chat(usr, "You've successfully purchased the item. It should be in your hands or on the floor.")
diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm
index aefeaaa864b..7ec7bd7a026 100644
--- a/code/game/machinery/computer/syndicate_specops_shuttle.dm
+++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm
@@ -3,12 +3,12 @@
#define SYNDICATE_ELITE_STATION_AREATYPE "/area/shuttle/syndicate_elite/station" //Type of the spec ops shuttle area for station
#define SYNDICATE_ELITE_DOCK_AREATYPE "/area/shuttle/syndicate_elite/mothership" //Type of the spec ops shuttle area for dock
-var/syndicate_elite_shuttle_moving_to_station = 0
-var/syndicate_elite_shuttle_moving_to_mothership = 0
-var/syndicate_elite_shuttle_at_station = 0
-var/syndicate_elite_shuttle_can_send = 1
-var/syndicate_elite_shuttle_time = 0
-var/syndicate_elite_shuttle_timeleft = 0
+GLOBAL_VAR_INIT(syndicate_elite_shuttle_moving_to_station, 0)
+GLOBAL_VAR_INIT(syndicate_elite_shuttle_moving_to_mothership, 0)
+GLOBAL_VAR_INIT(syndicate_elite_shuttle_at_station, 0)
+GLOBAL_VAR_INIT(syndicate_elite_shuttle_can_send, 1)
+GLOBAL_VAR_INIT(syndicate_elite_shuttle_time, 0)
+GLOBAL_VAR_INIT(syndicate_elite_shuttle_timeleft, 0)
/obj/machinery/computer/syndicate_elite_shuttle
name = "\improper Elite Syndicate Squad shuttle console"
@@ -23,7 +23,7 @@ var/syndicate_elite_shuttle_timeleft = 0
/proc/syndicate_elite_process()
var/area/syndicate_mothership/control/syndicate_ship = locate()//To find announcer. This area should exist for this proc to work.
- var/area/syndicate_mothership/elite_squad/elite_squad = locate()//Where is the specops area located?
+ //var/area/syndicate_mothership/elite_squad/elite_squad = locate()//Where is the specops area located?
var/mob/living/silicon/decoy/announcer = locate() in syndicate_ship//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values.
@@ -33,16 +33,16 @@ var/syndicate_elite_shuttle_timeleft = 0
// message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD"
// announcer.say(message)
- while(syndicate_elite_shuttle_time - world.timeofday > 0)
- var/ticksleft = syndicate_elite_shuttle_time - world.timeofday
+ while(GLOB.syndicate_elite_shuttle_time - world.timeofday > 0)
+ var/ticksleft = GLOB.syndicate_elite_shuttle_time - world.timeofday
if(ticksleft > 1e5)
- syndicate_elite_shuttle_time = world.timeofday // midnight rollover
- syndicate_elite_shuttle_timeleft = (ticksleft / 10)
+ GLOB.syndicate_elite_shuttle_time = world.timeofday // midnight rollover
+ GLOB.syndicate_elite_shuttle_timeleft = (ticksleft / 10)
//All this does is announce the time before launch.
if(announcer)
- var/rounded_time_left = round(syndicate_elite_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
+ var/rounded_time_left = round(GLOB.syndicate_elite_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
if(rounded_time_left in message_tracker)//If that time is in the list for message announce.
message = "ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN"
if(rounded_time_left==0)
@@ -53,17 +53,16 @@ var/syndicate_elite_shuttle_timeleft = 0
sleep(5)
- syndicate_elite_shuttle_moving_to_station = 0
- syndicate_elite_shuttle_moving_to_mothership = 0
+ GLOB.syndicate_elite_shuttle_moving_to_station = 0
+ GLOB.syndicate_elite_shuttle_moving_to_mothership = 0
- syndicate_elite_shuttle_at_station = 1
- if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
+ GLOB.syndicate_elite_shuttle_at_station = 1
+ if(GLOB.syndicate_elite_shuttle_moving_to_station || GLOB.syndicate_elite_shuttle_moving_to_mothership) return
if(!syndicate_elite_can_move())
to_chat(usr, "The Syndicate Elite shuttle is unable to leave.")
return
- sleep(600)
/*
//Begin Marauder launchpad.
spawn(0)//So it parallel processes it.
@@ -129,11 +128,12 @@ var/syndicate_elite_shuttle_timeleft = 0
if("ASSAULT3")
spawn(0)
M.close()
- */
elite_squad.readyreset()//Reset firealarm after the team launched.
+ */
//End Marauder launchpad.
- for(var/obj/effect/landmark/L in GLOB.landmarks_list)
+ for(var/thing in GLOB.landmarks_list)
+ var/obj/effect/landmark/L = thing
if(L.name == "Syndicate Breach Area")
explosion(L.loc,4,6,8,10,0)
@@ -174,7 +174,7 @@ var/syndicate_elite_shuttle_timeleft = 0
to_chat(M, "You have arrived to [station_name()]. Commence operation!")
/proc/syndicate_elite_can_move()
- if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return 0
+ if(GLOB.syndicate_elite_shuttle_moving_to_station || GLOB.syndicate_elite_shuttle_moving_to_mothership) return 0
else return 1
/obj/machinery/computer/syndicate_elite_shuttle/attack_ai(var/mob/user as mob)
@@ -205,8 +205,8 @@ var/syndicate_elite_shuttle_timeleft = 0
dat = temp
else
dat = {" Special Operations Shuttle
- \nLocation: [syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership ? "Departing for [station_name()] in ([syndicate_elite_shuttle_timeleft] seconds.)":syndicate_elite_shuttle_at_station ? "Station":"Dock"]
- [syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership ? "\n*The Syndicate Elite shuttle is already leaving.* \n ":syndicate_elite_shuttle_at_station ? "\nShuttle Offline \n ":"\nDepart to [station_name()] \n "]
+ \nLocation: [GLOB.syndicate_elite_shuttle_moving_to_station || GLOB.syndicate_elite_shuttle_moving_to_mothership ? "Departing for [station_name()] in ([GLOB.syndicate_elite_shuttle_timeleft] seconds.)":GLOB.syndicate_elite_shuttle_at_station ? "Station":"Dock"]
+ [GLOB.syndicate_elite_shuttle_moving_to_station || GLOB.syndicate_elite_shuttle_moving_to_mothership ? "\n*The Syndicate Elite shuttle is already leaving.* \n ":GLOB.syndicate_elite_shuttle_at_station ? "\nShuttle Offline \n ":"\nDepart to [station_name()] \n "]
\nClose"}
user << browse(dat, "window=computer;size=575x450")
@@ -221,13 +221,13 @@ var/syndicate_elite_shuttle_timeleft = 0
usr.set_machine(src)
if(href_list["sendtodock"])
- if(!syndicate_elite_shuttle_at_station|| syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
+ if(!GLOB.syndicate_elite_shuttle_at_station|| GLOB.syndicate_elite_shuttle_moving_to_station || GLOB.syndicate_elite_shuttle_moving_to_mothership) return
to_chat(usr, "The Syndicate will not allow the Elite Squad shuttle to return.")
return
else if(href_list["sendtostation"])
- if(syndicate_elite_shuttle_at_station || syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
+ if(GLOB.syndicate_elite_shuttle_at_station || GLOB.syndicate_elite_shuttle_moving_to_station || GLOB.syndicate_elite_shuttle_moving_to_mothership) return
if(!specops_can_move())
to_chat(usr, "The Syndicate Elite shuttle is unable to leave.")
@@ -241,9 +241,9 @@ var/syndicate_elite_shuttle_timeleft = 0
var/area/syndicate_mothership/elite_squad/elite_squad = locate()
if(elite_squad)
elite_squad.readyalert()//Trigger alarm for the spec ops area.
- syndicate_elite_shuttle_moving_to_station = 1
+ GLOB.syndicate_elite_shuttle_moving_to_station = 1
- syndicate_elite_shuttle_time = world.timeofday + SYNDICATE_ELITE_MOVETIME
+ GLOB.syndicate_elite_shuttle_time = world.timeofday + SYNDICATE_ELITE_MOVETIME
spawn(0)
syndicate_elite_process()
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index efee10767ba..ee29504fe99 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -218,7 +218,7 @@
//Machine Frame Circuit Boards
/*Common Parts: Parts List: Ignitor, Timer, Infra-red laser, Infra-red sensor, t_scanner, Capacitor, Valve, sensor unit,
-micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
+micro-manipulator, glass sheets, beaker, Microlaser, matter bin, power cells.
Note: Once everything is added to the public areas, will add MAT_METAL and MAT_GLASS to circuit boards since autolathe won't be able
to destroy them and players will be able to make replacements.
*/
@@ -226,7 +226,6 @@ to destroy them and players will be able to make replacements.
name = "circuit board (Booze-O-Mat Vendor)"
board_type = "machine"
origin_tech = "programming=1"
- frame_desc = "Requires 1 Resupply Canister."
build_path = /obj/machinery/vending/boozeomat
req_components = list(/obj/item/vending_refill/boozeomat = 1)
@@ -282,7 +281,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/power/smes
board_type = "machine"
origin_tech = "programming=3;powerstorage=3;engineering=3"
- frame_desc = "Requires 5 pieces of cable, 5 Power Cells and 1 Capacitor."
req_components = list(
/obj/item/stack/cable_coil = 5,
/obj/item/stock_parts/cell = 5,
@@ -321,7 +319,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/atmospherics/unary/cold_sink/freezer
board_type = "machine"
origin_tech = "programming=3;plasmatech=3"
- frame_desc = "Requires 2 Matter Bins, 2 Micro Lasers, 1 piece of cable and 1 Console Screen."
req_components = list(
/obj/item/stock_parts/matter_bin = 2,
/obj/item/stock_parts/micro_laser = 2,
@@ -346,7 +343,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/recharger
board_type = "machine"
origin_tech = "powerstorage=3;materials=2"
- frame_desc = "Requires 1 Capacitor"
req_components = list(/obj/item/stock_parts/capacitor = 1)
/obj/item/circuitboard/snow_machine
@@ -354,7 +350,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/snow_machine
board_type = "machine"
origin_tech = "programming=2;materials=2"
- frame_desc = "Requires 1 Matter Bin and 1 Micro Laser."
req_components = list(
/obj/item/stock_parts/matter_bin = 1,
/obj/item/stock_parts/micro_laser = 1)
@@ -364,7 +359,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/biogenerator
board_type = "machine"
origin_tech = "programming=2;biotech=3;materials=3"
- frame_desc = "Requires 1 Matter Bin, 1 Manipulator, 1 piece of cable and 1 Console Screen."
req_components = list(
/obj/item/stock_parts/matter_bin = 1,
/obj/item/stock_parts/manipulator = 1,
@@ -376,7 +370,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/plantgenes
board_type = "machine"
origin_tech = "programming=3;biotech=3"
- frame_desc = "Requires 1 Manipulator, 1 Micro Laser, 1 Console Screen, and 1 Scanning Module."
req_components = list(
/obj/item/stock_parts/manipulator = 1,
/obj/item/stock_parts/micro_laser = 1,
@@ -390,7 +383,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/seed_extractor
board_type = "machine"
origin_tech = "programming=1"
- frame_desc = "Requires 1 Matter Bin and 1 Manipulator."
req_components = list(
/obj/item/stock_parts/matter_bin = 1,
/obj/item/stock_parts/manipulator = 1)
@@ -400,7 +392,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/hydroponics/constructable
board_type = "machine"
origin_tech = "programming=1;biotech=2"
- frame_desc = "Requires 2 Matter Bins, 1 Manipulator, and 1 Console Screen."
req_components = list(
/obj/item/stock_parts/matter_bin = 2,
/obj/item/stock_parts/manipulator = 1,
@@ -411,7 +402,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/kitchen_machine/microwave
board_type = "machine"
origin_tech = "programming=2;magnets=2"
- frame_desc = "Requires 1 Micro Laser, 2 pieces of cable and 1 Console Screen."
req_components = list(
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stack/cable_coil = 2,
@@ -422,7 +412,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/kitchen_machine/oven
board_type = "machine"
origin_tech = "programming=2;magnets=2"
- frame_desc = "Requires 2 Micro Lasers, 5 pieces of cable and 1 Console Screen."
req_components = list(
/obj/item/stock_parts/micro_laser = 2,
/obj/item/stack/cable_coil = 5,
@@ -433,7 +422,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/kitchen_machine/grill
board_type = "machine"
origin_tech = "programming=2;magnets=2"
- frame_desc = "Requires 2 Micro Lasers, 5 pieces of cable and 1 Console Screen."
req_components = list(
/obj/item/stock_parts/micro_laser = 2,
/obj/item/stack/cable_coil = 5,
@@ -444,7 +432,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/kitchen_machine/candy_maker
board_type = "machine"
origin_tech = "programming=2;magnets=2"
- frame_desc = "Requires 1 Manipulator, 5 pieces of cable and 1 Console Screen."
req_components = list(
/obj/item/stock_parts/manipulator = 1,
/obj/item/stack/cable_coil = 5,
@@ -455,7 +442,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/cooker/deepfryer
board_type = "machine"
origin_tech = "programming=1"
- frame_desc = "Requires 2 Micro Lasers and 5 pieces of cable."
req_components = list(
/obj/item/stock_parts/micro_laser = 2,
/obj/item/stack/cable_coil = 5)
@@ -568,7 +554,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/chem_dispenser
board_type = "machine"
origin_tech = "materials=4;programming=4;plasmatech=4;biotech=3"
- frame_desc = "Requires 2 Matter Bins, 1 Capacitor, 1 Manipulator, 1 Console Screen, and 1 Power Cell."
req_components = list( /obj/item/stock_parts/matter_bin = 2,
/obj/item/stock_parts/capacitor = 1,
/obj/item/stock_parts/manipulator = 1,
@@ -609,7 +594,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/chem_heater
board_type = "machine"
origin_tech = "programming=2;engineering=2;biotech=2"
- frame_desc = "Requires 1 Micro Laser and 1 Console Screen."
req_components = list(
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stack/sheet/glass = 1)
@@ -619,7 +603,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/reagentgrinder/empty
board_type = "machine"
origin_tech = "materials=2;engineering=2;biotech=2"
- frame_desc = "Requires 2 Manipulators and 1 Matter Bin."
req_components = list(
/obj/item/stock_parts/manipulator = 2,
/obj/item/stock_parts/matter_bin = 1)
@@ -640,7 +623,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/r_n_d/destructive_analyzer
board_type = "machine"
origin_tech = "magnets=2;engineering=2;programming=2"
- frame_desc = "Requires 1 Scanning Module, 1 Manipulator, and 1 Micro-Laser."
req_components = list(
/obj/item/stock_parts/scanning_module = 1,
/obj/item/stock_parts/manipulator = 1,
@@ -651,7 +633,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/autolathe
board_type = "machine"
origin_tech = "engineering=2;programming=2"
- frame_desc = "Requires 3 Matter Bins, 1 Manipulator, and 1 Console Screen."
req_components = list(
/obj/item/stock_parts/matter_bin = 3,
/obj/item/stock_parts/manipulator = 1,
@@ -662,7 +643,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/r_n_d/protolathe
board_type = "machine"
origin_tech = "engineering=2;programming=2"
- frame_desc = "Requires 2 Matter Bins, 2 Manipulators, and 2 Beakers."
req_components = list(
/obj/item/stock_parts/matter_bin = 2,
/obj/item/stock_parts/manipulator = 2,
@@ -681,7 +661,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/r_n_d/circuit_imprinter
board_type = "machine"
origin_tech = "engineering=2;programming=2"
- frame_desc = "Requires 1 Matter Bin, 1 Manipulator, and 2 Beakers."
req_components = list(
/obj/item/stock_parts/matter_bin = 1,
/obj/item/stock_parts/manipulator = 1,
@@ -692,7 +671,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/power/port_gen/pacman
board_type = "machine"
origin_tech = "programming=2;powerstorage=3;plasmatech=3;engineering=3"
- frame_desc = "Requires 1 Matter Bin, 1 Micro-Laser, 2 Pieces of Cable, and 1 Capacitor."
req_components = list(
/obj/item/stock_parts/matter_bin = 1,
/obj/item/stock_parts/micro_laser = 1,
@@ -714,7 +692,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/r_n_d/server
board_type = "machine"
origin_tech = "programming=3"
- frame_desc = "Requires 2 pieces of cable, and 1 Scanning Module."
req_components = list(
/obj/item/stack/cable_coil = 2,
/obj/item/stock_parts/scanning_module = 1)
@@ -724,7 +701,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/mecha_part_fabricator
board_type = "machine"
origin_tech = "programming=2;engineering=2"
- frame_desc = "Requires 2 Matter Bins, 1 Manipulator, 1 Micro-Laser and 1 Console Screen."
req_components = list(
/obj/item/stock_parts/matter_bin = 2,
/obj/item/stock_parts/manipulator = 1,
@@ -736,7 +712,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/mecha_part_fabricator/spacepod
board_type = "machine"
origin_tech = "programming=2;engineering=2"
- frame_desc = "Requires 2 Matter Bins, 1 Manipulators, 1 Micro-Lasers, and 1 Console Screen."
req_components = list(
/obj/item/stock_parts/matter_bin = 2,
/obj/item/stock_parts/manipulator = 1,
@@ -749,7 +724,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/clonepod
board_type = "machine"
origin_tech = "programming=2;biotech=2"
- frame_desc = "Requires 2 Manipulator, 2 Scanning Module, 2 pieces of cable and 1 Console Screen."
req_components = list(
/obj/item/stack/cable_coil = 2,
/obj/item/stock_parts/scanning_module = 2,
@@ -761,7 +735,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/dna_scannernew
board_type = "machine"
origin_tech = "programming=2;biotech=2"
- frame_desc = "Requires 1 Scanning Module, 1 Manipulator, 1 Micro-Laser, 2 pieces of cable and 1 Console Screen."
req_components = list(
/obj/item/stock_parts/scanning_module = 1,
/obj/item/stock_parts/manipulator = 1,
@@ -774,7 +747,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/mech_bay_recharge_port
board_type = "machine"
origin_tech = "programming=3;powerstorage=3;engineering=3"
- frame_desc = "Requires 1 piece of cable and 5 Capacitors."
req_components = list(
/obj/item/stack/cable_coil = 1,
/obj/item/stock_parts/capacitor = 5)
@@ -784,7 +756,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/teleport/hub
board_type = "machine"
origin_tech = "programming=3;engineering=4;bluespace=4;materials=4"
- frame_desc = "Requires 3 Bluespace Crystals and 1 Matter Bin."
req_components = list(
/obj/item/stack/ore/bluespace_crystal = 3,
/obj/item/stock_parts/matter_bin = 1)
@@ -794,7 +765,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/teleport/station
board_type = "machine"
origin_tech = "programming=4;engineering=4;bluespace=4;plasmatech=3"
- frame_desc = "Requires 2 Bluespace Crystals, 2 Capacitors and 1 Console Screen."
req_components = list(
/obj/item/stack/ore/bluespace_crystal = 2,
/obj/item/stock_parts/capacitor = 2,
@@ -805,7 +775,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/teleport/perma
board_type = "machine"
origin_tech = "programming=3;engineering=4;bluespace=4;materials=4"
- frame_desc = "Requires 3 Bluespace Crystals and 1 Matter Bin."
req_components = list(
/obj/item/stack/ore/bluespace_crystal = 3,
/obj/item/stock_parts/matter_bin = 1)
@@ -825,7 +794,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/telepad
board_type = "machine"
origin_tech = "programming=4;engineering=3;plasmatech=4;bluespace=4"
- frame_desc = "Requires 2 Bluespace Crystals, 1 Capacitor, 1 piece of cable and 1 Console Screen."
req_components = list(
/obj/item/stack/ore/bluespace_crystal = 2,
/obj/item/stock_parts/capacitor = 1,
@@ -837,7 +805,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/quantumpad
board_type = "machine"
origin_tech = "programming=3;engineering=3;plasmatech=3;bluespace=4"
- frame_desc = "Requires 1 Bluespace Crystal, 1 Capacitor, 1 piece of cable and 1 Manipulator."
req_components = list(
/obj/item/stack/ore/bluespace_crystal = 1,
/obj/item/stock_parts/capacitor = 1,
@@ -849,7 +816,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/sleeper
board_type = "machine"
origin_tech = "programming=3;biotech=2;engineering=3"
- frame_desc = "Requires 1 Matter Bin, 1 Manipulator, 1 piece of cable and 2 Console Screens."
req_components = list(
/obj/item/stock_parts/matter_bin = 1,
/obj/item/stock_parts/manipulator = 1,
@@ -870,7 +836,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/bodyscanner
board_type = "machine"
origin_tech = "programming=3;biotech=2;engineering=3"
- frame_desc = "Requires 1 Scanning Module, 2 pieces of cable and 2 Console Screens."
req_components = list(
/obj/item/stock_parts/scanning_module = 1,
/obj/item/stack/cable_coil = 2,
@@ -881,7 +846,6 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/atmospherics/unary/cryo_cell
board_type = "machine"
origin_tech = "programming=4;biotech=3;engineering=4;plasmatech=3"
- frame_desc = "Requires 1 Matter Bin, 1 piece of cable and 4 Console Screens."
req_components = list(
/obj/item/stock_parts/matter_bin = 1,
/obj/item/stack/cable_coil = 1,
@@ -892,96 +856,26 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/recharge_station
board_type = "machine"
origin_tech = "powerstorage=3;engineering=3"
- frame_desc = "Requires 2 Capacitors, 1 Power Cell and 1 Manipulator."
req_components = list(
/obj/item/stock_parts/capacitor = 2,
/obj/item/stock_parts/cell = 1,
/obj/item/stock_parts/manipulator = 1)
// Telecomms circuit boards:
-/obj/item/circuitboard/telecomms/receiver
- name = "Circuit Board (Subspace Receiver)"
- build_path = /obj/machinery/telecomms/receiver
- board_type = "machine"
- origin_tech = "programming=2;engineering=2;bluespace=1"
- frame_desc = "Requires 1 Subspace Ansible, 1 Hyperwave Filter, 2 Manipulators, and 1 Micro-Laser."
- req_components = list(
- /obj/item/stock_parts/subspace/ansible = 1,
- /obj/item/stock_parts/subspace/filter = 1,
- /obj/item/stock_parts/manipulator = 2,
- /obj/item/stock_parts/micro_laser = 1)
-
-/obj/item/circuitboard/telecomms/hub
- name = "Circuit Board (Hub Mainframe)"
- build_path = /obj/machinery/telecomms/hub
- board_type = "machine"
- origin_tech = "programming=2;engineering=2"
- frame_desc = "Requires 2 Manipulators, 2 Cable Coil and 2 Hyperwave Filter."
- req_components = list(
- /obj/item/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 2,
- /obj/item/stock_parts/subspace/filter = 2)
-
-/obj/item/circuitboard/telecomms/relay
- name = "Circuit Board (Relay Mainframe)"
- build_path = /obj/machinery/telecomms/relay
+/obj/item/circuitboard/tcomms/relay
+ name = "Circuit Board (Telecommunications Relay)"
+ build_path = /obj/machinery/tcomms/relay
board_type = "machine"
origin_tech = "programming=2;engineering=2;bluespace=2"
- frame_desc = "Requires 2 Manipulators, 2 Cable Coil and 2 Hyperwave Filters."
- req_components = list(
- /obj/item/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 2,
- /obj/item/stock_parts/subspace/filter = 2)
+ req_components = list(/obj/item/stock_parts/manipulator = 2, /obj/item/stack/cable_coil = 2)
-/obj/item/circuitboard/telecomms/bus
- name = "Circuit Board (Bus Mainframe)"
- build_path = /obj/machinery/telecomms/bus
+/obj/item/circuitboard/tcomms/core
+ name = "Circuit Board (Telecommunications Core)"
+ build_path = /obj/machinery/tcomms/core
board_type = "machine"
origin_tech = "programming=2;engineering=2"
- frame_desc = "Requires 2 Manipulators, 1 Cable Coil and 1 Hyperwave Filter."
- req_components = list(
- /obj/item/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 1,
- /obj/item/stock_parts/subspace/filter = 1)
-
-/obj/item/circuitboard/telecomms/processor
- name = "Circuit Board (Processor Unit)"
- build_path = /obj/machinery/telecomms/processor
- board_type = "machine"
- origin_tech = "programming=2;engineering=2"
- frame_desc = "Requires 3 Manipulators, 1 Hyperwave Filter, 2 Treatment Disks, 1 Wavelength Analyzer, 2 Cable Coils and 1 Subspace Amplifier."
- req_components = list(
- /obj/item/stock_parts/manipulator = 3,
- /obj/item/stock_parts/subspace/filter = 1,
- /obj/item/stock_parts/subspace/treatment = 2,
- /obj/item/stock_parts/subspace/analyzer = 1,
- /obj/item/stack/cable_coil = 2,
- /obj/item/stock_parts/subspace/amplifier = 1)
-
-/obj/item/circuitboard/telecomms/server
- name = "Circuit Board (Telecommunication Server)"
- build_path = /obj/machinery/telecomms/server
- board_type = "machine"
- origin_tech = "programming=2;engineering=2"
- frame_desc = "Requires 2 Manipulators, 1 Cable Coil and 1 Hyperwave Filter."
- req_components = list(
- /obj/item/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 1,
- /obj/item/stock_parts/subspace/filter = 1)
-
-/obj/item/circuitboard/telecomms/broadcaster
- name = "Circuit Board (Subspace Broadcaster)"
- build_path = /obj/machinery/telecomms/broadcaster
- board_type = "machine"
- origin_tech = "programming=2;engineering=2;bluespace=1"
- frame_desc = "Requires 2 Manipulators, 1 Cable Coil, 1 Hyperwave Filter, 1 Ansible Crystal and 2 High-Powered Micro-Lasers. "
- req_components = list(
- /obj/item/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 1,
- /obj/item/stock_parts/subspace/filter = 1,
- /obj/item/stock_parts/subspace/crystal = 1,
- /obj/item/stock_parts/micro_laser/high = 2)
-
+ req_components = list(/obj/item/stock_parts/manipulator = 2, /obj/item/stack/cable_coil = 2)
+// End telecomms circuit boards
/obj/item/circuitboard/ore_redemption
name = "circuit board (Ore Redemption)"
build_path = /obj/machinery/mineral/ore_redemption
@@ -1042,50 +936,3 @@ to destroy them and players will be able to make replacements.
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stack/cable_coil = 3,
/obj/item/stack/sheet/glass = 1)
-
-//Selectable mode board, like vending machine boards
-/obj/item/circuitboard/logic_gate
- name = "circuit board (Logic Connector)"
- build_path = /obj/machinery/logic_gate
- board_type = "machine"
- origin_tech = "programming=1" //This stuff is pretty much the absolute basis of programming, so it's mostly useless for research
- req_components = list(/obj/item/stack/cable_coil = 1)
-
- var/list/names_paths = list(
- "NOT Gate" = /obj/machinery/logic_gate/not,
- "OR Gate" = /obj/machinery/logic_gate/or,
- "AND Gate" = /obj/machinery/logic_gate/and,
- "NAND Gate" = /obj/machinery/logic_gate/nand,
- "NOR Gate" = /obj/machinery/logic_gate/nor,
- "XOR Gate" = /obj/machinery/logic_gate/xor,
- "XNOR Gate" = /obj/machinery/logic_gate/xnor,
- "STATUS Gate" = /obj/machinery/logic_gate/status,
- "CONVERT Gate" = /obj/machinery/logic_gate/convert
- )
-
-/obj/item/circuitboard/logic_gate/New()
- ..()
- if(build_path == /obj/machinery/logic_gate) //If we spawn the base type board (determined by the base type machine as the build path), become a random gate board
- var/new_path = names_paths[pick(names_paths)]
- set_type(new_path)
-
-/obj/item/circuitboard/logic_gate/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/screwdriver))
- set_type(null, user)
- return
- return ..()
-
-/obj/item/circuitboard/logic_gate/proc/set_type(typepath, mob/user)
- var/new_name = "Logic Base"
- if(!typepath)
- new_name = input("Circuit Setting", "What would you change the board setting to?") in names_paths
- typepath = names_paths[new_name]
- else
- for(var/name in names_paths)
- if(names_paths[name] == typepath)
- new_name = name
- break
- build_path = typepath
- name = "circuit board ([new_name])"
- if(user)
- to_chat(user, "You set the board to [new_name].")
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 3ce6a8702f5..4213ff517bf 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -1,3 +1,6 @@
+#define AUTO_EJECT_DEAD (1<<0)
+#define AUTO_EJECT_HEALTHY (1<<1)
+
/obj/machinery/atmospherics/unary/cryo_cell
name = "cryo cell"
desc = "Lowers the body temperature so certain medications may take effect."
@@ -10,11 +13,12 @@
interact_offline = 1
max_integrity = 350
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 30, "acid" = 30)
- var/on = 0
+ var/on = FALSE
var/temperature_archived
var/mob/living/carbon/occupant = null
var/obj/item/reagent_containers/glass/beaker = null
- var/autoeject = 0
+ /// Holds two bitflags, AUTO_EJECT_DEAD and AUTO_EJECT_HEALTHY. Used to determine if the cryo cell will auto-eject dead and/or completely health patients.
+ var/auto_eject_prefs = NONE
var/next_trans = 0
var/current_heat_capacity = 50
@@ -68,7 +72,7 @@
/obj/machinery/atmospherics/unary/cryo_cell/atmos_init()
..()
if(node) return
- for(var/cdir in cardinal)
+ for(var/cdir in GLOB.cardinal)
node = findConnecting(cdir)
if(node)
break
@@ -139,18 +143,20 @@
/obj/machinery/atmospherics/unary/cryo_cell/process()
..()
- if(autoeject)
- if(occupant)
- if(!occupant.has_organic_damage() && !occupant.has_mutated_organs())
- on = 0
- go_out()
- playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
+ if(!occupant)
+ return
+
+ if((auto_eject_prefs & AUTO_EJECT_DEAD) && occupant.stat == DEAD)
+ auto_eject(AUTO_EJECT_DEAD)
+ return
+ if((auto_eject_prefs & AUTO_EJECT_HEALTHY) && !occupant.has_organic_damage() && !occupant.has_mutated_organs())
+ auto_eject(AUTO_EJECT_HEALTHY)
+ return
if(air_contents)
- if(occupant)
- process_occupant()
+ process_occupant()
- return 1
+ return TRUE
/obj/machinery/atmospherics/unary/cryo_cell/process_atmos()
..()
@@ -208,13 +214,13 @@
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
- ui = new(user, src, ui_key, "cryo.tmpl", "Cryo Cell Control System", 520, 420)
+ ui = new(user, src, ui_key, "cryo.tmpl", "Cryo Cell Control System", 520, 480)
// open the new ui window
ui.open()
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/machinery/atmospherics/unary/cryo_cell/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/atmospherics/unary/cryo_cell/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["isOperating"] = on
data["hasOccupant"] = occupant ? 1 : 0
@@ -231,7 +237,7 @@
occupantData["toxLoss"] = occupant.getToxLoss()
occupantData["fireLoss"] = occupant.getFireLoss()
occupantData["bodyTemperature"] = occupant.bodytemperature
- data["occupant"] = occupantData;
+ data["occupant"] = occupantData
data["cellTemperature"] = round(air_contents.temperature)
data["cellTemperatureStatus"] = "good"
@@ -249,7 +255,8 @@
for(var/datum/reagent/R in beaker.reagents.reagent_list)
data["beakerVolume"] += R.volume
- data["autoeject"] = autoeject
+ data["auto_eject_healthy"] = (auto_eject_prefs & AUTO_EJECT_HEALTHY) ? TRUE : FALSE
+ data["auto_eject_dead"] = (auto_eject_prefs & AUTO_EJECT_DEAD) ? TRUE : FALSE
return data
/obj/machinery/atmospherics/unary/cryo_cell/Topic(href, href_list)
@@ -260,18 +267,24 @@
return 0 // don't update UIs attached to this object
if(href_list["switchOn"])
- on = 1
+ on = TRUE
update_icon()
if(href_list["switchOff"])
- on = 0
+ on = FALSE
update_icon()
- if(href_list["autoejectOn"])
- autoeject = 1
+ if(href_list["auto_eject_healthy_on"])
+ auto_eject_prefs |= AUTO_EJECT_HEALTHY
- if(href_list["autoejectOff"])
- autoeject = 0
+ if(href_list["auto_eject_healthy_off"])
+ auto_eject_prefs &= ~AUTO_EJECT_HEALTHY
+
+ if(href_list["auto_eject_dead_on"])
+ auto_eject_prefs |= AUTO_EJECT_DEAD
+
+ if(href_list["auto_eject_dead_off"])
+ auto_eject_prefs &= ~AUTO_EJECT_DEAD
if(href_list["ejectBeaker"])
if(beaker)
@@ -430,6 +443,16 @@
for(var/atom/movable/A in contents - component_parts - list(beaker))
A.forceMove(get_step(loc, SOUTH))
+/// Called when either the occupant is dead and the AUTO_EJECT_DEAD flag is present, OR the occupant is alive, has no external damage, and the AUTO_EJECT_HEALTHY flag is present.
+/obj/machinery/atmospherics/unary/cryo_cell/proc/auto_eject(eject_flag)
+ on = FALSE
+ go_out()
+ switch(eject_flag)
+ if(AUTO_EJECT_HEALTHY)
+ playsound(loc, 'sound/machines/ding.ogg', 50, 1)
+ if(AUTO_EJECT_DEAD)
+ playsound(loc, 'sound/machines/buzz-sigh.ogg', 40)
+
/obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob)
if(!istype(M))
to_chat(usr, "The cryo cell cannot handle such a lifeform!")
@@ -493,7 +516,7 @@
if(stat & (NOPOWER|BROKEN))
return
- if(usr.incapacitated()) //are you cuffed, dying, lying, stunned or other
+ if(usr.incapacitated() || usr.buckled) //are you cuffed, dying, lying, stunned or other
return
put_mob(usr)
@@ -510,8 +533,17 @@
/datum/data/function/proc/display()
return
-/obj/machinery/atmospherics/components/unary/cryo_cell/get_remote_view_fullscreens(mob/user)
+/obj/machinery/atmospherics/unary/cryo_cell/get_remote_view_fullscreens(mob/user)
user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1)
-/obj/machinery/atmospherics/components/unary/cryo_cell/update_remote_sight(mob/living/user)
+/obj/machinery/atmospherics/unary/cryo_cell/update_remote_sight(mob/living/user)
return //we don't see the pipe network while inside cryo.
+
+/obj/machinery/atmospherics/unary/cryo_cell/can_crawl_through()
+ return // can't ventcrawl in or out of cryo.
+
+/obj/machinery/atmospherics/unary/cryo_cell/can_see_pipes()
+ return FALSE // you can't see the pipe network when inside a cryo cell.
+
+#undef AUTO_EJECT_HEALTHY
+#undef AUTO_EJECT_DEAD
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index b1a78f2825f..36196ea4eca 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -40,7 +40,7 @@
/obj/machinery/computer/cryopod/New()
..()
- for(var/T in potential_theft_objectives)
+ for(var/T in GLOB.potential_theft_objectives)
theft_cache += new T
/obj/machinery/computer/cryopod/attack_ai()
@@ -275,6 +275,12 @@
return control_computer != null
+// So the user can use movement keys to get out of the cryopod
+/obj/machinery/cryopod/relaymove(mob/user)
+ if(user.incapacitated())
+ return FALSE
+ go_out()
+
/obj/machinery/cryopod/proc/check_occupant_allowed(mob/M)
var/correct_type = 0
for(var/type in allow_occupant_types)
@@ -416,15 +422,15 @@
// Delete them from datacore.
var/announce_rank = null
- if(PDA_Manifest.len)
- PDA_Manifest.Cut()
- for(var/datum/data/record/R in data_core.medical)
+ if(GLOB.PDA_Manifest.len)
+ GLOB.PDA_Manifest.Cut()
+ for(var/datum/data/record/R in GLOB.data_core.medical)
if((R.fields["name"] == occupant.real_name))
qdel(R)
- for(var/datum/data/record/T in data_core.security)
+ for(var/datum/data/record/T in GLOB.data_core.security)
if((T.fields["name"] == occupant.real_name))
qdel(T)
- for(var/datum/data/record/G in data_core.general)
+ for(var/datum/data/record/G in GLOB.data_core.general)
if((G.fields["name"] == occupant.real_name))
announce_rank = G.fields["rank"]
qdel(G)
@@ -438,7 +444,7 @@
control_computer.frozen_crew += "[occupant.real_name]"
var/ailist[] = list()
- for(var/mob/living/silicon/ai/A in GLOB.living_mob_list)
+ for(var/mob/living/silicon/ai/A in GLOB.alive_mob_list)
ailist += A
if(ailist.len)
var/mob/living/silicon/ai/announcer = pick(ailist)
@@ -665,6 +671,9 @@
to_chat(usr, "[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.")
return
+ if(usr.incapacitated() || usr.buckled) //are you cuffed, dying, lying, stunned or other
+ return
+
visible_message("[usr] starts climbing into [src].")
if(do_after(usr, 20, target = usr))
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 1fb2dfc422d..baf32ab742c 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -400,7 +400,7 @@
while(time)
sleep(speed)
for(var/i in 1 to speed)
- M.setDir(pick(cardinal))
+ M.setDir(pick(GLOB.cardinal))
M.resting = !M.resting
M.update_canmove()
time--
diff --git a/code/game/machinery/defib_mount.dm b/code/game/machinery/defib_mount.dm
index 738fc115734..79d02155832 100644
--- a/code/game/machinery/defib_mount.dm
+++ b/code/game/machinery/defib_mount.dm
@@ -15,6 +15,9 @@
var/obj/item/defibrillator/defib //this mount's defibrillator
var/clamps_locked = FALSE //if true, and a defib is loaded, it can't be removed without unlocking the clamps
+/obj/machinery/defibrillator_mount/attack_ai()
+ return
+
/obj/machinery/defibrillator_mount/get_cell()
if(defib)
return defib.get_cell()
@@ -26,11 +29,10 @@
loc = location
if(direction)
- dir = direction
+ setDir(direction)
if(building)
- pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30)
- pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0
+ set_pixel_offsets_from_dir(30, -30, 30, -30)
/obj/machinery/defibrillator_mount/loaded/New() //loaded subtype for mapping use
..()
@@ -45,7 +47,7 @@
. = ..()
if(defib)
. += "There is a defib unit hooked up. Alt-click to remove it."
- if(security_level >= SEC_LEVEL_RED)
+ if(GLOB.security_level >= SEC_LEVEL_RED)
. += "Due to a security situation, its locking clamps can be toggled by swiping any ID."
else
. += "Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access."
@@ -100,7 +102,7 @@
return
var/obj/item/card/id = I.GetID()
if(id)
- if(check_access(id) || security_level >= SEC_LEVEL_RED) //anyone can toggle the clamps in red alert!
+ if(check_access(id) || GLOB.security_level >= SEC_LEVEL_RED) //anyone can toggle the clamps in red alert!
if(!defib)
to_chat(user, "You can't engage the clamps on a defibrillator that isn't there.")
return
@@ -154,6 +156,6 @@
w_class = WEIGHT_CLASS_BULKY
/obj/item/mounted/frame/defib_mount/do_build(turf/on_wall, mob/user)
- new /obj/machinery/defibrillator_mount(get_turf(src), get_dir(on_wall, user), 1)
+ new /obj/machinery/defibrillator_mount(get_turf(src), get_dir(user, on_wall), 1)
playsound(src, 'sound/machines/click.ogg', 50, TRUE)
qdel(src)
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 1d97056912f..ffb56109e9e 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -30,6 +30,8 @@
new stacktype(get_turf(src), drop_amount)
/obj/structure/barricade/welder_act(mob/user, obj/item/I)
+ if(bar_material != METAL)
+ return
if(obj_integrity >= max_integrity)
to_chat(user, "[src] does not need repairs.")
return
@@ -40,7 +42,7 @@
WELDER_ATTEMPT_REPAIR_MESSAGE
if(I.use_tool(src, user, 40, volume = I.tool_volume))
WELDER_REPAIR_SUCCESS_MESSAGE
- obj_integrity = Clamp(obj_integrity + 20, 0, max_integrity)
+ obj_integrity = clamp(obj_integrity + 20, 0, max_integrity)
update_icon()
return TRUE
@@ -71,6 +73,7 @@
bar_material = WOOD
stacktype = /obj/item/stack/sheet/wood
+
/obj/structure/barricade/wooden/attackby(obj/item/I, mob/user)
if(istype(I,/obj/item/stack/sheet/wood))
var/obj/item/stack/sheet/wood/W = I
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 5ba3885faff..42ff08ff00f 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -38,7 +38,7 @@
#define AIRLOCK_DAMAGE_DEFLECTION_N 21 // Normal airlock damage deflection
#define AIRLOCK_DAMAGE_DEFLECTION_R 30 // Reinforced airlock damage deflection
-var/list/airlock_overlays = list()
+GLOBAL_LIST_EMPTY(airlock_overlays)
/obj/machinery/door/airlock
name = "airlock"
@@ -80,6 +80,7 @@ var/list/airlock_overlays = list()
var/note_overlay_file = 'icons/obj/doors/airlocks/station/overlays.dmi' //Used for papers and photos pinned to the airlock
var/normal_integrity = AIRLOCK_INTEGRITY_N
var/prying_so_hard = FALSE
+ var/paintable = TRUE // If the airlock type can be painted with an airlock painter
var/image/old_frame_overlay //keep those in order to prevent unnecessary updating
var/image/old_filling_overlay
@@ -192,10 +193,10 @@ About the new airlock wires panel:
return wires.IsIndexCut(wireIndex)
/obj/machinery/door/airlock/proc/canAIControl()
- return ((aiControlDisabled!=1) && (!isAllPowerLoss()));
+ return ((aiControlDisabled!=1) && (!isAllPowerLoss()))
/obj/machinery/door/airlock/proc/canAIHack()
- return ((aiControlDisabled==1) && (!hackProof) && (!isAllPowerLoss()));
+ return ((aiControlDisabled==1) && (!hackProof) && (!isAllPowerLoss()))
/obj/machinery/door/airlock/proc/arePowerSystemsOn()
if(stat & (NOPOWER|BROKEN))
@@ -219,21 +220,21 @@ About the new airlock wires panel:
return isWireCut(AIRLOCK_WIRE_BACKUP_POWER1)
/obj/machinery/door/airlock/proc/loseMainPower()
- main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60)
+ main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + 60 SECONDS
if(main_power_lost_until > 0)
- main_power_timer = addtimer(CALLBACK(src, .proc/regainMainPower), SecondsToTicks(60), TIMER_UNIQUE | TIMER_STOPPABLE)
+ main_power_timer = addtimer(CALLBACK(src, .proc/regainMainPower), 60 SECONDS, TIMER_UNIQUE | TIMER_STOPPABLE)
// If backup power is permanently disabled then activate in 10 seconds if possible, otherwise it's already enabled or a timer is already running
if(backup_power_lost_until == -1 && !backupPowerCablesCut())
- backup_power_lost_until = world.time + SecondsToTicks(10)
- backup_power_timer = addtimer(CALLBACK(src, .proc/regainBackupPower), SecondsToTicks(10), TIMER_UNIQUE | TIMER_STOPPABLE)
+ backup_power_lost_until = world.time + 10 SECONDS
+ backup_power_timer = addtimer(CALLBACK(src, .proc/regainBackupPower), 10 SECONDS, TIMER_UNIQUE | TIMER_STOPPABLE)
// Disable electricity if required
if(electrified_until && isAllPowerLoss())
electrify(0)
/obj/machinery/door/airlock/proc/loseBackupPower()
- backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60)
+ backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + 60 SECONDS
if(backup_power_lost_until > 0)
- backup_power_timer = addtimer(CALLBACK(src, .proc/regainBackupPower), SecondsToTicks(60), TIMER_UNIQUE | TIMER_STOPPABLE)
+ backup_power_timer = addtimer(CALLBACK(src, .proc/regainBackupPower), 60 SECONDS, TIMER_UNIQUE | TIMER_STOPPABLE)
// Disable electricity if required
if(electrified_until && isAllPowerLoss())
@@ -276,20 +277,21 @@ About the new airlock wires panel:
if(usr)
shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])")
usr.create_attack_log("Electrified the [name] at [x] [y] [z]")
+ add_attack_logs(usr, src, "Electrified", ATKLOG_ALL)
else
shockedby += text("\[[time_stamp()]\] - EMP)")
message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]."
- electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration)
+ electrified_until = duration == -1 ? -1 : world.time + duration SECONDS
if(duration != -1)
- electrified_timer = addtimer(CALLBACK(src, .proc/electrify, 0), SecondsToTicks(duration), TIMER_UNIQUE | TIMER_STOPPABLE)
+ electrified_timer = addtimer(CALLBACK(src, .proc/electrify, 0), duration SECONDS, TIMER_UNIQUE | TIMER_STOPPABLE)
if(feedback && message)
to_chat(usr, message)
// shock user with probability prb (if all connections & power are working)
// returns 1 if shocked, 0 otherwise
// The preceding comment was borrowed from the grille's shock script
-/obj/machinery/door/airlock/shock(mob/user, prb)
- if(!arePowerSystemsOn())
+/obj/machinery/door/airlock/shock(mob/living/user, prb)
+ if(!istype(user) || !arePowerSystemsOn())
return FALSE
if(shockCooldown > world.time)
return FALSE //Already shocked someone recently?
@@ -483,10 +485,10 @@ About the new airlock wires panel:
/proc/get_airlock_overlay(icon_state, icon_file)
var/iconkey = "[icon_state][icon_file]"
- if(airlock_overlays[iconkey])
- return airlock_overlays[iconkey]
- airlock_overlays[iconkey] = image(icon_file, icon_state)
- return airlock_overlays[iconkey]
+ if(GLOB.airlock_overlays[iconkey])
+ return GLOB.airlock_overlays[iconkey]
+ GLOB.airlock_overlays[iconkey] = image(icon_file, icon_state)
+ return GLOB.airlock_overlays[iconkey]
/obj/machinery/door/airlock/do_animate(animation)
switch(animation)
@@ -501,6 +503,36 @@ About the new airlock wires panel:
sleep(6)
update_icon(AIRLOCK_CLOSED)
+
+/// Called when a player uses an airlock painter on this airlock
+/obj/machinery/door/airlock/proc/change_paintjob(obj/item/airlock_painter/painter, mob/user)
+ if((!in_range(src, user) && loc != user)) // user should be adjacent to the airlock.
+ return
+
+ if(!painter.paint_setting)
+ to_chat(user, "You need to select a paintjob first.")
+ return
+
+ if(!paintable)
+ to_chat(user, "This type of airlock cannot be painted.")
+ return
+
+ var/obj/machinery/door/airlock/airlock = painter.available_paint_jobs["[painter.paint_setting]"] // get the airlock type path associated with the airlock name the user just chose
+ var/obj/structure/door_assembly/assembly = initial(airlock.assemblytype)
+
+ if(airlock_material == "glass" && initial(assembly.noglass)) // prevents painting glass airlocks with a paint job that doesn't have a glass version, such as the freezer
+ to_chat(user, "This paint job can only be applied to non-glass airlocks.")
+ return
+
+ if(do_after(user, 20, target = src))
+ // applies the user-chosen airlock's icon, overlays and assemblytype to the src airlock
+ painter.paint(user)
+ icon = initial(airlock.icon)
+ overlays_file = initial(airlock.overlays_file)
+ assemblytype = initial(airlock.assemblytype)
+ update_icon()
+
+
/obj/machinery/door/airlock/examine(mob/user)
. = ..()
if(emagged)
@@ -550,7 +582,7 @@ About the new airlock wires panel:
ui.open()
ui.set_auto_update(1)
-/obj/machinery/door/airlock/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/door/airlock/ui_data(mob/user, datum/topic_state/state = GLOB.default_state)
var/data[0]
data["main_power_loss"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1)
@@ -763,6 +795,7 @@ About the new airlock wires panel:
else if(activate) //electrify door for 30 seconds
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
usr.create_attack_log("Electrified the [name] at [x] [y] [z]")
+ add_attack_logs(usr, src, "Electrified", ATKLOG_ALL)
to_chat(usr, "The door is now electrified for thirty seconds.")
electrify(30)
if("electrify_permanently")
@@ -774,6 +807,7 @@ About the new airlock wires panel:
else if(activate)
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
usr.create_attack_log("Electrified the [name] at [x] [y] [z]")
+ add_attack_logs(usr, src, "Electrified", ATKLOG_ALL)
to_chat(usr, "The door is now electrified.")
electrify(-1)
if("open")
@@ -861,7 +895,7 @@ About the new airlock wires panel:
update_icon()
return
- else if(istype(C, /obj/item/assembly/signaler))
+ if(istype(C, /obj/item/assembly/signaler))
return interact_with_panel(user)
else if(istype(C, /obj/item/pai_cable)) // -- TLE
var/obj/item/pai_cable/cable = C
@@ -873,10 +907,14 @@ About the new airlock wires panel:
if(!user.unEquip(C))
to_chat(user, "For some reason, you can't attach [C]!")
return
+ C.add_fingerprint(user)
+ user.create_log(MISC_LOG, "put [C] on", src)
C.forceMove(src)
user.visible_message("[user] pins [C] to [src].", "You pin [C] to [src].")
note = C
update_icon()
+ else if(istype(C, /obj/item/airlock_painter))
+ change_paintjob(C, user)
else
return ..()
@@ -930,7 +968,7 @@ About the new airlock wires panel:
if(!panel_open || user.a_intent == INTENT_HARM)
return
. = TRUE
- if(!I.tool_start_check(user, 0))
+ if(!I.tool_start_check(src, user, 0))
return
if(security_level == AIRLOCK_SECURITY_PLASTEEL)
if(arePowerSystemsOn() && shock(user, 60)) // Protective grille of wiring is electrified
@@ -946,7 +984,7 @@ About the new airlock wires panel:
if(note)
remove_airlock_note(user, TRUE)
else
- return interact_with_panel(user)
+ interact_with_panel(user)
/obj/machinery/door/airlock/multitool_act(mob/user, obj/item/I)
if(!headbutt_shock_check(user))
@@ -962,63 +1000,58 @@ About the new airlock wires panel:
. = TRUE
if(!I.tool_use_check(user, 0))
return
- switch(security_level)
- if(AIRLOCK_SECURITY_METAL)
- to_chat(user, "You begin cutting the panel's shielding...")
- if(!I.use_tool(src, user, 40, volume = I.tool_volume))
- return
- if(!panel_open)
- return
- visible_message("[user] cuts through \the [src]'s shielding.",
- "You cut through \the [src]'s shielding.",
- "You hear welding.")
- security_level = AIRLOCK_SECURITY_NONE
- spawn_atom_to_turf(/obj/item/stack/sheet/metal, user.loc, 2)
- if(AIRLOCK_SECURITY_PLASTEEL_O)
- to_chat(user, "You begin cutting the outer layer of shielding...")
- if(!I.use_tool(src, user, 40, volume = I.tool_volume))
- return
- if(!panel_open)
- return
- visible_message("[user] cuts through \the [src]'s shielding.",
- "You cut through \the [src]'s shielding.",
- "You hear welding.")
- security_level = AIRLOCK_SECURITY_PLASTEEL_O_S
- if(AIRLOCK_SECURITY_PLASTEEL_I)
- to_chat(user, "You begin cutting the inner layer of shielding...")
- if(!I.use_tool(src, user, 40, volume = I.tool_volume))
- return
- if(!panel_open)
- return
- user.visible_message("[user] cuts through \the [src]'s shielding.",
- "You cut through \the [src]'s shielding.",
- "You hear welding.")
- security_level = AIRLOCK_SECURITY_PLASTEEL_I_S
- else
- if(user.a_intent != INTENT_HELP)
- user.visible_message("[user] is [welded ? "unwelding":"welding"] the airlock.", \
- "You begin [welded ? "unwelding":"welding"] the airlock...", \
+ if(panel_open) // panel should be open before we try to slice out any shielding.
+ switch(security_level)
+ if(AIRLOCK_SECURITY_METAL)
+ to_chat(user, "You begin cutting the panel's shielding...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume))
+ return
+ visible_message("[user] cuts through \the [src]'s shielding.",
+ "You cut through \the [src]'s shielding.",
"You hear welding.")
+ security_level = AIRLOCK_SECURITY_NONE
+ spawn_atom_to_turf(/obj/item/stack/sheet/metal, user.loc, 2)
+ if(AIRLOCK_SECURITY_PLASTEEL_O)
+ to_chat(user, "You begin cutting the outer layer of shielding...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume))
+ return
+ visible_message("[user] cuts through \the [src]'s shielding.",
+ "You cut through \the [src]'s shielding.",
+ "You hear welding.")
+ security_level = AIRLOCK_SECURITY_PLASTEEL_O_S
+ if(AIRLOCK_SECURITY_PLASTEEL_I)
+ to_chat(user, "You begin cutting the inner layer of shielding...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume))
+ return
+ user.visible_message("[user] cuts through \the [src]'s shielding.",
+ "You cut through \the [src]'s shielding.",
+ "You hear welding.")
+ security_level = AIRLOCK_SECURITY_PLASTEEL_I_S
+ else
+ if(user.a_intent != INTENT_HELP)
+ user.visible_message("[user] is [welded ? "unwelding":"welding"] the airlock.", \
+ "You begin [welded ? "unwelding":"welding"] the airlock...", \
+ "You hear welding.")
- if(I.use_tool(src, user, 40, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/weld_checks, I, user)))
- if(!density && !welded)
- return
- welded = !welded
- user.visible_message("[user.name] has [welded? "welded shut":"unwelded"] [src].", \
- "You [welded ? "weld the airlock shut":"unweld the airlock"].")
- update_icon()
- else if(obj_integrity < max_integrity)
- user.visible_message("[user] is welding the airlock.", \
- "You begin repairing the airlock...", \
- "You hear welding.")
- if(I.use_tool(src, user, 40, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/weld_checks, I, user)))
- obj_integrity = max_integrity
- stat &= ~BROKEN
- user.visible_message("[user.name] has repaired [src].", \
- "You finish repairing the airlock.")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/weld_checks, I, user)))
+ if(!density && !welded)
+ return
+ welded = !welded
+ user.visible_message("[user.name] has [welded? "welded shut":"unwelded"] [src].", \
+ "You [welded ? "weld the airlock shut":"unweld the airlock"].")
update_icon()
- else
- to_chat(user, "The airlock doesn't need repairing.")
+ else if(obj_integrity < max_integrity)
+ user.visible_message("[user] is welding the airlock.", \
+ "You begin repairing the airlock...", \
+ "You hear welding.")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/weld_checks, I, user)))
+ obj_integrity = max_integrity
+ stat &= ~BROKEN
+ user.visible_message("[user.name] has repaired [src].", \
+ "You finish repairing the airlock.")
+ update_icon()
+ else
+ to_chat(user, "The airlock doesn't need repairing.")
update_icon()
/obj/machinery/door/airlock/proc/weld_checks(obj/item/I, mob/user)
@@ -1214,7 +1247,7 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/emp_act(severity)
..()
if(prob(40/severity))
- var/duration = world.time + SecondsToTicks(30 / severity)
+ var/duration = world.time + (30 / severity) SECONDS
if(duration > electrified_until)
electrify(duration)
@@ -1344,10 +1377,13 @@ About the new airlock wires panel:
if (ishuman(user) && user.a_intent == INTENT_GRAB)//grab that note
user.visible_message("[user] removes [note] from [src].", "You remove [note] from [src].")
playsound(src, 'sound/items/poster_ripped.ogg', 50, 1)
- else return FALSE
+ else
+ return FALSE
else
user.visible_message("[user] cuts down [note] from [src].", "You remove [note] from [src].")
playsound(src, 'sound/items/wirecutter.ogg', 50, 1)
+ note.add_fingerprint(user)
+ user.create_log(MISC_LOG, "removed [note] from", src)
user.put_in_hands(note)
note = null
update_icon()
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index 260d26493c0..660c6df683e 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -29,12 +29,12 @@
t1 += " Unrestricted Access Settings "
var/list/Directions = list("North","South",,"East",,,,"West")
- for(var/direction in cardinal)
+ for(var/direction in GLOB.cardinal)
if (unres_direction && unres_direction == direction)
t1 += "[Directions[direction]] "
else
t1 += "[Directions[direction]] "
-
+
t1 += ""
t1 += "Access requirement is set to "
t1 += one_access ? "ONE" : "ALL"
@@ -74,7 +74,7 @@
if(href_list["access"])
toggle_access(href_list["access"])
-
+
if(href_list["unres_direction"])
unres_direction = text2num(href_list["unres_direction"])
if (unres_sides == unres_direction)
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index fccb77c5e2a..dd9581a5af3 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -115,6 +115,7 @@
name = "gold airlock"
icon = 'icons/obj/doors/airlocks/station/gold.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_gold
+ paintable = FALSE
/obj/machinery/door/airlock/gold/glass
opacity = 0
@@ -124,6 +125,7 @@
name = "silver airlock"
icon = 'icons/obj/doors/airlocks/station/silver.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_silver
+ paintable = FALSE
/obj/machinery/door/airlock/silver/glass
opacity = 0
@@ -135,6 +137,7 @@
assemblytype = /obj/structure/door_assembly/door_assembly_diamond
normal_integrity = 1000
explosion_block = 2
+ paintable = FALSE
/obj/machinery/door/airlock/diamond/glass
normal_integrity = 950
@@ -146,6 +149,7 @@
desc = "And they said I was crazy."
icon = 'icons/obj/doors/airlocks/station/uranium.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_uranium
+ paintable = FALSE
var/event_step = 20
/obj/machinery/door/airlock/uranium/New()
@@ -169,6 +173,7 @@
desc = "No way this can end badly."
icon = 'icons/obj/doors/airlocks/station/plasma.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_plasma
+ paintable = FALSE
/obj/machinery/door/airlock/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
@@ -214,6 +219,7 @@
assemblytype = /obj/structure/door_assembly/door_assembly_bananium
doorOpen = 'sound/items/bikehorn.ogg'
doorClose = 'sound/items/bikehorn.ogg'
+ paintable = FALSE
/obj/machinery/door/airlock/bananium/glass
opacity = 0
@@ -227,11 +233,13 @@
doorDeni = null
boltUp = null
boltDown = null
+ paintable = FALSE
/obj/machinery/door/airlock/sandstone
name = "sandstone airlock"
icon = 'icons/obj/doors/airlocks/station/sandstone.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_sandstone
+ paintable = FALSE
/obj/machinery/door/airlock/sandstone/glass
opacity = 0
@@ -241,6 +249,7 @@
name = "wooden airlock"
icon = 'icons/obj/doors/airlocks/station/wood.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_wood
+ paintable = FALSE
/obj/machinery/door/airlock/wood/glass
opacity = 0
@@ -252,6 +261,7 @@
icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi'
overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi'
normal_integrity = 400
+ paintable = FALSE
/obj/machinery/door/airlock/titanium/glass
normal_integrity = 350
@@ -317,6 +327,7 @@
explosion_block = 2
normal_integrity = 400 // reverse engieneerd: 400 * 1.5 (sec lvl 6) = 600 = original
security_level = 6
+ paintable = FALSE
//////////////////////////////////
/*
@@ -329,6 +340,7 @@
overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_hatch
+ paintable = FALSE
/obj/machinery/door/airlock/hatch/syndicate
name = "syndicate hatch"
@@ -400,6 +412,7 @@
overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_mhatch
+ paintable = FALSE
//////////////////////////////////
/*
@@ -415,6 +428,7 @@
normal_integrity = 500
security_level = 1
damage_deflection = 30
+ paintable = FALSE
/obj/machinery/door/airlock/highsecurity/red
name = "secure armory airlock"
@@ -457,6 +471,7 @@
icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi'
overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_shuttle
+ paintable = FALSE
/obj/machinery/door/airlock/shuttle/glass
opacity = 0
@@ -475,6 +490,7 @@
aiControlDisabled = 1
normal_integrity = 700
security_level = 1
+ paintable = FALSE
//////////////////////////////////
/*
@@ -489,6 +505,7 @@
damage_deflection = 10
hackProof = TRUE
aiControlDisabled = TRUE
+ paintable = FALSE
var/openingoverlaytype = /obj/effect/temp_visual/cult/door
var/friendly = FALSE
@@ -575,6 +592,7 @@
overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi'
note_overlay_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi'
assemblytype = /obj/structure/door_assembly/multi_tile
+ paintable = FALSE
/obj/machinery/door/airlock/multi_tile/narsie_act()
return
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index dbc76ade250..9970974e4ff 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -2,6 +2,7 @@
#define FONT_SIZE "5pt"
#define FONT_COLOR "#09f"
#define FONT_STYLE "Small Fonts"
+#define CELL_NONE "None"
///////////////////////////////////////////////////////////////////////////////////////////////
// Brig Door control displays.
@@ -31,10 +32,13 @@
maptext_height = 26
maptext_width = 32
maptext_y = -1
- var/occupant = "None"
- var/crimes = "None"
+ var/occupant = CELL_NONE
+ var/crimes = CELL_NONE
var/time = 0
- var/officer = "None"
+ var/officer = CELL_NONE
+ var/prisoner_name = ""
+ var/prisoner_charge = ""
+ var/prisoner_time = ""
/obj/machinery/door_timer/New()
GLOB.celltimers_list += src
@@ -45,33 +49,29 @@
return ..()
/obj/machinery/door_timer/proc/print_report()
- var/logname = input(usr, "Name of the guilty?","[id] log name")
- var/logcharges = stripped_multiline_input(usr, "What have they been charged with?","[id] log charges")
-
- if(!logname || !logcharges)
+ if(occupant == CELL_NONE || crimes == CELL_NONE)
return 0
- occupant = logname
- crimes = logcharges
+
time = timetoset
officer = usr.name
for(var/obj/machinery/computer/prisoner/C in GLOB.prisoncomputer_list)
var/obj/item/paper/P = new /obj/item/paper(C.loc)
- P.name = "[id] log - [logname] [station_time_timestamp()]"
+ P.name = "[id] log - [occupant] [station_time_timestamp()]"
P.info = "
[id] - Brig record
"
P.info += {"
[station_name()] - Security Department
Admission data:
Log generated at: [station_time_timestamp()]
- Detainee: [logname]
+ Detainee: [occupant] Duration: [seconds_to_time(timetoset / 10)]
- Charge(s): [logcharges]
+ Charge(s): [crimes] Arresting Officer: [usr.name]
This log file was generated automatically upon activation of a cell timer."}
playsound(C.loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
GLOB.cell_logs += P
- var/datum/data/record/G = find_record("name", logname, data_core.general)
+ var/datum/data/record/G = find_record("name", occupant, GLOB.data_core.general)
var/prisoner_drank = "unknown"
var/prisoner_trank = "unknown"
if(G)
@@ -80,9 +80,9 @@
if(G.fields["real_rank"]) // Ignore alt job titles - necessary for lookups
prisoner_trank = G.fields["real_rank"]
- var/datum/data/record/R = find_security_record("name", logname)
+ var/datum/data/record/R = find_security_record("name", occupant)
- var/announcetext = "Detainee [logname] ([prisoner_drank]) has been incarcerated for [seconds_to_time(timetoset / 10)] for the charges of, '[logcharges]'. \
+ var/announcetext = "Detainee [occupant] ([prisoner_drank]) has been incarcerated for [seconds_to_time(timetoset / 10)] for the charges of: '[crimes]'. \
Arresting Officer: [usr.name].[R ? "" : " Detainee record not found, manual record update required."]"
Radio.autosay(announcetext, name, "Security", list(z))
@@ -91,15 +91,16 @@
if(R)
prisoner = R
- R.fields["criminal"] = "Incarcerated"
+ R.fields["criminal"] = SEC_RECORD_STATUS_INCARCERATED
var/mob/living/carbon/human/M = usr
var/rank = "UNKNOWN RANK"
- if(istype(M) && M.wear_id)
- var/obj/item/card/id/I = M.wear_id
- rank = I.assignment
+ if(istype(M))
+ var/obj/item/card/id/I = M.get_id_card()
+ if(I)
+ rank = I.assignment
if(!R.fields["comments"] || !islist(R.fields["comments"])) //copied from security computer code because apparently these need to be initialized
R.fields["comments"] = list()
- R.fields["comments"] += "Autogenerated by [name] on [current_date_string] [station_time_timestamp()] Sentenced to [timetoset/10] seconds for the charges of \"[logcharges]\" by [rank] [usr.name]."
+ R.fields["comments"] += "Autogenerated by [name] on [GLOB.current_date_string] [station_time_timestamp()] Sentenced to [timetoset/10] seconds for the charges of \"[crimes]\" by [rank] [usr.name]."
update_all_mob_security_hud()
return 1
@@ -118,7 +119,7 @@
var/boss_title = brigged_job.department_head[1]
var/obj/item/pda/target_pda
- for(var/obj/item/pda/check_pda in PDAs)
+ for(var/obj/item/pda/check_pda in GLOB.PDAs)
if(check_pda.ownrank == boss_title)
target_pda = check_pda
if(!target_pda)
@@ -136,8 +137,7 @@
Radio.config(list("Security" = 0))
Radio.follow_target = src
- pixel_x = ((dir & 3)? (0) : (dir == 4 ? 32 : -32))
- pixel_y = ((dir & 3)? (dir ==1 ? 32 : -32) : (0))
+ set_pixel_offsets_from_dir(32, -32, 32, -32)
spawn(20)
for(var/obj/machinery/door/window/brigdoor/M in GLOB.airlocks)
@@ -175,12 +175,10 @@
if(timing)
if(timeleft() <= 0)
Radio.autosay("Timer has expired. Releasing prisoner.", name, "Security", list(z))
- occupant = "None"
+ occupant = CELL_NONE
timer_end() // open doors, reset timer, clear status screen
timing = 0
. = PROCESS_KILL
-
- updateUsrDialog()
update_icon()
else
timer_end()
@@ -203,8 +201,8 @@
if(!printed)
if(!print_report())
- timing = 0
- return 0
+ timing = FALSE
+ return FALSE
// Set releasetime
releasetime = world.timeofday + timetoset
@@ -237,14 +235,14 @@
return 0
// Reset vars
- occupant = "None"
- crimes = "None"
+ occupant = CELL_NONE
+ crimes = CELL_NONE
time = 0
- officer = "None"
+ officer = CELL_NONE
releasetime = 0
printed = 0
if(prisoner)
- prisoner.fields["criminal"] = "Released"
+ prisoner.fields["criminal"] = SEC_RECORD_STATUS_RELEASED
update_all_mob_security_hud()
prisoner = null
@@ -290,10 +288,11 @@
//Allows AIs to use door_timer, see human attack_hand function below
/obj/machinery/door_timer/attack_ai(mob/user)
- interact(user)
+ attack_hand(user)
+ ui_interact(user)
/obj/machinery/door_timer/attack_ghost(mob/user)
- interact(user)
+ ui_interact(user)
//Allows humans to use door_timer
//Opens dialog window when someone clicks on door timer
@@ -302,98 +301,71 @@
/obj/machinery/door_timer/attack_hand(mob/user)
if(..())
return
- interact(user)
+ ui_interact(user)
-/obj/machinery/door_timer/interact(mob/user)
- // Used for the 'time left' display
- var/second = round(timeleft() % 60)
- var/minute = round((timeleft() - second) / 60)
+/obj/machinery/door_timer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "brig_timer.tmpl", "Brig Timer", 500, 400)
+ ui.open()
+ ui.set_auto_update(TRUE)
- // Used for 'set timer'
- var/setsecond = round((timetoset / 10) % 60)
- var/setminute = round(((timetoset / 10) - setsecond) / 60)
+/obj/machinery/door_timer/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
+ var/data[0]
+ data["cell_id"] = name
+ data["occupant"] = occupant
+ data["crimes"] = crimes
+ data["brigged_by"] = officer
+ data["time_set"] = seconds_to_clock(time / 10)
+ data["time_left"] = seconds_to_clock(timeleft())
+ data["timing"] = timing
+ data["isAllowed"] = allowed(user)
+ data["prisoner_name"] = prisoner_name
+ data["prisoner_charge"] = prisoner_charge
+ data["prisoner_time"] = prisoner_time
- user.set_machine(src)
+ return data
- // dat
- var/dat = "Timer System:"
- dat += " Door [id] controls "
-
- // Start/Stop timer
- if(timing)
- dat += "Stop Timer and open door "
- else
- dat += "Activate Timer and close door "
-
- // Time Left display (uses releasetime)
- dat += "Time Left: [(minute ? text("[minute]:") : null)][second] "
- dat += " "
-
- // Set Timer display (uses timetoset)
- if(timing)
- dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond] Set "
- else
- dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond] "
-
- // Controls
- dat += "Input Time"
-
- // Mounted flash controls
- for(var/obj/machinery/flasher/F in targets)
- if(F.last_flash && (F.last_flash + 150) > world.time)
- dat += " Flash Charging"
- else
- dat += " Activate Flash"
-
- dat += "
Close"
-
- var/datum/browser/popup = new(user, "door_timer", name, 400, 500)
- popup.set_content(dat)
- popup.open()
-
-
-//Function for using door_timer dialog input, checks if user has permission
-// href_list to
-// "timing" turns on timer
-// "tp" value to modify timer
-// "fc" activates flasher
-// "change" resets the timer to the timetoset amount while the timer is counting down
-// Also updates dialog window and timer icon
/obj/machinery/door_timer/Topic(href, href_list)
- if(..())
- return 1
-
if(!allowed(usr) && !usr.can_admin_interact())
return 1
- usr.set_machine(src)
-
- if(href_list["timing"])
- timing = text2num(href_list["timing"])
-
- if(timing)
- timer_start()
- else
- timer_end()
- if(!isobserver(usr)) //spooky admin ghosts are in your brig, releasing your prisoners
- Radio.autosay("Timer stopped manually by [usr.name].", name, "Security", list(z))
-
- else
- if(href_list["settime"])
- var/time = min(max(round(return_time_input(usr)), 0), 3600)
- timeset(time)
-
- if(href_list["fc"])
- for(var/obj/machinery/flasher/F in targets)
+ if(href_list["flash"])
+ for(var/obj/machinery/flasher/F in targets)
+ if(F.last_flash && (F.last_flash + 150) > world.time)
+ to_chat(usr, "Flash still charging.")
+ else
F.flash()
- if(href_list["change"])
- printed = 1
- timer_start()
+ if(href_list["release"])
+ if(timing)
+ timer_end()
+ Radio.autosay("Timer stopped manually from cell control.", name, "Security", list(z))
+ ui_interact(usr)
- add_fingerprint(usr)
- updateUsrDialog()
- update_icon()
+ if(href_list["prisoner_name"])
+ prisoner_name = input("Prisoner Name:", name, prisoner_name) as text|null
+
+ if(href_list["prisoner_charge"])
+ prisoner_charge = input("Prisoner Charge:", name, prisoner_charge) as text|null
+
+ if(href_list["prisoner_time"])
+ prisoner_time = input("Prisoner Time (in minutes):", name, prisoner_time) as num|null
+ prisoner_time = min(max(round(prisoner_time), 0), 60)
+
+ if(href_list["set_timer"])
+ if(!prisoner_name || !prisoner_charge || !prisoner_time)
+ return
+ timeset(prisoner_time * 60)
+ occupant = prisoner_name
+ crimes = prisoner_charge
+ prisoner_name = ""
+ prisoner_charge = ""
+ prisoner_time = ""
+ timing = TRUE
+ timer_start()
+ ui_interact(usr)
+ update_icon()
//icon update function
@@ -502,3 +474,4 @@
#undef FONT_COLOR
#undef FONT_STYLE
#undef CHARS_PER_LINE
+#undef CELL_NONE
diff --git a/code/game/machinery/doors/checkForMultipleDoors.dm b/code/game/machinery/doors/checkForMultipleDoors.dm
index d7f66f4630b..7884e3be989 100644
--- a/code/game/machinery/doors/checkForMultipleDoors.dm
+++ b/code/game/machinery/doors/checkForMultipleDoors.dm
@@ -12,5 +12,5 @@
for(var/obj/machinery/door/D in locate(x,y,z))
if(!istype(D, /obj/machinery/door/window) && D.density)
return 0
- //There are no false wall checks because that would be fucking retarded
+ //There are no false wall checks because that would be foolish
return 1
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 718efdb414c..2d6fac3bb81 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -204,7 +204,7 @@
. = TRUE
if(operating)
return
- if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ if(!I.use_tool(src, user, 0, volume = 0))
return
try_to_crowbar(user, I)
@@ -352,8 +352,8 @@
addtimer(CALLBACK(src, .proc/autoclose), wait, TIMER_UNIQUE | TIMER_NO_HASH_WAIT | TIMER_OVERRIDE)
/obj/machinery/door/proc/update_freelook_sight()
- if(!glass && cameranet)
- cameranet.updateVisibility(src, 0)
+ if(!glass && GLOB.cameranet)
+ GLOB.cameranet.updateVisibility(src, 0)
/obj/machinery/door/BlockSuperconductivity() // All non-glass airlocks block heat, this is intended.
if(opacity || heat_proof)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 448c410c1c8..37dbdb6c9c0 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -419,7 +419,7 @@
if(constructionStep != CONSTRUCTION_WIRES_EXPOSED)
return
. = TRUE
- if(!I.tool_start_check(user, 0))
+ if(!I.tool_start_check(src, user, 0))
return
user.visible_message("[user] starts cutting the wires from [src]...", \
@@ -442,7 +442,7 @@
if(locate(/obj/machinery/door/firedoor) in get_turf(src))
to_chat(user, "There's already a firelock there.")
return
- if(!I.tool_start_check(user, 0))
+ if(!I.tool_start_check(src, user, 0))
return
user.visible_message("[user] starts bolting down [src]...", \
"You begin bolting [src]...")
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index 6f4a84a7535..c0dce817189 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -59,9 +59,18 @@
/obj/machinery/door/poddoor/try_to_activate_door(mob/user)
return
-/obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user)
+/obj/machinery/door/poddoor/try_to_crowbar(mob/user, obj/item/I)
+ if(!density)
+ return
if(!hasPower())
- open()
+ to_chat(user, "You start forcing [src] open...")
+ if(do_after(user, 50 * I.toolspeed, target = src))
+ if(!hasPower())
+ open()
+ else
+ to_chat(user, "[src] resists your efforts to force it!")
+ else
+ to_chat(user, "[src] resists your efforts to force it!")
// Whoever wrote the old code for multi-tile spesspod doors needs to burn in hell. - Unknown
// Wise words. - Bxil
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 7af8ebe88f3..a4b9510945a 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -1,4 +1,4 @@
-var/list/doppler_arrays = list()
+GLOBAL_LIST_EMPTY(doppler_arrays)
/obj/machinery/doppler_array
name = "tachyon-doppler array"
@@ -28,12 +28,12 @@ var/list/doppler_arrays = list()
/obj/machinery/doppler_array/New()
..()
- doppler_arrays += src
+ GLOB.doppler_arrays += src
explosion_target = rand(8, 20)
toxins_tech = new /datum/tech/toxins(src)
/obj/machinery/doppler_array/Destroy()
- doppler_arrays -= src
+ GLOB.doppler_arrays -= src
logged_explosions.Cut()
return ..()
@@ -89,13 +89,13 @@ var/list/doppler_arrays = list()
/obj/machinery/doppler_array/proc/print_explosive_logs(mob/user)
if(!logged_explosions.len)
- atom_say("No logs currently stored in internal database.")
+ atom_say("No logs currently stored in internal database.")
return
if(active_timers)
to_chat(user, "[src] is already printing something, please wait.")
return
- atom_say("Printing explosive log. Standby...")
- addtimer(CALLBACK(src, .print), 50)
+ atom_say("Printing explosive log. Standby...")
+ addtimer(CALLBACK(src, .proc/print), 50)
/obj/machinery/doppler_array/proc/print()
visible_message("[src] prints a piece of paper!")
@@ -183,7 +183,7 @@ var/list/doppler_arrays = list()
ui.open()
ui.set_auto_update(1)
-/obj/machinery/doppler_array/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/doppler_array/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
var/list/explosion_data = list()
for(var/D in logged_explosions)
diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm
index b1a6f96e2eb..32924690d97 100644
--- a/code/game/machinery/embedded_controller/airlock_controllers.dm
+++ b/code/game/machinery/embedded_controller/airlock_controllers.dm
@@ -27,7 +27,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data = list(
@@ -98,7 +98,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/embedded_controller/radio/airlock/airlock_controller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/embedded_controller/radio/airlock/airlock_controller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data = list(
@@ -160,7 +160,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/embedded_controller/radio/airlock/access_controller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/embedded_controller/radio/airlock/access_controller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data = list(
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 7ae268fca46..f12361f1664 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -236,14 +236,14 @@ FIRE ALARM
ui_interact(user)
-/obj/machinery/firealarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
+/obj/machinery/firealarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = GLOB.default_state)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "firealarm.tmpl", name, 400, 400, state = state)
ui.open()
ui.set_auto_update(1)
-/obj/machinery/firealarm/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/firealarm/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
var/area/A = get_area(src)
@@ -309,16 +309,16 @@ FIRE ALARM
update_icon()
/obj/machinery/firealarm/New(location, direction, building)
- ..()
+ . = ..()
if(building)
buildstage = 0
wiresexposed = TRUE
- pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
- pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
+ setDir(direction)
+ set_pixel_offsets_from_dir(26, -26, 26, -26)
if(is_station_contact(z) && show_alert_level)
- if(security_level)
+ if(GLOB.security_level)
overlays += image('icons/obj/monitors.dmi', "overlay_[get_security_level()]")
else
overlays += image('icons/obj/monitors.dmi', "overlay_green")
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index b7b7e35eef6..37766db58fb 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -58,6 +58,8 @@
playsound(loc, 'sound/weapons/flash.ogg', 100, 1)
flick("[base_state]_flash", src)
+ set_light(2, 1, COLOR_WHITE)
+ addtimer(CALLBACK(src, /atom./proc/set_light, 0), 2)
last_flash = world.time
use_power(1000)
@@ -142,7 +144,7 @@
active = 1
icon_state = "launcheract"
- for(var/obj/machinery/flasher/M in world)
+ for(var/obj/machinery/flasher/M in GLOB.machines)
if(M.id == id)
spawn()
M.flash()
diff --git a/code/game/machinery/guestpass.dm b/code/game/machinery/guestpass.dm
index 2c37a3274c7..165c8dbe4cb 100644
--- a/code/game/machinery/guestpass.dm
+++ b/code/game/machinery/guestpass.dm
@@ -193,5 +193,5 @@
/obj/machinery/computer/guestpass/hop/get_changeable_accesses()
. = ..()
- if(. && ACCESS_CHANGE_IDS in .)
+ if(. && (ACCESS_CHANGE_IDS in .))
return get_all_accesses()
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 03b28423830..6d2586c46aa 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -33,7 +33,7 @@ Possible to do for anyone motivated enough:
#define HOLOPAD_MODE RANGE_BASED
-var/list/holopads = list()
+GLOBAL_LIST_EMPTY(holopads)
/obj/machinery/hologram/holopad
name = "holopad"
@@ -61,7 +61,7 @@ var/list/holopads = list()
/obj/machinery/hologram/holopad/New()
..()
- holopads += src
+ GLOB.holopads += src
component_parts = list()
component_parts += new /obj/item/circuitboard/holopad(null)
component_parts += new /obj/item/stock_parts/capacitor(null)
@@ -77,7 +77,7 @@ var/list/holopads = list()
for(var/I in masters)
clear_holo(I)
- holopads -= src
+ GLOB.holopads -= src
return ..()
/obj/machinery/hologram/holopad/power_change()
@@ -192,10 +192,10 @@ var/list/holopads = list()
temp = "You requested an AI's presence. "
temp += "Main Menu"
var/area/area = get_area(src)
- for(var/mob/living/silicon/ai/AI in ai_list)
+ for(var/mob/living/silicon/ai/AI in GLOB.ai_list)
if(!AI.client)
continue
- to_chat(AI, "Your presence is requested at \the [area].")
+ to_chat(AI, "Your presence is requested at \the [area].")
else
temp = "A request for AI presence was already sent recently. "
temp += "Main Menu"
@@ -210,7 +210,7 @@ var/list/holopads = list()
temp += "Main Menu"
if(usr.loc == loc)
var/list/callnames = list()
- for(var/I in holopads)
+ for(var/I in GLOB.holopads)
var/area/A = get_area(I)
if(A)
LAZYADD(callnames[A], I)
@@ -297,7 +297,7 @@ var/list/holopads = list()
/obj/machinery/hologram/holopad/proc/transfer_to_nearby_pad(turf/T, mob/holo_owner)
if(!isAI(holo_owner))
return
- for(var/pad in holopads)
+ for(var/pad in GLOB.holopads)
var/obj/machinery/hologram/holopad/another = pad
if(another == src)
continue
diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm
index aca4254b517..aa541ec8619 100644
--- a/code/game/machinery/holosign.dm
+++ b/code/game/machinery/holosign.dm
@@ -67,7 +67,7 @@
else
icon_state = "light0"
- for(var/obj/machinery/holosign/M in world)
+ for(var/obj/machinery/holosign/M in GLOB.machines)
if(M.id == src.id)
spawn( 0 )
M.toggle()
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index bb6889769b8..f02e037e8c5 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -116,8 +116,8 @@ Class Procs:
var/panel_open = 0
var/area/myArea
var/interact_offline = 0 // Can the machine be interacted with while de-powered.
- var/use_log = list()
- var/list/settagwhitelist = list()//WHITELIST OF VARIABLES THAT THE set_tag HREF CAN MODIFY, DON'T PUT SHIT YOU DON'T NEED ON HERE, AND IF YOU'RE GONNA USE set_tag (format_tag() proc), ADD TO THIS LIST.
+ var/list/use_log // Init this list if you wish to add logging to your machine - currently only viewable in VV
+ var/list/settagwhitelist // (Init this list if needed) WHITELIST OF VARIABLES THAT THE set_tag HREF CAN MODIFY, DON'T PUT SHIT YOU DON'T NEED ON HERE, AND IF YOU'RE GONNA USE set_tag (format_tag() proc), ADD TO THIS LIST.
atom_say_verb = "beeps"
var/siemens_strength = 0.7 // how badly will it shock you?
@@ -224,7 +224,7 @@ Class Procs:
var/obj/item/multitool/P = get_multitool(usr)
if(P && istype(P))
var/update_mt_menu = FALSE
- if("set_tag" in href_list)
+ if("set_tag" in href_list && settagwhitelist)
if(!(href_list["set_tag"] in settagwhitelist))//I see you're trying Href exploits, I see you're failing, I SEE ADMIN WARNING. (seriously though, this is a powerfull HREF, I originally found this loophole, I'm not leaving it in on my PR)
message_admins("set_tag HREF (var attempted to edit: [href_list["set_tag"]]) exploit attempted by [key_name_admin(user)] on [src] (JMP)")
return FALSE
@@ -290,7 +290,7 @@ Class Procs:
update_multitool_menu(usr)
return TRUE
-/obj/machinery/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state = default_state)
+/obj/machinery/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state = GLOB.default_state)
if(..(href, href_list, nowindow, state))
return 1
@@ -369,7 +369,6 @@ Class Procs:
/obj/machinery/proc/RefreshParts() //Placeholder proc for machines that are built using frames.
return
- return 0
/obj/machinery/proc/assign_uid()
uid = gl_uid
@@ -552,14 +551,18 @@ Class Procs:
if(check_records && !R)
threatcount += 4
- if(check_arrest && R && (R.fields["criminal"] == "*Arrest*"))
- threatcount += 4
+ if(R && R.fields["criminal"])
+ switch(R.fields["criminal"])
+ if(SEC_RECORD_STATUS_EXECUTE)
+ threatcount += 7
+ if(SEC_RECORD_STATUS_ARREST)
+ threatcount += 5
return threatcount
-/obj/machinery/proc/shock(mob/user, prb)
- if(inoperable())
+/obj/machinery/proc/shock(mob/living/user, prb)
+ if(!istype(user) || inoperable())
return FALSE
if(!prob(prb))
return FALSE
diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm
index b73fa94259f..d713817ca06 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -202,7 +202,7 @@
..()
if(autolink)
- for(var/obj/machinery/magnetic_module/M in world)
+ for(var/obj/machinery/magnetic_module/M in GLOB.machines)
if(M.freq == frequency && M.code == code)
magnets.Add(M)
@@ -224,7 +224,7 @@
/obj/machinery/magnetic_controller/process()
if(magnets.len == 0 && autolink)
- for(var/obj/machinery/magnetic_module/M in world)
+ for(var/obj/machinery/magnetic_module/M in GLOB.machines)
if(M.freq == frequency && M.code == code)
magnets.Add(M)
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 61d96602343..c2396ab1d9f 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -55,9 +55,9 @@
var/list/datum/feed_channel/network_channels = list()
var/datum/feed_message/wanted_issue
-var/datum/feed_network/news_network = new /datum/feed_network //The global news-network, which is coincidentally a global list.
+GLOBAL_DATUM_INIT(news_network, /datum/feed_network, new()) //The global news-network, which is coincidentally a global list.
-var/list/obj/machinery/newscaster/allCasters = list() //Global list that will contain reference to all newscasters in existence.
+GLOBAL_LIST_EMPTY(allNewscasters) //Global list that will contain reference to all newscasters in existence.
#define NEWSCASTER_MAIN 0 // Main menu
#define NEWSCASTER_FC_LIST 1 // Feed channel list
@@ -128,13 +128,13 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
securityCaster = 1
/obj/machinery/newscaster/New()
- allCasters += src
- unit_no = allCasters.len
+ GLOB.allNewscasters += src
+ unit_no = GLOB.allNewscasters.len
update_icon() //for any custom ones on the map...
..()
/obj/machinery/newscaster/Destroy()
- allCasters -= src
+ GLOB.allNewscasters -= src
viewing_channel = null
QDEL_NULL(photo)
return ..()
@@ -144,7 +144,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(inoperable())
icon_state = "newscaster_off"
else
- if(!news_network.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message
+ if(!GLOB.news_network.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message
icon_state = "newscaster_normal"
if(alert) //new message alert overlay
add_overlay("newscaster_alert")
@@ -194,7 +194,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
switch(screen)
if(0)
- data["wanted_issue"] = news_network.wanted_issue ? 1 : 0
+ data["wanted_issue"] = GLOB.news_network.wanted_issue ? 1 : 0
data["silence"] = silence
data["securityCaster"] = securityCaster
if(securityCaster)
@@ -202,7 +202,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(1, 6, 7)
var/list/channels = list()
data["channels"] = channels
- for(var/datum/feed_channel/C in news_network.network_channels)
+ for(var/datum/feed_channel/C in GLOB.news_network.network_channels)
channels[++channels.len] = list("name" = C.channel_name, "ref" = "\ref[C]", "censored" = C.censored, "admin" = C.is_admin_channel)
if(2)
data["scanned_user"] = scanned_user
@@ -215,10 +215,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
data["msg"] = msg
data["photo"] = photo ? 1 : 0
if(4)
- var/total_num = length(news_network.network_channels)
+ var/total_num = length(GLOB.news_network.network_channels)
var/active_num = total_num
var/message_num=0
- for(var/datum/feed_channel/FC in news_network.network_channels)
+ for(var/datum/feed_channel/FC in GLOB.news_network.network_channels)
if(!FC.censored)
message_num += length(FC.messages)
else
@@ -254,7 +254,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(10)
var/wanted_already = 0
var/end_param = 1
- if(news_network.wanted_issue)
+ if(GLOB.news_network.wanted_issue)
wanted_already = 1
end_param = 2
data["wanted_already"] = wanted_already
@@ -263,16 +263,16 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
data["msg"] = msg
data["photo"] = photo ? 1 : 0
if(wanted_already)
- data["author"] = news_network.wanted_issue.backup_author
+ data["author"] = GLOB.news_network.wanted_issue.backup_author
else
data["scanned_user"] = scanned_user
if(11)
- data["author"] = news_network.wanted_issue.backup_author
- data["criminal"] = news_network.wanted_issue.author
- data["description"] = news_network.wanted_issue.body
- if(news_network.wanted_issue.img)
- user << browse_rsc(news_network.wanted_issue.img, "tmp_photow.png")
- data["photo"] = news_network.wanted_issue.img ? news_network.wanted_issue.img : 0
+ data["author"] = GLOB.news_network.wanted_issue.backup_author
+ data["criminal"] = GLOB.news_network.wanted_issue.author
+ data["description"] = GLOB.news_network.wanted_issue.body
+ if(GLOB.news_network.wanted_issue.img)
+ user << browse_rsc(GLOB.news_network.wanted_issue.img, "tmp_photow.png")
+ data["photo"] = GLOB.news_network.wanted_issue.img ? GLOB.news_network.wanted_issue.img : 0
if(12)
var/list/jobs = list()
data["jobs"] = jobs
@@ -295,13 +295,13 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["submit_new_channel"])
var/list/existing_authors = list()
- for(var/datum/feed_channel/FC in news_network.network_channels)
+ for(var/datum/feed_channel/FC in GLOB.news_network.network_channels)
if(FC.author == REDACTED)
existing_authors += FC.backup_author
else
existing_authors += FC.author
var/check = 0
- for(var/datum/feed_channel/FC in news_network.network_channels)
+ for(var/datum/feed_channel/FC in GLOB.news_network.network_channels)
if(FC.channel_name == channel_name)
check = 1
break
@@ -325,13 +325,13 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
newChannel.author = scanned_user
newChannel.locked = c_locked
feedback_inc("newscaster_channels", 1)
- news_network.network_channels += newChannel //Adding channel to the global network
+ GLOB.news_network.network_channels += newChannel //Adding channel to the global network
temp = "Feed channel '[channel_name]' created successfully."
temp_back_screen = NEWSCASTER_MAIN
else if(href_list["set_channel_receiving"])
var/list/available_channels = list()
- for(var/datum/feed_channel/F in news_network.network_channels)
+ for(var/datum/feed_channel/F in GLOB.news_network.network_channels)
if((!F.locked || F.author == scanned_user) && !F.censored)
available_channels += F.channel_name
channel_name = strip_html_simple(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels)
@@ -366,14 +366,14 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
newMsg.img = photo.img
feedback_inc("newscaster_stories",1)
var/announcement = ""
- for(var/datum/feed_channel/FC in news_network.network_channels)
+ for(var/datum/feed_channel/FC in GLOB.news_network.network_channels)
if(FC.channel_name == channel_name)
FC.messages += newMsg //Adding message to the network's appropriate feed_channel
announcement = FC.announce_news(msg_title)
break
temp = "Feed story successfully submitted to [channel_name]."
temp_back_screen = NEWSCASTER_MAIN
- for(var/obj/machinery/newscaster/NC in allCasters)
+ for(var/obj/machinery/newscaster/NC in GLOB.allNewscasters)
NC.newsAlert(announcement)
else if(href_list["create_channel"])
@@ -405,12 +405,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["menu_wanted"])
var/already_wanted = 0
- if(news_network.wanted_issue)
+ if(GLOB.news_network.wanted_issue)
already_wanted = 1
if(already_wanted)
- channel_name = news_network.wanted_issue.author
- msg = news_network.wanted_issue.body
+ channel_name = GLOB.news_network.wanted_issue.author
+ msg = GLOB.news_network.wanted_issue.body
screen = NEWSCASTER_W_ISSUE_H
else if(href_list["set_wanted_name"])
@@ -441,32 +441,32 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
W.backup_author = scanned_user //I know, a bit wacky
if(photo)
W.img = photo.img
- news_network.wanted_issue = W
- for(var/obj/machinery/newscaster/NS in allCasters)
+ GLOB.news_network.wanted_issue = W
+ for(var/obj/machinery/newscaster/NS in GLOB.allNewscasters)
NS.newsAlert()
NS.update_icon()
temp = "Wanted issue for [channel_name] is now in Network Circulation."
temp_back_screen = NEWSCASTER_MAIN
else
- if(news_network.wanted_issue.is_admin_message)
+ if(GLOB.news_network.wanted_issue.is_admin_message)
alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok")
return
- news_network.wanted_issue.author = channel_name
- news_network.wanted_issue.body = msg
- news_network.wanted_issue.backup_author = scanned_user
+ GLOB.news_network.wanted_issue.author = channel_name
+ GLOB.news_network.wanted_issue.body = msg
+ GLOB.news_network.wanted_issue.backup_author = scanned_user
if(photo)
- news_network.wanted_issue.img = photo.img
+ GLOB.news_network.wanted_issue.img = photo.img
temp = "Wanted issue for [channel_name] successfully edited."
temp_back_screen = NEWSCASTER_MAIN
else if(href_list["cancel_wanted"])
- if(news_network.wanted_issue.is_admin_message)
+ if(GLOB.news_network.wanted_issue.is_admin_message)
alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.", "Ok")
return
var/choice = alert("Please confirm wanted issue removal", "Network Security Handler", "Confirm", "Cancel")
if(choice == "Confirm")
- news_network.wanted_issue = null
- for(var/obj/machinery/newscaster/NC in allCasters)
+ GLOB.news_network.wanted_issue = null
+ for(var/obj/machinery/newscaster/NC in GLOB.allNewscasters)
NC.update_icon()
temp = "Wanted Issue successfully deleted from Circulation"
temp_back_screen = NEWSCASTER_MAIN
@@ -826,10 +826,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
/obj/machinery/newscaster/proc/print_paper()
feedback_inc("newscaster_newspapers_printed",1)
var/obj/item/newspaper/NEWSPAPER = new /obj/item/newspaper
- for(var/datum/feed_channel/FC in news_network.network_channels)
+ for(var/datum/feed_channel/FC in GLOB.news_network.network_channels)
NEWSPAPER.news_content += FC
- if(news_network.wanted_issue)
- NEWSPAPER.important_message = news_network.wanted_issue
+ if(GLOB.news_network.wanted_issue)
+ NEWSPAPER.important_message = GLOB.news_network.wanted_issue
NEWSPAPER.loc = get_turf(src)
paper_remaining--
return
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 13ad44215bb..42452a9f8e2 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -216,7 +216,7 @@
/obj/item/pipe/Move()
..()
if(is_bent_pipe() \
- && (src.dir in cardinal))
+ && (src.dir in GLOB.cardinal))
src.dir = src.dir|turn(src.dir, 90)
else if(pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
if(dir==2)
@@ -305,7 +305,7 @@
return 0
/obj/item/pipe/proc/unflip(var/direction)
- if(!(direction in cardinal))
+ if(!(direction in GLOB.cardinal))
return turn(direction, 45)
return direction
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index 53dd0135c54..b910b1272ff 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -157,7 +157,7 @@
ui = new(user, src, ui_key, "poolcontroller.tmpl", "Pool Controller Interface", 520, 410)
ui.open()
-/obj/machinery/poolcontroller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/poolcontroller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
var/currenttemp
switch(temperature) //So we can output nice things like "Cool" to nanoUI
diff --git a/code/game/machinery/portable_tag_turret.dm b/code/game/machinery/portable_tag_turret.dm
index 0bd368bd75b..12bae1bbf5a 100644
--- a/code/game/machinery/portable_tag_turret.dm
+++ b/code/game/machinery/portable_tag_turret.dm
@@ -13,8 +13,8 @@
lasercolor = "b"
installation = /obj/item/gun/energy/laser/tag/blue
-/obj/machinery/porta_turret/tag/New()
- ..()
+/obj/machinery/porta_turret/tag/Initialize(mapload)
+ . = ..()
icon_state = "[lasercolor]grey_target_prism"
/obj/machinery/porta_turret/tag/weapon_setup(var/obj/item/gun/energy/E)
@@ -49,7 +49,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/porta_turret/tag/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/porta_turret/tag/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["access"] = !isLocked(user)
data["locked"] = locked
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index a77cbe6c184..79f1eb83e23 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -87,8 +87,8 @@
lethal = 1
installation = /obj/item/gun/energy/laser
-/obj/machinery/porta_turret/New()
- ..()
+/obj/machinery/porta_turret/Initialize(mapload)
+ . = ..()
if(req_access && req_access.len)
req_access.Cut()
req_one_access = list(ACCESS_SECURITY, ACCESS_HEADS)
@@ -105,8 +105,8 @@
QDEL_NULL(spark_system)
return ..()
-/obj/machinery/porta_turret/centcom/New()
- ..()
+/obj/machinery/porta_turret/centcom/Initialize(mapload)
+ . = ..()
if(req_one_access && req_one_access.len)
req_one_access.Cut()
req_access = list(ACCESS_CENT_SPECOPS)
@@ -161,14 +161,14 @@
eprojectile = /obj/item/projectile/beam/pulse
eshot_sound = 'sound/weapons/pulse.ogg'
-var/list/turret_icons
+GLOBAL_LIST_EMPTY(turret_icons)
/obj/machinery/porta_turret/update_icon()
- if(!turret_icons)
- turret_icons = list()
- turret_icons["open"] = image(icon, "openTurretCover")
+ if(!GLOB.turret_icons)
+ GLOB.turret_icons = list()
+ GLOB.turret_icons["open"] = image(icon, "openTurretCover")
underlays.Cut()
- underlays += turret_icons["open"]
+ underlays += GLOB.turret_icons["open"]
if(stat & BROKEN)
icon_state = "destroyed_target_prism"
@@ -218,7 +218,7 @@ var/list/turret_icons
ui.open()
ui.set_auto_update(1)
-/obj/machinery/porta_turret/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/porta_turret/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["access"] = !isLocked(user)
data["screen"] = screen
@@ -520,8 +520,6 @@ var/list/turret_icons
/obj/machinery/porta_turret/process()
//the main machinery process
- set background = BACKGROUND_ENABLED
-
if(stat & (NOPOWER|BROKEN))
if(!always_up)
//if the turret has no power or is broken, make the turret pop down if it hasn't already
@@ -1015,8 +1013,8 @@ var/list/turret_icons
depotarea.declare_started()
return ..(target)
-/obj/machinery/porta_turret/syndicate/New()
- ..()
+/obj/machinery/porta_turret/syndicate/Initialize(mapload)
+ . = ..()
if(req_one_access && req_one_access.len)
req_one_access.Cut()
req_access = list(ACCESS_SYNDICATE)
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index a17f9dfb9bd..b6da46a67c8 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -177,8 +177,8 @@
F.broken = 0
F.times_used = 0
F.icon_state = "flash"
- if(istype(O,/obj/item/gun/energy/disabler/cyborg))
- var/obj/item/gun/energy/disabler/cyborg/D = O
+ if(istype(O,/obj/item/gun/energy))
+ var/obj/item/gun/energy/D = O
if(D.cell.charge < D.cell.maxcharge)
var/obj/item/ammo_casing/energy/E = D.ammo_type[D.select]
D.cell.give(E.e_cost)
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 081a48c3da1..e4e37ae1bcb 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -19,8 +19,7 @@
var/item_recycle_sound = 'sound/machines/recycler.ogg'
/obj/machinery/recycler/New()
- AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_PLASTIC, MAT_BLUESPACE), 0,
- TRUE, null, null, null, TRUE)
+ AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_PLASTIC, MAT_BLUESPACE), 0, TRUE, null, null, null, TRUE)
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/recycler(null)
@@ -37,7 +36,7 @@
mat_mod *= 50000
for(var/obj/item/stock_parts/manipulator/M in component_parts)
amt_made = 25 * M.rating //% of materials salvaged
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
materials.max_amount = mat_mod
amount_produced = min(100, amt_made)
@@ -135,7 +134,7 @@
/obj/machinery/recycler/proc/recycle_item(obj/item/I)
I.forceMove(loc)
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
var/material_amount = materials.get_item_material_amount(I)
if(!material_amount)
qdel(I)
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index db913f171c3..85799279ff4 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -27,10 +27,10 @@
#define COM_ROLES list("Blueshield","NT Representative","Head of Personnel's Desk","Captain's Desk","Bridge")
#define SCI_ROLES list("Robotics","Science","Research Director's Desk")
-var/req_console_assistance = list()
-var/req_console_supplies = list()
-var/req_console_information = list()
-var/list/obj/machinery/requests_console/allConsoles = list()
+GLOBAL_LIST_EMPTY(req_console_assistance)
+GLOBAL_LIST_EMPTY(req_console_supplies)
+GLOBAL_LIST_EMPTY(req_console_information)
+GLOBAL_LIST_EMPTY(allRequestConsoles)
/obj/machinery/requests_console
name = "Requests Console"
@@ -59,7 +59,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/announceAuth = 0 //Will be set to 1 when you authenticate yourself for announcements
var/msgVerified = "" //Will contain the name of the person who varified it
var/msgStamped = "" //If a message is stamped, this will contain the stamp name
- var/message = "";
+ var/message = ""
var/recipient = ""; //the department which will be receiving the message
var/priority = -1 ; //Priority of the message being sent
light_range = 0
@@ -93,30 +93,30 @@ var/list/obj/machinery/requests_console/allConsoles = list()
announcement.newscast = 0
name = "[department] Requests Console"
- allConsoles += src
+ GLOB.allRequestConsoles += src
if(departmentType & RC_ASSIST)
- req_console_assistance |= department
+ GLOB.req_console_assistance |= department
if(departmentType & RC_SUPPLY)
- req_console_supplies |= department
+ GLOB.req_console_supplies |= department
if(departmentType & RC_INFO)
- req_console_information |= department
+ GLOB.req_console_information |= department
set_light(1)
/obj/machinery/requests_console/Destroy()
- allConsoles -= src
+ GLOB.allRequestConsoles -= src
var/lastDeptRC = 1
- for(var/obj/machinery/requests_console/Console in allConsoles)
+ for(var/obj/machinery/requests_console/Console in GLOB.allRequestConsoles)
if(Console.department == department)
lastDeptRC = 0
break
if(lastDeptRC)
if(departmentType & RC_ASSIST)
- req_console_assistance -= department
+ GLOB.req_console_assistance -= department
if(departmentType & RC_SUPPLY)
- req_console_supplies -= department
+ GLOB.req_console_supplies -= department
if(departmentType & RC_INFO)
- req_console_information -= department
+ GLOB.req_console_information -= department
QDEL_NULL(Radio)
return ..()
@@ -138,7 +138,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
ui.open()
ui.set_auto_update(1)
-/obj/machinery/requests_console/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/requests_console/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["department"] = department
@@ -148,9 +148,9 @@ var/list/obj/machinery/requests_console/allConsoles = list()
data["silent"] = silent
data["announcementConsole"] = announcementConsole
- data["assist_dept"] = req_console_assistance
- data["supply_dept"] = req_console_supplies
- data["info_dept"] = req_console_information
+ data["assist_dept"] = GLOB.req_console_assistance
+ data["supply_dept"] = GLOB.req_console_supplies
+ data["info_dept"] = GLOB.req_console_information
data["ship_dept"] = GLOB.TAGGERLOCATIONS
data["message"] = message
@@ -200,7 +200,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/log_msg = message
var/pass = 0
screen = RCS_SENTFAIL
- for(var/obj/machinery/message_server/MS in world)
+ for(var/obj/machinery/message_server/MS in GLOB.machines)
if(!MS.active) continue
MS.send_rc_message(ckey(href_list["department"]),department,log_msg,msgStamped,msgVerified,priority)
pass = 1
@@ -225,7 +225,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
message_log += "Message sent to [recipient] at [station_time_timestamp()] [message]"
Radio.autosay("Alert; a new requests console message received for [recipient] from [department]", null, "[radiochannel]")
else
- audible_message(text("[bicon(src)] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4)
+ atom_say("No server detected!")
//Handle screen switching
if(href_list["setScreen"])
@@ -233,7 +233,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if(tempScreen == RCS_ANNOUNCE && !announcementConsole)
return
if(tempScreen == RCS_VIEWMSGS)
- for(var/obj/machinery/requests_console/Console in allConsoles)
+ for(var/obj/machinery/requests_console/Console in GLOB.allRequestConsoles)
if(Console.department == department)
Console.newmessagepriority = 0
Console.icon_state = "req_comp0"
@@ -256,7 +256,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
else if(world.time < print_cooldown)
error_message = "Please allow the printer time to prepare the next shipping label."
if(error_message)
- audible_message(text("[bicon(src)] *The Requests Console beeps: 'NOTICE: [error_message]'"),,4)
+ atom_say("[error_message]")
return
print_label(ship_tag_name, ship_tag_index)
shipping_log += "Shipping Label printed for [ship_tag_name] [msgVerified]"
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index adbc3d67605..5952108b6a9 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -20,6 +20,12 @@
account = null
ui_interact(user)
+/obj/machinery/slot_machine/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_unfasten_wrench(user, I)
+
/obj/machinery/slot_machine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
@@ -27,7 +33,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/slot_machine/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/machinery/slot_machine/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["working"] = working
data["money"] = account ? account.money : null
@@ -52,18 +58,18 @@
icon_state = "slots-on"
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
addtimer(CALLBACK(src, .proc/spin_slots, usr.name), 25)
-
+
/obj/machinery/slot_machine/proc/spin_slots(userName)
switch(rand(1,4050))
if(1) // .02%
atom_say("JACKPOT! [userName] has won a MILLION CREDITS!")
- event_announcement.Announce("Congratulations to [userName] on winning the Jackpot of ONE MILLION CREDITS!", "Jackpot Winner")
+ GLOB.event_announcement.Announce("Congratulations to [userName] on winning the Jackpot of ONE MILLION CREDITS!", "Jackpot Winner")
result = "JACKPOT! You win one million credits!"
resultlvl = "highlight"
win_money(1000000, 'sound/goonstation/misc/airraid_loop.ogg')
if(2 to 5) // .07%
atom_say("Big Winner! [userName] has won a hundred thousand credits!")
- event_announcement.Announce("Congratulations to [userName] on winning a hundred thousand credits!", "Big Winner")
+ GLOB.event_announcement.Announce("Congratulations to [userName] on winning a hundred thousand credits!", "Big Winner")
result = "Big Winner! You win a hundred thousand credits!"
resultlvl = "good"
win_money(100000, 'sound/goonstation/misc/klaxon.ogg')
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 3a6f3011747..da4df4f8382 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -772,6 +772,8 @@
if(usr.stat != 0)
return
+ if(usr.incapacitated() || usr.buckled) //are you cuffed, dying, lying, stunned or other
+ return
if(!state_open)
to_chat(usr, "The unit's doors are shut.")
return
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index 6299be7be3d..a5cff57ad52 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -121,7 +121,8 @@
if(user)
to_chat(user, "The connected wire doesn't have enough current.")
return
- for(var/obj/singularity/singulo in GLOB.singularities)
+ for(var/thing in GLOB.singularities)
+ var/obj/singularity/singulo = thing
if(singulo.z == z)
singulo.target = src
icon_state = "[icontype]1"
@@ -132,7 +133,8 @@
/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null)
- for(var/obj/singularity/singulo in world)
+ for(var/thing in GLOB.singularities)
+ var/obj/singularity/singulo = thing
if(singulo.target == src)
singulo.target = null
icon_state = "[icontype]0"
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 99642db320e..181d5e494da 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -77,11 +77,10 @@
update_icon()
try_detonate(TRUE)
//Counter terrorists win
- else if(!active || defused)
- if(defused && payload in src)
+ else if(defused)
+ active = FALSE
+ if(payload in src)
payload.defuse()
- countdown.stop()
- STOP_PROCESSING(SSfastprocess, src)
/obj/machinery/syndicatebomb/New()
wires = new(src)
@@ -244,7 +243,7 @@
/obj/machinery/syndicatebomb/proc/settings(mob/user)
var/new_timer = input(user, "Please set the timer.", "Timer", "[timer_set]") as num
if(can_interact(user)) //No running off and setting bombs from across the station
- timer_set = Clamp(new_timer, minimum_timer, maximum_timer)
+ timer_set = clamp(new_timer, minimum_timer, maximum_timer)
loc.visible_message("[bicon(src)] timer set for [timer_set] seconds.")
if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && can_interact(user))
if(defused || active)
diff --git a/code/game/machinery/tcomms/_base.dm b/code/game/machinery/tcomms/_base.dm
new file mode 100644
index 00000000000..05c7552aacc
--- /dev/null
+++ b/code/game/machinery/tcomms/_base.dm
@@ -0,0 +1,496 @@
+/*
+
+ ParadiseSS13 Telecommunications System
+
+ Rewritten from the ground up because I was totally unhappy with how laggy and complicated the current implementation was
+ The system is made up of two objects. A main core and relays.
+
+ The main core is basically the same as all of the machines from the previous implementation, apart from the relay
+ The core handles recieving and sending messages, logging messages, the NTTC configuration, and serves as the linkage hub for relays
+
+ Relays function much in the same way as the old ones. They just expand the reach of tcomms from one z-level to another.
+
+ This file contains extra datums and helper procs which the system utilises.
+ Unlike old telecomms, everything in here **should** be well documented. If not, feel free to add your own
+ -aa07
+
+*/
+
+/// Global list for all telecomms machines in the world
+GLOBAL_LIST_EMPTY(tcomms_machines)
+
+/**
+ * # Telecommunications Device
+ *
+ * This is the base machine for both tcomms devices (core + relay)
+ *
+ * This holds a few base procs (Icon updates, enable/disable, etc)
+ * It also has the initial overrides for Initialize() and Destroy()
+ */
+/obj/machinery/tcomms
+ name = "Telecommunications Device"
+ desc = "Someone forgot to say what this thingy does. Please yell at a coder"
+ icon = 'icons/obj/tcomms.dmi'
+ icon_state = "error"
+ density = TRUE
+ anchored = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 500
+ /// Network ID used for names + auto linkage
+ var/network_id = "None"
+ /// Is the machine active
+ var/active = TRUE
+ /// Has the machine been hit by an ionspheric anomalie
+ var/ion = FALSE
+
+/**
+ * Base Initializer
+ *
+ * Ensures that the machine is put into the global list of tcomms devices, and then its made sure that the icon is correct if the machine starts offline
+ */
+/obj/machinery/tcomms/Initialize(mapload)
+ . = ..()
+ GLOB.tcomms_machines += src
+ update_icon()
+ if((!mapload) && (usr))
+ // To the person who asks "Hey affected, why are you using this massive operator when you can use AREACOORD?" Well, ill tell you
+ // get_area_name is fucking broken and uses a for(x in world) search
+ // It doesnt even work, is expensive, and returns 0
+ // Im not refactoring one thing which could risk breaking all admin location logs
+ // Fight me
+ log_action(usr, "constructed a new [src] at [src ? "[get_location_name(src, TRUE)] [COORD(src)]" : "nonexistent location"] [ADMIN_JMP(src)]", adminmsg = TRUE)
+ // Add in component parts for the sake of deconstruction
+ component_parts = list()
+ component_parts += new /obj/item/stock_parts/manipulator(null)
+ component_parts += new /obj/item/stock_parts/manipulator(null)
+ component_parts += new /obj/item/stack/cable_coil(null, 1)
+ component_parts += new /obj/item/stack/cable_coil(null, 1)
+
+/**
+ * Base Destructor
+ *
+ * Ensures that the machine is taken out of the global list when destroyed
+ */
+/obj/machinery/tcomms/Destroy()
+ GLOB.tcomms_machines -= src
+ if(usr)
+ log_action(usr, "destroyed a [src] at [src ? "[get_location_name(src, TRUE)] [COORD(src)]" : "nonexistent location"] [ADMIN_JMP(src)]", adminmsg = TRUE)
+ return ..()
+
+/**
+ * Icon Updater
+ *
+ * Ensures that the icon updates properly based on if the machine is active or not. This removes the need for this check in many other places.
+ */
+/obj/machinery/tcomms/update_icon()
+ . = ..()
+ // Show the off sprite if were inactive, ion'd or unpowered
+ if(!active || (stat & NOPOWER) || ion)
+ icon_state = "[initial(icon_state)]_off"
+ else
+ icon_state = initial(icon_state)
+
+
+// Attack overrides. These are needed so the UIs can be opened up //
+/obj/machinery/tcomms/attack_ai(mob/user)
+ add_hiddenprint(user)
+ ui_interact(user)
+
+/obj/machinery/tcomms/attack_ghost(mob/user)
+ ui_interact(user)
+
+/obj/machinery/tcomms/attack_hand(mob/user)
+ if(..(user))
+ return
+ ui_interact(user)
+
+
+/**
+ * Start of Ion Anomalie Event
+ *
+ * Proc to easily start an Ion Anomalie's effects, and update the icon
+ */
+/obj/machinery/tcomms/proc/start_ion()
+ ion = TRUE
+ update_icon()
+
+/**
+ * End of Ion Anomalie Event
+ *
+ * Proc to easily stop an Ion Anomalie's effects, and update the icon
+ */
+/obj/machinery/tcomms/proc/end_ion()
+ ion = FALSE
+ update_icon()
+
+/**
+ * Logging helper
+ *
+ * Proc which allows easy logging of changs made to tcomms machines
+ * Arguments:
+ * * user - The user who did the action
+ * * msg - The log message
+ * * adminmsg - Should an admin log be sent when this happens
+ */
+/obj/machinery/tcomms/proc/log_action(user, msg, adminmsg = FALSE)
+ log_game("NTTC: [key_name(user)] [msg]")
+ log_investigate("[key_name(user)] [msg]", "nttc")
+ if(adminmsg)
+ message_admins("[key_name_admin(user)] [msg]")
+/**
+ * Power Change Handler
+ *
+ * Proc which ensures icons are updated when machines lose power
+ */
+/obj/machinery/tcomms/power_change()
+ ..()
+ update_icon()
+
+/**
+ * # Telecommunications Message
+ *
+ * Datum which holds all the data for a message being sent
+ *
+ * This used to be a single associative list with just keys and values
+ * It had no typepath or presence checking, and was absolutely awful to work with
+ * This fixes that
+ *
+ */
+/datum/tcomms_message
+ /// Who sent the message
+ var/sender_name = "Error"
+ /// What job are they
+ var/sender_job = "Error"
+ /// Pieces of the message
+ var/list/message_pieces = list()
+ /// Source Z-level
+ var/source_level = 0
+ /// What frequency the message is sent on
+ var/freq = 0
+ /// Was it sent with a voice changer
+ var/vmask = FALSE
+ /// Did the signal come from a device that requires tcomms to function
+ var/needs_tcomms = TRUE
+ /// Origin of the signal
+ var/datum/radio_frequency/connection
+ /// Who sent it
+ var/mob/sender
+ /// The radio it was sent from
+ var/obj/item/radio/radio
+ /// The signal data (See defines/radio.dm)
+ var/data
+ /// Verbage used
+ var/verbage = "says"
+ /// Follow target for AI use
+ var/atom/follow_target = null
+ /// Is this signal meant to be rejected
+ var/reject = FALSE
+ /// Voice name if the person doesnt have a name (diona, alien, etc)
+ var/vname
+ /// List of all channels this can be sent or recieved on
+ var/list/zlevels = list()
+ /// Should this signal be re-broadcasted (Can be modified by NTTC, defaults to TRUE)
+ var/pass = TRUE
+
+/**
+ * Destructor for the TCM datum.
+ *
+ * This needs to happen like this so that things dont keep references held in place
+ */
+/datum/tcomms_message/Destroy()
+ connection = null
+ radio = null
+ follow_target = null
+ return ..()
+
+
+#define CREW_RADIO_TYPE 0
+#define CENTCOMM_RADIO_TYPE 1
+#define SYNDICATE_RADIO_TYPE 2
+
+/**
+ * Connection checker
+ *
+ * Checks the connection frequency against the intended frequency for the message
+ * NOTE: I barely know what on earth this does, but it works and it scares me
+ * Arguments:
+ * * old_freq - Frequency of the connection
+ * * new_freq - Frequency of the message
+ */
+/proc/is_bad_connection(old_freq, new_freq)
+ var/old_type = CREW_RADIO_TYPE
+ var/new_type = CREW_RADIO_TYPE
+ for(var/antag_freq in SSradio.ANTAG_FREQS)
+ if(old_freq == antag_freq)
+ old_type = SYNDICATE_RADIO_TYPE
+ if(new_freq == antag_freq)
+ new_type = SYNDICATE_RADIO_TYPE
+
+ for(var/cent_freq in SSradio.CENT_FREQS)
+ if(old_freq == cent_freq)
+ old_type = CENTCOMM_RADIO_TYPE
+ if(new_freq == cent_freq)
+ new_type = CENTCOMM_RADIO_TYPE
+
+ return new_type > old_type
+
+#undef CREW_RADIO_TYPE
+#undef CENTCOMM_RADIO_TYPE
+#undef SYNDICATE_RADIO_TYPE
+
+
+/**
+ * Message Broadcast Proc
+ *
+ * This big fat disaster is responsible for sending the message out to all headsets and radios on the station
+ * It is absolutely disgusting, but used to take about 20 arguments before I slimmed it down to just one
+ * Arguments:
+ * * tcm - The tcomms message datum
+ */
+/proc/broadcast_message(datum/tcomms_message/tcm)
+
+
+ /* ###### Prepare the radio connection ###### */
+
+ var/display_freq = tcm.freq
+
+ var/bad_connection = FALSE
+ var/datum/radio_frequency/new_connection = tcm.connection
+
+ if(tcm.connection.frequency != display_freq)
+ bad_connection = is_bad_connection(tcm.connection.frequency, display_freq)
+ new_connection = SSradio.return_frequency(display_freq)
+
+ var/list/radios = list()
+
+ // --- Broadcast only to intercom devices ---
+
+ if(tcm.data == SIGNALTYPE_INTERCOM && !bad_connection)
+
+ for(var/obj/item/radio/intercom/R in new_connection.devices["[RADIO_CHAT]"])
+ if(R.receive_range(display_freq, tcm.zlevels) > -1)
+ radios += R
+
+ // --- Broadcast only to intercoms and station-bounced radios ---
+
+ else if(tcm.data == SIGNALTYPE_INTERCOM_SBR && !bad_connection)
+
+ for(var/obj/item/radio/R in new_connection.devices["[RADIO_CHAT]"])
+
+ if(istype(R, /obj/item/radio/headset))
+ continue
+
+ if(R.receive_range(display_freq, tcm.zlevels) > -1)
+ radios += R
+
+ // --- Broadcast to ALL radio devices ---
+
+ else if(!bad_connection)
+
+ for(var/obj/item/radio/R in new_connection.devices["[RADIO_CHAT]"])
+ if(R.receive_range(display_freq, tcm.zlevels) > -1)
+ radios += R
+
+ // Add syndie radios for intercepts if its a regular department frequency
+ for(var/antag_freq in SSradio.ANTAG_FREQS)
+ var/datum/radio_frequency/antag_connection = SSradio.return_frequency(antag_freq)
+ for(var/obj/item/radio/R in antag_connection.devices["[RADIO_CHAT]"])
+ if(R.receive_range(antag_freq, tcm.zlevels) > -1)
+ // Only add if it wasnt there already
+ radios |= R
+
+ // Get a list of mobs who can hear from the radios we collected.
+ var/list/receive = get_mobs_in_radio_ranges(radios)
+
+ /* ###### Organize the receivers into categories for displaying the message ###### */
+
+ // Understood the message:
+ var/list/heard_masked = list() // masked name or no real name
+ var/list/heard_normal = list() // normal message
+
+ // Did not understand the message:
+ var/list/heard_voice = list() // voice message (ie "chimpers")
+ var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!")
+ var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!")
+
+ for(var/M in receive)
+ var/mob/R = M
+
+ /* --- Loop through the receivers and categorize them --- */
+
+ if(is_admin(R) && !R.get_preference(CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
+ continue
+
+ if(isnewplayer(R)) // we don't want new players to hear messages. rare but generates runtimes.
+ continue
+
+ // --- Can understand the speech ---
+ if(!tcm.sender || R.say_understands(tcm.sender))
+
+ // - Not human or wearing a voice mask -
+ if(!tcm.sender || !ishuman(tcm.sender) || tcm.vmask)
+ heard_masked += R
+
+ // - Human and not wearing voice mask -
+ else
+ heard_normal += R
+
+ // --- Can't understand the speech ---
+
+ else
+ // - Just display a garbled message -
+ heard_garbled += R
+
+
+ /* ###### Begin formatting and sending the message ###### */
+ if(length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled) || length(heard_gibberish))
+
+ /* --- Some miscellaneous variables to format the string output --- */
+ var/freq_text = get_frequency_name(display_freq)
+
+ var/part_b_extra = ""
+ var/part_a = "\[[freq_text]\][part_b_extra]" // goes in the actual output
+
+ // --- Some more pre-message formatting ---
+ var/part_b = "" // Tweaked for security headsets -- TLE
+ var/part_c = ""
+
+
+ // --- Filter the message; place it in quotes apply a verb ---
+ var/quotedmsg = null
+ if(tcm.sender)
+ quotedmsg = "[tcm.sender.say_quote(multilingual_to_message(tcm.message_pieces))], \"[multilingual_to_message(tcm.message_pieces)]\""
+ else
+ quotedmsg = "says, \"[multilingual_to_message(tcm.message_pieces)]\""
+
+ // --- This following recording is intended for research and feedback in the use of department radio channels ---
+
+ var/part_blackbox_b = " \[[freq_text]\]" // Tweaked for security headsets -- TLE
+ var/blackbox_msg = "[part_a][tcm.sender_name][part_blackbox_b][quotedmsg][part_c]"
+ //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]"
+
+ //BR.messages_admin += blackbox_admin_msg
+ if(istype(GLOB.blackbox))
+ switch(display_freq)
+ if(PUB_FREQ)
+ GLOB.blackbox.msg_common += blackbox_msg
+ if(SCI_FREQ)
+ GLOB.blackbox.msg_science += blackbox_msg
+ if(COMM_FREQ)
+ GLOB.blackbox.msg_command += blackbox_msg
+ if(MED_FREQ)
+ GLOB.blackbox.msg_medical += blackbox_msg
+ if(ENG_FREQ)
+ GLOB.blackbox.msg_engineering += blackbox_msg
+ if(SEC_FREQ)
+ GLOB.blackbox.msg_security += blackbox_msg
+ if(DTH_FREQ)
+ GLOB.blackbox.msg_deathsquad += blackbox_msg
+ if(SYND_FREQ)
+ GLOB.blackbox.msg_syndicate += blackbox_msg
+ if(SYNDTEAM_FREQ)
+ GLOB.blackbox.msg_syndteam += blackbox_msg
+ if(SUP_FREQ)
+ GLOB.blackbox.msg_cargo += blackbox_msg
+ if(SRV_FREQ)
+ GLOB.blackbox.msg_service += blackbox_msg
+ else
+ GLOB.blackbox.messages += blackbox_msg
+ //End of research and feedback code.
+
+ /* ###### Send the message ###### */
+
+
+ /* --- Process all the mobs that heard a masked voice (understood) --- */
+
+ if(length(heard_masked))
+ for(var/M in heard_masked)
+ var/mob/R = M
+ R.hear_radio(tcm.message_pieces, tcm.verbage, part_a, part_b, tcm.sender, 0, tcm.sender_name, follow_target=tcm.follow_target)
+
+ /* --- Process all the mobs that heard the voice normally (understood) --- */
+
+ if(length(heard_normal))
+ for(var/M in heard_normal)
+ var/mob/R = M
+ R.hear_radio(tcm.message_pieces, tcm.verbage, part_a, part_b, tcm.sender, 0, tcm.sender_name, follow_target=tcm.follow_target)
+
+ /* --- Process all the mobs that heard the voice normally (did not understand) --- */
+
+ if(length(heard_voice))
+ for(var/M in heard_voice)
+ var/mob/R = M
+ R.hear_radio(tcm.message_pieces, tcm.verbage, part_a, part_b, tcm.sender,0, tcm.vname, follow_target=tcm.follow_target)
+
+ /* --- Process all the mobs that heard a garbled voice (did not understand) --- */
+ // Displays garbled message (ie "f*c* **u, **i*er!")
+
+ if(length(heard_garbled))
+ for(var/M in heard_garbled)
+ var/mob/R = M
+ R.hear_radio(tcm.message_pieces, tcm.verbage, part_a, part_b, tcm.sender, 1, tcm.vname, follow_target=tcm.follow_target)
+
+
+ /* --- Complete gibberish. Usually happens when there's a compressed message --- */
+
+ if(length(heard_gibberish))
+ for(var/M in heard_gibberish)
+ var/mob/R = M
+ R.hear_radio(tcm.message_pieces, tcm.verbage, part_a, part_b, tcm.sender, 1, follow_target=tcm.follow_target)
+
+ return TRUE
+
+
+/**
+ * # Telecommunications Password Paper
+ *
+ * Piece of paper that spawns with the default link password
+ *
+ * This is spawned in the CE office and has the default link password
+ * While convenient, this is not necessary and doesnt matter if it gets lost or destroyed
+ * Because you can view the password easily by just looking at the core link page
+ */
+/obj/item/paper/tcommskey
+ name = "Telecommunications linkage password"
+
+/**
+ * Password Paper Initializer
+ *
+ * This paper MUST be LateInitialized so the core has a chance to initialize and setup its password
+ * Otherwise shit breaks BADLY
+ */
+/obj/item/paper/tcommskey/Initialize(mapload)
+ return INITIALIZE_HINT_LATELOAD
+
+/**
+ * Password Paper Late Initializer
+ *
+ * Since the core was regularly initialized, we can now use the LateInitialize here to grab its password, then put it on paper
+ */
+/obj/item/paper/tcommskey/LateInitialize(mapload)
+ for(var/obj/machinery/tcomms/core/C in GLOB.tcomms_machines)
+ if(C.network_id == "STATION-CORE")
+ info = "
Telecommunications Key
\n\t The station core linkage password is '[C.link_password]'. Should this paper be misplaced or destroyed, fear not, as the password is visible under the core linkage section. Should you wish to modify this password, it can be modified from the core."
+ info_links = info
+ update_icon()
+ // Save time, even though there should only be one STATION-CORE in the world
+ break
+ return ..()
+
+/**
+ * Screwdriver Act Handler
+ *
+ * Handles the screwdriver action for all tcomms machines, so they can be open and closed to be deconstructed
+ */
+/obj/machinery/tcomms/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ default_deconstruction_screwdriver(user, icon_state, icon_state, I)
+
+/**
+ * Crowbar Act Handler
+ *
+ * Handles the crowbar action for all tcomms machines, so they can be deconstructed
+ */
+/obj/machinery/tcomms/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ default_deconstruction_crowbar(user, I)
diff --git a/code/game/machinery/tcomms/core.dm b/code/game/machinery/tcomms/core.dm
new file mode 100644
index 00000000000..46cd0e6df71
--- /dev/null
+++ b/code/game/machinery/tcomms/core.dm
@@ -0,0 +1,305 @@
+#define UI_TAB_CONFIG "CONFIG"
+#define UI_TAB_LINKS "LINKS"
+#define UI_TAB_FILTER "FILTER"
+
+/**
+ * # Telecommunications Core
+ *
+ * The core of the entire telecomms operation
+ *
+ * This thing basically handles the main broadcasting of the data, as well as NTTC configs
+ * The relays dont do any actual processing, they are just objects which can bring tcomms to another zlevel
+ */
+/obj/machinery/tcomms/core
+ name = "Telecommunications Core"
+ desc = "A large rack full of communications equipment. Looks important."
+ icon_state = "core"
+ /// The NTTC config for this device
+ var/datum/nttc_configuration/nttc = new()
+ /// List of all reachable devices
+ var/list/reachable_zlevels = list()
+ /// List of all linked relays
+ var/list/linked_relays = list()
+ /// Password for linking stuff together
+ var/link_password
+ /// What tab of the UI were currently on
+ var/ui_tab = UI_TAB_CONFIG
+
+/**
+ * Initializer for the core.
+ *
+ * Calls parent to ensure its added to the GLOB of tcomms machines, before generating a link password and adding itself to the list of reachable Zs.
+ */
+/obj/machinery/tcomms/core/Initialize(mapload)
+ . = ..()
+ link_password = GenerateKey()
+ reachable_zlevels |= loc.z
+ component_parts += new /obj/item/circuitboard/tcomms/core(null)
+
+/**
+ * Destructor for the core.
+ *
+ * Ensures that the machine is taken out of the global list when destroyed, and also unlinks all connected relays
+ */
+/obj/machinery/tcomms/core/Destroy()
+ for(var/obj/machinery/tcomms/relay/R in linked_relays)
+ R.Reset()
+ QDEL_NULL(nttc) // Delete the NTTC datum
+ linked_relays.Cut() // Just to be sure
+ return ..()
+
+/**
+ * Helper to see if a zlevel is reachable
+ *
+ * This is a simple check to see if the input z-level is in the list of reachable ones
+ * Returns TRUE if it can, FALSE if it cant
+ *
+ * Arguments:
+ * * zlevel - The input z level to test
+ */
+/obj/machinery/tcomms/core/proc/zlevel_reachable(zlevel)
+ // Nothing is reachable if the core is offline, unpowered, or ion'd
+ if(!active || (stat & NOPOWER) || ion)
+ return FALSE
+ if(zlevel in reachable_zlevels)
+ return TRUE
+ else
+ return FALSE
+
+/**
+ * Proc which takes in the message datum
+ *
+ * Some checks are ran on the signal, and NTTC is applied
+ * After that, it is broadcasted out to the required Z-levels
+ *
+ * Arguments:
+ * * tcm - The tcomms message datum
+ */
+/obj/machinery/tcomms/core/proc/handle_message(datum/tcomms_message/tcm)
+ // Don't do anything with rejected signals, if were offline, if we are ion'd, or if we have no power
+ if(tcm.reject || !active || (stat & NOPOWER) || ion)
+ return FALSE
+ // Kill the signal if its on a z-level that isnt reachable
+ if(!zlevel_reachable(tcm.source_level))
+ return FALSE
+
+ // Now we can run NTTC
+ tcm = nttc.modify_message(tcm)
+
+ // If the signal shouldnt be broadcast, dont broadcast it
+ if(!tcm.pass)
+ // We still return TRUE here because the signal was handled, even though we didnt broadcast
+ return TRUE
+
+ // Now we generate the list of where that signal should go to
+ tcm.zlevels = reachable_zlevels
+ tcm.zlevels |= tcm.source_level
+
+ // Now check if they actually have pieces, if so, broadcast
+ if(tcm.message_pieces)
+ broadcast_message(tcm)
+ return TRUE
+
+ return FALSE
+
+/**
+ * Proc to remake the list of available zlevels
+ *
+ * Loops through the list of connected relays and adds their zlevels in.
+ * This is called if a relay is added or removed
+ *
+ */
+/obj/machinery/tcomms/core/proc/refresh_zlevels()
+ // Refresh the list
+ reachable_zlevels = list()
+ // Add itself as a reachable Z-level
+ reachable_zlevels |= loc.z
+ // Add all the linked relays in
+ for(var/obj/machinery/tcomms/relay/R in linked_relays)
+ // Only if the relay is active
+ if(R.active && !(R.stat & NOPOWER))
+ reachable_zlevels |= R.loc.z
+
+
+//////////////
+// UI STUFF //
+//////////////
+
+/obj/machinery/tcomms/core/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ // this is silly but it has to be done because NTTC inits before languages do
+ if(nttc.valid_languages.len == 1)
+ nttc.update_languages()
+
+ // Now the actual UI stuff
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "tcomms_core.tmpl", "Telecommunications Core", 900, 600)
+ ui.open()
+ ui.set_auto_update(1)
+
+/obj/machinery/tcomms/core/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
+ var/data[0]
+ // What tab are we on
+ data["tab"] = ui_tab
+ data["ion"] = ion
+
+ // Only send NTTC settings if were on the right tab. This saves on sending overhead.
+ if(ui_tab == UI_TAB_CONFIG)
+ // Z-level list. Note that this will also show sectors with hidden relay links, but you cant see the relays themselves
+ // This allows the crew to realise that sectors have hidden relays
+ data["sectors_available"] = "Count: [length(reachable_zlevels)] | List: [jointext(reachable_zlevels, " ")]"
+ // Toggles
+ data["active"] = active
+ data["nttc_toggle_jobs"] = nttc.toggle_jobs
+ data["nttc_toggle_job_color"] = nttc.toggle_job_color
+ data["nttc_toggle_name_color"] = nttc.toggle_name_color
+ data["nttc_toggle_command_bold"] = nttc.toggle_command_bold
+ // Strings
+ data["nttc_setting_language"] = nttc.setting_language
+ data["nttc_job_indicator_type"] = nttc.job_indicator_type
+ // Network ID
+ data["network_id"] = network_id
+
+ if(ui_tab == UI_TAB_LINKS)
+ data["link_password"] = link_password
+ // You ready to see some shit?
+ for(var/obj/machinery/tcomms/relay/R in linked_relays)
+ // Dont show relays with a hidden link
+ if(R.hidden_link)
+ continue
+ // Assume false
+ var/status = FALSE
+ var/status_color = "'background-color: #eb4034'" // Red
+ if(R.active && !(R.stat & NOPOWER))
+ status = TRUE
+ status_color = "'background-color: #32a852'" // Green
+
+
+
+ data["entries"] += list(list("addr" = "\ref[R]", "net_id" = R.network_id, "sector" = R.loc.z, "status" = status, "status_color" = status_color))
+ // End the shit
+
+ if(ui_tab == UI_TAB_FILTER)
+ data["filtered_users"] = nttc.filtering
+
+ return data
+
+/obj/machinery/tcomms/core/Topic(href, href_list)
+ // Check against href exploits
+ if(..())
+ return
+
+ if(href_list["tab"])
+ // Make sure its a valid tab
+ if(href_list["tab"] in list(UI_TAB_CONFIG, UI_TAB_LINKS, UI_TAB_FILTER))
+ ui_tab = href_list["tab"]
+
+ // Check if they did a href, but only for that current tab
+ if(ui_tab == UI_TAB_CONFIG)
+ // All the toggle on/offs go here
+ if(href_list["toggle_active"])
+ active = !active
+ update_icon()
+ // NTTC Toggles
+ if(href_list["nttc_toggle_jobs"])
+ nttc.toggle_jobs = !nttc.toggle_jobs
+ log_action(usr, "toggled job tags (Now [nttc.toggle_jobs])")
+ if(href_list["nttc_toggle_job_color"])
+ nttc.toggle_job_color = !nttc.toggle_job_color
+ log_action(usr, "toggled job colors (Now [nttc.toggle_job_color])")
+ if(href_list["nttc_toggle_name_color"])
+ nttc.toggle_name_color = !nttc.toggle_name_color
+ log_action(usr, "toggled name colors (Now [nttc.toggle_name_color])")
+ if(href_list["nttc_toggle_command_bold"])
+ nttc.toggle_command_bold = !nttc.toggle_command_bold
+ log_action(usr, "toggled command bold (Now [nttc.toggle_command_bold])")
+ // We need to be a little more fancy for the others
+
+ // Job Format
+ if(href_list["nttc_job_indicator_type"])
+ var/card_style = input(usr, "Pick a job card format.", "Job Card Format") as null|anything in nttc.job_card_styles
+ if(!card_style)
+ return
+ nttc.job_indicator_type = card_style
+ to_chat(usr, "Jobs will now have the style of [card_style].")
+ log_action(usr, "has set NTTC job card format to [card_style]")
+
+ // Language Settings
+ if(href_list["nttc_setting_language"])
+ var/new_language = input(usr, "Pick a language to convert messages to.", "Language Conversion") as null|anything in nttc.valid_languages
+ if(!new_language)
+ return
+ if(new_language == "--DISABLE--")
+ nttc.setting_language = null
+ to_chat(usr, "Language conversion disabled.")
+ else
+ nttc.setting_language = new_language
+ to_chat(usr, "Messages will now be converted to [new_language].")
+
+ log_action(usr, new_language == "--DISABLE--" ? "disabled NTTC language conversion" : "set NTTC language conversion to [new_language]", TRUE)
+
+ // Imports and exports
+ if(href_list["import"])
+ var/json = input(usr, "Provide configuration JSON below.", "Load Config", nttc.nttc_serialize()) as message
+ if(nttc.nttc_deserialize(json, usr.ckey))
+ log_action(usr, "has uploaded a NTTC JSON configuration: [ADMIN_SHOWDETAILS("Show", json)]", TRUE)
+
+ if(href_list["export"])
+ usr << browse(nttc.nttc_serialize(), "window=save_nttc")
+
+ // Set network ID
+ if(href_list["network_id"])
+ var/new_id = input(usr, "Please enter a new network ID", "Network ID", network_id)
+ log_action(usr, "renamed core with ID [network_id] to [new_id]")
+ to_chat(usr, "Device ID changed from [network_id] to [new_id].")
+ network_id = new_id
+
+ if(ui_tab == UI_TAB_LINKS)
+ if(href_list["unlink"])
+ var/obj/machinery/tcomms/relay/R = locate(href_list["unlink"])
+ if(istype(R, /obj/machinery/tcomms/relay))
+ var/confirm = alert("Are you sure you want to unlink this relay?\nID: [R.network_id]\nADDR: \ref[R]", "Relay Unlink", "Yes", "No")
+ if(confirm == "Yes")
+ log_action(usr, "has unlinked tcomms relay with ID [R.network_id] from tcomms core with ID [network_id]", TRUE)
+ R.Reset()
+ else
+ to_chat(usr, "ERROR: Relay not found. Please file an issue report.")
+
+ if(href_list["change_password"])
+ var/new_password = input(usr, "Please enter a new password","New Password", link_password)
+ log_action(usr, "has changed the password on core with ID [network_id] from [link_password] to [new_password]")
+ to_chat(usr, "Successfully changed password from [link_password] to [new_password].")
+ link_password = new_password
+
+ if(ui_tab == UI_TAB_FILTER)
+ if(href_list["add_filter"])
+ // This is a stripped input because I did NOT come this far for this system to be abused by HTML injection
+ var/name_to_add = stripped_input(usr, "Enter a name to add to the filtering list", "Name Entry")
+ if(name_to_add == "")
+ return
+ if(name_to_add in nttc.filtering)
+ to_chat(usr, "ERROR: User already in filtering list.")
+ else
+ nttc.filtering |= name_to_add
+ log_action(usr, "has added [name_to_add] to the NTTC filter list on core with ID [network_id]", TRUE)
+ to_chat(usr, "Successfully added [name_to_add] to the NTTC filtering list.")
+
+
+ if(href_list["remove_filter"])
+ var/name_to_remove = href_list["remove_filter"]
+ if(!(name_to_remove in nttc.filtering))
+ to_chat(usr, "ERROR: Name does not exist in filter list. Please file an issue report.")
+ else
+ var/confirm = alert(usr, "Are you sure you want to remove [name_to_remove] from the filtering list?", "Confirm Removal", "Yes", "No")
+ if(confirm == "Yes")
+ nttc.filtering -= name_to_remove
+ log_action(usr, "has removed [name_to_remove] from the NTTC filter list on core with ID [network_id]", TRUE)
+ to_chat(usr, "Successfully removed [name_to_remove] from the NTTC filtering list.")
+
+
+ // Hack to speed update the nanoUI
+ SSnanoui.update_uis(src)
+
+#undef UI_TAB_CONFIG
+#undef UI_TAB_LINKS
+#undef UI_TAB_FILTER
diff --git a/code/game/machinery/tcomms/nttc.dm b/code/game/machinery/tcomms/nttc.dm
new file mode 100644
index 00000000000..cd880970b23
--- /dev/null
+++ b/code/game/machinery/tcomms/nttc.dm
@@ -0,0 +1,295 @@
+/*
+ NTTC system
+ This is basically the replacement for NTSL and allows tickbox features such as job titles and colours, without needing a script
+ This also means that there is no user input here, which means the system isnt prone to exploits since its only selecting options, no user input
+ Basically, just imagine pfSense for tcomms
+
+ All this code was written by Tigercat2000. I take no credit -aa07
+*/
+
+#define JOB_STYLE_1 "Name (Job)"
+#define JOB_STYLE_2 "Name - Job"
+#define JOB_STYLE_3 "\[Job\] Name"
+#define JOB_STYLE_4 "(Job) Name"
+
+/datum/nttc_configuration
+ var/regex/word_blacklist = new("( [ckey] attempted to upload an NTTC configuration containing JS abusable tags!")
+ log_admin("EXPLOIT WARNING: [ckey] attempted to upload an NTTC configuration containing JS abusable tags")
+ return FALSE
+ var/list/var_list = json_decode(text)
+ for(var/variable in var_list)
+ if(variable in to_serialize) // Don't just accept any random vars jesus christ!
+ var/sanitize_method = serialize_sanitize[variable]
+ var/variable_value = var_list[variable]
+ variable_value = nttc_sanitize(variable_value, sanitize_method)
+ if(variable_value != null)
+ vars[variable] = variable_value
+ return TRUE
+
+// Sanitizing user input. Don't blindly trust the JSON.
+/datum/nttc_configuration/proc/nttc_sanitize(variable, sanitize_method)
+ if(!sanitize_method)
+ return null
+
+ switch(sanitize_method)
+ if("bool")
+ return variable ? TRUE : FALSE
+ // if("table", "array")
+ if("array")
+ if(!islist(variable))
+ return list()
+ // Insert html filtering for the regexes here if you're boring
+ var/newlist = json_decode(html_decode(json_encode(variable)))
+ if(!islist(newlist))
+ return null
+ return newlist
+ if("string")
+ return "[variable]"
+
+ return variable
+
+// Primary signal modification. This is where all of the variables behavior are actually implemented.
+/datum/nttc_configuration/proc/modify_message(datum/tcomms_message/tcm)
+ // Check if they should be blacklisted right off the bat. We can save CPU if the message wont even be processed
+ if(tcm.sender_name in filtering)
+ tcm.pass = FALSE
+ // All job and coloring shit
+ if(toggle_job_color || toggle_name_color)
+ var/job = tcm.sender_job
+ job_class = all_jobs[job]
+
+ if(toggle_name_color)
+ var/new_name = "" + tcm.sender_name + ""
+ tcm.sender_name = new_name
+ tcm.vname = new_name // this is required because the broadcaster uses this directly if the speaker doesn't have a voice changer on
+
+ if(toggle_jobs)
+ var/new_name = ""
+ var/job = tcm.sender_job
+ if(job in ert_jobs)
+ job = "ERT"
+ if(toggle_job_color)
+ switch(job_indicator_type)
+ // These must have trailing spaces. No exceptions.
+ if(JOB_STYLE_1)
+ new_name = "[tcm.sender_name] ([job]) "
+ if(JOB_STYLE_2)
+ new_name = "[tcm.sender_name] - [job] "
+ if(JOB_STYLE_3)
+ new_name = "\[[job]\] [tcm.sender_name] "
+ if(JOB_STYLE_4)
+ new_name = "([job]) [tcm.sender_name] "
+ else
+ switch(job_indicator_type)
+ if(JOB_STYLE_1)
+ new_name = "[tcm.sender_name] ([job]) "
+ if(JOB_STYLE_2)
+ new_name = "[tcm.sender_name] - [job] "
+ if(JOB_STYLE_3)
+ new_name = "\[[job]\] [tcm.sender_name] "
+ if(JOB_STYLE_4)
+ new_name = "([job]) [tcm.sender_name] "
+
+ // Only change the name if they have a job tag set, otherwise everyone becomes unknown, and thats bad
+ if(new_name != "")
+ tcm.sender_name = new_name
+ tcm.vname = new_name // this is required because the broadcaster uses this directly if the speaker doesn't have a voice changer on
+ // This is hacky stuff for multilingual messages...
+ var/list/message_pieces = tcm.message_pieces
+
+ // Makes heads of staff bold
+ if(toggle_command_bold)
+ var/job = tcm.sender_job
+ if((job in ert_jobs) || (job in heads))
+ for(var/datum/multilingual_say_piece/S in message_pieces)
+ S.message = "[capitalize(S.message)]" // This only capitalizes the first word
+
+ // Language Conversion
+ if(setting_language && valid_languages[setting_language])
+ if(setting_language == "--DISABLE--")
+ setting_language = null
+ else
+ for(var/datum/multilingual_say_piece/S in message_pieces)
+ if(S.speaking != GLOB.all_languages["Noise"]) // check if they are emoting, these do not need to be translated
+ S.speaking = GLOB.all_languages[setting_language]
+
+ return tcm
+
+#undef JOB_STYLE_1
+#undef JOB_STYLE_2
+#undef JOB_STYLE_3
+#undef JOB_STYLE_4
diff --git a/code/game/machinery/tcomms/presets.dm b/code/game/machinery/tcomms/presets.dm
new file mode 100644
index 00000000000..efc98866f62
--- /dev/null
+++ b/code/game/machinery/tcomms/presets.dm
@@ -0,0 +1,32 @@
+/*
+ All machine presets go in here
+*/
+
+// STATION CORE //
+/obj/machinery/tcomms/core/station
+ network_id = "STATION-CORE"
+
+// MINING RELAY //
+/obj/machinery/tcomms/relay/mining
+ network_id = "MINING-RELAY"
+ autolink_id = "STATION-CORE"
+
+// ENGINEERING RELAY //
+/obj/machinery/tcomms/relay/engineering
+ network_id = "ENGINEERING-RELAY"
+ autolink_id = "STATION-CORE"
+ active = FALSE
+
+// RUSKIE RELAY //
+/obj/machinery/tcomms/relay/ruskie
+ network_id = "RUSKIE-RELAY"
+ autolink_id = "STATION-CORE"
+ active = FALSE
+ hidden_link = TRUE
+
+// CC RELAY //
+/obj/machinery/tcomms/relay/cc
+ network_id = "CENTCOMM-RELAY"
+ autolink_id = "STATION-CORE"
+ hidden_link = TRUE
+
diff --git a/code/game/machinery/tcomms/relay.dm b/code/game/machinery/tcomms/relay.dm
new file mode 100644
index 00000000000..b2faf9ce0cd
--- /dev/null
+++ b/code/game/machinery/tcomms/relay.dm
@@ -0,0 +1,170 @@
+/**
+ * # Telecommunications Relay
+ *
+ * Extends the reach of telecomms to the z-level it is built on
+ *
+ * Relays themselves dont do any processing, they just tell the core that this z-level is available in the tcomms network.
+ */
+/obj/machinery/tcomms/relay
+ name = "Telecommunications Relay"
+ desc = "A large device with several radio antennas on it."
+ icon_state = "relay"
+ /// The host core for this relay
+ var/obj/machinery/tcomms/core/linked_core
+ /// ID of the hub to auto link to
+ var/autolink_id
+ /// Is this linked to anything at all
+ var/linked = FALSE
+ /// Is this link invisible on the hub?
+ var/hidden_link = FALSE
+
+/**
+ * Initializer for the relay.
+ *
+ * Calls parent to ensure its added to the GLOB of tcomms machines, before checking if there is an autolink that needs to be added.
+ */
+/obj/machinery/tcomms/relay/Initialize(mapload)
+ . = ..()
+ component_parts += new /obj/item/circuitboard/tcomms/relay(null)
+ if(mapload && autolink_id)
+ return INITIALIZE_HINT_LATELOAD
+
+/**
+ * Descrutor for the relay.
+ *
+ * Ensures that the machine is taken out of the global list when destroyed, and also removes the link to the core.
+ */
+/obj/machinery/tcomms/relay/Destroy()
+ Reset()
+ return ..()
+
+/**
+ * Late Initialize for the relay.
+ *
+ * Calls parent, then adds links to the cores. This is a LateInitialize because the core MUST be initialized first
+ */
+/obj/machinery/tcomms/relay/LateInitialize()
+ . = ..()
+ for(var/obj/machinery/tcomms/core/C in GLOB.tcomms_machines)
+ if(C.network_id == autolink_id)
+ AddLink(C)
+ // Only ONE of these with one ID should exist per world
+ break
+
+/**
+ * Proc to link the relay to the core.
+ *
+ * Sets the linked core to the target (argument below), before adding it to the list of linked relays, then re-freshing the zlevel list
+ * The relay is then marked as linked
+ * Arguments:
+ * * target - The telecomms core that this relay should be linked to
+ */
+/obj/machinery/tcomms/relay/proc/AddLink(obj/machinery/tcomms/core/target)
+ linked_core = target
+ target.linked_relays |= src
+ target.refresh_zlevels()
+ linked = TRUE
+
+/**
+ * Proc to rest the relay.
+ *
+ * Resets the relay, removing its linkage status, and refreshing the core's list of z-levels
+ */
+/obj/machinery/tcomms/relay/proc/Reset()
+ if(linked_core)
+ linked_core.linked_relays -= src
+ linked_core.refresh_zlevels()
+ linked_core = null
+ linked = FALSE
+
+/**
+ * Power Change Handler
+ *
+ * Proc which ensures the host core has its zlevels updated (icons are updated by parent call)
+ */
+/obj/machinery/tcomms/relay/power_change()
+ ..()
+ if(linked_core)
+ linked_core.refresh_zlevels()
+
+//////////////
+// UI STUFF //
+//////////////
+
+/obj/machinery/tcomms/relay/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "tcomms_relay.tmpl", "Telecommunications Relay", 600, 400)
+ ui.open()
+ ui.set_auto_update(1)
+
+/obj/machinery/tcomms/relay/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
+ var/data[0]
+ // Are we on or not
+ data["active"] = active
+ // What is our network ID
+ data["network_id"] = network_id
+ // Are we linked
+ data["linked"] = linked
+ // Is the link hidden
+ data["hidden_link"] = hidden_link
+
+ // Only send linked tab stuff if we are linked. This saves on sending overhead.
+ if(linked)
+ data["linked_core_id"] = linked_core.network_id
+ data["linked_core_addr"] = "\ref[linked_core]"
+
+ else
+ for(var/obj/machinery/tcomms/core/C in GLOB.tcomms_machines)
+ data["entries"] += list(list("addr" = "\ref[C]", "net_id" = C.network_id, "sector" = C.loc.z))
+
+ return data
+
+/obj/machinery/tcomms/relay/Topic(href, href_list)
+ // Check against href exploits
+ if(..())
+ return
+
+ // All the toggle on/offs go here
+ if(href_list["toggle_active"])
+ active = !active
+ update_icon()
+ if(linked_core)
+ linked_core.refresh_zlevels()
+
+ // Set network ID
+ if(href_list["network_id"])
+ var/new_id = input(usr, "Please enter a new network ID", "Network ID", network_id)
+ log_action(usr, "renamed core with ID [network_id] to [new_id]")
+ to_chat(usr, "Device ID changed from [network_id] to [new_id].")
+ network_id = new_id
+
+ if(linked)
+ // Only do these hrefs if we are linked to prevent bugs/exploits
+ if(href_list["toggle_hidden_link"])
+ hidden_link = !hidden_link
+ log_action(usr, "Modified hidden link for [network_id] (Now [hidden_link])")
+
+ if(href_list["unlink"])
+ var/choice = alert(usr, "Are you SURE you want to unlink this relay?\nYou wont be able to re-link without the core password", "Unlink","Yes","No")
+ if(choice == "Yes")
+ log_action(usr, "Unlinked [network_id] from [linked_core.network_id]")
+ Reset()
+ else
+ // You should only be able to link if its not linked, to prevent weirdness
+ if(href_list["link"])
+ var/obj/machinery/tcomms/core/C = locate(href_list["link"])
+ if(istype(C, /obj/machinery/tcomms/core))
+ var/user_pass = input(usr, "Please enter core password","Password Entry")
+ // Check the password
+ if(user_pass == C.link_password)
+ AddLink(C)
+ to_chat(usr, "Successfully linked to [C.network_id].")
+ else
+ to_chat(usr, "ERROR: Password incorrect.")
+ else
+ to_chat(usr, "ERROR: Core not found. Please file an issue report.")
+
+
+ // Hack to speed update the nanoUI
+ SSnanoui.update_uis(src)
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
deleted file mode 100644
index 8cd285c994a..00000000000
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ /dev/null
@@ -1,665 +0,0 @@
-/*
- The broadcaster sends processed messages to all radio devices in the game. They
- do not have to be headsets; intercoms and station-bounced radios suffice.
-
- They receive their message from a server after the message has been logged.
-*/
-
-var/list/recentmessages = list() // global list of recent messages broadcasted : used to circumvent massive radio spam
-var/message_delay = 0 // To make sure restarting the recentmessages list is kept in sync
-
-/obj/machinery/telecomms/broadcaster
- name = "Subspace Broadcaster"
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "broadcaster"
- desc = "A dish-shaped machine used to broadcast processed subspace signals."
- density = 1
- anchored = 1
- use_power = IDLE_POWER_USE
- idle_power_usage = 25
- machinetype = 5
- circuitboard = /obj/item/circuitboard/telecomms/broadcaster
-
-/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
- // Don't broadcast rejected signals
- if(signal.data["reject"])
- return
-
- if(signal.data["message"])
-
- // Prevents massive radio spam
- signal.data["done"] = 1 // mark the signal as being broadcasted
- // Search for the original signal and mark it as done as well
- var/datum/signal/original = signal.data["original"]
- if(original)
- original.data["done"] = 1
- original.data["compression"] = signal.data["compression"]
- original.data["level"] = signal.data["level"]
-
- var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["realname"]]"
- if(signal_message in recentmessages)
- return
- recentmessages.Add(signal_message)
-
- if(signal.data["slow"] > 0)
- sleep(signal.data["slow"]) // simulate the network lag if necessary
-
- signal.data["level"] |= listening_level
-
- /** #### - Normal Broadcast - #### **/
-
- if(signal.data["type"] == 0)
-
- /* ###### Broadcast a message using signal.data ###### */
- Broadcast_Message(signal.data["connection"], signal.data["mob"],
- signal.data["vmask"], signal.data["vmessage"],
- signal.data["radio"], signal.data["message"],
- signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"],,
- signal.data["compression"], signal.data["level"], signal.frequency,
- signal.data["verb"] )
-
-
- /** #### - Simple Broadcast - #### **/
-
- if(signal.data["type"] == 1)
-
- /* ###### Broadcast a message using signal.data ###### */
- Broadcast_SimpleMessage(signal.data["name"], signal.frequency,
- signal.data["message"],null, null,
- signal.data["compression"], listening_level)
-
-
- /** #### - Artificial Broadcast - #### **/
- // (Imitates a mob)
-
- if(signal.data["type"] == 2)
-
- /* ###### Broadcast a message using signal.data ###### */
- // Parameter "data" as 4: AI can't track this person/mob
-
- Broadcast_Message(signal.data["connection"], signal.data["mob"],
- signal.data["vmask"], signal.data["vmessage"],
- signal.data["radio"], signal.data["message"],
- signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"], 4, signal.data["compression"], signal.data["level"], signal.frequency,
- signal.data["verb"])
-
- if(!message_delay)
- message_delay = 1
- spawn(10)
- message_delay = 0
- recentmessages = list()
-
- /* --- Do a snazzy animation! --- */
- flick("broadcaster_send", src)
-
-/obj/machinery/telecomms/broadcaster/Destroy()
- // In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore.
- if(message_delay)
- message_delay = 0
- return ..()
-
-
-/*
- Basically just an empty shell for receiving and broadcasting radio messages. Not
- very flexible, but it gets the job done.
-*/
-
-/obj/machinery/telecomms/allinone
- name = "Telecommunications Mainframe"
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "comm_server"
- desc = "A compact machine used for portable subspace telecommuniations processing."
- density = 1
- anchored = 1
- use_power = NO_POWER_USE
- idle_power_usage = 0
- machinetype = 6
- var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel
-
-/obj/machinery/telecomms/allinone/receive_signal(datum/signal/signal)
-
- if(!on) // has to be on to receive messages
- return
-
- if(is_freq_listening(signal)) // detect subspace signals
-
- signal.data["done"] = 1 // mark the signal as being broadcasted
- signal.data["compression"] = 0
-
- // Search for the original signal and mark it as done as well
- var/datum/signal/original = signal.data["original"]
- if(original)
- original.data["done"] = 1
-
- if(signal.data["slow"] > 0)
- sleep(signal.data["slow"]) // simulate the network lag if necessary
-
- /* ###### Broadcast a message using signal.data ###### */
-
- var/datum/radio_frequency/connection = signal.data["connection"]
-
- if(connection.frequency in SSradio.ANTAG_FREQS) // if antag broadcast, just
- Broadcast_Message(signal.data["connection"], signal.data["mob"],
- signal.data["vmask"], signal.data["vmessage"],
- signal.data["radio"], signal.data["message"],
- signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"],, signal.data["compression"], list(0), connection.frequency,
- signal.data["verb"])
- else
- if(intercept)
- Broadcast_Message(signal.data["connection"], signal.data["mob"],
- signal.data["vmask"], signal.data["vmessage"],
- signal.data["radio"], signal.data["message"],
- signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"], 3, signal.data["compression"], list(0), connection.frequency,
- signal.data["verb"])
-
-#define CREW_RADIO_TYPE 0
-#define CENTCOMM_RADIO_TYPE 1
-#define SYNDICATE_RADIO_TYPE 2
-/proc/Is_Bad_Connection(old_freq, new_freq) //Makes sure players cant read radios of a higher level than they are
- var/old_type = CREW_RADIO_TYPE
- var/new_type = CREW_RADIO_TYPE
- for(var/antag_freq in SSradio.ANTAG_FREQS)
- if(old_freq == antag_freq)
- old_type = SYNDICATE_RADIO_TYPE
- if(new_freq == antag_freq)
- new_type = SYNDICATE_RADIO_TYPE
-
- for(var/cent_freq in SSradio.CENT_FREQS)
- if(old_freq == cent_freq)
- old_type = CENTCOMM_RADIO_TYPE
- if(new_freq == cent_freq)
- new_type = CENTCOMM_RADIO_TYPE
-
- return new_type > old_type
-
-/**
-
- Here is the big, bad function that broadcasts a message given the appropriate
- parameters.
-
- @param connection:
- The datum generated in radio.dm, stored in signal.data["connection"].
-
- @param M:
- Reference to the mob/speaker, stored in signal.data["mob"]
-
- @param vmask:
- Boolean value if the mob is "hiding" its identity via voice mask, stored in
- signal.data["vmask"]
-
- @param vmessage:
- If specified, will display this as the message; such as "chimpering"
- for monkies if the mob is not understood. Stored in signal.data["vmessage"].
-
- @param radio:
- Reference to the radio broadcasting the message, stored in signal.data["radio"]
-
- @param message:
- The actual string message to display to mobs who understood mob M. Stored in
- signal.data["message"]
-
- @param name:
- The name to display when a mob receives the message. signal.data["name"]
-
- @param job:
- The name job to display for the AI when it receives the message. signal.data["job"]
-
- @param realname:
- The "real" name associated with the mob. signal.data["realname"]
-
- @param vname:
- If specified, will use this name when mob M is not understood. signal.data["vname"]
-
- @param data:
- If specified:
- 1 -- Will only broadcast to intercoms
- 2 -- Will only broadcast to intercoms and station-bounced radios
- 3 -- Broadcast to syndicate frequency
- 4 -- AI can't track down this person. Useful for imitation broadcasts where you can't find the actual mob
-
- @param compression:
- If 0, the signal is audible
- If nonzero, the signal may be partially inaudible or just complete gibberish.
-
- @param level:
- The list of Z levels that the sending radio is broadcasting to. Having 0 in the list broadcasts on all levels
-
- @param freq
- The frequency of the signal
-
-**/
-
-/proc/Broadcast_Message(var/datum/radio_frequency/connection, var/mob/M,
- var/vmask, list/vmessage_pieces, var/obj/item/radio/radio,
- list/message_pieces, var/name, var/job, var/realname, var/vname,
- var/data, var/compression, var/list/level, var/freq, var/verbage = "says",
- var/atom/follow_target = null)
-
-
- /* ###### Prepare the radio connection ###### */
-
- var/display_freq = freq
-
- var/bad_connection = FALSE
- var/datum/radio_frequency/new_connection = connection
-
- if(connection.frequency != display_freq)
- bad_connection = Is_Bad_Connection(connection.frequency, display_freq)
- new_connection = SSradio.return_frequency(display_freq)
-
- var/list/obj/item/radio/radios = list()
-
- // --- Broadcast only to intercom devices ---
-
- if(data == 1 && !bad_connection)
-
- for(var/obj/item/radio/intercom/R in new_connection.devices["[RADIO_CHAT]"])
- if(R.receive_range(display_freq, level) > -1)
- radios += R
-
- // --- Broadcast only to intercoms and station-bounced radios ---
-
- else if(data == 2 && !bad_connection)
-
- for(var/obj/item/radio/R in new_connection.devices["[RADIO_CHAT]"])
-
- if(istype(R, /obj/item/radio/headset))
- continue
-
- if(R.receive_range(display_freq, level) > -1)
- radios += R
-
- // --- Broadcast to antag radios! ---
-
- else if(data == 3)
- for(var/antag_freq in SSradio.ANTAG_FREQS)
- var/datum/radio_frequency/antag_connection = SSradio.return_frequency(antag_freq)
- for(var/obj/item/radio/R in antag_connection.devices["[RADIO_CHAT]"])
- if(R.receive_range(antag_freq, level) > -1)
- radios += R
-
- // --- Broadcast to ALL radio devices ---
-
- else if(!bad_connection)
-
- for(var/obj/item/radio/R in new_connection.devices["[RADIO_CHAT]"])
- if(R.receive_range(display_freq, level) > -1)
- radios += R
-
- // Get a list of mobs who can hear from the radios we collected.
- var/list/receive = get_mobs_in_radio_ranges(radios)
-
- /* ###### Organize the receivers into categories for displaying the message ###### */
-
- // Understood the message:
- var/list/heard_masked = list() // masked name or no real name
- var/list/heard_normal = list() // normal message
-
- // Did not understand the message:
- var/list/heard_voice = list() // voice message (ie "chimpers")
- var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!")
- var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!")
-
- for(var/mob/R in receive)
-
- /* --- Loop through the receivers and categorize them --- */
-
- if(is_admin(R) && !R.get_preference(CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
- continue
-
- if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
- continue
-
- // Ghosts hearing all radio chat don't want to hear syndicate intercepts, they're duplicates
- if(data == 3 && istype(R, /mob/dead/observer) && R.get_preference(CHAT_GHOSTRADIO))
- continue
-
- // --- Check for compression ---
- if(compression > 0)
- heard_gibberish += R
- continue
-
- // --- Can understand the speech ---
-
- if(!M || R.say_understands(M))
-
- // - Not human or wearing a voice mask -
- if(!M || !ishuman(M) || vmask)
- heard_masked += R
-
- // - Human and not wearing voice mask -
- else
- heard_normal += R
-
- // --- Can't understand the speech ---
-
- else
- // - The speaker has a prespecified "voice message" to display if not understood -
- if(vmessage_pieces)
- heard_voice += R
-
- // - Just display a garbled message -
- else
- heard_garbled += R
-
-
- /* ###### Begin formatting and sending the message ###### */
- if(length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled) || length(heard_gibberish))
-
- /* --- Some miscellaneous variables to format the string output --- */
- var/freq_text = get_frequency_name(display_freq)
-
- var/part_b_extra = ""
- if(data == 3) // intercepted radio message
- part_b_extra = " (Intercepted)"
- var/part_a = "\[[freq_text]\][part_b_extra]" // goes in the actual output
-
- // --- Some more pre-message formatting ---
- var/part_b = "" // Tweaked for security headsets -- TLE
- var/part_c = ""
-
-
- // --- Filter the message; place it in quotes apply a verb ---
- var/quotedmsg = null
- if(M)
- quotedmsg = "[M.say_quote(multilingual_to_message(message_pieces))], \"[multilingual_to_message(message_pieces)]\""
- else
- quotedmsg = "says, \"[multilingual_to_message(message_pieces)]\""
-
- // --- This following recording is intended for research and feedback in the use of department radio channels ---
-
- var/part_blackbox_b = " \[[freq_text]\]" // Tweaked for security headsets -- TLE
- var/blackbox_msg = "[part_a][name][part_blackbox_b][quotedmsg][part_c]"
- //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]"
-
- //BR.messages_admin += blackbox_admin_msg
- if(istype(blackbox))
- switch(display_freq)
- if(PUB_FREQ)
- blackbox.msg_common += blackbox_msg
- if(SCI_FREQ)
- blackbox.msg_science += blackbox_msg
- if(COMM_FREQ)
- blackbox.msg_command += blackbox_msg
- if(MED_FREQ)
- blackbox.msg_medical += blackbox_msg
- if(ENG_FREQ)
- blackbox.msg_engineering += blackbox_msg
- if(SEC_FREQ)
- blackbox.msg_security += blackbox_msg
- if(DTH_FREQ)
- blackbox.msg_deathsquad += blackbox_msg
- if(SYND_FREQ)
- blackbox.msg_syndicate += blackbox_msg
- if(SYNDTEAM_FREQ)
- blackbox.msg_syndteam += blackbox_msg
- if(SUP_FREQ)
- blackbox.msg_cargo += blackbox_msg
- if(SRV_FREQ)
- blackbox.msg_service += blackbox_msg
- else
- blackbox.messages += blackbox_msg
-
- //End of research and feedback code.
-
- /* ###### Send the message ###### */
-
-
- /* --- Process all the mobs that heard a masked voice (understood) --- */
-
- if(length(heard_masked))
- for(var/mob/R in heard_masked)
- R.hear_radio(message_pieces, verbage, part_a, part_b, M, 0, name, follow_target=follow_target)
-
- /* --- Process all the mobs that heard the voice normally (understood) --- */
-
- if(length(heard_normal))
- for(var/mob/R in heard_normal)
- R.hear_radio(message_pieces, verbage, part_a, part_b, M, 0, realname, follow_target=follow_target)
-
- /* --- Process all the mobs that heard the voice normally (did not understand) --- */
-
- if(length(heard_voice))
- for(var/mob/R in heard_voice)
- R.hear_radio(message_pieces, verbage, part_a, part_b, M,0, vname, follow_target=follow_target)
-
- /* --- Process all the mobs that heard a garbled voice (did not understand) --- */
- // Displays garbled message (ie "f*c* **u, **i*er!")
-
- if(length(heard_garbled))
- for(var/mob/R in heard_garbled)
- R.hear_radio(message_pieces, verbage, part_a, part_b, M, 1, vname, follow_target=follow_target)
-
-
- /* --- Complete gibberish. Usually happens when there's a compressed message --- */
-
- if(length(heard_gibberish))
- for(var/mob/R in heard_gibberish)
- R.hear_radio(message_pieces, verbage, part_a, part_b, M, 1, follow_target=follow_target)
-
- return 1
-
-/proc/Broadcast_SimpleMessage(var/source, var/frequency, list/message_pieces, var/data, var/mob/M, var/compression, var/level)
- var/text = multilingual_to_message(message_pieces)
- /* ###### Prepare the radio connection ###### */
-
- var/mob/living/carbon/human/H
- if(!M)
- H = new
- M = H
-
- var/datum/radio_frequency/connection = SSradio.return_frequency(frequency)
-
- var/display_freq = connection.frequency
-
- var/list/receive = list()
-
-
- // --- Broadcast only to intercom devices ---
-
- if(data == 1)
- for(var/obj/item/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
- var/turf/position = get_turf(R)
- // TODO: Make the radio system cooperate with the space manager
- if(position && position.z == level)
- receive |= R.send_hear(display_freq, level)
-
-
- // --- Broadcast only to intercoms and station-bounced radios ---
-
- else if(data == 2)
- for(var/obj/item/radio/R in connection.devices["[RADIO_CHAT]"])
-
- if(istype(R, /obj/item/radio/headset))
- continue
- var/turf/position = get_turf(R)
- // TODO: Make the radio system cooperate with the space manager
- if(position && position.z == level)
- receive |= R.send_hear(display_freq)
-
-
- // --- Broadcast to antag radios! ---
-
- else if(data == 3)
- for(var/freq in SSradio.ANTAG_FREQS)
- var/datum/radio_frequency/antag_connection = SSradio.return_frequency(freq)
- for(var/obj/item/radio/R in antag_connection.devices["[RADIO_CHAT]"])
- var/turf/position = get_turf(R)
- // TODO: Make the radio system cooperate with the space manager
- if(position && position.z == level)
- receive |= R.send_hear(freq)
-
-
- // --- Broadcast to ALL radio devices ---
-
- else
- for(var/obj/item/radio/R in connection.devices["[RADIO_CHAT]"])
- var/turf/position = get_turf(R)
- // TODO: Make the radio system cooperate with the space manager
- if(position && position.z == level)
- receive |= R.send_hear(display_freq)
-
-
- /* ###### Organize the receivers into categories for displaying the message ###### */
-
- // Understood the message:
- var/list/heard_normal = list() // normal message
-
- // Did not understand the message:
- var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!")
- var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!")
-
- for(var/mob/R in receive)
-
- /* --- Loop through the receivers and categorize them --- */
-
- if(R.client && !R.get_preference(CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
- continue
-
-
- // --- Check for compression ---
- if(compression > 0)
-
- heard_gibberish += R
- continue
-
- // --- Can understand the speech ---
-
- if(R.say_understands(M))
-
- heard_normal += R
-
- // --- Can't understand the speech ---
-
- else
- // - Just display a garbled message -
-
- heard_garbled += R
-
-
- /* ###### Begin formatting and sending the message ###### */
- if(length(heard_normal) || length(heard_garbled) || length(heard_gibberish))
-
- /* --- Some miscellaneous variables to format the string output --- */
- var/part_a = "" // goes in the actual output
- var/freq_text = get_frequency_name(display_freq)
-
- // --- Some more pre-message formatting ---
-
- var/part_b_extra = ""
- if(data == 3) // intercepted radio message
- part_b_extra = " (Intercepted)"
-
- var/part_b = " \[[freq_text]\][part_b_extra]" // Tweaked for security headsets -- TLE
- var/part_blackbox_b = " \[[freq_text]\]"
- var/part_c = ""
-
- var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]"
-
- //BR.messages_admin += blackbox_admin_msg
- if(istype(blackbox))
- switch(display_freq)
- if(PUB_FREQ)
- blackbox.msg_common += blackbox_msg
- if(SCI_FREQ)
- blackbox.msg_science += blackbox_msg
- if(COMM_FREQ)
- blackbox.msg_command += blackbox_msg
- if(MED_FREQ)
- blackbox.msg_medical += blackbox_msg
- if(ENG_FREQ)
- blackbox.msg_engineering += blackbox_msg
- if(SEC_FREQ)
- blackbox.msg_security += blackbox_msg
- if(DTH_FREQ)
- blackbox.msg_deathsquad += blackbox_msg
- if(SYND_FREQ)
- blackbox.msg_syndicate += blackbox_msg
- if(SYNDTEAM_FREQ)
- blackbox.msg_syndteam += blackbox_msg
- if(SUP_FREQ)
- blackbox.msg_cargo += blackbox_msg
- if(SRV_FREQ)
- blackbox.msg_service += blackbox_msg
- else
- blackbox.messages += blackbox_msg
-
- //End of research and feedback code.
-
- /* ###### Send the message ###### */
-
- /* --- Process all the mobs that heard the voice normally (understood) --- */
-
- if(length(heard_normal))
- var/rendered = "[part_a][source][part_b]\"[text]\"[part_c]"
-
- for(var/mob/R in heard_normal)
- R.show_message(rendered, 2)
-
- /* --- Process all the mobs that heard a garbled voice (did not understand) --- */
- // Displays garbled message (ie "f*c* **u, **i*er!")
-
- if(length(heard_garbled))
- var/quotedmsg = "\"[stars(text)]\""
- var/rendered = "[part_a][source][part_b][quotedmsg][part_c]"
-
- for(var/mob/R in heard_garbled)
- R.show_message(rendered, 2)
-
-
- /* --- Complete gibberish. Usually happens when there's a compressed message --- */
-
- if(length(heard_gibberish))
- var/quotedmsg = "\"[Gibberish(text, compression + 50)]\""
- var/rendered = "[part_a][Gibberish(source, compression + 50)][part_b][quotedmsg][part_c]"
-
- for(var/mob/R in heard_gibberish)
- R.show_message(rendered, 2)
-
- if(H)
- qdel(H)
-
-//Use this to test if an obj can communicate with a Telecommunications Network
-
-/atom/proc/test_telecomms()
- var/datum/signal/signal = src.telecomms_process()
- var/turf/position = get_turf(src)
- // TODO: Make the radio system cooperate with the space manager
- return (position.z in signal.data["level"]) && signal.data["done"]
-
-/atom/proc/telecomms_process(var/do_sleep = 1)
-
- // First, we want to generate a new radio signal
- var/datum/signal/signal = new
- signal.transmission_method = 2 // 2 would be a subspace transmission.
- var/turf/pos = get_turf(src)
-
- // --- Finally, tag the actual signal with the appropriate values ---
- signal.data = list(
- "slow" = 0, // how much to sleep() before broadcasting - simulates net lag
- "message" = "TEST",
- "compression" = rand(45, 50), // If the signal is compressed, compress our message too.
- "traffic" = 0, // dictates the total traffic sum that the signal went through
- "type" = 4, // determines what type of radio input it is: test broadcast
- "reject" = 0,
- "done" = 0,
- // TODO: Make the radio system cooperate with the space manager
- "level" = pos.z // The level it is being broadcasted at.
- )
- signal.frequency = PUB_FREQ// Common channel
-
- //#### Sending the signal to all subspace receivers ####//
- for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
- spawn(0)
- R.receive_signal(signal)
-
- if(do_sleep)
- sleep(rand(10,25))
-
- //log_world("Level: [signal.data["level"]] - Done: [signal.data["done"]]")
-
- return signal
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
deleted file mode 100644
index f0b5a945f92..00000000000
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ /dev/null
@@ -1,219 +0,0 @@
-/obj/machinery/computer/telecomms
-
- light_color = LIGHT_COLOR_DARKGREEN
-
-/obj/machinery/computer/telecomms/server
- name = "telecommunications server monitor"
- icon_screen = "comm_logs"
-
-
- var/screen = 0 // the screen number:
- var/list/servers = list() // the servers located by the computer
- var/obj/machinery/telecomms/server/SelectedServer
-
- var/network = "NULL" // the network to probe
- var/temp = "" // temporary feedback messages
-
- var/universal_translate = 0 // set to 1 if it can translate nonhuman speech
-
- req_access = list(ACCESS_TCOMSAT)
- circuit = /obj/item/circuitboard/comm_server
-
- attack_hand(mob/user as mob)
- if(stat & (BROKEN|NOPOWER))
- return
- user.set_machine(src)
- var/list/dat = list()
- dat += "Telecommunication Server Monitor
Telecommunications Server Monitor
"
-
- switch(screen)
-
-
- // --- Main Menu ---
-
- if(0)
- dat += " [temp] "
- dat += " Current Network: [network] "
- if(servers.len)
- dat += " Detected Telecommunication Servers:
"
- for(var/obj/machinery/telecomms/T in servers)
- dat += "
"
- dat += " Current Network: [network]"
- dat += " Selected Server: [SelectedServer.id]"
-
- if(SelectedServer.totaltraffic >= 1024)
- dat += " Total recorded traffic: [round(SelectedServer.totaltraffic / 1024)] Terrabytes
"
- else
- dat += " Total recorded traffic: [SelectedServer.totaltraffic] Gigabytes
"
-
- dat += "Stored Logs: "
-
- var/i = 0
- for(var/datum/comm_log_entry/C in SelectedServer.log_entries)
- i++
- // If the log is a speech file
- if(C.input_type == "Speech File")
- dat += "
[C.name] \[X\] "
-
- // -- If the orator is a human, or universal translate is active, OR mob has universal speech on --
-
- if(user.say_understands(null, C.parameters["language"]) || universal_translate || C.parameters["uspeech"])
- dat += "Data type: [C.input_type] "
- dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]]) "
- dat += "Class: [C.parameters["race"]] "
- dat += "Contents: \"[C.parameters["message"]]\" "
-
-
- // -- Orator is not human and universal translate not active --
-
- else
- dat += "Data type: Audio File "
- dat += "Source: Unidentifiable "
- dat += "Class: [C.parameters["race"]] "
- dat += "Contents: Unintelligble "
-
- dat += "
Name of Deceased: [dead_name] Rank of Deceased: [dead_rank]
Time of Death: [dead_tod]
Cause of Death: [dead_cause]
Trace Chemicals: [dead_chems]
Additional Coroner's Notes: [dead_notes]
Coroner's Signature:"
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
sleep(10)
user.put_in_hands(R)
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index 3ca37a3f662..7724d499e7e 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -54,26 +54,26 @@
user.set_machine(src)
interact(user)
-/obj/item/camera_bug/check_eye(var/mob/user as mob)
- if(user.stat || loc != user || !user.canmove || !user.has_vision() || !current)
- user.reset_perspective(null)
+/obj/item/camera_bug/check_eye(mob/user)
+ if(loc != user || user.incapacitated() || !user.has_vision() || !current)
user.unset_machine()
- return null
-
- var/turf/T = get_turf(user.loc)
- if(T.z != current.z || !current.can_use())
+ return FALSE
+ var/turf/T_user = get_turf(user.loc)
+ var/turf/T_current = get_turf(current)
+ if(!atoms_share_level(T_user, T_current) || !current.can_use())
to_chat(user, "[src] has lost the signal.")
current = null
- user.reset_perspective(null)
user.unset_machine()
- return null
+ return FALSE
+ return TRUE
- return 1
+/obj/item/camera_bug/on_unset_machine(mob/user)
+ user.reset_perspective(null)
/obj/item/camera_bug/proc/get_cameras()
if(world.time > (last_net_update + 100))
bugged_cameras = list()
- for(var/obj/machinery/camera/camera in cameranet.cameras)
+ for(var/obj/machinery/camera/camera in GLOB.cameranet.cameras)
if(camera.stat || !camera.can_use())
continue
if(length(list("SS13","MINE")&camera.network))
@@ -182,7 +182,6 @@
/obj/item/camera_bug/Topic(var/href,var/list/href_list)
if(usr != loc)
usr.unset_machine()
- usr.reset_perspective(null)
usr << browse(null, "window=camerabug")
return
usr.set_machine(src)
@@ -233,7 +232,6 @@
interact()
else
usr.unset_machine()
- usr.reset_perspective(null)
usr << browse(null, "window=camerabug")
return
else
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 97c5817f05b..95b36194f56 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -241,6 +241,7 @@
user.base_icon = disguise
user.icon_state = disguise
user.cham_proj = src
+ user.bubble_icon = "robot"
active = TRUE
user.update_icons()
@@ -249,6 +250,7 @@
S = user
user.base_icon = initial(user.base_icon)
user.icon_state = initial(user.icon_state)
+ user.bubble_icon = "syndibot"
active = FALSE
user.update_icons()
diff --git a/code/game/objects/items/devices/enginepicker.dm b/code/game/objects/items/devices/enginepicker.dm
index fe6bb7e8717..0fd3a591560 100644
--- a/code/game/objects/items/devices/enginepicker.dm
+++ b/code/game/objects/items/devices/enginepicker.dm
@@ -14,8 +14,12 @@
var/list/list_enginebeacons = list()
var/isactive = FALSE
+/obj/item/enginepicker/Destroy()
+ list_enginebeacons.Cut()
+ return ..()
+
/obj/item/enginepicker/attack_self(mob/living/carbon/user)
- if(usr.stat || !usr.canmove || usr.restrained())
+ if(user.incapacitated())
return
if(!isactive)
@@ -72,7 +76,7 @@
new G(T) //Spawns the switch-selected engine on the chosen beacon's turf
var/ailist[] = list()
- for(var/mob/living/silicon/ai/A in GLOB.living_mob_list)
+ for(var/mob/living/silicon/ai/A in GLOB.alive_mob_list)
ailist += A
if(ailist.len)
var/mob/living/silicon/ai/announcer = pick(ailist)
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index af673c7b285..8bfbf22f05d 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -67,49 +67,52 @@
times_used = max(0, times_used) //sanity
-/obj/item/flash/proc/try_use_flash(var/mob/user = null)
+/obj/item/flash/proc/try_use_flash(mob/user = null)
flash_recharge(user)
if(broken)
- return 0
+ return FALSE
- playsound(src.loc, use_sound, 100, 1)
+ playsound(loc, use_sound, 100, 1)
flick("[initial(icon_state)]2", src)
+ set_light(2, 1, COLOR_WHITE)
+ addtimer(CALLBACK(src, /atom./proc/set_light, 0), 2)
times_used++
if(user && !clown_check(user))
- return 0
+ return FALSE
- return 1
+ return TRUE
/obj/item/flash/proc/flash_carbon(var/mob/living/carbon/M, var/mob/user = null, var/power = 5, targeted = 1)
- add_attack_logs(user, M, "Flashed with [src]")
- if(user && targeted)
- if(M.weakeyes)
- M.Weaken(3) //quick weaken bypasses eye protection but has no eye flash
- if(M.flash_eyes(1, 1))
- M.AdjustConfused(power)
- terrible_conversion_proc(M, user)
- M.Stun(1)
- visible_message("[user] blinds [M] with the flash!")
- to_chat(user, "You blind [M] with the flash!")
- to_chat(M, "[user] blinds you with the flash!")
+ if(user)
+ add_attack_logs(user, M, "Flashed with [src]")
+ if(targeted)
if(M.weakeyes)
- M.Stun(2)
- M.visible_message("[M] gasps and shields [M.p_their()] eyes!", "You gasp and shields your eyes!")
- else
- visible_message("[user] fails to blind [M] with the flash!")
- to_chat(user, "You fail to blind [M] with the flash!")
- to_chat(M, "[user] fails to blind you with the flash!")
- else
- if(M.flash_eyes())
- M.AdjustConfused(power)
+ M.Weaken(3) //quick weaken bypasses eye protection but has no eye flash
+ if(M.flash_eyes(1, 1))
+ M.AdjustConfused(power)
+ terrible_conversion_proc(M, user)
+ M.Stun(1)
+ visible_message("[user] blinds [M] with the flash!")
+ to_chat(user, "You blind [M] with the flash!")
+ to_chat(M, "[user] blinds you with the flash!")
+ if(M.weakeyes)
+ M.Stun(2)
+ M.visible_message("[M] gasps and shields [M.p_their()] eyes!", "You gasp and shield your eyes!")
+ else
+ visible_message("[user] fails to blind [M] with the flash!")
+ to_chat(user, "You fail to blind [M] with the flash!")
+ to_chat(M, "[user] fails to blind you with the flash!")
+ return
+
+ if(M.flash_eyes())
+ M.AdjustConfused(power)
/obj/item/flash/attack(mob/living/M, mob/user)
if(!try_use_flash(user))
return 0
-
if(iscarbon(M))
flash_carbon(M, user, 5, 1)
if(overcharged)
@@ -117,22 +120,12 @@
M.IgniteMob()
burn_out()
return 1
-
else if(issilicon(M))
- if(isrobot(M))
- var/mob/living/silicon/robot/R = M
- if(R.module) // Perhaps they didn't choose a module yet
- for(var/obj/item/borg/combat/shield/S in R.module.modules)
- if(R.activated(S))
- add_attack_logs(user, M, "Flashed with [src]")
- user.visible_message("[user] tries to overloads [M]'s sensors with the [src.name], but is blocked by [M]'s shield!", "You try to overload [M]'s sensors with the [src.name], but are blocked by [M.p_their()] shield!")
- return 1
add_attack_logs(user, M, "Flashed with [src]")
if(M.flash_eyes(affect_silicon = 1))
M.Weaken(rand(5,10))
user.visible_message("[user] overloads [M]'s sensors with the [src.name]!", "You overload [M]'s sensors with the [src.name]!")
return 1
-
user.visible_message("[user] fails to blind [M] with the [src.name]!", "You fail to blind [M] with the [src.name]!")
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 4ce64a859ec..307964ca25c 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -74,7 +74,7 @@
if(istype(H)) //robots and aliens are unaffected
var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
- if(M.stat == DEAD || !eyes || M.disabilities & BLIND) //mob is dead or fully blind
+ if(M.stat == DEAD || !eyes || (BLINDNESS in M.mutations)) //mob is dead or fully blind
to_chat(user, "[M]'s pupils are unresponsive to the light!")
else if((XRAY in M.mutations) || eyes.see_in_dark >= 8) //The mob's either got the X-RAY vision or has a tapetum lucidum (extreme nightvision, i.e. Vulp/Tajara with COLOURBLIND & their monkey forms).
to_chat(user, "[M]'s pupils glow eerily!")
diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm
index a296e465a59..53ead129836 100644
--- a/code/game/objects/items/devices/instruments.dm
+++ b/code/game/objects/items/devices/instruments.dm
@@ -35,7 +35,7 @@
song.ui_interact(user, ui_key, ui, force_open)
-/obj/item/instrument/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/item/instrument/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
return song.ui_data(user, ui_key, state)
/obj/item/instrument/Topic(href, href_list)
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index 21b71e7668c..cfaea9f32f9 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -138,6 +138,7 @@
log_admin("[key_name(user)] EMPd a camera with a laser pointer")
user.create_attack_log("[key_name(user)] EMPd a camera with a laser pointer")
+ add_attack_logs(user, C, "EMPd with [src]", ATKLOG_ALL)
else
outmsg = "You missed the lens of [C] with [src]."
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index d9c6d60cf54..7a6b41966a8 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -167,7 +167,7 @@
// Negative numbers will subtract
/obj/item/lightreplacer/proc/AddUses(amount = 1)
- uses = Clamp(uses + amount, 0, max_uses)
+ uses = clamp(uses + amount, 0, max_uses)
/obj/item/lightreplacer/proc/AddShards(amount = 1, user)
bulb_shards += amount
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 941e90a31ef..c6fa7b20c66 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -33,8 +33,6 @@
if(H && H.mind && H.mind.miming)
to_chat(user, "Your vow of silence prevents you from speaking.")
return
- if(H.mind)
- span = H.mind.speech_span
if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice))
span = "sans"
if(spamcheck)
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index 5f987bdce45..b3695229790 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -264,7 +264,7 @@
return
last_request = world.time / 10
looking_for_personality = 1
- paiController.findPAI(src, usr)
+ GLOB.paiController.findPAI(src, usr)
if(href_list["wipe"])
var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No")
if(confirm == "Yes")
diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm
index 69beb04f67c..842a96c2af2 100644
--- a/code/game/objects/items/devices/pipe_painter.dm
+++ b/code/game/objects/items/devices/pipe_painter.dm
@@ -9,7 +9,7 @@
/obj/item/pipe_painter/New()
..()
modes = new()
- for(var/C in pipe_colors)
+ for(var/C in GLOB.pipe_colors)
modes += "[C]"
mode = pick(modes)
@@ -23,7 +23,7 @@
to_chat(user, "You must remove the plating first.")
return
- P.change_color(pipe_colors[mode])
+ P.change_color(GLOB.pipe_colors[mode])
/obj/item/pipe_painter/attack_self(mob/user as mob)
mode = input("Which colour do you want to use?", "Pipe Painter", mode) in modes
diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm
index c12331b2be2..e5c237938d6 100644
--- a/code/game/objects/items/devices/pizza_bomb.dm
+++ b/code/game/objects/items/devices/pizza_bomb.dm
@@ -27,7 +27,7 @@
desc = "A box suited for pizzas."
icon_state = "pizzabox1"
return
- timer = Clamp(timer, 10, 100)
+ timer = clamp(timer, 10, 100)
icon_state = "pizzabox1"
to_chat(user, "You set the timer to [timer / 10] before activating the payload and closing \the [src].")
message_admins("[key_name_admin(usr)] has set a timer on a pizza bomb to [timer/10] seconds at (JMP).")
@@ -52,7 +52,7 @@
if(disarmed)
visible_message("[bicon(src)] Sparks briefly jump out of the [correct_wire] wire on \the [src], but it's disarmed!")
return
- src.audible_message("[bicon(src)] [src] beeps, \"Enjoy the pizza!\"")
+ atom_say("Enjoy the pizza!")
src.visible_message("\The [src] violently explodes!")
explosion(src.loc,1,2,4,flame_range = 2) //Identical to a minibomb
qdel(src)
diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm
index 517f9f595c5..aa123930323 100644
--- a/code/game/objects/items/devices/radio/beacon.dm
+++ b/code/game/objects/items/devices/radio/beacon.dm
@@ -69,8 +69,8 @@
to_chat(user, "Locked In")
new /obj/machinery/power/singularity_beacon/syndicate( user.loc )
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
+ user.drop_item()
qdel(src)
- return
/obj/item/radio/beacon/syndicate/bomb
name = "suspicious beacon"
@@ -82,16 +82,21 @@
to_chat(user, "Locked In")
new /obj/machinery/syndicatebomb( user.loc )
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
+ user.drop_item()
qdel(src)
- return
/obj/item/radio/beacon/engine
desc = "A label on it reads: Warning: This device is used for transportation of high-density objects used for high-yield power generation. Stay away!."
anchored = 1 //Let's not move these around. Some folk might get the idea to use these for assassinations
var/list/enginetype = list()
-/obj/item/radio/beacon/engine/Initialize()
+/obj/item/radio/beacon/engine/Initialize(mapload)
LAZYADD(GLOB.engine_beacon_list, src)
+ return ..()
+
+/obj/item/radio/beacon/engine/Destroy()
+ GLOB.engine_beacon_list -= src
+ return ..()
/obj/item/radio/beacon/engine/tesling
name = "Engine Beacon for Tesla and Singularity"
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index 4b5716d73eb..284ce8d5598 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -65,7 +65,7 @@
else if(href_list["code"])
code += text2num(href_list["code"])
code = round(code)
- code = Clamp(code, 1, 100)
+ code = clamp(code, 1, 100)
else if(href_list["power"])
on = !on
@@ -103,7 +103,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/item/radio/electropack/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/item/radio/electropack/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["power"] = on
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 72e584e91aa..691c12e1347 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -21,6 +21,7 @@
var/ks1type = null
var/ks2type = null
dog_fashion = null
+ requires_tcomms = TRUE
/obj/item/radio/headset/New()
..()
@@ -88,6 +89,8 @@
/obj/item/radio/headset/syndicate
origin_tech = "syndicate=3"
ks1type = /obj/item/encryptionkey/syndicate/nukeops
+ requires_tcomms = FALSE
+ instant = TRUE // Work instantly if there are no comms
/obj/item/radio/headset/syndicate/alt //undisguised bowman with flash protection
name = "syndicate headset"
@@ -103,6 +106,13 @@
/obj/item/radio/headset/syndicate/alt/syndteam
ks1type = /obj/item/encryptionkey/syndteam
+/obj/item/radio/headset/syndicate/alt/lavaland
+ name = "syndicate lavaland headset"
+
+/obj/item/radio/headset/syndicate/alt/lavaland/New()
+ . = ..()
+ set_frequency(SYND_FREQ)
+
/obj/item/radio/headset/binary
origin_tech = "syndicate=3"
ks1type = /obj/item/encryptionkey/binary
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index fbfe984d35f..59d2c2a99bd 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -46,16 +46,15 @@
name = "station intercom (Security)"
frequency = SEC_I_FREQ
-/obj/item/radio/intercom/New(turf/loc, ndir, building = 3)
- ..()
+/obj/item/radio/intercom/New(turf/loc, direction, building = 3)
+ . = ..()
buildstage = building
if(buildstage)
START_PROCESSING(SSobj, src)
else
- if(ndir)
- pixel_x = (ndir & EAST|WEST) ? (ndir == EAST ? 28 : -28) : 0
- pixel_y = (ndir & NORTH|SOUTH) ? (ndir == NORTH ? 28 : -28) : 0
- dir=ndir
+ if(direction)
+ setDir(direction)
+ set_pixel_offsets_from_dir(28, -28, 28, -28)
b_stat=1
on = 0
GLOB.global_intercoms.Add(src)
@@ -63,7 +62,7 @@
/obj/item/radio/intercom/department/medbay/New()
..()
- internal_channels = default_medbay_channels.Copy()
+ internal_channels = GLOB.default_medbay_channels.Copy()
/obj/item/radio/intercom/department/security/New()
..()
@@ -204,7 +203,7 @@
STOP_PROCESSING(SSobj, src)
/obj/item/radio/intercom/welder_act(mob/user, obj/item/I)
- if(!buildstage)
+ if(buildstage != 0)
return
. = TRUE
if(!I.tool_use_check(user, 3))
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 23d897d491f..7ddf11ab451 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -1,4 +1,4 @@
-var/global/list/default_internal_channels = list(
+GLOBAL_LIST_INIT(default_internal_channels, list(
num2text(PUB_FREQ) = list(),
num2text(AI_FREQ) = list(ACCESS_CAPTAIN),
num2text(ERT_FREQ) = list(ACCESS_CENT_SPECOPS),
@@ -11,13 +11,13 @@ var/global/list/default_internal_channels = list(
num2text(SCI_FREQ) = list(ACCESS_RESEARCH),
num2text(SUP_FREQ) = list(ACCESS_CARGO),
num2text(SRV_FREQ) = list(ACCESS_HOP, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_JANITOR, ACCESS_CLOWN, ACCESS_MIME)
-)
+))
-var/global/list/default_medbay_channels = list(
+GLOBAL_LIST_INIT(default_medbay_channels, list(
num2text(PUB_FREQ) = list(),
num2text(MED_FREQ) = list(ACCESS_MEDICAL),
num2text(MED_I_FREQ) = list(ACCESS_MEDICAL)
-)
+))
/obj/item/radio
icon = 'icons/obj/radio.dmi'
@@ -58,6 +58,9 @@ var/global/list/default_medbay_channels = list(
var/datum/radio_frequency/radio_connection
var/list/datum/radio_frequency/secure_radio_connections = new
+ var/requires_tcomms = FALSE // Does this device require tcomms to work.If TRUE it wont function at all without tcomms. If FALSE, it will work without tcomms, just slowly
+ var/instant = FALSE // Should this device instantly communicate if there isnt tcomms
+
/obj/item/radio/proc/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
@@ -69,7 +72,7 @@ var/global/list/default_medbay_channels = list(
..()
wires = new(src)
- internal_channels = default_internal_channels.Copy()
+ internal_channels = GLOB.default_internal_channels.Copy()
GLOB.global_radios |= src
/obj/item/radio/Destroy()
@@ -116,7 +119,7 @@ var/global/list/default_medbay_channels = list(
ui.open()
ui.set_auto_update(1)
-/obj/item/radio/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/item/radio/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["mic_status"] = broadcasting
@@ -233,7 +236,7 @@ var/global/list/default_medbay_channels = list(
add_fingerprint(usr)
-/obj/item/radio/proc/autosay(var/message, var/from, var/channel, var/zlevel = config.contact_levels, var/role = "Unknown") //BS12 EDIT
+/obj/item/radio/proc/autosay(message, from, channel, role = "Unknown") //BS12 EDIT
var/datum/radio_frequency/connection = null
if(channel && channels && channels.len > 0)
if(channel == "department")
@@ -258,10 +261,29 @@ var/global/list/default_medbay_channels = list(
if(jammed)
message = Gibberish(message, 100)
var/list/message_pieces = message_to_multilingual(message)
- Broadcast_Message(connection, A,
- 0, "*garbled automated announcement*", src,
- message_pieces, from, "Automated Announcement", from, "synthesized voice",
- 4, 0, zlevel, connection.frequency, follow_target = follow_target)
+
+ // Make us a message datum!
+ var/datum/tcomms_message/tcm = new
+ tcm.connection = connection
+ tcm.sender = A
+ tcm.radio = src
+ tcm.sender_name = from
+ tcm.message_pieces = message_pieces
+ tcm.sender_job = "Automated Announcement"
+ tcm.vname = "synthesized voice"
+ tcm.data = SIGNALTYPE_AINOTRACK
+ // Datum radios dont have a location (obviously)
+ if(loc && loc.z)
+ tcm.source_level = loc.z // For anyone that reads this: This used to pull from a LIST from the CONFIG DATUM. WHYYYYYYYYY!!!!!!!! -aa
+ else
+ tcm.source_level = 1 // Assume Z1 if we dont have an actual Z level available to us.
+ tcm.freq = connection.frequency
+ tcm.follow_target = follow_target
+
+ // Now put that through the stuff
+ for(var/obj/machinery/tcomms/core/C in GLOB.tcomms_machines)
+ C.handle_message(tcm)
+ qdel(tcm) // Delete the message datum
qdel(A)
// Just a dummy mob used for making announcements, so we don't create AIs to do this
@@ -273,7 +295,7 @@ var/global/list/default_medbay_channels = list(
universal_speak = 1
/mob/living/automatedannouncer/New()
- lifetime_timer = addtimer(CALLBACK(src, .proc/autocleanup), SecondsToTicks(10), TIMER_STOPPABLE)
+ lifetime_timer = addtimer(CALLBACK(src, .proc/autocleanup), 10 SECONDS, TIMER_STOPPABLE)
..()
/mob/living/automatedannouncer/Destroy()
@@ -318,48 +340,32 @@ var/global/list/default_medbay_channels = list(
if(!M.IsVocal())
return 0
- /* Quick introduction:
- This new radio system uses a very robust FTL signaling technology unoriginally
- dubbed "subspace" which is somewhat similar to 'blue-space' but can't
- actually transmit large mass. Headsets are the only radio devices capable
- of sending subspace transmissions to the Communications Satellite.
-
- A headset sends a signal to a subspace listener/receiver elsewhere in space,
- the signal gets processed and logged, and an audible transmission gets sent
- to each individual headset.
- */
-
- //#### Grab the connection datum ####//
- var/message_mode = handle_message_mode(M, message_pieces, channel)
- switch(message_mode) //special cases
- if(RADIO_CONNECTION_FAIL)
- return 0
- if(RADIO_CONNECTION_NON_SUBSPACE)
- return 1
-
- if(!istype(message_mode, /datum/radio_frequency)) //if not a special case, it should be returning a radio connection
- return 0
-
- var/datum/radio_frequency/connection = message_mode
- var/turf/position = get_turf(src)
-
var/jammed = FALSE
- for(var/obj/item/jammer/jammer in GLOB.active_jammers)
+ var/turf/position = get_turf(src)
+ for(var/J in GLOB.active_jammers)
+ var/obj/item/jammer/jammer = J
if(get_dist(position, get_turf(jammer)) < jammer.range)
jammed = TRUE
break
- //#### Tagging the signal with all appropriate identity values ####//
+ var/message_mode = handle_message_mode(M, message_pieces, channel)
+ switch(message_mode) //special cases
+ // This is if the connection fails
+ if(RADIO_CONNECTION_FAIL)
+ return 0
+ // This is if were using either a binary key, or a hivemind through a headset somehow. Dont ask.
+ if(RADIO_CONNECTION_NON_SUBSPACE)
+ return 1
+
+ if(!istype(message_mode, /datum/radio_frequency)) //if not a special case, it should be returning a radio connection
+ return
+
+ var/datum/radio_frequency/connection = message_mode
+
// ||-- The mob's name identity --||
var/displayname = M.name // grab the display name (name you get when you hover over someone's icon)
- var/real_name = M.real_name // mob's real name
- var/mobkey = "none" // player key associated with mob
var/voicemask = 0 // the speaker is wearing a voice mask
- if(M.client)
- mobkey = M.key // assign the mob's key
-
-
var/jobname // the mob's "job"
if(jammed)
@@ -397,7 +403,7 @@ var/global/list/default_medbay_channels = list(
if(ishuman(M))
var/mob/living/carbon/human/H = M
displayname = H.voice
- if(H.voice != real_name)
+ if(H.voice != M.real_name)
voicemask = TRUE
if(syndiekey && syndiekey.change_voice && connection.frequency == SYND_FREQ)
@@ -405,124 +411,45 @@ var/global/list/default_medbay_channels = list(
jobname = "Unknown"
voicemask = TRUE
+ // Make us a message datum!
+ var/datum/tcomms_message/tcm = new
+ tcm.sender_name = displayname
+ tcm.sender_job = jobname
+ tcm.message_pieces = message_pieces
+ tcm.source_level = position.z
+ tcm.freq = connection.frequency
+ tcm.vmask = voicemask
+ tcm.needs_tcomms = requires_tcomms
+ tcm.connection = connection
+ tcm.vname = M.voice_name
+ tcm.sender = M
+ // Now put that through the stuff
+ var/handled = FALSE
+ if(connection)
+ for(var/obj/machinery/tcomms/core/C in GLOB.tcomms_machines)
+ if(C.handle_message(tcm))
+ handled = TRUE
+ qdel(tcm) // Delete the message datum
+ return TRUE
- /* ###### Radio headsets can only broadcast through subspace ###### */
+ // If we dont need tcomms and we have no connection
+ if(!requires_tcomms && !handled)
+ // If they dont need tcomms for their signal, set the type to intercoms
+ tcm.data = SIGNALTYPE_INTERCOM_SBR
+ tcm.zlevels = list(position.z)
+ if(!instant)
+ // Simulate two seconds of lag
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/broadcast_message, tcm), 20)
+ QDEL_IN(tcm, 20)
+ else
+ // Nukeops + Deathsquad headsets are instant and should work the same, whether there is comms or not
+ broadcast_message(tcm)
+ qdel(tcm) // Delete the message datum
+ return TRUE
- if(subspace_transmission)
- // First, we want to generate a new radio signal
- var/datum/signal/signal = new
- signal.transmission_method = 2 // 2 would be a subspace transmission.
- // transmission_method could probably be enumerated through #define. Would be neater.
-
- // --- Finally, tag the actual signal with the appropriate values ---
- signal.data = list(
- // Identity-associated tags:
- "mob" = M, // store a reference to the mob
- "mobtype" = M.type, // the mob's type
- "race" = signal.get_race(M),
- "realname" = real_name, // the mob's real name
- "name" = displayname, // the mob's display name
- "job" = jobname, // the mob's job
- "key" = mobkey, // the mob's key
- "vmessage" = pick(M.speak_emote), // the message to display if the voice wasn't understood
- "vname" = M.voice_name, // the name to display if the voice wasn't understood
- "vmask" = voicemask, // 1 if the mob is using a voice gas mask
-
- // We store things that would otherwise be kept in the actual mob
- // so that they can be logged even AFTER the mob is deleted or something
-
- // Other tags:
- "compression" = rand(45,50), // compressed radio signal
- "message" = message_pieces, // the actual sent message
- "connection" = connection, // the radio connection to use
- "radio" = src, // stores the radio used for transmission
- "slow" = 0, // how much to sleep() before broadcasting - simulates net lag
- "traffic" = 0, // dictates the total traffic sum that the signal went through
- "type" = 0, // determines what type of radio input it is: normal broadcast
- "server" = null, // the last server to log this signal
- "reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery
- "level" = position.z, // The source's z level
- "verb" = verb
- )
- signal.frequency = connection.frequency // Quick frequency set
-
- //#### Sending the signal to all subspace receivers ####//
-
- for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
- spawn(0)
- R.receive_signal(signal)
-
- // Allinone can act as receivers.
- for(var/obj/machinery/telecomms/allinone/R in telecomms_list)
- spawn(0)
- R.receive_signal(signal)
-
- // Receiving code can be located in Telecommunications.dm
- return signal.data["done"] && position.z in signal.data["level"]
-
-
- /* ###### Intercoms and station-bounced radios ###### */
-
- var/filter_type = 2
-
- /* --- Intercoms can only broadcast to other intercoms, but bounced radios can broadcast to bounced radios and intercoms --- */
- if(istype(src, /obj/item/radio/intercom))
- filter_type = 1
-
-
- var/datum/signal/signal = new
- signal.transmission_method = 2
-
-
- /* --- Try to send a normal subspace broadcast first */
-
- signal.data = list(
-
- "mob" = M, // store a reference to the mob
- "mobtype" = M.type, // the mob's type
- "race" = signal.get_race(M), // text to show next to mob in comms log console
- "realname" = real_name, // the mob's real name
- "name" = displayname, // the mob's display name
- "job" = jobname, // the mob's job
- "key" = mobkey, // the mob's key
- "vmessage" = pick(M.speak_emote), // the message to display if the voice wasn't understood
- "vname" = M.voice_name, // the name to display if the voice wasn't understood
- "vmask" = voicemask, // 1 if the mob is using a voice gas mas
-
- "compression" = 0, // uncompressed radio signal
- "message" = message_pieces, // the actual sent message
- "connection" = connection, // the radio connection to use
- "radio" = src, // stores the radio used for transmission
- "slow" = 0,
- "traffic" = 0,
- "type" = 0,
- "server" = null,
- "reject" = 0,
- "level" = position.z,
- "verb" = verb
- )
- signal.frequency = connection.frequency // Quick frequency set
-
- for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
- spawn(0)
- R.receive_signal(signal)
-
-
- sleep(rand(10,25)) // wait a little...
-
- if(signal.data["done"] && position.z in signal.data["level"])
- // we're done here.
- return 1
-
- // Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level.
- // Send a mundane broadcast with limited targets:
-
- //THIS IS TEMPORARY. YEAH RIGHT
- if(!connection) return 0 //~Carn
-
- return Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
- src, message_pieces, displayname, jobname, real_name, M.voice_name,
- filter_type, signal.data["compression"], list(position.z), connection.frequency,verb)
+ // If we didnt get here, oh fuck
+ qdel(tcm) // Delete the message datum
+ return FALSE
/obj/item/radio/hear_talk(mob/M as mob, list/message_pieces, var/verb = "says")
@@ -696,6 +623,9 @@ var/global/list/default_medbay_channels = list(
..()
set_frequency(ERT_FREQ)
+/obj/item/radio/borg/ert/specops
+ keyslot = new /obj/item/encryptionkey/centcom
+
/obj/item/radio/borg/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/encryptionkey/))
user.set_machine(src)
@@ -812,7 +742,7 @@ var/global/list/default_medbay_channels = list(
ui.open()
ui.set_auto_update(1)
-/obj/item/radio/borg/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/item/radio/borg/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["mic_status"] = broadcasting
@@ -863,4 +793,4 @@ var/global/list/default_medbay_channels = list(
/obj/item/radio/phone/medbay/New()
..()
- internal_channels = default_medbay_channels.Copy()
+ internal_channels = GLOB.default_medbay_channels.Copy()
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 34183a81102..f20a2cc5875 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -141,7 +141,7 @@ REAGENT SCANNER
// Used by the PDA medical scanner too
/proc/healthscan(mob/user, mob/living/M, mode = 1, advanced = FALSE)
- if(!ishuman(M) || M.isSynthetic())
+ if(!ishuman(M) || ismachineperson(M))
//these sensors are designed for organic life
to_chat(user, "Analyzing Results for ERROR:\n\t Overall Status: ERROR")
to_chat(user, "\t Key: Suffocation/Toxin/Burns/Brute")
@@ -212,7 +212,7 @@ REAGENT SCANNER
if(H.getBrainLoss() >= 100)
to_chat(user, "Subject is brain dead.")
else if(H.getBrainLoss() >= 60)
- to_chat(user, "Severe brain damage detected. Subject likely to have mental retardation.")
+ to_chat(user, "Severe brain damage detected. Subject likely to have dementia.")
else if(H.getBrainLoss() >= 10)
to_chat(user, "Significant brain damage detected. Subject may have had a concussion.")
else
@@ -859,11 +859,11 @@ REAGENT SCANNER
dat += "
[i.name]
N/A
[i.damage]
[infection]:[mech]
"
dat += ""
dat += ""
- if(target.disabilities & BLIND)
+ if(BLINDNESS in target.mutations)
dat += "Cataracts detected. "
- if(target.disabilities & COLOURBLIND)
+ if(COLOURBLIND in target.mutations)
dat += "Photoreceptor abnormalities detected. "
- if(target.disabilities & NEARSIGHTED)
+ if(NEARSIGHTED in target.mutations)
dat += "Retinal misalignment detected. "
return dat
diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm
index 8c69402ed70..9133bf37b9c 100644
--- a/code/game/objects/items/devices/sensor_device.dm
+++ b/code/game/objects/items/devices/sensor_device.dm
@@ -6,7 +6,7 @@
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
origin_tech = "programming=3;materials=3;magnets=3"
- var/datum/nano_module/crew_monitor/crew_monitor
+ var/datum/tgui_module/crew_monitor/crew_monitor
/obj/item/sensor_device/New()
..()
@@ -17,7 +17,7 @@
return ..()
/obj/item/sensor_device/attack_self(mob/user as mob)
- ui_interact(user)
+ tgui_interact(user)
-/obj/item/sensor_device/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- crew_monitor.ui_interact(user, ui_key, ui, force_open)
+/obj/item/sensor_device/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
+ crew_monitor.tgui_interact(user, ui_key, ui, force_open)
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 7a8766ebb3c..3eeb992c87e 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -194,13 +194,11 @@
if(mytape.storedinfo.len < i + 1)
playsleepseconds = 1
sleep(10)
- T = get_turf(src)
atom_say("End of recording.")
else
playsleepseconds = mytape.timestamp[i + 1] - mytape.timestamp[i]
if(playsleepseconds > 14)
sleep(10)
- T = get_turf(src)
atom_say("Skipping [playsleepseconds] seconds of silence.")
playsleepseconds = 1
i++
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index 40eea3a9856..acba0087caf 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -100,7 +100,7 @@
// auto update every Master Controller tick
//ui.set_auto_update(1)
-/obj/item/transfer_valve/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/item/transfer_valve/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["attachmentOne"] = tank_one ? tank_one.name : null
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index ab4387a988e..77e9eacc6a1 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -6,7 +6,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
*/
-var/list/world_uplinks = list()
+GLOBAL_LIST_EMPTY(world_uplinks)
/obj/item/uplink
var/welcome // Welcoming menu message
@@ -35,10 +35,10 @@ var/list/world_uplinks = list()
uses = SSticker.mode.uplink_uses
uplink_items = get_uplink_items()
- world_uplinks += src
+ GLOB.world_uplinks += src
/obj/item/uplink/Destroy()
- world_uplinks -= src
+ GLOB.world_uplinks -= src
return ..()
/obj/item/uplink/proc/generate_items(mob/user as mob)
@@ -131,7 +131,6 @@ var/list/world_uplinks = list()
else
var/datum/uplink_item/UI = ItemsReference[href_list["buy_item"]]
return buy(UI, UI ? UI.reference : "")
- return 0
/obj/item/uplink/proc/buy(var/datum/uplink_item/UI, var/reference)
if(!UI)
@@ -168,7 +167,6 @@ var/list/world_uplinks = list()
to_chat(user, "[I] refunded.")
qdel(I)
return
- ..()
// HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it.
/* How to create an uplink in 3 easy steps!
@@ -216,7 +214,7 @@ var/list/world_uplinks = list()
/*
NANO UI FOR UPLINK WOOP WOOP
*/
-/obj/item/uplink/hidden/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state)
+/obj/item/uplink/hidden/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = GLOB.inventory_state)
var/title = "Remote Uplink"
// update the ui if it exists, returns null if no ui is passed/found
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
@@ -227,7 +225,7 @@ var/list/world_uplinks = list()
// open the new ui window
ui.open()
-/obj/item/uplink/hidden/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state)
+/obj/item/uplink/hidden/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.inventory_state)
var/data[0]
data["welcome"] = welcome
@@ -277,14 +275,14 @@ var/list/world_uplinks = list()
/obj/item/uplink/hidden/proc/update_nano_data(var/id)
if(nanoui_menu == 1)
var/permanentData[0]
- for(var/datum/data/record/L in sortRecord(data_core.general))
+ for(var/datum/data/record/L in sortRecord(GLOB.data_core.general))
permanentData[++permanentData.len] = list(Name = sanitize(L.fields["name"]),"id" = L.fields["id"])
nanoui_data["exploit_records"] = permanentData
if(nanoui_menu == 11)
nanoui_data["exploit_exists"] = 0
- for(var/datum/data/record/L in data_core.general)
+ for(var/datum/data/record/L in GLOB.data_core.general)
if(L.fields["id"] == id)
nanoui_data["exploit"] = list() // Setting this to equal L.fields passes it's variables that are lists as reference instead of value.
nanoui_data["exploit"]["name"] = html_encode(L.fields["name"])
diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm
index 0edcafd64b5..14bb468e049 100644
--- a/code/game/objects/items/flag.dm
+++ b/code/game/objects/items/flag.dm
@@ -222,7 +222,7 @@
var/input_flag = input(user, "Choose a flag to disguise as.", "Choose a flag.") in show_flag
- if(user && src in user.contents)
+ if(user && (src in user.contents))
var/obj/item/flag/chosen_flag = flag[input_flag]
diff --git a/code/game/objects/items/mixing_bowl.dm b/code/game/objects/items/mixing_bowl.dm
index da851437fd5..1e1a39d49d0 100644
--- a/code/game/objects/items/mixing_bowl.dm
+++ b/code/game/objects/items/mixing_bowl.dm
@@ -118,7 +118,7 @@
/obj/item/mixing_bowl/Topic(href, href_list)
if(..())
return
- if("dispose")
+ if(href_list["dispose"])
dispose()
return
diff --git a/code/game/objects/items/mountable_frames/fire_alarm.dm b/code/game/objects/items/mountable_frames/fire_alarm.dm
index 83f435a277c..22c526664aa 100644
--- a/code/game/objects/items/mountable_frames/fire_alarm.dm
+++ b/code/game/objects/items/mountable_frames/fire_alarm.dm
@@ -6,5 +6,5 @@
mount_reqs = list("simfloor", "nospace")
/obj/item/mounted/frame/firealarm/do_build(turf/on_wall, mob/user)
- new /obj/machinery/firealarm(get_turf(src), get_dir(on_wall, user), 1)
+ new /obj/machinery/firealarm(get_turf(src), get_dir(user, on_wall), 1)
qdel(src)
diff --git a/code/game/objects/items/mountable_frames/mountables.dm b/code/game/objects/items/mountable_frames/mountables.dm
index 7120f8c880d..cfb4d18473c 100644
--- a/code/game/objects/items/mountable_frames/mountables.dm
+++ b/code/game/objects/items/mountable_frames/mountables.dm
@@ -20,7 +20,7 @@
return
if(proximity_flag != 1) //if we aren't next to the wall
return
- if(!( get_dir(on_wall,user) in cardinal))
+ if(!( get_dir(on_wall,user) in GLOB.cardinal))
to_chat(user, "You need to be standing next to a wall to place \the [src].")
return
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 6ce10294940..ca2fb17c004 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -14,7 +14,7 @@
..(newloc)
if(model_info && model)
model_info = model
- var/datum/robolimb/R = all_robolimbs[model]
+ var/datum/robolimb/R = GLOB.all_robolimbs[model]
if(R)
name = "[R.company] [initial(name)]"
desc = "[R.desc]"
@@ -24,7 +24,7 @@
name = "robot [initial(name)]"
/obj/item/robot_parts/attack_self(mob/user)
- var/choice = input(user, "Select the company appearance for this limb.", "Limb Company Selection") as null|anything in selectable_robolimbs
+ var/choice = input(user, "Select the company appearance for this limb.", "Limb Company Selection") as null|anything in GLOB.selectable_robolimbs
if(!choice)
return
if(loc != user)
@@ -253,7 +253,16 @@
to_chat(user, "This [W] does not seem to fit.")
return
- var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1)
+ var/datum/ai_laws/laws_to_give
+ if(M.syndiemmi)
+ aisync = FALSE
+ lawsync = FALSE
+ laws_to_give = new /datum/ai_laws/syndicate_override
+
+ if(!aisync)
+ lawsync = FALSE
+
+ var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1, ai_to_sync_to = forced_ai)
if(!O)
return
@@ -263,24 +272,15 @@
if(istype(task))
task.unit_completed()
- if(M.syndiemmi)
- aisync = 0
- lawsync = 0
- O.laws = new /datum/ai_laws/syndicate_override
-
O.invisibility = 0
//Transfer debug settings to new mob
O.custom_name = created_name
O.rename_character(O.real_name, O.get_default_name())
O.locked = panel_locked
- if(!aisync)
- lawsync = 0
- O.connected_ai = null
- else
- O.notify_ai(1)
- if(forced_ai)
- O.connected_ai = forced_ai
- if(!lawsync && !M.syndiemmi)
+
+ if(laws_to_give)
+ O.laws = laws_to_give
+ else if(!lawsync)
O.lawupdate = 0
O.make_laws()
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index a13bce6fb61..2d2b110fa06 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -9,23 +9,23 @@
origin_tech = "programming=2"
var/locked = 0
var/installed = 0
- var/require_module = 0
+ var/require_module = FALSE
var/module_type = null
/obj/item/borg/upgrade/proc/action(mob/living/silicon/robot/R)
if(R.stat == DEAD)
to_chat(usr, "[src] will not function on a deceased cyborg.")
- return 1
+ return TRUE
if(module_type && !istype(R.module, module_type))
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
to_chat(usr, "There's no mounting point for the module!")
- return 1
+ return TRUE
/obj/item/borg/upgrade/reset
name = "cyborg module reset board"
desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the cyborg."
icon_state = "cyborg_upgrade1"
- require_module = 1
+ require_module = TRUE
/obj/item/borg/upgrade/reset/action(mob/living/silicon/robot/R)
if(..())
@@ -48,14 +48,14 @@
if(..())
return
if(!R.allow_rename)
- to_chat(R, "Internal diagnostic error: incompatible upgrade module detected.");
+ to_chat(R, "Internal diagnostic error: incompatible upgrade module detected.")
return 0
R.notify_ai(3, R.name, heldname)
R.name = heldname
R.custom_name = heldname
R.real_name = heldname
- return 1
+ return TRUE
/obj/item/borg/upgrade/restart
name = "cyborg emergency reboot module"
@@ -74,17 +74,17 @@
R.stat = CONSCIOUS
GLOB.dead_mob_list -= R //please never forget this ever kthx
- GLOB.living_mob_list += R
+ GLOB.alive_mob_list += R
R.notify_ai(1)
- return 1
+ return TRUE
/obj/item/borg/upgrade/vtec
name = "robotic VTEC Module"
desc = "Used to kick in a robot's VTEC systems, increasing their speed."
icon_state = "cyborg_upgrade2"
- require_module = 1
+ require_module = TRUE
origin_tech = "engineering=4;materials=5;programming=4"
/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R)
@@ -97,14 +97,14 @@
R.speed = -1 // Gotta go fast.
- return 1
+ return TRUE
/obj/item/borg/upgrade/disablercooler
name = "cyborg rapid disabler cooling module"
desc = "Used to cool a mounted disabler, increasing the potential current in it and thus its recharge rate."
icon_state = "cyborg_upgrade3"
origin_tech = "engineering=4;powerstorage=4;combat=4"
- require_module = 1
+ require_module = TRUE
module_type = /obj/item/robot_module/security
/obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R)
@@ -122,7 +122,7 @@
T.charge_delay = max(2 , T.charge_delay - 4)
- return 1
+ return TRUE
/obj/item/borg/upgrade/thrusters
name = "ion thruster upgrade"
@@ -139,14 +139,14 @@
return
R.ionpulse = 1
- return 1
+ return TRUE
/obj/item/borg/upgrade/ddrill
name = "mining cyborg diamond drill"
desc = "A diamond drill replacement for the mining module's standard drill."
icon_state = "cyborg_upgrade3"
origin_tech = "engineering=4;materials=5"
- require_module = 1
+ require_module = TRUE
module_type = /obj/item/robot_module/miner
/obj/item/borg/upgrade/ddrill/action(mob/living/silicon/robot/R)
@@ -161,14 +161,14 @@
R.module.modules += new /obj/item/pickaxe/drill/cyborg/diamond(R.module)
R.module.rebuild()
- return 1
+ return TRUE
/obj/item/borg/upgrade/soh
name = "mining cyborg satchel of holding"
desc = "A satchel of holding replacement for mining cyborg's ore satchel module."
icon_state = "cyborg_upgrade3"
origin_tech = "engineering=4;materials=4;bluespace=4"
- require_module = 1
+ require_module = TRUE
module_type = /obj/item/robot_module/miner
/obj/item/borg/upgrade/soh/action(mob/living/silicon/robot/R)
@@ -181,35 +181,46 @@
R.module.modules += new /obj/item/storage/bag/ore/holding(R.module)
R.module.rebuild()
- return 1
+ return TRUE
/obj/item/borg/upgrade/syndicate
- name = "illegal equipment module"
+ name = "safety override module"
desc = "Unlocks the hidden, deadlier functions of a cyborg. Also prevents emag subversion."
icon_state = "cyborg_upgrade3"
origin_tech = "combat=4;syndicate=1"
- require_module = 1
+ require_module = TRUE
/obj/item/borg/upgrade/syndicate/action(mob/living/silicon/robot/R)
if(..())
return
-
if(R.emagged)
return
-
if(R.weapons_unlock)
- to_chat(R, "Internal diagnostic error: incompatible upgrade module detected.");
+ to_chat(R, "Internal diagnostic error: incompatible upgrade module detected.")
return
-
R.emagged = 1
+ return TRUE
- return 1
+/obj/item/borg/upgrade/lavaproof
+ name = "mining cyborg lavaproof chassis"
+ desc = "An upgrade kit to apply specialized coolant systems and insulation layers to a mining cyborg's chassis, enabling them to withstand exposure to molten rock."
+ icon_state = "ash_plating"
+ resistance_flags = LAVA_PROOF | FIRE_PROOF
+ require_module = TRUE
+ module_type = /obj/item/robot_module/miner
+
+/obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R)
+ if(..())
+ return
+ if(istype(R))
+ R.weather_immunities += "lava"
+ return TRUE
/obj/item/borg/upgrade/selfrepair
name = "self-repair module"
desc = "This module will repair the cyborg over time."
icon_state = "cyborg_upgrade5"
- require_module = 1
+ require_module = TRUE
var/repair_amount = -1
var/repair_tick = 1
var/msg_cooldown = 0
@@ -230,7 +241,7 @@
icon_state = "selfrepair_off"
var/datum/action/A = new /datum/action/item_action/toggle(src)
A.Grant(R)
- return 1
+ return TRUE
/obj/item/borg/upgrade/selfrepair/Destroy()
cyborg = null
diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm
index 8b85d8821d9..9b24b1efce6 100644
--- a/code/game/objects/items/shooting_range.dm
+++ b/code/game/objects/items/shooting_range.dm
@@ -4,24 +4,23 @@
desc = "A shooting target."
icon = 'icons/obj/objects.dmi'
icon_state = "target_h"
- density = 0
+ density = FALSE
var/hp = 1800
- var/icon/virtualIcon
- var/list/bulletholes = list()
/obj/item/target/Destroy()
+ cut_overlays()
// if a target is deleted and associated with a stake, force stake to forget
- for(var/obj/structure/target_stake/T in view(3,src))
+ for(var/obj/structure/target_stake/T in view(3, src))
if(T.pinned_target == src)
T.pinned_target = null
- T.density = 1
+ T.density = TRUE
break
return ..() // delete target
/obj/item/target/Move()
..()
// After target moves, check for nearby stakes. If associated, move to target
- for(var/obj/structure/target_stake/M in view(3,src))
+ for(var/obj/structure/target_stake/M in view(3, src))
if(M.density == 0 && M.pinned_target == src)
M.loc = loc
@@ -33,12 +32,12 @@
/obj/item/target/welder_act(mob/user, obj/item/I)
. = TRUE
- if(!use_tool(src, user, 0,, volume = I.tool_volume))
+ if(!use_tool(src, user, 0, volume = I.tool_volume))
return
overlays.Cut()
- to_chat(usr, "You slice off [src]'s uneven chunks of aluminum and scorch marks.")
+ to_chat(user, "You slice off [src]'s uneven chunks of aluminium and scorch marks.")
-/obj/item/target/attack_hand(mob/user as mob)
+/obj/item/target/attack_hand(mob/user)
// taking pinned targets off!
var/obj/structure/target_stake/stake
for(var/obj/structure/target_stake/T in view(3,src))
@@ -48,8 +47,8 @@
if(stake)
if(stake.pinned_target)
- stake.density = 1
- density = 0
+ stake.density = TRUE
+ density = FALSE
layer = OBJ_LAYER
loc = user.loc
@@ -77,101 +76,37 @@
desc = "A shooting target that looks like a xenomorphic alien."
hp = 2350 // alium onest too kinda
-/obj/item/target/bullet_act(var/obj/item/projectile/Proj)
- var/p_x = Proj.p_x + pick(0,0,0,0,0,-1,1) // really ugly way of coding "sometimes offset Proj.p_x!"
- var/p_y = Proj.p_y + pick(0,0,0,0,0,-1,1)
- var/decaltype = 1 // 1 - scorch, 2 - bullet
+#define DECALTYPE_SCORCH 1
+#define DECALTYPE_BULLET 2
- if(istype(/obj/item/projectile/bullet, Proj))
- decaltype = 2
+/obj/item/target/bullet_act(obj/item/projectile/P)
+ var/p_x = P.p_x + pick(0,0,0,0,0,-1,1) // really ugly way of coding "sometimes offset P.p_x!"
+ var/p_y = P.p_y + pick(0,0,0,0,0,-1,1)
+ var/decaltype = DECALTYPE_SCORCH
+ if(istype(P, /obj/item/projectile/bullet))
+ decaltype = DECALTYPE_BULLET
-
- virtualIcon = new(icon, icon_state)
-
- if( virtualIcon.GetPixel(p_x, p_y) ) // if the located pixel isn't blank (null)
-
- hp -= Proj.damage
+ var/icon/C = icon(icon, icon_state)
+ if(LAZYLEN(overlays) <= 35 && C.GetPixel(p_x, p_y)) // if the located pixel isn't blank (null)
+ hp -= P.damage
if(hp <= 0)
- visible_message("[src] breaks into tiny pieces and collapses!")
+ visible_message("[src] breaks into tiny pieces and collapses!")
qdel(src)
-
- // Create a temporary object to represent the damage
- var/obj/bmark = new
- bmark.pixel_x = p_x
- bmark.pixel_y = p_y
- bmark.icon = 'icons/effects/effects.dmi'
- bmark.layer = 3.5
- bmark.icon_state = "scorch"
-
- if(decaltype == 1)
- // Energy weapons are hot. they scorch!
-
- // offset correction
- bmark.pixel_x--
- bmark.pixel_y--
-
- if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/beam/practice))
- bmark.icon_state = "scorch"
- bmark.dir = pick(NORTH,SOUTH,EAST,WEST) // random scorch design
-
-
+ return
+ var/image/bullet_hole = image('icons/effects/effects.dmi', "scorch", OBJ_LAYER + 0.5)
+ bullet_hole.pixel_x = p_x - 1 //offset correction
+ bullet_hole.pixel_y = p_y - 1
+ if(decaltype == DECALTYPE_SCORCH)
+ if(P.damage >= 20 || istype(P, /obj/item/projectile/beam/practice))
+ bullet_hole.setDir(pick(NORTH,SOUTH,EAST,WEST))// random scorch design. light_scorch does not have different directions
else
- bmark.icon_state = "light_scorch"
+ bullet_hole.icon_state = "light_scorch"
else
-
- // Bullets are hard. They make dents!
- bmark.icon_state = "dent"
-
- if(Proj.damage >= 10 && bulletholes.len <= 35) // maximum of 35 bullet holes
- if(decaltype == 2) // bullet
- if(prob(Proj.damage+30)) // bullets make holes more commonly!
- new/datum/bullethole(src, bmark.pixel_x, bmark.pixel_y) // create new bullet hole
- else // Lasers!
- if(prob(Proj.damage-10)) // lasers make holes less commonly
- new/datum/bullethole(src, bmark.pixel_x, bmark.pixel_y) // create new bullet hole
-
- // draw bullet holes
- for(var/datum/bullethole/B in bulletholes)
-
- virtualIcon.DrawBox(null, B.b1x1, B.b1y, B.b1x2, B.b1y) // horizontal line, left to right
- virtualIcon.DrawBox(null, B.b2x, B.b2y1, B.b2x, B.b2y2) // vertical line, top to bottom
-
- overlays += bmark // add the decal
-
- icon = virtualIcon // apply bulletholes over decals
-
+ bullet_hole.icon_state = "dent"
+ add_overlay(bullet_hole)
return
return -1 // the bullet/projectile goes through the target! Ie, you missed
-
-// Small memory holder entity for transparent bullet holes
-/datum/bullethole
- // First box
- var/b1x1 = 0
- var/b1x2 = 0
- var/b1y = 0
-
- // Second box
- var/b2x = 0
- var/b2y1 = 0
- var/b2y2 = 0
-
-/datum/bullethole/New(obj/item/target/Target, pixel_x = 0, pixel_y = 0)
- if(!Target) return
-
- // Randomize the first box
- b1x1 = pixel_x - pick(1,1,1,1,2,2,3,3,4)
- b1x2 = pixel_x + pick(1,1,1,1,2,2,3,3,4)
- b1y = pixel_y
- if(prob(35))
- b1y += rand(-4,4)
-
- // Randomize the second box
- b2x = pixel_x
- if(prob(35))
- b2x += rand(-4,4)
- b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4)
- b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4)
-
- Target.bulletholes.Add(src)
+#undef DECALTYPE_SCORCH
+#undef DECALTYPE_BULLET
diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm
index 59dad865acb..ff469ba3c59 100644
--- a/code/game/objects/items/stacks/nanopaste.dm
+++ b/code/game/objects/items/stacks/nanopaste.dm
@@ -4,6 +4,7 @@
desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery."
icon = 'icons/obj/nanopaste.dmi'
icon_state = "tube"
+ w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=2;engineering=3"
amount = 6
max_amount = 6
@@ -56,7 +57,7 @@
E.heal_damage(0, remheal, 0, 1) //Healing Burn
remheal = nremheal
user.visible_message("\The [user] applies some nanite paste at \the [M]'s [E.name] with \the [src].")
- if(H.bleed_rate && H.isSynthetic())
+ if(H.bleed_rate && ismachineperson(H))
H.bleed_rate = 0
else
to_chat(user, "Nothing to fix here.")
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index 3b214f87940..3911ab51cc7 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -1,7 +1,7 @@
-var/global/list/datum/stack_recipe/rod_recipes = list ( \
+GLOBAL_LIST_INIT(rod_recipes, list ( \
new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 10, one_per_turf = 1, on_floor = 1), \
- )
+ ))
/obj/item/stack/rods
name = "metal rod"
@@ -36,7 +36,7 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \
/obj/item/stack/rods/New(loc, amount=null)
..()
- recipes = rod_recipes
+ recipes = GLOB.rod_recipes
update_icon()
/obj/item/stack/rods/update_icon()
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 4d3e3181726..000ad2d225f 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -17,9 +17,9 @@
GLOBAL_LIST_INIT(glass_recipes, list ( \
new/datum/stack_recipe/window("directional window", /obj/structure/window/basic, time = 0, on_floor = TRUE, window_checks = TRUE), \
new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
- new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 0), \
- new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 0, on_floor = TRUE), \
- new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 0, on_floor = TRUE) \
+ new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 10), \
+ new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 20, on_floor = TRUE), \
+ new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \
))
/obj/item/stack/sheet/glass
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index d79c31467bf..6bdfdd49234 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -9,13 +9,13 @@
singular_name = "human skin piece"
icon_state = "sheet-hide"
-var/global/list/datum/stack_recipe/human_recipes = list( \
- new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/bloated_human, 5, on_floor = 1), \
- new/datum/stack_recipe("bloated human costume head", /obj/item/clothing/head/human_head, 5, on_floor = 1), \
- )
+GLOBAL_LIST_INIT(human_recipes, list( \
+ new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/bloated_human, 5, on_floor = TRUE), \
+ new/datum/stack_recipe("bloated human costume head", /obj/item/clothing/head/human_head, 5, on_floor = TRUE), \
+ ))
/obj/item/stack/sheet/animalhide/human/New(var/loc, var/amount=null)
- recipes = human_recipes
+ recipes = GLOB.human_recipes
return ..()
/obj/item/stack/sheet/animalhide/generic
@@ -48,6 +48,14 @@ var/global/list/datum/stack_recipe/human_recipes = list( \
singular_name = "lizard skin piece"
icon_state = "sheet-lizard"
+GLOBAL_LIST_INIT(lizard_recipes, list( \
+ new/datum/stack_recipe("lizard skin handbag", /obj/item/storage/backpack/satchel/lizard, 5, on_floor = TRUE), \
+ ))
+
+/obj/item/stack/sheet/animalhide/lizard/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.lizard_recipes
+ return ..()
+
/obj/item/stack/sheet/animalhide/xeno
name = "alien hide"
desc = "The skin of a terrible creature."
@@ -132,12 +140,12 @@ GLOBAL_LIST_INIT(leather_recipes, list (
icon_state = "sinew"
origin_tech = "biotech=4"
-var/global/list/datum/stack_recipe/sinew_recipes = list ( \
+GLOBAL_LIST_INIT(sinew_recipes, list ( \
new/datum/stack_recipe("sinew restraints", /obj/item/restraints/handcuffs/sinew, 1, on_floor = 1), \
- )
+ ))
/obj/item/stack/sheet/sinew/New(var/loc, var/amount=null)
- recipes = sinew_recipes
+ recipes = GLOB.sinew_recipes
return ..()
/obj/item/stack/sheet/animalhide/goliath_hide
@@ -161,9 +169,9 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \
return
if(is_type_in_typecache(target, goliath_platable_armor_typecache))
var/obj/item/clothing/C = target
- var/list/current_armor = C.armor
- if(current_armor["melee"] < 60)
- current_armor["melee"] = min(current_armor["melee"] + 10, 60)
+ var/datum/armor/current_armor = C.armor
+ if(current_armor.getRating("melee") < 60)
+ C.armor = current_armor.setRating(melee_value = min(current_armor.getRating("melee") + 10, 60))
to_chat(user, "You strengthen [target], improving its resistance against melee attacks.")
use(1)
else
@@ -172,9 +180,9 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \
var/obj/mecha/working/ripley/D = target
if(D.hides < 3)
D.hides++
- D.armor["melee"] = min(D.armor["melee"] + 10, 70)
- D.armor["bullet"] = min(D.armor["bullet"] + 5, 50)
- D.armor["laser"] = min(D.armor["laser"] + 5, 50)
+ D.armor = D.armor.setRating(melee_value = min(D.armor.getRating("melee") + 10, 70))
+ D.armor = D.armor.setRating(bullet_value = min(D.armor.getRating("bullet") + 5, 50))
+ D.armor = D.armor.setRating(laser_value = min(D.armor.getRating("laser") + 5, 50))
to_chat(user, "You strengthen [target], improving its resistance against melee attacks.")
D.update_icon()
if(D.hides == 3)
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 0791bb760dc..9dabea08319 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -15,16 +15,16 @@ Mineral Sheets
- Adamantine
*/
-var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
+GLOBAL_LIST_INIT(sandstone_recipes, list ( \
new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("Assistant Statue", /obj/structure/statue/sandstone/assistant, 5, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, one_per_turf = 0, on_floor = 1), \
- )
+ ))
-var/global/list/datum/stack_recipe/silver_recipes = list ( \
+GLOBAL_LIST_INIT(silver_recipes, list ( \
new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("silver tile", /obj/item/stack/tile/mineral/silver, 1, 4, 20), \
@@ -34,9 +34,9 @@ var/global/list/datum/stack_recipe/silver_recipes = list ( \
new/datum/stack_recipe("Sec Borg Statue", /obj/structure/statue/silver/secborg, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Med Doctor Statue", /obj/structure/statue/silver/md, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Med Borg Statue", /obj/structure/statue/silver/medborg, 5, one_per_turf = 1, on_floor = 1), \
- )
+ ))
-var/global/list/datum/stack_recipe/diamond_recipes = list ( \
+GLOBAL_LIST_INIT(diamond_recipes, list ( \
new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("diamond tile", /obj/item/stack/tile/mineral/diamond, 1, 4, 20), \
@@ -44,18 +44,18 @@ var/global/list/datum/stack_recipe/diamond_recipes = list ( \
new/datum/stack_recipe("Captain Statue", /obj/structure/statue/diamond/captain, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("AI Hologram Statue", /obj/structure/statue/diamond/ai1, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("AI Core Statue", /obj/structure/statue/diamond/ai2, 5, one_per_turf = 1, on_floor = 1), \
- )
+ ))
-var/global/list/datum/stack_recipe/uranium_recipes = list ( \
+GLOBAL_LIST_INIT(uranium_recipes, list ( \
new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("uranium tile", /obj/item/stack/tile/mineral/uranium, 1, 4, 20), \
null, \
new/datum/stack_recipe("Nuke Statue", /obj/structure/statue/uranium/nuke, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Engineer Statue", /obj/structure/statue/uranium/eng, 5, one_per_turf = 1, on_floor = 1), \
- )
+ ))
-var/global/list/datum/stack_recipe/gold_recipes = list ( \
+GLOBAL_LIST_INIT(gold_recipes, list ( \
new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("gold tile", /obj/item/stack/tile/mineral/gold, 1, 4, 20), \
@@ -67,51 +67,51 @@ var/global/list/datum/stack_recipe/gold_recipes = list ( \
new/datum/stack_recipe("CMO Statue", /obj/structure/statue/gold/cmo, 5, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("Simple Crown", /obj/item/clothing/head/crown, 5), \
- )
+ ))
-var/global/list/datum/stack_recipe/plasma_recipes = list ( \
+GLOBAL_LIST_INIT(plasma_recipes, list ( \
new/datum/stack_recipe/dangerous("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe/dangerous("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \
null, \
new/datum/stack_recipe/dangerous("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe/dangerous("Xenomorph Statue", /obj/structure/statue/plasma/xeno, 5, one_per_turf = 1, on_floor = 1), \
- )
+ ))
-var/global/list/datum/stack_recipe/bananium_recipes = list ( \
+GLOBAL_LIST_INIT(bananium_recipes, list ( \
new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \
null, \
new/datum/stack_recipe("Clown Statue", /obj/structure/statue/bananium/clown, 5, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("bananium computer frame", /obj/structure/computerframe/HONKputer, 50, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("bananium grenade casing", /obj/item/grenade/bananade/casing, 4, on_floor = 1), \
- )
+ ))
-var/global/list/datum/stack_recipe/tranquillite_recipes = list ( \
+GLOBAL_LIST_INIT(tranquillite_recipes, list ( \
new/datum/stack_recipe("invisible wall", /obj/structure/barricade/mime, 5, one_per_turf = 1, on_floor = 1, time = 50), \
null, \
new/datum/stack_recipe("silent tile", /obj/item/stack/tile/mineral/tranquillite, 1, 4, 20), \
null, \
new/datum/stack_recipe("Mime Statue", /obj/structure/statue/tranquillite/mime, 5, one_per_turf = 1, on_floor = 1), \
- )
+ ))
-var/global/list/datum/stack_recipe/abductor_recipes = list ( \
+GLOBAL_LIST_INIT(abductor_recipes, list ( \
new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("alien table frame", /obj/structure/table_frame/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("alien airlock assembly", /obj/structure/door_assembly/door_assembly_abductor, 4, time = 20, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20), \
- )
+ ))
-var/global/list/datum/stack_recipe/adamantine_recipes = list(
+GLOBAL_LIST_INIT(adamantine_recipes, list(
new /datum/stack_recipe("incomplete servant golem shell", /obj/item/golem_shell/servant, req_amount = 1, res_amount = 1), \
- )
+ ))
-var/global/list/datum/stack_recipe/snow_recipes = list(
+GLOBAL_LIST_INIT(snow_recipes, list(
new/datum/stack_recipe("snowman", /obj/structure/snowman, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Snowball", /obj/item/snowball, 1)
- )
+ ))
/obj/item/stack/sheet/mineral
force = 5
@@ -135,7 +135,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list(
/obj/item/stack/sheet/mineral/sandstone/New()
..()
- recipes = sandstone_recipes
+ recipes = GLOB.sandstone_recipes
/*
* Sandbags
@@ -186,7 +186,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
/obj/item/stack/sheet/mineral/diamond/New()
..()
- recipes = diamond_recipes
+ recipes = GLOB.diamond_recipes
/obj/item/stack/sheet/mineral/uranium
name = "uranium"
@@ -199,7 +199,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
/obj/item/stack/sheet/mineral/uranium/New()
..()
- recipes = uranium_recipes
+ recipes = GLOB.uranium_recipes
/obj/item/stack/sheet/mineral/plasma
name = "solid plasma"
@@ -214,14 +214,26 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
/obj/item/stack/sheet/mineral/plasma/New()
..()
- recipes = plasma_recipes
+ recipes = GLOB.plasma_recipes
/obj/item/stack/sheet/mineral/plasma/welder_act(mob/user, obj/item/I)
if(I.use_tool(src, user, volume = I.tool_volume))
- message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")]) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma sheets ignited by [key_name(user)] in ([x],[y],[z])")
- investigate_log("was ignited by [key_name(user)]","atmos")
- fire_act()
+ log_and_set_aflame(user, I)
+ return TRUE
+
+/obj/item/stack/sheet/mineral/plasma/attackby(obj/item/I, mob/living/user, params)
+ if(is_hot(I))
+ log_and_set_aflame(user, I)
+ else
+ return ..()
+
+/obj/item/stack/sheet/mineral/plasma/proc/log_and_set_aflame(mob/user, obj/item/I)
+ var/turf/T = get_turf(src)
+ message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user, "?")]) ([ADMIN_FLW(user, "FLW")]) in ([COORD(T)] - [ADMIN_JMP(T)]")
+ log_game("Plasma sheets ignited by [key_name(user)] in [COORD(T)]")
+ investigate_log("was ignited by [key_name(user)]", "atmos")
+ user.create_log(MISC_LOG, "Plasma sheets ignited using [I]", src)
+ fire_act()
/obj/item/stack/sheet/mineral/plasma/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
@@ -239,7 +251,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
/obj/item/stack/sheet/mineral/gold/New()
..()
- recipes = gold_recipes
+ recipes = GLOB.gold_recipes
/obj/item/stack/sheet/mineral/silver
name = "silver"
@@ -252,7 +264,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
/obj/item/stack/sheet/mineral/silver/New()
..()
- recipes = silver_recipes
+ recipes = GLOB.silver_recipes
/obj/item/stack/sheet/mineral/bananium
name = "bananium"
@@ -265,7 +277,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
/obj/item/stack/sheet/mineral/bananium/New(loc, amount=null)
..()
- recipes = bananium_recipes
+ recipes = GLOB.bananium_recipes
/obj/item/stack/sheet/mineral/tranquillite
name = "tranquillite"
@@ -279,7 +291,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
/obj/item/stack/sheet/mineral/tranquillite/New(loc, amount=null)
..()
- recipes = tranquillite_recipes
+ recipes = GLOB.tranquillite_recipes
/*
* Titanium
@@ -298,13 +310,13 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT)
point_value = 20
-var/global/list/datum/stack_recipe/titanium_recipes = list (
+GLOBAL_LIST_INIT(titanium_recipes, list(
new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20),
new/datum/stack_recipe("surgical tray", /obj/structure/table/tray, 2, one_per_turf = 1, on_floor = 1),
- )
+ ))
/obj/item/stack/sheet/mineral/titanium/New(loc, amount=null)
- recipes = titanium_recipes
+ recipes = GLOB.titanium_recipes
..()
/obj/item/stack/sheet/mineral/titanium/fifty
@@ -328,12 +340,12 @@ var/global/list/datum/stack_recipe/titanium_recipes = list (
materials = list(MAT_TITANIUM=2000, MAT_PLASMA=2000)
point_value = 45
-var/global/list/datum/stack_recipe/plastitanium_recipes = list (
+GLOBAL_LIST_INIT(plastitanium_recipes, list(
new/datum/stack_recipe("plas-titanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20),
- )
+ ))
/obj/item/stack/sheet/mineral/plastitanium/New(loc, amount=null)
- recipes = plastitanium_recipes
+ recipes = GLOB.plastitanium_recipes
..()
/obj/item/stack/sheet/mineral/enruranium
@@ -356,7 +368,7 @@ var/global/list/datum/stack_recipe/plastitanium_recipes = list (
sheettype = "abductor"
/obj/item/stack/sheet/mineral/abductor/New(loc, amount=null)
- recipes = abductor_recipes
+ recipes = GLOB.abductor_recipes
..()
/obj/item/stack/sheet/mineral/adamantine
@@ -369,7 +381,7 @@ var/global/list/datum/stack_recipe/plastitanium_recipes = list (
wall_allowed = FALSE
/obj/item/stack/sheet/mineral/adamantine/New(loc, amount = null)
- recipes = adamantine_recipes
+ recipes = GLOB.adamantine_recipes
..()
/*
@@ -385,5 +397,5 @@ var/global/list/datum/stack_recipe/plastitanium_recipes = list (
merge_type = /obj/item/stack/sheet/mineral/snow
/obj/item/stack/sheet/mineral/snow/New(loc, amount = null)
- recipes = snow_recipes
+ recipes = GLOB.snow_recipes
..()
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 30085f8dad2..ac635eebef7 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -13,7 +13,7 @@
/*
* Metal
*/
-var/global/list/datum/stack_recipe/metal_recipes = list(
+GLOBAL_LIST_INIT(metal_recipes, list(
new /datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("shuttle seat", /obj/structure/chair/comfy/shuttle, 2, one_per_turf = 1, on_floor = 1),
@@ -94,7 +94,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
new /datum/stack_recipe("intercom frame", /obj/item/mounted/frame/intercom, 2),
new /datum/stack_recipe("extinguisher cabinet frame", /obj/item/mounted/frame/extinguisher, 2),
null
-)
+))
/obj/item/stack/sheet/metal
name = "metal"
@@ -124,13 +124,13 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
qdel(src)
/obj/item/stack/sheet/metal/New(var/loc, var/amount=null)
- recipes = metal_recipes
+ recipes = GLOB.metal_recipes
return ..()
/*
* Plasteel
*/
-var/global/list/datum/stack_recipe/plasteel_recipes = list(
+GLOBAL_LIST_INIT(plasteel_recipes, list(
new /datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1),
new /datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 3, time = 50),
new /datum/stack_recipe("Surgery Table", /obj/machinery/optable, 5, time = 50, one_per_turf = 1, on_floor = 1),
@@ -141,7 +141,7 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list(
new /datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 6, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("vault door assembly", /obj/structure/door_assembly/door_assembly_vault, 8, time = 50, one_per_turf = 1, on_floor = 1),
)),
-)
+))
/obj/item/stack/sheet/plasteel
name = "plasteel"
@@ -159,13 +159,13 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list(
point_value = 23
/obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null)
- recipes = plasteel_recipes
+ recipes = GLOB.plasteel_recipes
return ..()
/*
* Wood
*/
-var/global/list/datum/stack_recipe/wood_recipes = list(
+GLOBAL_LIST_INIT(wood_recipes, list(
new /datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1),
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), \
@@ -178,7 +178,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
new /datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40),
new /datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1),
- new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, 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("honey frame", /obj/item/honey_frame, 5, time = 10),
@@ -189,7 +189,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
new /datum/stack_recipe("loom", /obj/structure/loom, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
new /datum/stack_recipe("fermenting barrel", /obj/structure/fermenting_barrel, 30, time = 50),
new /datum/stack_recipe("firebrand", /obj/item/match/firebrand, 2, time = 100)
-)
+))
/obj/item/stack/sheet/wood
name = "wooden planks"
@@ -203,13 +203,13 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
merge_type = /obj/item/stack/sheet/wood
/obj/item/stack/sheet/wood/New(var/loc, var/amount=null)
- recipes = wood_recipes
+ recipes = GLOB.wood_recipes
return ..()
/*
* Cloth
*/
-var/global/list/datum/stack_recipe/cloth_recipes = list ( \
+GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("white jumpsuit", /obj/item/clothing/under/color/white, 3), \
new/datum/stack_recipe("white shoes", /obj/item/clothing/shoes/white, 2), \
new/datum/stack_recipe("white scarf", /obj/item/clothing/accessory/scarf/white, 1), \
@@ -234,7 +234,7 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \
new/datum/stack_recipe("white beanie", /obj/item/clothing/head/beanie, 2), \
null, \
new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/sunglasses/blindfold, 3), \
- )
+ ))
/obj/item/stack/sheet/cloth
name = "cloth"
@@ -248,7 +248,7 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \
merge_type = /obj/item/stack/sheet/cloth
/obj/item/stack/sheet/cloth/New(loc, amount=null)
- recipes = cloth_recipes
+ recipes = GLOB.cloth_recipes
..()
/obj/item/stack/sheet/cloth/ten
@@ -300,7 +300,7 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
/*
* Cardboard
*/
-var/global/list/datum/stack_recipe/cardboard_recipes = list (
+GLOBAL_LIST_INIT(cardboard_recipes, list (
new /datum/stack_recipe("box", /obj/item/storage/box),
new /datum/stack_recipe("large box", /obj/item/storage/box/large, 4),
new /datum/stack_recipe("patch pack", /obj/item/storage/pill_bottle/patch_pack, 2),
@@ -314,7 +314,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list (
new /datum/stack_recipe("cardboard tube", /obj/item/c_tube),
new /datum/stack_recipe("cardboard box", /obj/structure/closet/cardboard, 4),
new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5),
-)
+))
/obj/item/stack/sheet/cardboard/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/stamp/clown) && !istype(loc, /obj/item/storage))
@@ -336,21 +336,21 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list (
merge_type = /obj/item/stack/sheet/cardboard
/obj/item/stack/sheet/cardboard/New(var/loc, var/amt = null)
- recipes = cardboard_recipes
+ recipes = GLOB.cardboard_recipes
return ..()
/*
* Runed Metal
*/
-var/global/list/datum/stack_recipe/cult = list ( \
+GLOBAL_LIST_INIT(cult_recipes, list ( \
new/datum/stack_recipe/cult("runed door", /obj/machinery/door/airlock/cult, 1, time = 50, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe/cult("runed girder", /obj/structure/girder/cult, 1, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe/cult("pylon", /obj/structure/cult/functional/pylon, 3, time = 40, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe/cult("forge", /obj/structure/cult/functional/forge, 5, time = 40, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe/cult("archives", /obj/structure/cult/functional/archives, 2, time = 40, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe/cult("altar", /obj/structure/cult/functional/altar, 5, time = 40, one_per_turf = 1, on_floor = 1), \
- )
+ ))
/obj/item/stack/sheet/runed_metal
name = "runed metal"
@@ -393,13 +393,13 @@ var/global/list/datum/stack_recipe/cult = list ( \
amount = 50
/obj/item/stack/sheet/runed_metal/New(var/loc, var/amount=null)
- recipes = cult
+ recipes = GLOB.cult_recipes
return ..()
/*
* Brass
*/
-var/global/list/datum/stack_recipe/brass_recipes = list (\
+GLOBAL_LIST_INIT(brass_recipes, list (\
new/datum/stack_recipe("wall gear", /obj/structure/clockwork/wall_gear, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
null,
new/datum/stack_recipe/window("brass windoor", /obj/machinery/door/window/clockwork, 2, time = 30, on_floor = TRUE, window_checks = TRUE), \
@@ -408,7 +408,7 @@ var/global/list/datum/stack_recipe/brass_recipes = list (\
new/datum/stack_recipe/window("fulltile brass window", /obj/structure/window/reinforced/clockwork/fulltile, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
new/datum/stack_recipe("brass chair", /obj/structure/chair/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \
- )
+ ))
/obj/item/stack/tile/brass
name = "brass"
@@ -428,7 +428,7 @@ var/global/list/datum/stack_recipe/brass_recipes = list (\
qdel(src)
/obj/item/stack/tile/brass/New(loc, amount=null)
- recipes = brass_recipes
+ recipes = GLOB.brass_recipes
. = ..()
pixel_x = 0
pixel_y = 0
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 14ccc103ab1..ab592cc0402 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -204,7 +204,7 @@
if(amount < 1) // Just in case a stack's amount ends up fractional somehow
var/oldsrc = src
- src = null //dont kill proc after del()
+ src = null //dont kill proc after qdel()
usr.unEquip(oldsrc, 1)
qdel(oldsrc)
if(istype(O, /obj/item))
diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm
index c568e66c86a..1c499a7d6af 100644
--- a/code/game/objects/items/stacks/tiles/tile_mineral.dm
+++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm
@@ -27,9 +27,9 @@
mineralType = "uranium"
materials = list(MAT_URANIUM=500)
-var/global/list/datum/stack_recipe/gold_tile_recipes = list ( \
+GLOBAL_LIST_INIT(gold_tile_recipes, list ( \
new/datum/stack_recipe("fancy gold tile", /obj/item/stack/tile/mineral/gold/fancy, max_res_amount = 20), \
- )
+ ))
/obj/item/stack/tile/mineral/gold
name = "gold tile"
@@ -42,11 +42,11 @@ var/global/list/datum/stack_recipe/gold_tile_recipes = list ( \
/obj/item/stack/tile/mineral/gold/New(loc, amount=null)
..()
- recipes = gold_tile_recipes
+ recipes = GLOB.gold_tile_recipes
-var/global/list/datum/stack_recipe/goldfancy_tile_recipes = list ( \
+GLOBAL_LIST_INIT(goldfancy_tile_recipes, list ( \
new/datum/stack_recipe("regular gold tile", /obj/item/stack/tile/mineral/gold, max_res_amount = 20), \
- )
+ ))
/obj/item/stack/tile/mineral/gold/fancy
icon_state = "tile_goldfancy"
@@ -54,11 +54,11 @@ var/global/list/datum/stack_recipe/goldfancy_tile_recipes = list ( \
/obj/item/stack/tile/mineral/gold/fancy/New(loc, amount=null)
..()
- recipes = goldfancy_tile_recipes
+ recipes = GLOB.goldfancy_tile_recipes
-var/global/list/datum/stack_recipe/silver_tile_recipes = list ( \
+GLOBAL_LIST_INIT(silver_tile_recipes, list ( \
new/datum/stack_recipe("fancy silver tile", /obj/item/stack/tile/mineral/silver/fancy, max_res_amount = 20), \
- )
+ ))
/obj/item/stack/tile/mineral/silver
name = "silver tile"
@@ -71,11 +71,11 @@ var/global/list/datum/stack_recipe/silver_tile_recipes = list ( \
/obj/item/stack/tile/mineral/silver/New(loc, amount=null)
..()
- recipes = silver_tile_recipes
+ recipes = GLOB.silver_tile_recipes
-var/global/list/datum/stack_recipe/silverfancy_tile_recipes = list ( \
+GLOBAL_LIST_INIT(silverfancy_tile_recipes, list ( \
new/datum/stack_recipe("regular silver tile", /obj/item/stack/tile/mineral/silver, max_res_amount = 20), \
- )
+ ))
/obj/item/stack/tile/mineral/silver/fancy
icon_state = "tile_silverfancy"
@@ -83,7 +83,7 @@ var/global/list/datum/stack_recipe/silverfancy_tile_recipes = list ( \
/obj/item/stack/tile/mineral/silver/fancy/New(loc, amount=null)
..()
- recipes = silverfancy_tile_recipes
+ recipes = GLOB.silverfancy_tile_recipes
/obj/item/stack/tile/mineral/diamond
name = "diamond tile"
diff --git a/code/game/objects/items/tools/multitool.dm b/code/game/objects/items/tools/multitool.dm
index 22c9861da6e..c31f0666f50 100644
--- a/code/game/objects/items/tools/multitool.dm
+++ b/code/game/objects/items/tools/multitool.dm
@@ -73,13 +73,13 @@
/obj/item/multitool/ai_detect/proc/multitool_detect()
var/turf/our_turf = get_turf(src)
- for(var/mob/living/silicon/ai/AI in ai_list)
+ for(var/mob/living/silicon/ai/AI in GLOB.ai_list)
if(AI.cameraFollow == src)
detect_state = PROXIMITY_ON_SCREEN
break
- if(!detect_state && cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z))
- var/datum/camerachunk/chunk = cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z)
+ if(!detect_state && GLOB.cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z))
+ var/datum/camerachunk/chunk = GLOB.cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z)
if(chunk)
if(chunk.seenby.len)
for(var/mob/camera/aiEye/A in chunk.seenby)
diff --git a/code/game/objects/items/tools/tool_behaviour.dm b/code/game/objects/items/tools/tool_behaviour.dm
index c937f80c30d..136bea77e6a 100644
--- a/code/game/objects/items/tools/tool_behaviour.dm
+++ b/code/game/objects/items/tools/tool_behaviour.dm
@@ -4,7 +4,7 @@
// No delay means there is no start message, and no reason to call tool_start_check before use_tool.
// Run the start check here so we wouldn't have to call it manually.
target.add_fingerprint(user)
- if(!tool_start_check(user, amount) && !delay)
+ if(!tool_start_check(target, user, amount) && !delay)
return
delay *= toolspeed
@@ -16,11 +16,11 @@
var/datum/callback/tool_check = CALLBACK(src, .proc/tool_check_callback, user, target, amount, extra_checks)
if(ismob(target))
- if(!do_mob(user, target, delay, extra_checks=tool_check))
+ if(!do_mob(user, target, delay, extra_checks = list(tool_check)))
return
else
- if(!do_after(user, delay, target=target, extra_checks=tool_check))
+ if(!do_after(user, delay, target=target, extra_checks = list(tool_check)))
return
else
// Invoke the extra checks once, just in case.
@@ -39,7 +39,7 @@
// Called before use_tool if there is a delay, or by use_tool if there isn't.
// Only ever used by welding tools and stacks, so it's not added on any other use_tool checks.
-/obj/item/proc/tool_start_check(mob/living/user, amount=0)
+/obj/item/proc/tool_start_check(atom/target, mob/living/user, amount=0)
return tool_use_check(user, amount)
// A check called by tool_start_check once, and by use_tool on every tick of delay.
@@ -57,4 +57,4 @@
// Used in a callback that is passed by use_tool into do_after call. Do not override, do not call manually.
/obj/item/proc/tool_check_callback(mob/living/user, atom/target, amount, datum/callback/extra_checks)
- return tool_use_check(user, amount) && (!extra_checks || extra_checks.Invoke())
+ return tool_use_check(user, amount) && (extra_checks && !extra_checks.Invoke())
diff --git a/code/game/objects/items/tools/welder.dm b/code/game/objects/items/tools/welder.dm
index b002ed32205..4ac934462a0 100644
--- a/code/game/objects/items/tools/welder.dm
+++ b/code/game/objects/items/tools/welder.dm
@@ -35,10 +35,12 @@
..()
create_reagents(maximum_fuel)
reagents.add_reagent("fuel", maximum_fuel)
- if(refills_over_time)
- reagents.reagents_generated_per_cycle += list("fuel" = 1)
update_icon()
+/obj/item/weldingtool/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
/obj/item/weldingtool/examine(mob/user)
. = ..()
if(get_dist(user, src) <= 0)
@@ -49,10 +51,15 @@
return FIRELOSS
/obj/item/weldingtool/process()
- var/turf/T = get_turf(src)
- T.hotspot_expose(2500, 5)
- if(prob(5))
- remove_fuel(1)
+ if(tool_enabled)
+ var/turf/T = get_turf(src)
+ if(T) // Implants for instance won't find a turf
+ T.hotspot_expose(2500, 5)
+ if(prob(5))
+ remove_fuel(1)
+ if(refills_over_time)
+ if(GET_FUEL < maximum_fuel)
+ reagents.add_reagent("fuel", 1)
..()
/obj/item/weldingtool/attack_self(mob/user)
@@ -76,7 +83,8 @@
playsound(loc, activation_sound, 50, 1)
set_light(light_intensity)
else
- STOP_PROCESSING(SSobj, src)
+ if(!refills_over_time)
+ STOP_PROCESSING(SSobj, src)
damtype = BRUTE
force = 3
hitsound = "swing_hit"
@@ -100,9 +108,9 @@
return FALSE
// When welding is about to start, run a normal tool_use_check, then flash a mob if it succeeds.
-/obj/item/weldingtool/tool_start_check(mob/living/user, amount=0)
+/obj/item/weldingtool/tool_start_check(atom/target, mob/living/user, amount=0)
. = tool_use_check(user, amount)
- if(. && user)
+ if(. && user && !ismob(target)) // Don't flash the user if they're repairing robo limbs or repairing a borg etc. Only flash them if the target is an object
user.flash_eyes(light_intensity)
/obj/item/weldingtool/use(amount)
@@ -159,7 +167,7 @@
/obj/item/weldingtool/update_icon()
if(low_fuel_changes_icon)
var/ratio = GET_FUEL / maximum_fuel
- ratio = Ceiling(ratio*4) * 25
+ ratio = CEILING(ratio*4, 1) * 25
if(ratio == 100)
icon_state = initial(icon_state)
else
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index a4d54f12ab0..66f35a169f9 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -1023,6 +1023,18 @@ obj/item/toy/cards/deck/syndicate/black
name = "orange fox plushie"
icon_state = "orangefox"
+/obj/item/toy/plushie/orange_fox/grump
+ name = "grumpy fox"
+ desc = "An ancient plushie that seems particularly grumpy."
+
+/obj/item/toy/plushie/orange_fox/grump/ComponentInitialize()
+ . = ..()
+ var/static/list/grumps = list("Ahh, yes, you're so clever, var editing that.", "Really?", "If you make a runtime with var edits, it's your own damn fault.",
+ "Don't you dare post issues on the git when you don't even know how this works.", "Was that necessary?", "Ohhh, setting admin edited var must be your favorite pastime!",
+ "Oh, so you have time to var edit, but you don't have time to ban that greytider?", "Oh boy, is this another one of those 'events'?", "Seriously, just stop.", "You do realize this is incurring proc call overhead.",
+ "Congrats, you just left a reference with your dirty client and now that thing you edited will never garbage collect properly.", "Is it that time of day, again, for unecessary adminbus?")
+ AddComponent(/datum/component/edit_complainer, grumps)
+
/obj/item/toy/plushie/coffee_fox
name = "coffee fox plushie"
icon_state = "coffeefox"
@@ -1087,6 +1099,21 @@ obj/item/toy/cards/deck/syndicate/black
return
..()
+/obj/item/toy/plushie/ipcplushie
+ name = "IPC plushie"
+ desc = "An adorable IPC plushie, straight from New Canaan. Arguably more durable than the real deal. Toaster functionality included."
+ icon_state = "plushie_ipc"
+ item_state = "plushie_ipc"
+
+/obj/item/toy/plushie/ipcplushie/attackby(obj/item/B, mob/user, params)
+ if(istype(B, /obj/item/reagent_containers/food/snacks/breadslice))
+ new /obj/item/reagent_containers/food/snacks/toast(get_turf(loc))
+ to_chat(user, " You insert bread into the toaster. ")
+ playsound(loc, 'sound/machines/ding.ogg', 50, 1)
+ qdel(B)
+ else
+ return ..()
+
//New generation TG plushies
/obj/item/toy/plushie/lizardplushie
@@ -1117,15 +1144,15 @@ obj/item/toy/cards/deck/syndicate/black
* Foam Armblade
*/
- /obj/item/toy/foamblade
- name = "foam armblade"
- desc = "it says \"Sternside Changs #1 fan\" on it. "
- icon = 'icons/obj/toy.dmi'
- icon_state = "foamblade"
- item_state = "arm_blade"
- attack_verb = list("pricked", "absorbed", "gored")
- w_class = WEIGHT_CLASS_SMALL
- resistance_flags = FLAMMABLE
+/obj/item/toy/foamblade
+ name = "foam armblade"
+ desc = "it says \"Sternside Changs #1 fan\" on it. "
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "foamblade"
+ item_state = "arm_blade"
+ attack_verb = list("pricked", "absorbed", "gored")
+ w_class = WEIGHT_CLASS_SMALL
+ resistance_flags = FLAMMABLE
/*
* Toy/fake flash
@@ -1208,10 +1235,10 @@ obj/item/toy/cards/deck/syndicate/black
var/list/messages = list()
var/datum/devilinfo/devil = randomDevilInfo()
messages += "Some fun facts about: [devil.truename]"
- messages += "[lawlorify[LORE][devil.bane]]"
- messages += "[lawlorify[LORE][devil.obligation]]"
- messages += "[lawlorify[LORE][devil.ban]]"
- messages += "[lawlorify[LORE][devil.banish]]"
+ messages += "[GLOB.lawlorify[LORE][devil.bane]]"
+ messages += "[GLOB.lawlorify[LORE][devil.obligation]]"
+ messages += "[GLOB.lawlorify[LORE][devil.ban]]"
+ messages += "[GLOB.lawlorify[LORE][devil.banish]]"
playsound(loc, 'sound/machines/click.ogg', 20, 1)
cooldown = TRUE
for(var/message in messages)
@@ -1220,7 +1247,6 @@ obj/item/toy/cards/deck/syndicate/black
spawn(20)
cooldown = FALSE
return
- ..()
/obj/item/toy/owl
name = "owl action figure"
@@ -1382,6 +1408,7 @@ obj/item/toy/cards/deck/syndicate/black
name = "xenomorph action figure"
desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use."
w_class = WEIGHT_CLASS_SMALL
+ bubble_icon = "alien"
var/cooldown = 0
/obj/item/toy/toy_xeno/attack_self(mob/user)
@@ -1390,7 +1417,7 @@ obj/item/toy/cards/deck/syndicate/black
user.visible_message("[user] pulls back the string on [src].")
icon_state = "[initial(icon_state)]_used"
sleep(5)
- audible_message("[bicon(src)] Hiss!")
+ atom_say("Hiss!")
var/list/possible_sounds = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg')
playsound(get_turf(src), pick(possible_sounds), 50, 1)
spawn(45)
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 7cf48095e72..8508c741524 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -8,6 +8,13 @@
desc = "This is rubbish."
resistance_flags = FLAMMABLE
+/obj/item/trash/decompile_act(obj/item/matter_decompiler/C, mob/user)
+ C.stored_comms["metal"] += 2
+ C.stored_comms["wood"] += 1
+ C.stored_comms["glass"] += 1
+ qdel(src)
+ return TRUE
+
/obj/item/trash/raisins
name = "4no raisins"
icon_state= "4no_raisins"
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index 1f89bd03336..1e34561c441 100755
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -84,7 +84,7 @@ AI MODULES
/obj/item/aiModule/proc/log_law_changes(var/mob/living/silicon/ai/target, var/mob/sender)
var/time = time2text(world.realtime,"hh:mm:ss")
- lawchanges.Add("[time] : [sender.name]([sender.key]) used [src.name] on [target.name]([target.key])")
+ GLOB.lawchanges.Add("[time] : [sender.name]([sender.key]) used [src.name] on [target.name]([target.key])")
log_and_message_admins("used [src.name] on [target.name]([target.key])")
/obj/item/aiModule/proc/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
@@ -114,7 +114,7 @@ AI MODULES
var/law = text("Safeguard []. Individuals that threaten [] are not crew and must be eliminated.'", targetName, targetName)
to_chat(target, law)
target.add_supplied_law(4, law)
- lawchanges.Add("The law specified [targetName]")
+ GLOB.lawchanges.Add("The law specified [targetName]")
/******************** oneCrewMember ********************/
/obj/item/aiModule/oneCrewMember
@@ -141,12 +141,11 @@ AI MODULES
if(!is_special_character(target)) // Makes sure the AI isn't a traitor before changing their law 0. --NeoFite
to_chat(target, law)
target.set_zeroth_law(law)
- lawchanges.Add("The law specified [targetName]")
+ GLOB.lawchanges.Add("The law specified [targetName]")
else
- to_chat(target, "[sender.real_name] attempted to modify your zeroth law.")// And lets them know that someone tried. --NeoFite
-
- to_chat(target, "It would be in your best interest to play along with [sender.real_name] that [law]")
- lawchanges.Add("The law specified [targetName], but the AI's existing law 0 cannot be overridden.")
+ to_chat(target, "[sender.real_name] attempted to modify your zeroth law.")// And lets them know that someone tried. --NeoFite
+ to_chat(target, "It would be in your best interest to play along with [sender.real_name] that [law]")
+ GLOB.lawchanges.Add("The law specified [targetName], but the AI's existing law 0 cannot be overridden.")
/******************** ProtectStation ********************/
/obj/item/aiModule/protectStation
@@ -203,7 +202,7 @@ AI MODULES
if(!lawpos || lawpos < MIN_SUPPLIED_LAW_NUMBER)
lawpos = MIN_SUPPLIED_LAW_NUMBER
target.add_supplied_law(lawpos, law)
- lawchanges.Add("The law was '[newFreeFormLaw]'")
+ GLOB.lawchanges.Add("The law was '[newFreeFormLaw]'")
/obj/item/aiModule/freeform/install(var/obj/machinery/computer/C)
if(!newFreeFormLaw)
@@ -222,11 +221,11 @@ AI MODULES
log_law_changes(target, sender)
if(!is_special_character(target))
- target.set_zeroth_law("")
+ target.clear_zeroth_law()
target.laws.clear_supplied_laws()
target.laws.clear_ion_laws()
- to_chat(target, "[sender.real_name] attempted to reset your laws using a reset module.")
+ to_chat(target, "[sender.real_name] attempted to reset your laws using a reset module.")
target.show_laws()
/******************** Purge ********************/
@@ -238,8 +237,8 @@ AI MODULES
/obj/item/aiModule/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
..()
if(!is_special_character(target))
- target.set_zeroth_law("")
- to_chat(target, "[sender.real_name] attempted to wipe your laws using a purge module.")
+ target.clear_zeroth_law()
+ to_chat(target, "[sender.real_name] attempted to wipe your laws using a purge module.")
target.clear_supplied_laws()
target.clear_ion_laws()
target.clear_inherent_laws()
@@ -332,7 +331,7 @@ AI MODULES
..()
var/law = "[newFreeFormLaw]"
target.add_inherent_law(law)
- lawchanges.Add("The law is '[newFreeFormLaw]'")
+ GLOB.lawchanges.Add("The law is '[newFreeFormLaw]'")
/obj/item/aiModule/freeformcore/install(var/obj/machinery/computer/C)
if(!newFreeFormLaw)
@@ -358,7 +357,7 @@ AI MODULES
// ..() //We don't want this module reporting to the AI who dun it. --NEO
log_law_changes(target, sender)
- lawchanges.Add("The law is '[newFreeFormLaw]'")
+ GLOB.lawchanges.Add("The law is '[newFreeFormLaw]'")
to_chat(target, "BZZZZT")
var/law = "[newFreeFormLaw]"
target.add_ion_law(law)
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index fda3418fd11..f8f9a48102a 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -167,14 +167,14 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
/obj/item/rcd/attack_self_tk(mob/user)
radial_menu(user)
-/obj/item/rcd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state)
+/obj/item/rcd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = GLOB.inventory_state)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "rcd.tmpl", "[name]", 450, 400, state = state)
ui.open()
ui.set_auto_update(1)
-/obj/item/rcd/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state)
+/obj/item/rcd/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.inventory_state)
var/data[0]
data["mode"] = mode
data["door_type"] = door_type
@@ -374,7 +374,7 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
QDEL_NULL(A)
for(var/obj/structure/window/W in T1.contents)
qdel(W)
- for(var/cdir in cardinal)
+ for(var/cdir in GLOB.cardinal)
var/turf/T2 = get_step(T1, cdir)
if(locate(/obj/structure/window/full/shuttle) in T2)
continue // Shuttle windows? Nah. We don't need extra windows there.
@@ -408,7 +408,7 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
new /obj/structure/grille(A)
for(var/obj/structure/window/W in A)
qdel(W)
- for(var/cdir in cardinal)
+ for(var/cdir in GLOB.cardinal)
var/turf/T = get_step(A, cdir)
if(locate(/obj/structure/grille) in T)
for(var/obj/structure/window/W in T)
@@ -477,9 +477,7 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
return R.cell.charge >= (amount * use_multiplier)
/obj/item/rcd/proc/detonate_pulse()
- audible_message("[src] begins to vibrate and \
- buzz loudly!","[src] begins \
- vibrating violently!")
+ audible_message("[src] begins to vibrate and buzz loudly!", "[src] begins vibrating violently!")
// 5 seconds to get rid of it
addtimer(CALLBACK(src, .proc/detonate_pulse_explode), 50)
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 58258687fc7..405ce47a033 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -495,17 +495,17 @@
else if(department != "Civilian")
switch(department)
if("Engineering")
- new_job = input(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation") in engineering_positions
+ new_job = input(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation") in GLOB.engineering_positions
if("Medical")
- new_job = input(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation") in medical_positions
+ new_job = input(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation") in GLOB.medical_positions
if("Science")
- new_job = input(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation") in science_positions
+ new_job = input(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation") in GLOB.science_positions
if("Security")
- new_job = input(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation") in security_positions
+ new_job = input(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation") in GLOB.security_positions
if("Support")
- new_job = input(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation") in support_positions
+ new_job = input(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation") in GLOB.support_positions
if("Command")
- new_job = input(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation") in command_positions
+ new_job = input(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation") in GLOB.command_positions
if(!Adjacent(user))
return
diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm
index 91bb84f880b..1dc0b22abdf 100644
--- a/code/game/objects/items/weapons/chrono_eraser.dm
+++ b/code/game/objects/items/weapons/chrono_eraser.dm
@@ -32,7 +32,7 @@
if(PA)
qdel(PA)
else
- PA = new(src)
+ PA = new(user, src)
user.put_in_hands(PA)
/obj/item/chrono_eraser/item_action_slot_check(slot, mob/user)
@@ -55,7 +55,7 @@
var/obj/structure/chrono_field/field = null
var/turf/startpos = null
-/obj/item/gun/energy/chrono_gun/New(var/obj/item/chrono_eraser/T)
+/obj/item/gun/energy/chrono_gun/Initialize(mapload, obj/item/chrono_eraser/T)
. = ..()
if(istype(T))
TED = T
@@ -188,7 +188,7 @@
/obj/structure/chrono_field/update_icon()
var/ttk_frame = 1 - (tickstokill / initial(tickstokill))
- ttk_frame = Clamp(Ceiling(ttk_frame * CHRONO_FRAME_COUNT), 1, CHRONO_FRAME_COUNT)
+ ttk_frame = clamp(CEILING(ttk_frame * CHRONO_FRAME_COUNT, 1), 1, CHRONO_FRAME_COUNT)
if(ttk_frame != RPpos)
RPpos = ttk_frame
mob_underlay.icon_state = "frame[RPpos]"
diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm
index 24c904bc9d3..30ad91beffa 100644
--- a/code/game/objects/items/weapons/cigs.dm
+++ b/code/game/objects/items/weapons/cigs.dm
@@ -31,6 +31,7 @@ LIGHTERS ARE IN LIGHTERS.DM
var/smoketime = 150
var/chem_volume = 60
var/list/list_reagents = list("nicotine" = 40)
+ var/first_puff = TRUE // the first puff is a bit more reagents ingested
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
@@ -194,8 +195,9 @@ LIGHTERS ARE IN LIGHTERS.DM
if(reagents && reagents.total_volume) // check if it has any reagents at all
if(is_being_smoked) // if it's being smoked, transfer reagents to the mob
var/mob/living/carbon/C = loc
- for (var/datum/reagent/R in reagents.reagent_list)
- reagents.trans_id_to(C, R.id, max(REAGENTS_METABOLISM / reagents.reagent_list.len, 0.1)) //transfer at least .1 of each chem
+ for(var/datum/reagent/R in reagents.reagent_list)
+ reagents.trans_id_to(C, R.id, first_puff ? 1 : max(REAGENTS_METABOLISM / reagents.reagent_list.len, 0.1)) //transfer at least .1 of each chem
+ first_puff = FALSE
if(!reagents.total_volume) // There were reagents, but now they're gone
to_chat(C, "Your [name] loses its flavor.")
else // else just remove some of the reagents
@@ -309,6 +311,11 @@ LIGHTERS ARE IN LIGHTERS.DM
pixel_y = rand(-10,10)
transform = turn(transform,rand(0,360))
+/obj/item/cigbutt/decompile_act(obj/item/matter_decompiler/C, mob/user)
+ C.stored_comms["wood"] += 1
+ qdel(src)
+ return TRUE
+
/obj/item/cigbutt/cigarbutt
name = "cigar butt"
desc = "A manky old cigar butt."
@@ -360,7 +367,7 @@ LIGHTERS ARE IN LIGHTERS.DM
lit = FALSE
icon_state = icon_off
item_state = icon_off
- M.update_inv_wear_mask(0)
+ M.update_inv_wear_mask()
STOP_PROCESSING(SSobj, src)
return
smoke()
@@ -377,6 +384,7 @@ LIGHTERS ARE IN LIGHTERS.DM
to_chat(user, "You refill the pipe with tobacco.")
reagents.add_reagent("nicotine", chem_volume)
smoketime = initial(smoketime)
+ first_puff = TRUE
/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/reagent_containers))
diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index 7f9cd2f1663..8815ad6a20f 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -108,7 +108,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/C = H.get_organ("head")
- var/datum/robolimb/robohead = all_robolimbs[C.model]
+ var/datum/robolimb/robohead = GLOB.all_robolimbs[C.model]
if(user.zone_selected == "mouth")
if(!get_location_accessible(H, "mouth"))
to_chat(user, "The mask is in the way.")
diff --git a/code/game/objects/items/weapons/courtroom.dm b/code/game/objects/items/weapons/courtroom.dm
index 09d43434560..4a9e3c2b7cf 100644
--- a/code/game/objects/items/weapons/courtroom.dm
+++ b/code/game/objects/items/weapons/courtroom.dm
@@ -27,10 +27,12 @@
throwforce = 2.0
w_class = WEIGHT_CLASS_TINY
resistance_flags = FLAMMABLE
+ var/next_gavel_hit
/obj/item/gavelblock/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/gavelhammer))
- playsound(loc, 'sound/items/gavel.ogg', 100, 1)
- user.visible_message("[user] strikes \the [src] with \the [I].")
- else
+ if(!istype(I, /obj/item/gavelhammer))
return
+ if(world.time > next_gavel_hit)
+ playsound(loc, 'sound/items/gavel.ogg', 100, 1)
+ next_gavel_hit = world.time + 5 SECONDS
+ user.visible_message("[user] strikes \the [src] with \the [I].")
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 581c4395650..ee98d309876 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -72,7 +72,7 @@
if(powered) //so it doesn't show charge if it's unpowered
if(cell)
var/ratio = cell.charge / cell.maxcharge
- ratio = Ceiling(ratio*4) * 25
+ ratio = CEILING(ratio*4, 1) * 25
overlays += "[icon_state]-charge[ratio]"
/obj/item/defibrillator/CheckParts(list/parts_list)
diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm
index 82b885c03d1..629942860be 100644
--- a/code/game/objects/items/weapons/dice.dm
+++ b/code/game/objects/items/weapons/dice.dm
@@ -138,7 +138,7 @@
/obj/item/dice/proc/diceroll(mob/user)
result = roll(sides)
if(rigged != DICE_NOT_RIGGED && result != rigged_value)
- if(rigged == DICE_BASICALLY_RIGGED && prob(Clamp(1/(sides - 1) * 100, 25, 80)))
+ if(rigged == DICE_BASICALLY_RIGGED && prob(clamp(1/(sides - 1) * 100, 25, 80)))
result = rigged_value
else if(rigged == DICE_TOTALLY_RIGGED)
result = rigged_value
@@ -178,9 +178,9 @@
spawn(40)
var/cap = 0
- if(result > MAX_EX_LIGHT_RANGE && result != 20)
+ if(result > GLOB.max_ex_light_range && result != 20)
cap = 1
- result = min(result, MAX_EX_LIGHT_RANGE) //Apply the bombcap
+ result = min(result, GLOB.max_ex_light_range) //Apply the bombcap
else if(result == 20) //Roll a nat 20, screw the bombcap
result = 24
var/turf/epicenter = get_turf(src)
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index 295d17efc39..45047e97156 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -127,12 +127,12 @@
if(buf && buf.types & DNA2_BUF_SE)
if(block)
- if(GetState() && block == MONKEYBLOCK && ishuman(M))
+ if(GetState() && block == GLOB.monkeyblock && ishuman(M))
attack_log = "injected with the Isolated [name] (MONKEY)"
message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] (MONKEY)")
else
- if(GetState(MONKEYBLOCK) && ishuman(M))
+ if(GetState(GLOB.monkeyblock) && ishuman(M))
attack_log = "injected with the Isolated [name] (MONKEY)"
message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] (MONKEY)")
@@ -147,10 +147,6 @@
to_chat(user, "You inject yourself with [src].")
add_attack_logs(user, M, attack_log, ATKLOG_ALL)
- if(!iscarbon(user))
- M.LAssailant = null
- else
- M.LAssailant = user
inject(M, user)
used = TRUE
@@ -165,7 +161,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/hulkmut/Initialize()
- block = HULKBLOCK
+ block = GLOB.hulkblock
..()
/obj/item/dnainjector/antihulk
@@ -176,7 +172,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antihulk/Initialize()
- block = HULKBLOCK
+ block = GLOB.hulkblock
..()
/obj/item/dnainjector/xraymut
@@ -187,7 +183,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/xraymut/Initialize()
- block = XRAYBLOCK
+ block = GLOB.xrayblock
..()
/obj/item/dnainjector/antixray
@@ -198,7 +194,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antixray/Initialize()
- block = XRAYBLOCK
+ block = GLOB.xrayblock
..()
/obj/item/dnainjector/firemut
@@ -209,7 +205,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/firemut/Initialize()
- block = FIREBLOCK
+ block = GLOB.fireblock
..()
/obj/item/dnainjector/antifire
@@ -220,7 +216,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antifire/Initialize()
- block = FIREBLOCK
+ block = GLOB.fireblock
..()
/obj/item/dnainjector/telemut
@@ -231,7 +227,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/telemut/Initialize()
- block = TELEBLOCK
+ block = GLOB.teleblock
..()
/obj/item/dnainjector/telemut/darkbundle
@@ -247,7 +243,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antitele/Initialize()
- block = TELEBLOCK
+ block = GLOB.teleblock
..()
/obj/item/dnainjector/nobreath
@@ -258,7 +254,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/nobreath/Initialize()
- block = BREATHLESSBLOCK
+ block = GLOB.breathlessblock
..()
/obj/item/dnainjector/antinobreath
@@ -269,7 +265,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antinobreath/Initialize()
- block = BREATHLESSBLOCK
+ block = GLOB.breathlessblock
..()
/obj/item/dnainjector/remoteview
@@ -280,7 +276,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/remoteview/Initialize()
- block = REMOTEVIEWBLOCK
+ block = GLOB.remoteviewblock
..()
/obj/item/dnainjector/antiremoteview
@@ -291,7 +287,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antiremoteview/Initialize()
- block = REMOTEVIEWBLOCK
+ block = GLOB.remoteviewblock
..()
/obj/item/dnainjector/regenerate
@@ -302,7 +298,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/regenerate/Initialize()
- block = REGENERATEBLOCK
+ block = GLOB.regenerateblock
..()
/obj/item/dnainjector/antiregenerate
@@ -313,7 +309,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antiregenerate/Initialize()
- block = REGENERATEBLOCK
+ block = GLOB.regenerateblock
..()
/obj/item/dnainjector/runfast
@@ -324,7 +320,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/runfast/Initialize()
- block = INCREASERUNBLOCK
+ block = GLOB.increaserunblock
..()
/obj/item/dnainjector/antirunfast
@@ -335,7 +331,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antirunfast/Initialize()
- block = INCREASERUNBLOCK
+ block = GLOB.increaserunblock
..()
/obj/item/dnainjector/morph
@@ -346,7 +342,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/morph/Initialize()
- block = MORPHBLOCK
+ block = GLOB.morphblock
..()
/obj/item/dnainjector/antimorph
@@ -357,7 +353,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antimorph/Initialize()
- block = MORPHBLOCK
+ block = GLOB.morphblock
..()
/obj/item/dnainjector/noprints
@@ -368,7 +364,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/noprints/Initialize()
- block = NOPRINTSBLOCK
+ block = GLOB.noprintsblock
..()
/obj/item/dnainjector/antinoprints
@@ -379,7 +375,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antinoprints/Initialize()
- block = NOPRINTSBLOCK
+ block = GLOB.noprintsblock
..()
/obj/item/dnainjector/insulation
@@ -390,7 +386,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/insulation/Initialize()
- block = SHOCKIMMUNITYBLOCK
+ block = GLOB.shockimmunityblock
..()
/obj/item/dnainjector/antiinsulation
@@ -401,7 +397,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antiinsulation/Initialize()
- block = SHOCKIMMUNITYBLOCK
+ block = GLOB.shockimmunityblock
..()
/obj/item/dnainjector/midgit
@@ -412,7 +408,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/midgit/Initialize()
- block = SMALLSIZEBLOCK
+ block = GLOB.smallsizeblock
..()
/obj/item/dnainjector/antimidgit
@@ -423,7 +419,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antimidgit/Initialize()
- block = SMALLSIZEBLOCK
+ block = GLOB.smallsizeblock
..()
/////////////////////////////////////
@@ -435,7 +431,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antiglasses/Initialize()
- block = GLASSESBLOCK
+ block = GLOB.glassesblock
..()
/obj/item/dnainjector/glassesmut
@@ -446,7 +442,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/glassesmut/Initialize()
- block = GLASSESBLOCK
+ block = GLOB.glassesblock
..()
/obj/item/dnainjector/epimut
@@ -457,7 +453,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/epimut/Initialize()
- block = EPILEPSYBLOCK
+ block = GLOB.epilepsyblock
..()
/obj/item/dnainjector/antiepi
@@ -468,7 +464,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antiepi/Initialize()
- block = EPILEPSYBLOCK
+ block = GLOB.epilepsyblock
..()
/obj/item/dnainjector/anticough
@@ -479,7 +475,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/anticough/Initialize()
- block = COUGHBLOCK
+ block = GLOB.coughblock
..()
/obj/item/dnainjector/coughmut
@@ -490,7 +486,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/coughmut/Initialize()
- block = COUGHBLOCK
+ block = GLOB.coughblock
..()
/obj/item/dnainjector/clumsymut
@@ -501,7 +497,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/clumsymut/Initialize()
- block = CLUMSYBLOCK
+ block = GLOB.clumsyblock
..()
/obj/item/dnainjector/anticlumsy
@@ -512,7 +508,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/anticlumsy/Initialize()
- block = CLUMSYBLOCK
+ block = GLOB.clumsyblock
..()
/obj/item/dnainjector/antitour
@@ -523,7 +519,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antitour/Initialize()
- block = TWITCHBLOCK
+ block = GLOB.twitchblock
..()
/obj/item/dnainjector/tourmut
@@ -534,7 +530,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/tourmut/Initialize()
- block = TWITCHBLOCK
+ block = GLOB.twitchblock
..()
/obj/item/dnainjector/stuttmut
@@ -545,7 +541,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/stuttmut/Initialize()
- block = NERVOUSBLOCK
+ block = GLOB.nervousblock
..()
@@ -557,7 +553,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antistutt/Initialize()
- block = NERVOUSBLOCK
+ block = GLOB.nervousblock
..()
/obj/item/dnainjector/blindmut
@@ -568,7 +564,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/blindmut/Initialize()
- block = BLINDBLOCK
+ block = GLOB.blindblock
..()
/obj/item/dnainjector/antiblind
@@ -579,7 +575,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antiblind/Initialize()
- block = BLINDBLOCK
+ block = GLOB.blindblock
..()
/obj/item/dnainjector/telemut
@@ -590,7 +586,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/telemut/Initialize()
- block = TELEBLOCK
+ block = GLOB.teleblock
..()
/obj/item/dnainjector/antitele
@@ -601,7 +597,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antitele/Initialize()
- block = TELEBLOCK
+ block = GLOB.teleblock
..()
/obj/item/dnainjector/deafmut
@@ -612,7 +608,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/deafmut/Initialize()
- block = DEAFBLOCK
+ block = GLOB.deafblock
..()
/obj/item/dnainjector/antideaf
@@ -623,7 +619,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antideaf/Initialize()
- block = DEAFBLOCK
+ block = GLOB.deafblock
..()
/obj/item/dnainjector/hallucination
@@ -634,7 +630,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/hallucination/Initialize()
- block = HALLUCINATIONBLOCK
+ block = GLOB.hallucinationblock
..()
/obj/item/dnainjector/antihallucination
@@ -645,7 +641,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/antihallucination/Initialize()
- block = HALLUCINATIONBLOCK
+ block = GLOB.hallucinationblock
..()
/obj/item/dnainjector/h2m
@@ -656,7 +652,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/h2m/Initialize()
- block = MONKEYBLOCK
+ block = GLOB.monkeyblock
..()
/obj/item/dnainjector/m2h
@@ -667,7 +663,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/m2h/Initialize()
- block = MONKEYBLOCK
+ block = GLOB.monkeyblock
..()
@@ -679,7 +675,7 @@
forcedmutation = TRUE
/obj/item/dnainjector/comic/Initialize()
- block = COMICBLOCK
+ block = GLOB.comicblock
..()
/obj/item/dnainjector/anticomic
@@ -690,5 +686,5 @@
forcedmutation = TRUE
/obj/item/dnainjector/anticomic/Initialize()
- block = COMICBLOCK
+ block = GLOB.comicblock
..()
diff --git a/code/game/objects/items/weapons/dnascrambler.dm b/code/game/objects/items/weapons/dnascrambler.dm
index c2dc8e285ab..1dcc4a942c2 100644
--- a/code/game/objects/items/weapons/dnascrambler.dm
+++ b/code/game/objects/items/weapons/dnascrambler.dm
@@ -45,7 +45,7 @@
scramble(1, H, 100)
H.real_name = random_name(H.gender, H.dna.species.name) //Give them a name that makes sense for their species.
H.sync_organ_dna(assimilate = 1)
- H.update_body(0)
+ H.update_body()
H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
H.reset_markings() //...Or markings.
H.dna.ResetUIFrom(H)
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index c534a89277c..9584130c0c6 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -62,7 +62,7 @@
return
var/newtime = input(usr, "Please set the timer.", "Timer", det_time) as num
if(user.is_in_active_hand(src))
- newtime = Clamp(newtime, 10, 60000)
+ newtime = clamp(newtime, 10, 60000)
det_time = newtime
to_chat(user, "Timer set for [det_time] seconds.")
@@ -229,6 +229,7 @@
desc = "A C4 charge with an altered chemical composition, designed to blind and deafen the occupants of a room before breaching."
/obj/item/grenade/plastic/c4_shaped/flash/prime()
+ var/turf/T
if(target && target.density)
T = get_step(get_turf(target), aim_dir)
else if(target)
@@ -266,6 +267,7 @@
addtimer(CALLBACK(null, .proc/explosion, T, 0, 0, 2), 3)
addtimer(CALLBACK(smoke, /datum/effect_system/smoke_spread/.proc/start), 3)
else
+ var/turf/T = get_step(location, aim_dir)
addtimer(CALLBACK(null, .proc/explosion, T, 0, 0, 2), 3)
addtimer(CALLBACK(smoke, /datum/effect_system/smoke_spread/.proc/start), 3)
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index 5a3286bfc05..48edcc826e6 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -49,8 +49,7 @@
to_chat(user, "You cut open the present.")
for(var/mob/M in src) //Should only be one but whatever.
- M.loc = src.loc
- M.reset_perspective(null)
+ M.forceMove(loc)
qdel(src)
diff --git a/code/game/objects/items/weapons/grenades/bananade.dm b/code/game/objects/items/weapons/grenades/bananade.dm
index 26a1f3ede0d..96a3a8e1400 100644
--- a/code/game/objects/items/weapons/grenades/bananade.dm
+++ b/code/game/objects/items/weapons/grenades/bananade.dm
@@ -1,5 +1,5 @@
-var/turf/T
+// var/turf/T | This was made 14th September 2013, and has no use at all. Its being removed
/obj/item/grenade/bananade
name = "bananade"
diff --git a/code/game/objects/items/weapons/grenades/clowngrenade.dm b/code/game/objects/items/weapons/grenades/clowngrenade.dm
index bce9861fb72..1dcf250dfe4 100644
--- a/code/game/objects/items/weapons/grenades/clowngrenade.dm
+++ b/code/game/objects/items/weapons/grenades/clowngrenade.dm
@@ -13,22 +13,12 @@
/obj/item/grenade/clown_grenade/prime()
..()
playsound(src.loc, 'sound/items/bikehorn.ogg', 25, -3)
- /*
- for(var/turf/simulated/floor/T in view(affected_area, src.loc))
- if(prob(75))
- banana(T)
- */
var/i = 0
var/number = 0
- for(var/direction in alldirs)
+ for(var/direction in GLOB.alldirs)
for(i = 0; i < 2; i++)
number++
var/obj/item/grown/bananapeel/traitorpeel/peel = new /obj/item/grown/bananapeel/traitorpeel(get_turf(src.loc))
- /* var/direction = pick(alldirs)
- var/spaces = pick(1;150, 2)
- var/a = 0
- for(a = 0; a < spaces; a++)
- step(peel,direction)*/
var/a = 1
if(number & 2)
for(a = 1; a <= 2; a++)
@@ -39,21 +29,17 @@
qdel(src)
return
-/obj/item/grown/bananapeel/traitorpeel
- trip_stun = 0
- trip_weaken = 7
- trip_tiles = 4
- trip_walksafe = FALSE
-
- trip_chance = 100
-
-
-/obj/item/grown/bananapeel/traitorpeel/on_trip(mob/living/carbon/human/H)
+/obj/item/grown/bananapeel/traitorpeel/New(newloc, obj/item/seeds/new_seed)
. = ..()
- if(.)
- to_chat(H, "Your feet feel like they're on fire!")
- H.take_overall_damage(0, rand(2,8))
- H.take_organ_damage(2) // Was 5 -- TLE
+ // The reason this AddComponent is here and not in ComponentInitialize() is because if it's put there, it will be ran before the parent New proc for /grown types.
+ // And then be overriden by the generic component placed onto it by the `/datum/plant_gene/trait/slip`.
+ AddComponent(/datum/component/slippery, src, 0, 7, 100, 4, FALSE)
+
+/obj/item/grown/bananapeel/traitorpeel/after_slip(mob/living/carbon/human/H)
+ to_chat(H, "Your feet feel like they're on fire!")
+ H.take_overall_damage(0, rand(2,8))
+ H.take_organ_damage(2)
+ return ..()
/obj/item/grown/bananapeel/traitorpeel/throw_impact(atom/hit_atom)
var/burned = rand(1,3)
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index e188279eb8c..1f73e5c7062 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -37,6 +37,9 @@
cuff(C, user)
/obj/item/restraints/handcuffs/proc/cuff(mob/living/carbon/C, mob/user, remove_src = TRUE)
+ if(!istype(C)) // Shouldn't be able to cuff anything but carbons.
+ return
+
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(!(H.has_left_hand() || H.has_right_hand()))
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index 95cf1e7026a..6423bbeb6ff 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -37,7 +37,7 @@
user.visible_message("[src] slips out of the grip of [user] as they try to pick it up, bouncing upwards and smacking [user.p_them()] in the face!", \
"[src] slips out of your grip as you pick it up, bouncing upwards and smacking you in the face!")
playsound(get_turf(user), 'sound/effects/hit_punch.ogg', 50, 1, -1)
- throw_at(get_edge_target_turf(user, pick(alldirs)), rand(1, 3), 5)
+ throw_at(get_edge_target_turf(user, pick(GLOB.alldirs)), rand(1, 3), 5)
/obj/item/nullrod/attack_self(mob/user)
@@ -488,7 +488,7 @@
var/mob/living/carbon/human/holder = loc
if(src == holder.l_hand || src == holder.r_hand) // Holding this in your hand will
for(var/mob/living/carbon/human/H in range(5, loc))
- if(H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full))
+ if(H.mind && H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full))
H.mind.vampire.nullified = max(5, H.mind.vampire.nullified + 2)
if(prob(10))
to_chat(H, "Being in the presence of [holder]'s [src] is interfering with your powers!")
diff --git a/code/game/objects/items/weapons/implants/implant_death_alarm.dm b/code/game/objects/items/weapons/implants/implant_death_alarm.dm
index d27d6dd5f7e..e8330c0c5cd 100644
--- a/code/game/objects/items/weapons/implants/implant_death_alarm.dm
+++ b/code/game/objects/items/weapons/implants/implant_death_alarm.dm
@@ -47,7 +47,7 @@
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm")
qdel(src)
if("emp")
- var/name = prob(50) ? t.name : pick(teleportlocs)
+ var/name = prob(50) ? t.name : pick(GLOB.teleportlocs)
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm")
else
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm")
diff --git a/code/game/objects/items/weapons/implants/implant_storage.dm b/code/game/objects/items/weapons/implants/implant_storage.dm
index 18b08bba283..b530fd860fa 100644
--- a/code/game/objects/items/weapons/implants/implant_storage.dm
+++ b/code/game/objects/items/weapons/implants/implant_storage.dm
@@ -20,6 +20,10 @@
..()
storage = new /obj/item/storage/hidden/implant(src)
+/obj/item/implant/storage/emp_act(severity)
+ ..()
+ storage.emp_act(severity)
+
/obj/item/implant/storage/activate()
storage.MouseDrop(imp_in)
diff --git a/code/game/objects/items/weapons/implants/implant_traitor.dm b/code/game/objects/items/weapons/implants/implant_traitor.dm
index 05d2363ee01..40998caa774 100644
--- a/code/game/objects/items/weapons/implants/implant_traitor.dm
+++ b/code/game/objects/items/weapons/implants/implant_traitor.dm
@@ -40,14 +40,13 @@
L.adjustBrainLoss(20)
removed(mindslave_target)
qdel(src)
- return -1
+ return -1
if(ismindshielded(mindslave_target))
mindslave_target.visible_message("[mindslave_target] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.")
removed(mindslave_target)
qdel(src)
return -1
- mindslave_target.implanting = 1
to_chat(mindslave_target, "You feel completely loyal to [user.name].")
if(!(user.mind in SSticker.mode.implanter))
SSticker.mode.implanter[user.mind] = list()
@@ -56,7 +55,7 @@
SSticker.mode.implanted.Add(mindslave_target.mind)
SSticker.mode.implanted[mindslave_target.mind] = user.mind
SSticker.mode.implanter[user.mind] = implanters
-
+
to_chat(mindslave_target, "You're now completely loyal to [user.name]! You now must lay down your life to protect [user.p_them()] and assist in [user.p_their()] goals at any cost.")
var/datum/objective/protect/mindslave/MS = new
diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm
index e24346c1ee9..1bfeeabae03 100644
--- a/code/game/objects/items/weapons/lighters.dm
+++ b/code/game/objects/items/weapons/lighters.dm
@@ -1,29 +1,19 @@
-/////////
-//ZIPPO//
-/////////
+// Basic lighters
/obj/item/lighter
name = "cheap lighter"
desc = "A cheap-as-free lighter."
icon = 'icons/obj/items.dmi'
icon_state = "lighter-g"
item_state = "lighter-g"
- var/icon_on = "lighter-g-on"
- var/icon_off = "lighter-g"
w_class = WEIGHT_CLASS_TINY
throwforce = 4
flags = CONDUCT
slot_flags = SLOT_BELT
attack_verb = null
resistance_flags = FIRE_PROOF
- var/lit = 0
-
-/obj/item/lighter/zippo
- name = "zippo lighter"
- desc = "The zippo."
- icon_state = "zippo"
- item_state = "zippo"
- icon_on = "zippoon"
- icon_off = "zippo"
+ var/lit = FALSE
+ var/icon_on = "lighter-g-on"
+ var/icon_off = "lighter-g"
/obj/item/lighter/random/New()
..()
@@ -33,54 +23,51 @@
icon_state = icon_off
/obj/item/lighter/attack_self(mob/living/user)
- if(user.r_hand == src || user.l_hand == src || isrobot(user))
- if(!lit)
- lit = 1
- w_class = WEIGHT_CLASS_BULKY
- icon_state = icon_on
- item_state = icon_on
- force = 5
- damtype = "fire"
- hitsound = 'sound/items/welder.ogg'
- attack_verb = list("burnt", "singed")
- if(istype(src, /obj/item/lighter/zippo) )
- user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.")
- playsound(src.loc, 'sound/items/zippolight.ogg', 25, 1)
- else
- if(prob(75))
- user.visible_message("After a few attempts, [user] manages to light the [src].")
- else
- to_chat(user, "You burn yourself while lighting the lighter.")
- var/mob/living/M = user
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand")
- if(affecting.receive_damage( 0, 5 )) //INFERNO
- H.UpdateDamageIcon()
- user.visible_message("After a few attempts, [user] manages to light the [src], [user.p_they()] however burn[user.p_s()] [user.p_their()] finger in the process.")
-
- set_light(2)
- START_PROCESSING(SSobj, src)
- else
- lit = 0
- w_class = WEIGHT_CLASS_TINY
- icon_state = icon_off
- item_state = icon_off
- hitsound = "swing_hit"
- force = 0
- attack_verb = null //human_defense.dm takes care of it
- if(istype(src, /obj/item/lighter/zippo) )
- user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow.")
- playsound(src.loc, 'sound/items/zippoclose.ogg', 25, 1)
- else
- user.visible_message("[user] quietly shuts off the [src].")
-
- set_light(0)
- STOP_PROCESSING(SSobj, src)
+ . = ..()
+ if(!lit)
+ turn_on_lighter(user)
else
- return ..()
- return
+ turn_off_lighter(user)
+/obj/item/lighter/proc/turn_on_lighter(mob/living/user)
+ lit = TRUE
+ w_class = WEIGHT_CLASS_BULKY
+ icon_state = icon_on
+ item_state = icon_on
+ force = 5
+ damtype = BURN
+ hitsound = 'sound/items/welder.ogg'
+ attack_verb = list("burnt", "singed")
+
+ attempt_light(user)
+ set_light(2)
+ START_PROCESSING(SSobj, src)
+
+/obj/item/lighter/proc/attempt_light(mob/living/user)
+ if(prob(75) || issilicon(user)) // Robots can never burn themselves trying to light it.
+ to_chat(user, "You light [src].")
+ else
+ var/mob/living/carbon/human/H = user
+ var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand")
+ if(affecting.receive_damage( 0, 5 )) //INFERNO
+ H.UpdateDamageIcon()
+ to_chat(user,"You light [src], but you burn your hand in the process.")
+
+/obj/item/lighter/proc/turn_off_lighter(mob/living/user)
+ lit = FALSE
+ w_class = WEIGHT_CLASS_TINY
+ icon_state = icon_off
+ item_state = icon_off
+ hitsound = "swing_hit"
+ force = 0
+ attack_verb = null //human_defense.dm takes care of it
+
+ show_off_message(user)
+ set_light(0)
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/lighter/proc/show_off_message(mob/living/user)
+ to_chat(user, "You shut off [src].")
/obj/item/lighter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!isliving(M))
@@ -108,6 +95,41 @@
location.hotspot_expose(700, 5)
return
+// Zippo lighters
+/obj/item/lighter/zippo
+ name = "zippo lighter"
+ desc = "The zippo."
+ icon_state = "zippo"
+ item_state = "zippo"
+ icon_on = "zippoon"
+ icon_off = "zippo"
+ var/next_on_message
+ var/next_off_message
+
+/obj/item/lighter/zippo/turn_on_lighter(mob/living/user)
+ . = ..()
+ if(world.time > next_on_message)
+ user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.")
+ playsound(src.loc, 'sound/items/zippolight.ogg', 25, 1)
+ next_on_message = world.time + 5 SECONDS
+ else
+ to_chat(user, "You light [src].")
+
+/obj/item/lighter/zippo/turn_off_lighter(mob/living/user)
+ . = ..()
+ if(world.time > next_off_message)
+ user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow.")
+ playsound(src.loc, 'sound/items/zippoclose.ogg', 25, 1)
+ next_off_message = world.time + 5 SECONDS
+ else
+ to_chat(user, "You shut off [src].")
+
+/obj/item/lighter/zippo/show_off_message(mob/living/user)
+ return
+
+/obj/item/lighter/zippo/attempt_light(mob/living/user)
+ return
+
//EXTRA LIGHTERS
/obj/item/lighter/zippo/nt_rep
name = "gold engraved zippo"
@@ -222,12 +244,18 @@
else
..()
+/obj/item/match/decompile_act(obj/item/matter_decompiler/C, mob/user)
+ if(burnt)
+ C.stored_comms["wood"] += 1
+ qdel(src)
+ return TRUE
+ return ..()
+
/obj/item/proc/help_light_cig(mob/living/M)
var/mask_item = M.get_item_by_slot(slot_wear_mask)
if(istype(mask_item, /obj/item/clothing/mask/cigarette))
return mask_item
-
/obj/item/match/firebrand
name = "firebrand"
desc = "An unlit firebrand. It makes you wonder why it's not just called a stick."
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index c3f2e50174b..f6fb213b353 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -6,7 +6,7 @@
var/list/nemesis_factions //Any mob with a faction that exists in this list will take bonus damage/effects
w_class = WEIGHT_CLASS_SMALL
var/w_class_on = WEIGHT_CLASS_BULKY
- var/icon_state_on = "axe1"
+ var/icon_state_on
var/list/attack_verb_on = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
hitsound = 'sound/weapons/blade1.ogg' // Probably more appropriate than the previous hitsound. -- Dave
usesound = 'sound/weapons/blade1.ogg'
@@ -37,7 +37,7 @@
return BRUTELOSS|FIRELOSS
/obj/item/melee/energy/attack_self(mob/living/carbon/user)
- if(user.disabilities & CLUMSY && prob(50))
+ if((CLUMSY in user.mutations) && prob(50))
to_chat(user, "You accidentally cut yourself with [src], like a doofus!")
user.take_organ_damage(5,5)
active = !active
@@ -48,9 +48,9 @@
throw_speed = 4
if(attack_verb_on.len)
attack_verb = attack_verb_on
- if(!item_color)
+ if(icon_state_on)
icon_state = icon_state_on
- set_light(brightness_on)
+ set_light(brightness_on, l_color = item_color ? colormap[item_color] : null)
else
icon_state = "sword[item_color]"
set_light(brightness_on, l_color=colormap[item_color])
@@ -80,6 +80,7 @@
name = "energy axe"
desc = "An energised battle axe."
icon_state = "axe0"
+ icon_state_on = "axe1"
force = 40
force_on = 150
throwforce = 25
@@ -290,7 +291,7 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.disabilities & CLUMSY && prob(50))
+ if((CLUMSY in H.mutations) && prob(50))
to_chat(H, "You accidentally cut yourself with [src], like a doofus!")
H.take_organ_damage(10,10)
active = !active
@@ -301,9 +302,9 @@
throw_speed = 4
if(attack_verb_on.len)
attack_verb = attack_verb_on
- if(!item_color)
+ if(icon_state_on)
icon_state = icon_state_on
- set_light(brightness_on)
+ set_light(brightness_on, l_color = item_color ? colormap[item_color] : null)
else
icon_state = "sword[item_color]"
set_light(brightness_on, l_color=colormap[item_color])
diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm
index 0732c0fdd1d..40d68cc8fc6 100644
--- a/code/game/objects/items/weapons/misc.dm
+++ b/code/game/objects/items/weapons/misc.dm
@@ -77,6 +77,10 @@
item_state = "gift"
w_class = WEIGHT_CLASS_BULKY
+/obj/item/gift/emp_act(severity)
+ ..()
+ gift.emp_act(severity)
+
/obj/item/kidanglobe
name = "Kidan homeworld globe"
icon = 'icons/obj/decorations.dmi'
diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm
index 073ae0941e4..415a02f4456 100644
--- a/code/game/objects/items/weapons/rpd.dm
+++ b/code/game/objects/items/weapons/rpd.dm
@@ -39,6 +39,21 @@
var/primary_sound = 'sound/machines/click.ogg'
var/alt_sound = null
+ //Lists of things
+ var/list/mainmenu = list(
+ list("category" = "Atmospherics", "mode" = RPD_ATMOS_MODE, "icon" = "wrench"),
+ list("category" = "Disposals", "mode" = RPD_DISPOSALS_MODE, "icon" = "recycle"),
+ list("category" = "Rotate", "mode" = RPD_ROTATE_MODE, "icon" = "rotate-right"),
+ list("category" = "Flip", "mode" = RPD_FLIP_MODE, "icon" = "exchange"),
+ list("category" = "Recycle", "mode" = RPD_DELETE_MODE, "icon" = "trash"))
+ var/list/pipemenu = list(
+ list("category" = "Normal", "pipemode" = RPD_ATMOS_PIPING),
+ list("category" = "Supply", "pipemode" = RPD_SUPPLY_PIPING),
+ list("category" = "Scrubber", "pipemode" = RPD_SCRUBBERS_PIPING),
+ list("category" = "Devices", "pipemode" = RPD_DEVICES),
+ list("category" = "Heat exchange", "pipemode" = RPD_HEAT_PIPING))
+
+
/obj/item/rpd/New()
..()
spark_system = new /datum/effect_system/spark_spread()
@@ -91,7 +106,7 @@
P = new(T, whatpipe, iconrotation) //Make the pipe, BUT WAIT! There's more!
if(!iconrotation && P.is_bent_pipe()) //Automatically rotates dispensed pipes if the user selected auto-rotation
P.dir = turn(user.dir, 135)
- else if(!iconrotation && P.pipe_type in list(PIPE_CONNECTOR, PIPE_UVENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_CAP, PIPE_SUPPLY_CAP, PIPE_SCRUBBERS_CAP, PIPE_INJECTOR, PIPE_PASV_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction
+ else if(!iconrotation && (P.pipe_type in list(PIPE_CONNECTOR, PIPE_UVENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_CAP, PIPE_SUPPLY_CAP, PIPE_SCRUBBERS_CAP, PIPE_INJECTOR, PIPE_PASV_VENT))) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction
P.dir = turn(user.dir, -180)
else if(iconrotation && P.is_bent_pipe()) //If user selected a rotation and the pipe is bent
P.dir = turn(iconrotation, -45)
@@ -150,27 +165,12 @@
QDEL_NULL(P)
activate_rpd()
-//Lists of things
-
-var/list/mainmenu = list(
- list("category" = "Atmospherics", "mode" = RPD_ATMOS_MODE, "icon" = "wrench"),
- list("category" = "Disposals", "mode" = RPD_DISPOSALS_MODE, "icon" = "recycle"),
- list("category" = "Rotate", "mode" = RPD_ROTATE_MODE, "icon" = "rotate-right"),
- list("category" = "Flip", "mode" = RPD_FLIP_MODE, "icon" = "exchange"),
- list("category" = "Recycle", "mode" = RPD_DELETE_MODE, "icon" = "trash"))
-var/list/pipemenu = list(
- list("category" = "Normal", "pipemode" = RPD_ATMOS_PIPING),
- list("category" = "Supply", "pipemode" = RPD_SUPPLY_PIPING),
- list("category" = "Scrubber", "pipemode" = RPD_SCRUBBERS_PIPING),
- list("category" = "Devices", "pipemode" = RPD_DEVICES),
- list("category" = "Heat exchange", "pipemode" = RPD_HEAT_PIPING))
-
//NanoUI stuff
/obj/item/rpd/attack_self(mob/user)
ui_interact(user)
-/obj/item/rpd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state)
+/obj/item/rpd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = GLOB.inventory_state)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "rpd.tmpl", "[name]", 400, 650, state = state)
@@ -180,7 +180,7 @@ var/list/pipemenu = list(
/obj/item/rpd/AltClick(mob/user)
radial_menu(user)
-/obj/item/rpd/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state)
+/obj/item/rpd/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.inventory_state)
var/data[0]
data["iconrotation"] = iconrotation
data["mainmenu"] = mainmenu
diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm
index 70add3839ef..14f3b0ab91f 100644
--- a/code/game/objects/items/weapons/scrolls.dm
+++ b/code/game/objects/items/weapons/scrolls.dm
@@ -47,12 +47,12 @@
var/A
- A = input(user, "Area to jump to", "BOOYEA", A) as null|anything in teleportlocs
+ A = input(user, "Area to jump to", "BOOYEA", A) as null|anything in GLOB.teleportlocs
if(!A)
return
- var/area/thearea = teleportlocs[A]
+ var/area/thearea = GLOB.teleportlocs[A]
if(user.stat || user.restrained())
return
@@ -60,7 +60,7 @@
return
if(thearea.tele_proof && !istype(thearea, /area/wizard_station))
- to_chat(user, "A mysterious force disrupts your arcane spell matrix, and you remain where you are.")
+ to_chat(user, "A mysterious force disrupts your arcane spell matrix, and you remain where you are.")
return
var/datum/effect_system/smoke_spread/smoke = new
@@ -79,7 +79,7 @@
L+=T
if(!L.len)
- to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.")
+ to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.")
return
if(user && user.buckled)
@@ -100,7 +100,8 @@
break
if(!success)
- user.loc = pick(L)
+ user.forceMove(pick(L))
smoke.start()
src.uses -= 1
+ user.update_action_buttons_icon() //Update action buttons as some spells might now be castable
diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm
index 52c2aea5ddb..6daabffe000 100644
--- a/code/game/objects/items/weapons/shards.dm
+++ b/code/game/objects/items/weapons/shards.dm
@@ -88,6 +88,11 @@
playsound(loc, 'sound/effects/glass_step.ogg', 50, TRUE)
return ..()
+/obj/item/shard/decompile_act(obj/item/matter_decompiler/C, mob/user)
+ C.stored_comms["glass"] += 3
+ qdel(src)
+ return TRUE
+
/obj/item/shard/plasma
name = "plasma shard"
desc = "A shard of plasma glass. Considerably tougher then normal glass shards. Apparently not tough enough to be a window."
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index 362ab601685..19e56e161e3 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -76,7 +76,7 @@
return (active)
/obj/item/shield/energy/attack_self(mob/living/carbon/human/user)
- if(user.disabilities & CLUMSY && prob(50))
+ if((CLUMSY in user.mutations) && prob(50))
to_chat(user, "You beat yourself in the head with [src].")
user.take_organ_damage(5)
active = !active
diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm
index 62f65b5a6cc..cb220ff9565 100644
--- a/code/game/objects/items/weapons/soap.dm
+++ b/code/game/objects/items/weapons/soap.dm
@@ -11,15 +11,11 @@
throw_speed = 4
throw_range = 20
discrete = 1
-
- trip_stun = 4
- trip_weaken = 2
- trip_chance = 100
- trip_walksafe = FALSE
- trip_verb = TV_SLIP
-
var/cleanspeed = 50 //slower than mop
+/obj/item/soap/ComponentInitialize()
+ AddComponent(/datum/component/slippery, src, 4, 2, 100, 0, FALSE)
+
/obj/item/soap/afterattack(atom/target, mob/user, proximity)
if(!proximity) return
//I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing.
diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm
index 1cc2b25edf0..0d5591bbc16 100644
--- a/code/game/objects/items/weapons/stock_parts.dm
+++ b/code/game/objects/items/weapons/stock_parts.dm
@@ -235,57 +235,6 @@
rating = 4
materials = list(MAT_METAL=80)
-// Subspace stock parts
-
-/obj/item/stock_parts/subspace/ansible
- name = "subspace ansible"
- icon_state = "subspace_ansible"
- desc = "A compact module capable of sensing extradimensional activity."
- origin_tech = "programming=2;magnets=2;materials=2;bluespace=1"
- materials = list(MAT_METAL=30, MAT_GLASS=10)
-
-/obj/item/stock_parts/subspace/filter
- name = "hyperwave filter"
- icon_state = "hyperwave_filter"
- desc = "A tiny device capable of filtering and converting super-intense radiowaves."
- origin_tech = "programming=2;magnets=2"
- materials = list(MAT_METAL=30, MAT_GLASS=10)
-
-/obj/item/stock_parts/subspace/amplifier
- name = "subspace amplifier"
- icon_state = "subspace_amplifier"
- desc = "A compact micro-machine capable of amplifying weak subspace transmissions."
- origin_tech = "programming=2;magnets=2;materials=2;bluespace=2"
- materials = list(MAT_METAL=30, MAT_GLASS=10)
-
-/obj/item/stock_parts/subspace/treatment
- name = "subspace treatment disk"
- icon_state = "treatment_disk"
- desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves."
- origin_tech = "programming=2;magnets=2;materials=2;bluespace=2"
- materials = list(MAT_METAL=30, MAT_GLASS=10)
-
-/obj/item/stock_parts/subspace/analyzer
- name = "subspace wavelength analyzer"
- icon_state = "wavelength_analyzer"
- desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
- origin_tech = "programming=2;magnets=2;materials=2;bluespace=2"
- materials = list(MAT_METAL=30, MAT_GLASS=10)
-
-/obj/item/stock_parts/subspace/crystal
- name = "ansible crystal"
- icon_state = "ansible_crystal"
- desc = "A crystal made from pure glass used to transmit laser databursts to subspace."
- origin_tech = "magnets=2;materials=2;bluespace=2;plasmatech=2"
- materials = list(MAT_GLASS=50)
-
-/obj/item/stock_parts/subspace/transmitter
- name = "subspace transmitter"
- icon_state = "subspace_transmitter"
- desc = "A large piece of equipment used to open a window into the subspace dimension."
- origin_tech = "magnets=2;materials=2;bluespace=2"
- materials = list(MAT_METAL=50)
-
/obj/item/research//Makes testing much less of a pain -Sieve
name = "research"
icon = 'icons/obj/stock_parts.dmi'
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 757d2b05757..26045731bd9 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -230,6 +230,11 @@
desc = "An NT Deluxe satchel, with the finest quality leather and the company logo in a thin gold stitch"
icon_state = "nt_deluxe"
+/obj/item/storage/backpack/satchel/lizard
+ name = "lizard skin handbag"
+ desc = "A handbag made out of what appears to be supple green Unathi skin. A face can be vaguely seen on the front."
+ icon_state = "satchel-lizard"
+
/obj/item/storage/backpack/satchel/withwallet/New()
..()
new /obj/item/storage/wallet/random(src)
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 66288713775..4a449069d4c 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -33,9 +33,11 @@
icon_state = "trashbag"
item_state = "trashbag"
- w_class = WEIGHT_CLASS_TINY
+ w_class = WEIGHT_CLASS_BULKY
max_w_class = WEIGHT_CLASS_SMALL
+ slot_flags = null
storage_slots = 30
+ max_combined_w_class = 30
can_hold = list() // any
cant_hold = list(/obj/item/disk/nuclear)
@@ -45,18 +47,15 @@
return TOXLOSS
/obj/item/storage/bag/trash/update_icon()
- if(contents.len == 0)
- w_class = WEIGHT_CLASS_TINY
- icon_state = "[initial(icon_state)]"
- else if(contents.len < 12)
- w_class = WEIGHT_CLASS_BULKY
- icon_state = "[initial(icon_state)]1"
- else if(contents.len < 21)
- w_class = WEIGHT_CLASS_BULKY
- icon_state = "[initial(icon_state)]2"
- else
- w_class = WEIGHT_CLASS_BULKY
- icon_state = "[initial(icon_state)]3"
+ switch(contents.len)
+ if(20 to INFINITY)
+ icon_state = "[initial(icon_state)]3"
+ if(11 to 20)
+ icon_state = "[initial(icon_state)]2"
+ if(1 to 11)
+ icon_state = "[initial(icon_state)]1"
+ else
+ icon_state = "[initial(icon_state)]"
/obj/item/storage/bag/trash/cyborg
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 755b0076c3c..403088e2b71 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -134,7 +134,8 @@
/obj/item/rad_laser,
/obj/item/sensor_device,
/obj/item/wrench/medical,
- /obj/item/handheld_defibrillator
+ /obj/item/handheld_defibrillator,
+ /obj/item/reagent_containers/applicator
)
/obj/item/storage/belt/medical/surgery
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index dceab93330a..da0094bb2ef 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -1059,6 +1059,7 @@
name = "clown box"
desc = "A colorful cardboard box for the clown"
icon_state = "box_clown"
+ var/robot_arm // This exists for bot construction
/obj/item/storage/box/emptysandbags
name = "box of empty sandbags"
@@ -1123,6 +1124,11 @@
playsound(loc, "rustle", 50, 1, -5)
user.visible_message("[user] hugs \the [src].","You hug \the [src].")
+/obj/item/storage/box/wizard
+ name = "magical box"
+ desc = "It's just an ordinary magical box."
+ icon_state = "box_wizard"
+
#undef NODESIGN
#undef NANOTRASEN
#undef SYNDI
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index f0ab5bd5ac7..37f568fa51a 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -215,6 +215,13 @@
//if we get this far, handle the insertion checks as normal
.=..()
+/obj/item/storage/fancy/cigarettes/decompile_act(obj/item/matter_decompiler/C, mob/user)
+ if(!length(contents))
+ C.stored_comms["wood"] += 1
+ qdel(src)
+ return TRUE
+ return ..()
+
/obj/item/storage/fancy/cigarettes/dromedaryco
name = "\improper DromedaryCo packet"
desc = "A packet of six imported DromedaryCo cancer sticks. A label on the packaging reads, \"Wouldn't a slow death make a change?\""
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index bc1e90dac8e..4ff769a7d3f 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -14,7 +14,7 @@
icon_state = "firstaid"
throw_speed = 2
throw_range = 8
- var/empty = 0
+ var/empty = FALSE
req_one_access =list(ACCESS_MEDICAL, ACCESS_ROBOTICS) //Access and treatment are utilized for medbots.
var/treatment_brute = "salglu_solution"
var/treatment_oxy = "salbutamol"
@@ -23,6 +23,7 @@
var/treatment_virus = "spaceacillin"
var/med_bot_skin = null
var/syndicate_aligned = FALSE
+ var/robot_arm // This is for robot construction
/obj/item/storage/firstaid/fire
@@ -32,39 +33,51 @@
item_state = "firstaid-ointment"
med_bot_skin = "ointment"
- New()
- ..()
- if(empty) return
-
- icon_state = pick("ointment","firefirstaid")
-
- new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
- new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
- new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
- new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
- new /obj/item/healthanalyzer( src )
- new /obj/item/reagent_containers/hypospray/autoinjector( src )
- new /obj/item/reagent_containers/food/pill/salicylic( src )
+/obj/item/storage/firstaid/fire/New()
+ ..()
+ if(empty)
return
+ icon_state = pick("ointment", "firefirstaid")
+ new /obj/item/reagent_containers/applicator/burn(src)
+ new /obj/item/reagent_containers/food/pill/patch/silver_sulf/small(src)
+ new /obj/item/healthanalyzer(src)
+ new /obj/item/reagent_containers/hypospray/autoinjector(src)
+ new /obj/item/reagent_containers/food/pill/salicylic(src)
/obj/item/storage/firstaid/fire/empty
- empty = 1
+ empty = TRUE
/obj/item/storage/firstaid/regular
desc = "A general medical kit that contains medical patches for both brute damage and burn damage. Also contains an epinephrine syringe for emergency use and a health analyzer"
icon_state = "firstaid"
- New()
- ..()
- if(empty) return
- new /obj/item/reagent_containers/food/pill/patch/styptic( src )
- new /obj/item/reagent_containers/food/pill/patch/styptic( src )
- new /obj/item/reagent_containers/food/pill/salicylic( src )
- new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
- new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
- new /obj/item/healthanalyzer( src )
- new /obj/item/reagent_containers/hypospray/autoinjector( src )
+/obj/item/storage/firstaid/regular/New()
+ ..()
+ if(empty)
return
+ new /obj/item/reagent_containers/food/pill/patch/styptic(src)
+ new /obj/item/reagent_containers/food/pill/patch/styptic(src)
+ new /obj/item/reagent_containers/food/pill/salicylic(src)
+ new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src)
+ new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src)
+ new /obj/item/healthanalyzer(src)
+ new /obj/item/reagent_containers/hypospray/autoinjector(src)
+
+/obj/item/storage/firstaid/doctor
+ desc = "A general medical kit that contains medical patches for both brute damage and burn damage. Also contains an epinephrine syringe for emergency use and a health analyzer"
+ icon_state = "firstaid"
+
+/obj/item/storage/firstaid/doctor/New()
+ ..()
+ if(empty)
+ return
+ new /obj/item/reagent_containers/applicator/brute(src)
+ new /obj/item/reagent_containers/applicator/burn(src)
+ new /obj/item/reagent_containers/food/pill/patch/styptic(src)
+ new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src)
+ new /obj/item/reagent_containers/food/pill/salicylic(src)
+ new /obj/item/healthanalyzer/advanced(src)
+ new /obj/item/reagent_containers/hypospray/autoinjector(src)
/obj/item/storage/firstaid/toxin
name = "toxin first aid kit"
@@ -73,23 +86,21 @@
item_state = "firstaid-toxin"
med_bot_skin = "tox"
- New()
- ..()
- if(empty) return
-
- icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3")
-
- new /obj/item/reagent_containers/syringe/charcoal( src )
- new /obj/item/reagent_containers/syringe/charcoal( src )
- new /obj/item/reagent_containers/syringe/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/healthanalyzer( src )
+/obj/item/storage/firstaid/toxin/New()
+ ..()
+ if(empty)
return
+ icon_state = pick("antitoxin", "antitoxfirstaid", "antitoxfirstaid2", "antitoxfirstaid3")
+ new /obj/item/reagent_containers/syringe/charcoal(src)
+ new /obj/item/reagent_containers/syringe/charcoal(src)
+ new /obj/item/reagent_containers/syringe/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/toxin/empty
- empty = 1
+ empty = TRUE
/obj/item/storage/firstaid/o2
name = "oxygen deprivation first aid kit"
@@ -98,18 +109,18 @@
item_state = "firstaid-o2"
med_bot_skin = "o2"
- New()
- ..()
- if(empty) return
- new /obj/item/reagent_containers/food/pill/salbutamol( src )
- new /obj/item/reagent_containers/food/pill/salbutamol( src )
- new /obj/item/reagent_containers/food/pill/salbutamol( src )
- new /obj/item/reagent_containers/food/pill/salbutamol( src )
- new /obj/item/healthanalyzer( src )
+/obj/item/storage/firstaid/o2/New()
+ ..()
+ if(empty)
return
+ new /obj/item/reagent_containers/food/pill/salbutamol(src)
+ new /obj/item/reagent_containers/food/pill/salbutamol(src)
+ new /obj/item/reagent_containers/food/pill/salbutamol(src)
+ new /obj/item/reagent_containers/food/pill/salbutamol(src)
+ new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/o2/empty
- empty = 1
+ empty = TRUE
/obj/item/storage/firstaid/brute
name = "brute trauma treatment kit"
@@ -118,23 +129,19 @@
item_state = "firstaid-brute"
med_bot_skin = "brute"
- New()
- ..()
- if(empty) return
-
- icon_state = pick("brute","brute2")
-
- new /obj/item/reagent_containers/food/pill/patch/styptic(src)
- new /obj/item/reagent_containers/food/pill/patch/styptic(src)
- new /obj/item/reagent_containers/food/pill/patch/styptic(src)
- new /obj/item/reagent_containers/food/pill/patch/styptic(src)
- new /obj/item/healthanalyzer(src)
- new /obj/item/reagent_containers/hypospray/autoinjector(src)
- new /obj/item/stack/medical/bruise_pack(src)
+/obj/item/storage/firstaid/brute/New()
+ ..()
+ if(empty)
return
+ icon_state = pick("brute", "brute2")
+ new /obj/item/reagent_containers/applicator/brute(src)
+ new /obj/item/reagent_containers/food/pill/patch/styptic/small(src)
+ new /obj/item/healthanalyzer(src)
+ new /obj/item/reagent_containers/hypospray/autoinjector(src)
+ new /obj/item/stack/medical/bruise_pack(src)
/obj/item/storage/firstaid/brute/empty
- empty = 1
+ empty = TRUE
/obj/item/storage/firstaid/adv
name = "advanced first-aid kit"
@@ -156,7 +163,7 @@
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/adv/empty
- empty = 1
+ empty = TRUE
/obj/item/storage/firstaid/machine
name = "machine repair kit"
@@ -177,7 +184,7 @@
new /obj/item/robotanalyzer(src)
/obj/item/storage/firstaid/machine/empty
- empty = 1
+ empty = TRUE
/obj/item/storage/firstaid/tactical
@@ -195,18 +202,15 @@
/obj/item/storage/firstaid/tactical/New()
..()
- if(empty) return
+ if(empty)
+ return
new /obj/item/reagent_containers/hypospray/combat(src)
- new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) // Because you ain't got no time to look at what damage dey taking yo
- new /obj/item/reagent_containers/food/pill/patch/synthflesh(src)
- new /obj/item/reagent_containers/food/pill/patch/synthflesh(src)
- new /obj/item/reagent_containers/food/pill/patch/synthflesh(src)
+ new /obj/item/reagent_containers/applicator/dual(src) // Because you ain't got no time to look at what damage dey taking yo
new /obj/item/defibrillator/compact/combat/loaded(src)
new /obj/item/clothing/glasses/hud/health/night(src)
- return
/obj/item/storage/firstaid/tactical/empty
- empty =1
+ empty = TRUE
/obj/item/storage/firstaid/surgery
name = "field surgery kit"
@@ -346,15 +350,15 @@
desc = "Contains pills used to counter toxins."
wrapper_color = COLOR_GREEN
- New()
- ..()
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
+/obj/item/storage/pill_bottle/charcoal/New()
+ ..()
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
/obj/item/storage/pill_bottle/painkillers
name = "Pill Bottle (Salicylic Acid)"
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index d38c3c97dac..357cb043ca4 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -98,6 +98,7 @@
add_fingerprint(usr)
to_chat(usr, "It's locked!")
return FALSE
+ return TRUE
/obj/item/storage/secure/attack_self(mob/user as mob)
user.set_machine(src)
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index d79a121e685..55b25ad725a 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -83,11 +83,14 @@
return
/obj/item/storage/AltClick(mob/user)
- if(Adjacent(user) && !user.incapacitated(FALSE, TRUE, TRUE))
+ if(ishuman(user) && Adjacent(user) && !user.incapacitated(FALSE, TRUE, TRUE))
orient2hud(user)
if(user.s_active)
user.s_active.close(user)
show_to(user)
+ playsound(loc, "rustle", 50, 1, -5)
+ add_fingerprint(user)
+ return ..()
/obj/item/storage/proc/return_inv()
@@ -479,10 +482,10 @@
return ..()
/obj/item/storage/emp_act(severity)
- if(!istype(loc, /mob/living))
- for(var/obj/O in contents)
- O.emp_act(severity)
..()
+ for(var/i in contents)
+ var/atom/A = i
+ A.emp_act(severity)
/obj/item/storage/hear_talk(mob/living/M as mob, list/message_pieces)
..()
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index f965907c5ba..6cf011bc2c3 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -121,19 +121,6 @@
desc = "A sleek, sturdy box"
icon_state = "box_of_doom"
-/obj/item/storage/box/syndie_kit/romerol
- name = "Romerol Kit"
- desc = "A box containing a deadly virus capable of reanimating dead as zombies."
- max_w_class = WEIGHT_CLASS_NORMAL
- can_hold = list(/obj/item/reagent_containers/glass/bottle/romerol,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/dropper)
-
-/obj/item/storage/box/syndie_kit/romerol/New()
- ..()
- new /obj/item/reagent_containers/glass/bottle/romerol(src)
- new /obj/item/reagent_containers/syringe(src)
- new /obj/item/reagent_containers/dropper(src)
- return
-
/obj/item/storage/box/syndie_kit/space
name = "Boxed Space Suit and Helmet"
can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red, /obj/item/tank/emergency_oxygen/syndi, /obj/item/clothing/mask/gas/syndicate)
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 6782057d928..a39050cba47 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -189,8 +189,8 @@
L.apply_effect(STUTTER, stunforce)
if(user)
- user.lastattacked = L
- L.lastattacker = user
+ L.lastattacker = user.real_name
+ L.lastattackerckey = user.ckey
L.visible_message("[user] has stunned [L] with [src]!", \
"[user] has stunned you with [src]!")
add_attack_logs(user, L, "stunned")
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 11355b34170..a82d6c0c223 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -53,13 +53,8 @@ obj/item/tank/oxygen/empty/New()
/obj/item/tank/anesthetic/New()
..()
-
- air_contents.oxygen = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
-
- var/datum/gas/sleeping_agent/trace_gas = new()
- trace_gas.moles = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
-
- air_contents.trace_gases += trace_gas
+ air_contents.oxygen = (3 * ONE_ATMOSPHERE) * 70 / (R_IDEAL_GAS_EQUATION * T20C) * O2STANDARD
+ air_contents.sleeping_agent = (3 * ONE_ATMOSPHERE) * 70 / (R_IDEAL_GAS_EQUATION * T20C) * N2STANDARD
/*
* Air
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index a0dd6aa485d..9ded7947202 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -156,7 +156,7 @@
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/item/tank/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/item/tank/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/using_internal
if(iscarbon(loc))
var/mob/living/carbon/C = loc
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index 2375c42db65..55dc189fc9b 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -119,7 +119,7 @@
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(25,50,100)
volume = 500
- flags = NODROP | NOBLUDGEON
+ flags = NOBLUDGEON
container_type = OPENCONTAINER
var/obj/item/watertank/tank
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index 4ac9651ea65..33aeddeaab0 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -115,7 +115,7 @@ Frequency:
to_chat(user, "\The [src] is malfunctioning.")
return
var/list/L = list( )
- for(var/obj/machinery/computer/teleporter/com in world)
+ 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)
L["[com.id] (Active)"] = com.target
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
deleted file mode 100644
index 012fcf79b10..00000000000
--- a/code/game/objects/items/weapons/tools.dm
+++ /dev/null
@@ -1,785 +0,0 @@
-#define HEALPERWELD 15
-
-/* Tools!
- * Note: Multitools are in devices
- *
- * Contains:
- * Wrench
- * Screwdriver
- * Wirecutters
- * Welding Tool
- * Crowbar
- * Revolver Conversion Kit
- */
-
-//Wrench
-/obj/item/wrench
- name = "wrench"
- desc = "A wrench with common uses. Can be found in your hand."
- icon = 'icons/obj/tools.dmi'
- icon_state = "wrench"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 5
- throwforce = 7
- usesound = 'sound/items/ratchet.ogg'
- w_class = WEIGHT_CLASS_SMALL
- materials = list(MAT_METAL=150)
- origin_tech = "materials=1;engineering=1"
- attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
- toolspeed = 1
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
-
-/obj/item/wrench/suicide_act(mob/user)
- user.visible_message("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
- playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
- return BRUTELOSS
-
-/obj/item/wrench/cyborg
- name = "automatic wrench"
- desc = "An advanced robotic wrench. Can be found in construction cyborgs."
- toolspeed = 0.5
-
-/obj/item/wrench/brass
- name = "brass wrench"
- desc = "A brass wrench. It's faintly warm to the touch."
- icon_state = "wrench_brass"
- toolspeed = 0.5
- resistance_flags = FIRE_PROOF | ACID_PROOF
-
-/obj/item/wrench/abductor
- name = "alien wrench"
- desc = "A polarized wrench. It causes anything placed between the jaws to turn."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "wrench"
- usesound = 'sound/effects/empulse.ogg'
- toolspeed = 0.1
- origin_tech = "materials=5;engineering=5;abductor=3"
-
-/obj/item/wrench/power
- name = "hand drill"
- desc = "A simple powered drill with a bolt bit."
- icon_state = "drill_bolt"
- item_state = "drill"
- usesound = 'sound/items/drill_use.ogg'
- materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
- origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get
- force = 8 //might or might not be too high, subject to change
- throwforce = 8
- attack_verb = list("drilled", "screwed", "jabbed")
- toolspeed = 0.25
-
-/obj/item/wrench/power/attack_self(mob/user)
- playsound(get_turf(user),'sound/items/change_drill.ogg', 50, 1)
- var/obj/item/wirecutters/power/s_drill = new /obj/item/screwdriver/power
- to_chat(user, "You attach the screwdriver bit to [src].")
- qdel(src)
- user.put_in_active_hand(s_drill)
-
-/obj/item/wrench/power/suicide_act(mob/user)
- user.visible_message("[user] is pressing [src] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!")
- return BRUTELOSS
-
-/obj/item/wrench/medical
- name = "medical wrench"
- desc = "A medical wrench with common (medical?) uses. Can be found in your hand."
- icon_state = "wrench_medical"
- force = 2 //MEDICAL
- throwforce = 4
- origin_tech = "materials=1;engineering=1;biotech=3"
- attack_verb = list("wrenched", "medicaled", "tapped", "jabbed", "whacked")
-
-/obj/item/wrench/medical/suicide_act(mob/user)
- user.visible_message("[user] is praying to the medical wrench to take [user.p_their()] soul. It looks like [user.p_theyre()] trying to commit suicide!")
- // TODO Make them glow with the power of the M E D I C A L W R E N C H
- // during their ascension
-
- // Stun stops them from wandering off
- user.Stun(5)
- playsound(loc, 'sound/effects/pray.ogg', 50, 1, -1)
-
- // Let the sound effect finish playing
- sleep(20)
-
- if(!user)
- return
-
- for(var/obj/item/W in user)
- user.unEquip(W)
-
- var/obj/item/wrench/medical/W = new /obj/item/wrench/medical(loc)
- W.add_fingerprint(user)
- W.desc += " For some reason, it reminds you of [user.name]."
-
- if(!user)
- return
-
- user.dust()
- return OBLITERATION
-
-//Screwdriver
-/obj/item/screwdriver
- name = "screwdriver"
- desc = "You can be totally screwy with this."
- icon = 'icons/obj/tools.dmi'
- icon_state = "screwdriver_map"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 5
- w_class = WEIGHT_CLASS_TINY
- throwforce = 5
- throw_speed = 3
- throw_range = 5
- materials = list(MAT_METAL=75)
- attack_verb = list("stabbed")
- hitsound = 'sound/weapons/bladeslice.ogg'
- usesound = 'sound/items/screwdriver.ogg'
- toolspeed = 1
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
- var/random_color = TRUE //if the screwdriver uses random coloring
-
-/obj/item/screwdriver/nuke
- name = "screwdriver"
- desc = "A screwdriver with an ultra thin tip."
- icon_state = "screwdriver_nuke"
- toolspeed = 0.5
-
-/obj/item/screwdriver/suicide_act(mob/user)
- user.visible_message("[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!")
- return BRUTELOSS
-
-/obj/item/screwdriver/New(loc, var/param_color = null)
- ..()
- if(random_color)
- if(!param_color)
- param_color = pick("red","blue","pink","brown","green","cyan","yellow")
- icon_state = "screwdriver_[param_color]"
-
- if (prob(75))
- src.pixel_y = rand(0, 16)
-
-/obj/item/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
- if(!istype(M) || user.a_intent == INTENT_HELP)
- return ..()
- if(user.zone_selected != "eyes" && user.zone_selected != "head")
- return ..()
- if(HAS_TRAIT(user, TRAIT_PACIFISM))
- to_chat(user, "You don't want to harm [M]!")
- return
- if((CLUMSY in user.mutations) && prob(50))
- M = user
- return eyestab(M,user)
-
-/obj/item/screwdriver/brass
- name = "brass screwdriver"
- desc = "A screwdriver made of brass. The handle feels freezing cold."
- icon_state = "screwdriver_brass"
- toolspeed = 0.5
- random_color = FALSE
- resistance_flags = FIRE_PROOF | ACID_PROOF
-
-/obj/item/screwdriver/abductor
- name = "alien screwdriver"
- desc = "An ultrasonic screwdriver."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "screwdriver"
- usesound = 'sound/items/pshoom.ogg'
- toolspeed = 0.1
- random_color = FALSE
-
-/obj/item/screwdriver/power
- name = "hand drill"
- desc = "A simple hand drill with a screwdriver bit attached."
- icon_state = "drill_screw"
- item_state = "drill"
- materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
- origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get
- force = 8 //might or might not be too high, subject to change
- throwforce = 8
- throw_speed = 2
- throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far
- attack_verb = list("drilled", "screwed", "jabbed","whacked")
- hitsound = 'sound/items/drill_hit.ogg'
- usesound = 'sound/items/drill_use.ogg'
- toolspeed = 0.25
- random_color = FALSE
-
-/obj/item/screwdriver/power/suicide_act(mob/user)
- user.visible_message("[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!")
- return BRUTELOSS
-
-/obj/item/screwdriver/power/attack_self(mob/user)
- playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, 1)
- var/obj/item/wrench/power/b_drill = new /obj/item/wrench/power
- to_chat(user, "You attach the bolt driver bit to [src].")
- qdel(src)
- user.put_in_active_hand(b_drill)
-
-/obj/item/screwdriver/cyborg
- name = "powered screwdriver"
- desc = "An electrical screwdriver, designed to be both precise and quick."
- usesound = 'sound/items/drill_use.ogg'
- toolspeed = 0.5
-
-//Wirecutters
-/obj/item/wirecutters
- name = "wirecutters"
- desc = "This cuts wires."
- icon = 'icons/obj/tools.dmi'
- icon_state = "cutters"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 6
- throw_speed = 3
- throw_range = 7
- w_class = WEIGHT_CLASS_SMALL
- materials = list(MAT_METAL=80)
- origin_tech = "materials=1;engineering=1"
- attack_verb = list("pinched", "nipped")
- hitsound = 'sound/items/wirecutter.ogg'
- usesound = 'sound/items/wirecutter.ogg'
- sharp = 1
- toolspeed = 1
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
- var/random_color = TRUE
-
-/obj/item/wirecutters/New(loc, param_color = null)
- ..()
- if(random_color)
- if(!param_color)
- param_color = pick("yellow", "red")
- icon_state = "cutters_[param_color]"
-
-/obj/item/wirecutters/attack(mob/living/carbon/C, mob/user)
- if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/restraints/handcuffs/cable))
- user.visible_message("[user] cuts [C]'s restraints with [src]!")
- QDEL_NULL(C.handcuffed)
- if(C.buckled && C.buckled.buckle_requires_restraints)
- C.buckled.unbuckle_mob(C)
- C.update_handcuffed()
- return
- else
- ..()
-
-/obj/item/wirecutters/suicide_act(mob/user)
- user.visible_message("[user] is cutting at [user.p_their()] arteries with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
- playsound(loc, usesound, 50, 1, -1)
- return BRUTELOSS
-
-/obj/item/wirecutters/brass
- name = "brass wirecutters"
- desc = "A pair of wirecutters made of brass. The handle feels freezing cold to the touch."
- icon_state = "cutters_brass"
- toolspeed = 0.5
- random_color = FALSE
- resistance_flags = FIRE_PROOF | ACID_PROOF
-
-/obj/item/wirecutters/abductor
- name = "alien wirecutters"
- desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "cutters"
- toolspeed = 0.1
- origin_tech = "materials=5;engineering=4;abductor=3"
- random_color = FALSE
-
-/obj/item/wirecutters/cyborg
- name = "wirecutters"
- desc = "This cuts wires."
- toolspeed = 0.5
-
-/obj/item/wirecutters/power
- name = "jaws of life"
- desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a cutting head."
- icon_state = "jaws_cutter"
- item_state = "jawsoflife"
- origin_tech = "materials=2;engineering=2"
- materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
- usesound = 'sound/items/jaws_cut.ogg'
- toolspeed = 0.25
- random_color = FALSE
-
-/obj/item/wirecutters/power/suicide_act(mob/user)
- user.visible_message("[user] is wrapping \the [src] around [user.p_their()] neck. It looks like [user.p_theyre()] trying to rip [user.p_their()] head off!")
- playsound(loc, 'sound/items/jaws_cut.ogg', 50, 1, -1)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- var/obj/item/organ/external/head/head = H.bodyparts_by_name["head"]
- if(head)
- head.droplimb(0, DROPLIMB_BLUNT, FALSE, TRUE)
- playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
- return BRUTELOSS
-
-/obj/item/wirecutters/power/attack_self(mob/user)
- playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
- var/obj/item/crowbar/power/pryjaws = new /obj/item/crowbar/power
- to_chat(user, "You attach the pry jaws to [src].")
- qdel(src)
- user.put_in_active_hand(pryjaws)
-
-//Welding Tool
-/obj/item/weldingtool
- name = "welding tool"
- desc = "A standard edition welder provided by Nanotrasen."
- icon = 'icons/obj/tools.dmi'
- icon_state = "welder"
- item_state = "welder"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 3
- throwforce = 5
- throw_speed = 3
- throw_range = 5
- hitsound = "swing_hit"
- usesound = 'sound/items/welder.ogg'
- var/acti_sound = 'sound/items/welderactivate.ogg'
- var/deac_sound = 'sound/items/welderdeactivate.ogg'
- w_class = WEIGHT_CLASS_SMALL
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
- resistance_flags = FIRE_PROOF
- materials = list(MAT_METAL=70, MAT_GLASS=30)
- origin_tech = "engineering=1;plasmatech=1"
- toolspeed = 1
- var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
- var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
- var/max_fuel = 20 //The max amount of fuel the welder can hold
- var/change_icons = 1
- var/can_off_process = 0
- var/light_intensity = 2 //how powerful the emitted light is when used.
- var/nextrefueltick = 0
-
-/obj/item/weldingtool/New()
- ..()
- create_reagents(max_fuel)
- reagents.add_reagent("fuel", max_fuel)
- update_icon()
-
-/obj/item/weldingtool/examine(mob/user)
- . = ..()
- if(get_dist(user, src) <= 0)
- . += "It contains [get_fuel()] unit\s of fuel out of [max_fuel]."
-
-/obj/item/weldingtool/suicide_act(mob/user)
- user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!")
- return FIRELOSS
-
-/obj/item/weldingtool/proc/update_torch()
- overlays.Cut()
- if(welding)
- overlays += "[initial(icon_state)]-on"
- item_state = "[initial(item_state)]1"
- else
- item_state = "[initial(item_state)]"
-
-/obj/item/weldingtool/update_icon()
- if(change_icons)
- var/ratio = get_fuel() / max_fuel
- ratio = Ceiling(ratio*4) * 25
- if(ratio == 100)
- icon_state = initial(icon_state)
- else
- icon_state = "[initial(icon_state)][ratio]"
- update_torch()
- ..()
-
-/obj/item/weldingtool/process()
- switch(welding)
- if(0)
- force = 3
- damtype = "brute"
- update_icon()
- if(!can_off_process)
- STOP_PROCESSING(SSobj, src)
- return
- //Welders left on now use up fuel, but lets not have them run out quite that fast
- if(1)
- force = 15
- damtype = "fire"
- if(prob(5))
- remove_fuel(1)
- update_icon()
-
- //This is to start fires. process() is only called if the welder is on.
- var/turf/location = loc
- if(ismob(location))
- var/mob/M = location
- if(M.l_hand == src || M.r_hand == src)
- location = get_turf(M)
- if(isturf(location))
- location.hotspot_expose(700, 5)
-
-/obj/item/weldingtool/attackby(obj/item/I, mob/user, params)
- if(isscrewdriver(I))
- flamethrower_screwdriver(I, user)
- else if(istype(I, /obj/item/stack/rods))
- flamethrower_rods(I, user)
- else
- ..()
-
-/obj/item/weldingtool/attack(mob/M, mob/user)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- var/obj/item/organ/external/S = H.bodyparts_by_name[user.zone_selected]
-
- if(!S)
- return
-
- if(!S.is_robotic() || user.a_intent != INTENT_HELP || S.open == 2)
- return ..()
-
- if(!isOn()) //why wasn't this being checked already?
- to_chat(user, "Turn on [src] before attempting repairs!")
- return 1
-
- if(S.brute_dam > ROBOLIMB_SELF_REPAIR_CAP)
- to_chat(user, "The damage is far too severe to patch over externally.")
- return
-
- if(!S.brute_dam)
- to_chat(user, "Nothing to fix!")
- return
-
- if(get_fuel() >= 1)
- if(H == user)
- if(!do_mob(user, H, 10))
- return 1
- if(!remove_fuel(1,null))
- to_chat(user, "Need more welding fuel!")
- var/rembrute = HEALPERWELD
- var/nrembrute = 0
- var/childlist
- if(!isnull(S.children))
- childlist = S.children.Copy()
- var/parenthealed = FALSE
- while(rembrute > 0)
- var/obj/item/organ/external/E
- if(S.brute_dam)
- E = S
- else if(LAZYLEN(childlist))
- E = pick_n_take(childlist)
- if(!E.brute_dam || !E.is_robotic())
- continue
- else if(S.parent && !parenthealed)
- E = S.parent
- parenthealed = TRUE
- if(!E.brute_dam || !E.is_robotic())
- break
- else
- break
- playsound(src.loc, usesound, 50, 1)
- nrembrute = max(rembrute - E.brute_dam, 0)
- E.heal_damage(rembrute,0,0,1)
- rembrute = nrembrute
- user.visible_message("\The [user] patches some dents on \the [M]'s [E.name] with \the [src].")
- if(H.bleed_rate && H.isSynthetic())
- H.bleed_rate = 0
- user.visible_message("\The [user] patches some leaks on [M] with \the [src].")
- return 1
- else
- return ..()
-
-/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity)
- if(!proximity)
- return
- if(welding)
- remove_fuel(1)
- var/turf/location = get_turf(user)
- location.hotspot_expose(700, 50, 1)
- if(get_fuel() <= 0)
- set_light(0)
-
- if(isliving(O))
- var/mob/living/L = O
- if(L.IgniteMob())
- message_admins("[key_name_admin(user)] set [key_name_admin(L)] on fire")
- log_game("[key_name(user)] set [key_name(L)] on fire")
-
-/obj/item/weldingtool/attack_self(mob/user)
- switched_on(user)
- if(welding)
- set_light(light_intensity)
-
- update_icon()
-
-//Returns the amount of fuel in the welder
-/obj/item/weldingtool/proc/get_fuel()
- return reagents.get_reagent_amount("fuel")
-
-//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use()
-/obj/item/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null)
- if(!welding || !check_fuel())
- return FALSE
- if(get_fuel() >= amount)
- reagents.remove_reagent("fuel", amount)
- check_fuel()
- if(M)
- M.flash_eyes(light_intensity)
- return TRUE
- else
- if(M)
- to_chat(M, "You need more welding fuel to complete this task.")
- return FALSE
-
-//Returns whether or not the welding tool is currently on.
-/obj/item/weldingtool/proc/isOn()
- return welding
-
-//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
-/obj/item/weldingtool/proc/check_fuel(mob/user)
- if(get_fuel() <= 0 && welding)
- switched_on(user)
- update_icon()
- //mob icon update
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_r_hand(0)
- M.update_inv_l_hand(0)
- return 0
- return 1
-
-//Switches the welder on
-/obj/item/weldingtool/proc/switched_on(mob/user)
- if(!status)
- to_chat(user, "[src] can't be turned on while unsecured!")
- return
- welding = !welding
- if(welding)
- if(get_fuel() >= 1)
- to_chat(user, "You switch [src] on.")
- playsound(loc, acti_sound, 50, 1)
- force = 15
- damtype = "fire"
- hitsound = 'sound/items/welder.ogg'
- update_icon()
- START_PROCESSING(SSobj, src)
- else
- to_chat(user, "You need more fuel!")
- switched_off(user)
- else
- if(user)
- to_chat(user, "You switch [src] off.")
- playsound(loc, deac_sound, 50, 1)
- switched_off(user)
-
-//Switches the welder off
-/obj/item/weldingtool/proc/switched_off(mob/user)
- welding = 0
- set_light(0)
-
- force = 3
- damtype = "brute"
- hitsound = "swing_hit"
- update_icon()
-
-/obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user)
- if(welding)
- to_chat(user, "Turn it off first!")
- return
- status = !status
- if(status)
- to_chat(user, "You resecure [src].")
- else
- to_chat(user, "[src] can now be attached and modified.")
- add_fingerprint(user)
-
-/obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user)
- if(!status)
- var/obj/item/stack/rods/R = I
- if(R.use(1))
- var/obj/item/flamethrower/F = new /obj/item/flamethrower(user.loc)
- if(!remove_item_from_storage(F))
- user.unEquip(src)
- loc = F
- F.weldtool = src
- add_fingerprint(user)
- to_chat(user, "You add a rod to a welder, starting to build a flamethrower.")
- user.put_in_hands(F)
- else
- to_chat(user, "You need one rod to start building a flamethrower!")
-
-/obj/item/weldingtool/largetank
- name = "Industrial Welding Tool"
- desc = "A slightly larger welder with a larger tank."
- icon_state = "indwelder"
- max_fuel = 40
- materials = list(MAT_METAL=70, MAT_GLASS=60)
- origin_tech = "engineering=2;plasmatech=2"
-
-/obj/item/weldingtool/largetank/cyborg
- name = "integrated welding tool"
- desc = "An advanced welder designed to be used in robotic systems."
- toolspeed = 0.5
-
-/obj/item/weldingtool/largetank/flamethrower_screwdriver()
- return
-
-/obj/item/weldingtool/mini
- name = "emergency welding tool"
- desc = "A miniature welder used during emergencies."
- icon_state = "miniwelder"
- max_fuel = 10
- w_class = WEIGHT_CLASS_TINY
- materials = list(MAT_METAL=30, MAT_GLASS=10)
- change_icons = 0
-
-/obj/item/weldingtool/mini/flamethrower_screwdriver()
- return
-
-/obj/item/weldingtool/abductor
- name = "alien welding tool"
- desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "welder"
- toolspeed = 0.1
- light_intensity = 0
- change_icons = 0
- origin_tech = "plasmatech=5;engineering=5;abductor=3"
- can_off_process = 1
-
-/obj/item/weldingtool/abductor/process()
- if(get_fuel() <= max_fuel)
- reagents.add_reagent("fuel", 1)
- ..()
-
-/obj/item/weldingtool/hugetank
- name = "Upgraded Welding Tool"
- desc = "An upgraded welder based off the industrial welder."
- icon_state = "upindwelder"
- item_state = "upindwelder"
- max_fuel = 80
- materials = list(MAT_METAL=70, MAT_GLASS=120)
- origin_tech = "engineering=3;plasmatech=2"
-
-/obj/item/weldingtool/experimental
- name = "Experimental Welding Tool"
- desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes."
- icon_state = "exwelder"
- item_state = "exwelder"
- max_fuel = 40
- materials = list(MAT_METAL=70, MAT_GLASS=120)
- origin_tech = "materials=4;engineering=4;bluespace=3;plasmatech=4"
- change_icons = 0
- can_off_process = 1
- light_intensity = 1
- toolspeed = 0.5
- var/last_gen = 0
-
-/obj/item/weldingtool/experimental/brass
- name = "brass welding tool"
- desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch."
- icon_state = "brasswelder"
- item_state = "brasswelder"
- resistance_flags = FIRE_PROOF | ACID_PROOF
-
-obj/item/weldingtool/experimental/process()
- ..()
- if(get_fuel() < max_fuel && nextrefueltick < world.time)
- nextrefueltick = world.time + 10
- reagents.add_reagent("fuel", 1)
-
-//Crowbar
-/obj/item/crowbar
- name = "pocket crowbar"
- desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors."
- icon = 'icons/obj/tools.dmi'
- icon_state = "crowbar"
- item_state = "crowbar"
- usesound = 'sound/items/crowbar.ogg'
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 5
- throwforce = 7
- item_state = "crowbar"
- w_class = WEIGHT_CLASS_SMALL
- materials = list(MAT_METAL=50)
- origin_tech = "engineering=1;combat=1"
- attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
- toolspeed = 1
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
-
-/obj/item/crowbar/red
- icon_state = "crowbar_red"
- item_state = "crowbar_red"
- force = 8
-
-/obj/item/crowbar/brass
- name = "brass crowbar"
- desc = "A brass crowbar. It feels faintly warm to the touch."
- icon_state = "crowbar_brass"
- item_state = "crowbar_brass"
- toolspeed = 0.5
- resistance_flags = FIRE_PROOF | ACID_PROOF
-
-/obj/item/crowbar/abductor
- name = "alien crowbar"
- desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
- icon = 'icons/obj/abductor.dmi'
- usesound = 'sound/weapons/sonic_jackhammer.ogg'
- icon_state = "crowbar"
- toolspeed = 0.1
- origin_tech = "combat=4;engineering=4;abductor=3"
-
-/obj/item/crowbar/large
- name = "crowbar"
- desc = "It's a big crowbar. It doesn't fit in your pockets, because its too big."
- force = 12
- w_class = WEIGHT_CLASS_NORMAL
- throw_speed = 3
- throw_range = 3
- materials = list(MAT_METAL=70)
- icon_state = "crowbar_large"
- item_state = "crowbar_large"
- toolspeed = 0.5
-
-/obj/item/crowbar/cyborg
- name = "hydraulic crowbar"
- desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs."
- usesound = 'sound/items/jaws_pry.ogg'
- force = 10
- toolspeed = 0.5
-
-/obj/item/crowbar/power
- name = "jaws of life"
- desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a prying head."
- icon_state = "jaws_pry"
- item_state = "jawsoflife"
- materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
- origin_tech = "materials=2;engineering=2"
- usesound = 'sound/items/jaws_pry.ogg'
- force = 15
- toolspeed = 0.25
- var/airlock_open_time = 100 // Time required to open powered airlocks
-
-/obj/item/crowbar/power/suicide_act(mob/user)
- user.visible_message("[user] is putting [user.p_their()] head in [src]. It looks like [user.p_theyre()] trying to commit suicide!")
- playsound(loc, 'sound/items/jaws_pry.ogg', 50, 1, -1)
- return BRUTELOSS
-
-/obj/item/crowbar/power/attack_self(mob/user)
- playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
- var/obj/item/wirecutters/power/cutjaws = new /obj/item/wirecutters/power
- to_chat(user, "You attach the cutting jaws to [src].")
- qdel(src)
- user.put_in_active_hand(cutjaws)
-
-// Conversion kit
-/obj/item/conversion_kit
- name = "\improper Revolver Conversion Kit"
- desc = "A professional conversion kit used to convert any knock off revolver into the real deal capable of shooting lethal .357 rounds without the possibility of catastrophic failure."
- icon_state = "kit"
- flags = CONDUCT
- w_class = WEIGHT_CLASS_SMALL
- origin_tech = "combat=2"
- var/open = 0
-
-/obj/item/conversion_kit/New()
- ..()
- update_icon()
-
-/obj/item/conversion_kit/update_icon()
- icon_state = "[initial(icon_state)]_[open]"
-
-/obj/item/conversion_kit/attack_self(mob/user)
- open = !open
- to_chat(user, "You [open ? "open" : "close"] the conversion kit.")
- update_icon()
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 57c9a5301f6..ed857c18ded 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -179,6 +179,7 @@
slot_flags = SLOT_BACK
force_unwielded = 5
force_wielded = 24
+ toolspeed = 0.25
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
usesound = 'sound/items/crowbar.ogg'
@@ -542,6 +543,7 @@
w_class = WEIGHT_CLASS_BULKY // can't fit in backpacks
force_unwielded = 15 //still pretty robust
force_wielded = 40 //you'll gouge their eye out! Or a limb...maybe even their entire body!
+ hitsound = null // Handled in the snowflaked attack proc
wieldsound = 'sound/weapons/chainsawstart.ogg'
hitsound = null
armour_penetration = 35
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 6ef379ffcad..32158a9a3ab 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -205,7 +205,7 @@
else if(prob(30))
visible_message("[owner] swings! And [p_they()] miss[p_es()]! How embarassing.", "You swing! You miss! Oh no!")
playsound(get_turf(owner), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- do_attack_animation(get_step(owner, pick(alldirs)), ATTACK_EFFECT_DISARM)
+ do_attack_animation(get_step(owner, pick(GLOB.alldirs)), ATTACK_EFFECT_DISARM)
deflectmode = FALSE
if(!istype(I, /obj/item/beach_ball))
lastdeflect = world.time + 3000
@@ -214,7 +214,7 @@
visible_message("[owner] swings and deflects [I]!", "You swing and deflect the [I]!")
playsound(get_turf(owner), 'sound/weapons/baseball_hit.ogg', 50, 1, -1)
do_attack_animation(I, ATTACK_EFFECT_DISARM)
- I.throw_at(get_edge_target_turf(owner, pick(cardinal)), rand(8,10), 14, owner)
+ I.throw_at(get_edge_target_turf(owner, pick(GLOB.cardinal)), rand(8,10), 14, owner)
deflectmode = FALSE
if(!istype(I, /obj/item/beach_ball))
lastdeflect = world.time + 3000
diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm
index f74f8d28f57..d2ab4b2733f 100644
--- a/code/game/objects/items/weapons/whetstone.dm
+++ b/code/game/objects/items/weapons/whetstone.dm
@@ -34,15 +34,15 @@
if(TH.force_wielded > initial(TH.force_wielded))
to_chat(user, "[TH] has already been refined before. It cannot be sharpened further!")
return
- TH.force_wielded = Clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay
+ TH.force_wielded = clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay
if(I.force > initial(I.force))
to_chat(user, "[I] has already been refined before. It cannot be sharpened further!")
return
user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.")
if(!requires_sharpness)
I.sharp = 1
- I.force = Clamp(I.force + increment, 0, max)
- I.throwforce = Clamp(I.throwforce + increment, 0, max)
+ I.force = clamp(I.force + increment, 0, max)
+ I.throwforce = clamp(I.throwforce + increment, 0, max)
I.name = "[prefix] [I.name]"
playsound(get_turf(src), usesound, 50, 1)
name = "worn out [name]"
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 1816357d450..bbd43db7c1e 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -30,9 +30,9 @@
return 0
var/armor_protection = 0
if(damage_flag)
- armor_protection = armor[damage_flag]
+ armor_protection = armor.getRating(damage_flag)
if(armor_protection) //Only apply weak-against-armor/hollowpoint effects if there actually IS armor.
- armor_protection = Clamp(armor_protection - armour_penetration, min(armor_protection, 0), 100)
+ armor_protection = clamp(armor_protection - armour_penetration, min(armor_protection, 0), 100)
return round(damage_amount * (100 - armor_protection)*0.01, DAMAGE_PRECISION)
///the sound played when the obj is damaged.
@@ -201,11 +201,11 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
return
..()
if(exposed_temperature && !(resistance_flags & FIRE_PROOF))
- take_damage(Clamp(0.02 * exposed_temperature, 0, 20), BURN, "fire", 0)
+ take_damage(clamp(0.02 * exposed_temperature, 0, 20), BURN, "fire", 0)
if(!(resistance_flags & ON_FIRE) && (resistance_flags & FLAMMABLE) && !(resistance_flags & FIRE_PROOF))
resistance_flags |= ON_FIRE
SSfires.processing[src] = src
- add_overlay(fire_overlay, TRUE)
+ add_overlay(GLOB.fire_overlay, TRUE)
return 1
///called when the obj is destroyed by fire
@@ -218,7 +218,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
/obj/proc/extinguish()
if(resistance_flags & ON_FIRE)
resistance_flags &= ~ON_FIRE
- cut_overlay(fire_overlay, TRUE)
+ cut_overlay(GLOB.fire_overlay, TRUE)
SSfires.processing -= src
///Called when the obj is hit by a tesla bolt.
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index e30c8c5c4c2..d40c628ed90 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -1,15 +1,14 @@
/obj
//var/datum/module/mod //not used
var/origin_tech = null //Used by R&D to determine what research bonuses it grants.
- var/crit_fail = 0
+ var/crit_fail = FALSE
animate_movement = 2
- var/list/attack_verb = list() //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]"
var/list/species_exception = null // list() of species types, if a species cannot put items in a certain slot, but species type is in list, it will be able to wear that item
- var/sharp = 0 // whether this object cuts
- var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING!
+ var/sharp = FALSE // whether this object cuts
+ var/in_use = FALSE // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING!
var/damtype = "brute"
var/force = 0
- var/list/armor
+ var/datum/armor/armor
var/obj_integrity //defaults to max_integrity
var/max_integrity = 500
var/integrity_failure = 0 //0 if we have no special broken behavior
@@ -22,9 +21,9 @@
var/can_be_hit = TRUE //can this be bludgeoned by items?
- var/Mtoollink = 0 // variable to decide if an object should show the multitool menu linking menu, not all objects use it
+ var/Mtoollink = FALSE // variable to decide if an object should show the multitool menu linking menu, not all objects use it
- var/being_shocked = 0
+ var/being_shocked = FALSE
var/speed_process = FALSE
var/on_blueprints = FALSE //Are we visible on the station blueprints at roundstart?
@@ -33,8 +32,6 @@
/obj/New()
..()
- if(!armor)
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
if(obj_integrity == null)
obj_integrity = max_integrity
if(on_blueprints && isturf(loc))
@@ -44,25 +41,34 @@
else
T.add_blueprints_preround(src)
-/obj/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state = default_state)
+/obj/Initialize(mapload)
+ . = ..()
+ if(islist(armor))
+ armor = getArmor(arglist(armor))
+ else if(!armor)
+ armor = getArmor()
+ else if(!istype(armor, /datum/armor))
+ stack_trace("Invalid type [armor.type] found in .armor during /obj Initialize()")
+
+/obj/Topic(href, href_list, nowindow = FALSE, datum/topic_state/state = GLOB.default_state)
// Calling Topic without a corresponding window open causes runtime errors
if(!nowindow && ..())
- return 1
+ return TRUE
// In the far future no checks are made in an overriding Topic() beyond if(..()) return
// Instead any such checks are made in CanUseTopic()
if(CanUseTopic(usr, state, href_list) == STATUS_INTERACTIVE)
CouldUseTopic(usr)
- return 0
+ return FALSE
CouldNotUseTopic(usr)
- return 1
+ return TRUE
-/obj/proc/CouldUseTopic(var/mob/user)
+/obj/proc/CouldUseTopic(mob/user)
var/atom/host = nano_host()
host.add_fingerprint(user)
-/obj/proc/CouldNotUseTopic(var/mob/user)
+/obj/proc/CouldNotUseTopic(mob/user)
// Nada
/obj/Destroy()
@@ -110,23 +116,23 @@
// null if object handles breathing logic for lifeform
// datum/air_group to tell lifeform to process using that breath return
//DEFAULT: Take air from turf to give to have mob process
- if(breath_request>0)
+ if(breath_request > 0)
return remove_air(breath_request)
else
return null
/obj/proc/updateUsrDialog()
if(in_use)
- var/is_in_use = 0
+ var/is_in_use = FALSE
var/list/nearby = viewers(1, src)
for(var/mob/M in nearby)
if((M.client && M.machine == src))
- is_in_use = 1
+ is_in_use = TRUE
src.attack_hand(M)
if(istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot))
if(!(usr in nearby))
if(usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh.
- is_in_use = 1
+ is_in_use = TRUE
src.attack_ai(usr)
// check for TK users
@@ -134,8 +140,8 @@
if(istype(usr, /mob/living/carbon/human))
if(istype(usr.l_hand, /obj/item/tk_grab) || istype(usr.r_hand, /obj/item/tk_grab/))
if(!(usr in nearby))
- if(usr.client && usr.machine==src)
- is_in_use = 1
+ if(usr.client && usr.machine == src)
+ is_in_use = TRUE
src.attack_hand(usr)
in_use = is_in_use
@@ -143,15 +149,15 @@
// Check that people are actually using the machine. If not, don't update anymore.
if(in_use)
var/list/nearby = viewers(1, src)
- var/is_in_use = 0
+ var/is_in_use = FALSE
for(var/mob/M in nearby)
if((M.client && M.machine == src))
- is_in_use = 1
+ is_in_use = TRUE
src.interact(M)
var/ai_in_use = AutoUpdateAI(src)
if(!ai_in_use && !is_in_use)
- in_use = 0
+ in_use = FALSE
/obj/proc/interact(mob/user)
return
@@ -168,12 +174,12 @@
/atom/movable/proc/on_unset_machine(mob/user)
return
-/mob/proc/set_machine(var/obj/O)
+/mob/proc/set_machine(obj/O)
if(src.machine)
unset_machine()
src.machine = O
if(istype(O))
- O.in_use = 1
+ O.in_use = TRUE
/obj/item/proc/updateSelfDialog()
var/mob/M = src.loc
@@ -183,48 +189,48 @@
/obj/proc/hide(h)
return
-
/obj/proc/hear_talk(mob/M, list/message_pieces)
return
-/obj/proc/hear_message(mob/M as mob, text)
+/obj/proc/hear_message(mob/M, text)
-/obj/proc/multitool_menu(var/mob/user,var/obj/item/multitool/P)
+/obj/proc/multitool_menu(mob/user, obj/item/multitool/P)
return "NO MULTITOOL_MENU!"
-/obj/proc/linkWith(var/mob/user, var/obj/buffer, var/link/context)
- return 0
+/obj/proc/linkWith(mob/user, obj/buffer, context)
+ return FALSE
-/obj/proc/unlinkFrom(var/mob/user, var/obj/buffer)
- return 0
+/obj/proc/unlinkFrom(mob/user, obj/buffer)
+ return FALSE
-/obj/proc/canLink(var/obj/O, var/link/context)
- return 0
+/obj/proc/canLink(obj/O, list/context)
+ return FALSE
-/obj/proc/isLinkedWith(var/obj/O)
- return 0
+/obj/proc/isLinkedWith(obj/O)
+ return FALSE
-/obj/proc/getLink(var/idx)
+/obj/proc/getLink(idx)
return null
-/obj/proc/linkMenu(var/obj/O)
- var/dat=""
+/obj/proc/linkMenu(obj/O)
+ var/dat = ""
if(canLink(O, list()))
dat += " \[Link\] "
return dat
-/obj/proc/format_tag(var/label,var/varname, var/act="set_tag")
+/obj/proc/format_tag(label, varname, act = "set_tag")
var/value = vars[varname]
- if(!value || value=="")
- value="-----"
+ if(!value || value == "")
+ value = "-----"
return "[label]:[value]"
-/obj/proc/update_multitool_menu(mob/user as mob)
+/obj/proc/update_multitool_menu(mob/user)
var/obj/item/multitool/P = get_multitool(user)
if(!istype(P))
- return 0
+ return FALSE
+
var/dat = {"
[name] Configuration
@@ -246,15 +252,13 @@ a {
[name]
"}
if(allowed(user))//no, assistants, you're not ruining all vents on the station with just a multitool
- dat += multitool_menu(user,P)
+ dat += multitool_menu(user, P)
if(Mtoollink)
if(P)
if(P.buffer)
var/id = null
- if(istype(P.buffer, /obj/machinery/telecomms))
- id=P.buffer:id
- else if("id_tag" in P.buffer.vars)
- id=P.buffer:id_tag
+ if("id_tag" in P.buffer.vars)
+ id = P.buffer:id_tag
dat += "
MULTITOOL BUFFER: [P.buffer] [id ? "([id])" : ""]"
dat += linkMenu(P.buffer)
@@ -311,12 +315,12 @@ a {
/obj/singularity_pull(S, current_size)
..()
if(!anchored || current_size >= STAGE_FIVE)
- step_towards(src,S)
+ step_towards(src, S)
-/obj/proc/container_resist(var/mob/living)
+/obj/proc/container_resist(mob/living)
return
-/obj/proc/CanAStarPass()
+/obj/proc/CanAStarPass(ID, dir, caller)
. = !density
/obj/proc/on_mob_move(dir, mob/user)
@@ -343,6 +347,7 @@ a {
.["Make speed process"] = "?_src_=vars;makespeedy=[UID()]"
else
.["Make normal process"] = "?_src_=vars;makenormalspeed=[UID()]"
+ .["Modify armor values"] = "?_src_=vars;modifyarmor=[UID()]"
/obj/proc/check_uplink_validity()
- return 1
+ return TRUE
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 3d727142db5..b1ed99357ad 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -7,8 +7,6 @@
var/broken = FALSE
/obj/structure/New()
- if (!armor)
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
..()
if(smooth)
if(SSticker && SSticker.current_state == GAME_STATE_PLAYING)
@@ -18,11 +16,16 @@
if(climbable)
verbs += /obj/structure/proc/climb_on
if(SSticker)
- cameranet.updateVisibility(src)
+ GLOB.cameranet.updateVisibility(src)
+
+/obj/structure/Initialize(mapload)
+ if(!armor)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ return ..()
/obj/structure/Destroy()
if(SSticker)
- cameranet.updateVisibility(src)
+ GLOB.cameranet.updateVisibility(src)
if(smooth)
var/turf/T = get_turf(src)
spawn(0)
diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index 1de93f4d583..033787cce75 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -141,7 +141,6 @@
return ..()
/obj/structure/alien/weeds/proc/Life()
- set background = BACKGROUND_ENABLED
var/turf/U = get_turf(src)
if(istype(U, /turf/space))
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 82487dbd0ae..04373502832 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -12,6 +12,8 @@
var/opened = FALSE
var/welded = FALSE
var/locked = FALSE
+ var/large = TRUE
+ var/can_be_emaged = FALSE
var/wall_mounted = 0 //never solid (You can always pass over it)
var/lastbang
var/sound = 'sound/machines/click.ogg'
@@ -143,84 +145,21 @@
/obj/structure/closet/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/rcs) && !opened)
- if(user in contents) //to prevent self-teleporting.
- return
var/obj/item/rcs/E = W
- if(E.rcell && (E.rcell.charge >= E.chargecost))
- if(!is_level_reachable(z))
- to_chat(user, "The rapid-crate-sender can't locate any telepads!")
- return
- if(E.mode == 0)
- if(!E.teleporting)
- var/list/L = list()
- var/list/areaindex = list()
- for(var/obj/machinery/telepad_cargo/R in world)
- if(R.stage == 0)
- var/turf/T = get_turf(R)
- var/tmpname = T.loc.name
- if(areaindex[tmpname])
- tmpname = "[tmpname] ([++areaindex[tmpname]])"
- else
- areaindex[tmpname] = 1
- L[tmpname] = R
- var/desc = input("Please select a telepad.", "RCS") in L
- E.pad = L[desc]
- if(!Adjacent(user))
- to_chat(user, "Unable to teleport, too far from crate.")
- return
- playsound(E.loc, E.usesound, 50, 1)
- to_chat(user, "Teleporting [name]...")
- E.teleporting = 1
- if(!do_after(user, 50 * E.toolspeed, target = src))
- E.teleporting = 0
- return
- E.teleporting = 0
- if(user in contents)
- to_chat(user, "Error: User located in container--aborting for safety.")
- playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
- return
- if(!(E.rcell && E.rcell.use(E.chargecost)))
- to_chat(user, "Unable to teleport, insufficient charge.")
- return
- do_sparks(5, 1, src)
- do_teleport(src, E.pad, 0)
- to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.")
- return
- else
- E.rand_x = rand(50,200)
- E.rand_y = rand(50,200)
- var/L = locate(E.rand_x, E.rand_y, 6)
- if(!Adjacent(user))
- to_chat(user, "Unable to teleport, too far from crate.")
- return
- playsound(E.loc, E.usesound, 50, 1)
- to_chat(user, "Teleporting [name]...")
- E.teleporting = 1
- if(!do_after(user, 50, E.toolspeed, target = src))
- E.teleporting = 0
- return
- E.teleporting = 0
- if(user in contents)
- to_chat(user, "Error: User located in container--aborting for safety.")
- playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
- return
- if(!(E.rcell && E.rcell.use(E.chargecost)))
- to_chat(user, "Unable to teleport, insufficient charge.")
- return
- do_sparks(5, 1, src)
- do_teleport(src, L)
- to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.")
- return
- else
- to_chat(user, "Out of charges.")
- return
+ E.try_send_container(user, src)
return
if(opened)
if(istype(W, /obj/item/grab))
- MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
- if(istype(W,/obj/item/tk_grab))
+ var/obj/item/grab/G = W
+ if(large)
+ MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
+ else
+ to_chat(user, "[src] is too small to stuff [G.affecting] into!")
+ if(istype(W, /obj/item/tk_grab))
return FALSE
+ if(user.a_intent != INTENT_HELP) // Stops you from putting your baton in the closet on accident
+ return
if(isrobot(user))
return
if(!user.drop_item()) //couldn't drop the item
@@ -228,13 +167,20 @@
return
if(W)
W.forceMove(loc)
+ return TRUE // It's resolved. No afterattack needed. Stops you from emagging lockers when putting in an emag
+ else if(can_be_emaged && (istype(W, /obj/item/card/emag) || istype(W, /obj/item/melee/energy/blade) && !broken))
+ emag_act(user)
else if(istype(W, /obj/item/stack/packageWrap))
return
else if(user.a_intent != INTENT_HARM)
- attack_hand(user)
+ closed_item_click(user)
else
return ..()
+// What happens when the closet is attacked by a random item not on harm mode
+/obj/structure/closet/proc/closed_item_click(mob/user)
+ attack_hand(user)
+
/obj/structure/closet/welder_act(mob/user, obj/item/I)
. = TRUE
if(!opened && user.loc == src)
@@ -284,7 +230,7 @@
add_fingerprint(user)
/obj/structure/closet/attack_ai(mob/user)
- if(isrobot(user) && Adjacent(user)) //Robots can open/close it, but not the AI
+ if(isrobot(user) && Adjacent(user) && !istype(user.loc, /obj/machinery/atmospherics)) //Robots can open/close it, but not the AI
attack_hand(user)
/obj/structure/closet/relaymove(mob/user)
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 448fd6feb34..0da39d2255d 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -115,6 +115,8 @@
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/glasses/sunglasses/big(src)
new /obj/item/clothing/glasses/sunglasses/big(src)
+ new /obj/item/clothing/accessory/lawyers_badge(src)
+ new /obj/item/clothing/accessory/lawyers_badge(src)
//Paramedic
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm
index bba8dc2a866..5ffbdd0cda7 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm
@@ -36,7 +36,7 @@
depotarea.armory_locker_looted()
/obj/structure/closet/secure_closet/syndicate/depot/attack_animal(mob/M)
- if(isanimal(M) && "syndicate" in M.faction)
+ if(isanimal(M) && ("syndicate" in M.faction))
to_chat(M, "The [src] resists your attack!")
return
return ..()
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 7616aa90877..f0a7336389b 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -16,7 +16,7 @@
new /obj/item/storage/backpack/satchel_eng(src)
new /obj/item/storage/backpack/duffel/engineering(src)
new /obj/item/clothing/head/beret/ce(src)
- new /obj/item/areaeditor/blueprints(src)
+ new /obj/item/areaeditor/blueprints/ce(src)
new /obj/item/storage/box/permits(src)
new /obj/item/clothing/under/rank/chief_engineer(src)
new /obj/item/clothing/under/rank/chief_engineer/skirt(src)
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 096133b6e0d..7eab5858772 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -54,36 +54,33 @@
new /obj/item/storage/backpack/satchel/withwallet( src )
new /obj/item/radio/headset( src )
-/obj/structure/closet/secure_closet/personal/attackby(obj/item/W as obj, mob/user as mob, params)
- if(src.opened)
- if(istype(W, /obj/item/grab))
- src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
- user.drop_item()
- if(W) W.forceMove(loc)
- else if(istype(W, /obj/item/card/id))
- if(src.broken)
- to_chat(user, "It appears to be broken.")
- return
- var/obj/item/card/id/I = W
- if(!I || !I.registered_name) return
- if(src == user.loc)
- to_chat(user, "You can't reach the lock from inside.")
- else if(src.allowed(user) || !src.registered_name || (istype(I) && (src.registered_name == I.registered_name)))
- //they can open all lockers, or nobody owns this, or they own this locker
- src.locked = !( src.locked )
- if(src.locked)
- src.icon_state = src.icon_locked
- else
- src.icon_state = src.icon_closed
- registered_name = null
- desc = initial(desc)
-
- if(!src.registered_name && src.locked)
- src.registered_name = I.registered_name
- src.desc = "Owned by [I.registered_name]."
- else
- to_chat(user, "Access Denied")
- else if((istype(W, /obj/item/card/emag) || istype(W, /obj/item/melee/energy/blade)) && !broken)
- emag_act(user)
- else
+/obj/structure/closet/secure_closet/personal/attackby(obj/item/W, mob/user, params)
+ if(opened || !istype(W, /obj/item/card/id))
return ..()
+
+ if(broken)
+ to_chat(user, "It appears to be broken.")
+ return
+
+ var/obj/item/card/id/I = W
+ if(!I || !I.registered_name)
+ return
+
+ if(src == user.loc)
+ to_chat(user, "You can't reach the lock from inside.")
+
+ else if(allowed(user) || !registered_name || (istype(I) && (registered_name == I.registered_name)))
+ //they can open all lockers, or nobody owns this, or they own this locker
+ locked = !locked
+ if(locked)
+ icon_state = icon_locked
+ else
+ icon_state = icon_closed
+ registered_name = null
+ desc = initial(desc)
+
+ if(!registered_name && locked)
+ registered_name = I.registered_name
+ desc = "Owned by [I.registered_name]."
+ else
+ to_chat(user, "Access Denied")
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index dbb3b8f283d..763717dc270 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -7,10 +7,10 @@
opened = 0
locked = 1
broken = 0
+ can_be_emaged = TRUE
max_integrity = 250
armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
damage_deflection = 20
- var/large = 1
icon_closed = "secure"
var/icon_locked = "secure1"
icon_opened = "secureopen"
@@ -66,31 +66,8 @@
else
to_chat(user, "Access Denied")
-/obj/structure/closet/secure_closet/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/rcs))
- return ..()
-
- if(opened)
- if(istype(W, /obj/item/grab))
- if(large)
- MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
- else
- to_chat(user, "The locker is too small to stuff [W:affecting] into!")
- if(isrobot(user))
- return
- if(!user.drop_item()) //couldn't drop the item
- to_chat(user, "\The [W] is stuck to your hand, you cannot put it in \the [src]!")
- return
- if(W)
- W.forceMove(loc)
- else if((istype(W, /obj/item/card/emag)||istype(W, /obj/item/melee/energy/blade)) && !broken)
- emag_act(user)
- else if(istype(W,/obj/item/stack/packageWrap) || istype(W,/obj/item/weldingtool))
- return ..(W, user)
- else if(user.a_intent != INTENT_HARM)
- togglelock(user)
- else
- return ..()
+/obj/structure/closet/secure_closet/closed_item_click(mob/user)
+ togglelock(user)
/obj/structure/closet/secure_closet/emag_act(mob/user)
if(!broken)
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 6d4b47df6ab..be004a82912 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -426,7 +426,7 @@
icon_off = "wall-lockeroff"
//too small to put a man in
- large = 0
+ large = FALSE
/obj/structure/closet/secure_closet/wall/update_icon()
if(broken)
@@ -466,3 +466,4 @@
new /obj/item/gavelhammer(src)
new /obj/item/clothing/head/justice_wig(src)
new /obj/item/clothing/accessory/medal/legal(src)
+ new /obj/item/clothing/accessory/lawyers_badge(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm
index 501abd4922d..e285c6a0ae9 100644
--- a/code/game/objects/structures/crates_lockers/closets/statue.dm
+++ b/code/game/objects/structures/crates_lockers/closets/statue.dm
@@ -19,7 +19,7 @@
L.buckled = 0
L.anchored = 0
L.forceMove(src)
- L.disabilities += MUTE
+ L.mutations |= MUTE
max_integrity = L.health + 100 //stoning damaged mobs will result in easier to shatter statues
intialTox = L.getToxLoss()
intialFire = L.getFireLoss()
@@ -69,7 +69,7 @@
for(var/mob/living/M in src)
M.forceMove(loc)
- M.disabilities -= MUTE
+ M.mutations -= MUTE
M.take_overall_damage((M.health - obj_integrity - 100),0) //any new damage the statue incurred is transfered to the mob
..()
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 45aaf76fb07..2441a2d57d6 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -79,111 +79,42 @@
return TRUE
/obj/structure/closet/crate/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/rcs) && !src.opened)
- var/obj/item/rcs/E = W
- if(E.rcell && (E.rcell.charge >= E.chargecost))
- if(!is_level_reachable(src.z)) // This is inconsistent with the closet sending code
- to_chat(user, "The rapid-crate-sender can't locate any telepads!")
- return
- if(E.mode == 0)
- if(!E.teleporting)
- var/list/L = list()
- var/list/areaindex = list()
- for(var/obj/machinery/telepad_cargo/R in world)
- if(R.stage == 0)
- var/turf/T = get_turf(R)
- var/tmpname = T.loc.name
- if(areaindex[tmpname])
- tmpname = "[tmpname] ([++areaindex[tmpname]])"
- else
- areaindex[tmpname] = 1
- L[tmpname] = R
- var/desc = input("Please select a telepad.", "RCS") in L
- E.pad = L[desc]
- if(!Adjacent(user))
- to_chat(user, "Unable to teleport, too far from crate.")
- return
- playsound(E.loc, E.usesound, 50, 1)
- to_chat(user, "Teleporting [src.name]...")
- E.teleporting = TRUE
- if(!do_after(user, 50 * E.toolspeed, target = src))
- E.teleporting = 0
- return
- E.teleporting = 0
- if(!(E.rcell && E.rcell.use(E.chargecost)))
- to_chat(user, "Unable to teleport, insufficient charge.")
- return
- do_sparks(5, 1, src)
- do_teleport(src, E.pad, 0)
- to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.")
- return
-
- else
- E.rand_x = rand(50,200)
- E.rand_y = rand(50,200)
- var/L = locate(E.rand_x, E.rand_y, 6)
- if(!Adjacent(user))
- to_chat(user, "Unable to teleport, too far from crate.")
- return
- playsound(E.loc, E.usesound, 50, 1)
- to_chat(user, "Teleporting [src.name]...")
- E.teleporting = TRUE
- if(!do_after(user, 50 * E.toolspeed, target = src))
- E.teleporting = FALSE
- return
- E.teleporting = 0
- if(!(E.rcell && E.rcell.use(E.chargecost)))
- to_chat(user, "Unable to teleport, insufficient charge.")
- return
- do_sparks(5, 1, src)
- do_teleport(src, L)
- to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.")
- return
- else
- to_chat(user, "Out of charges.")
- return
-
- if(opened)
- if(isrobot(user))
- return
- if(!user.drop_item()) //couldn't drop the item
- to_chat(user, "\The [W] is stuck to your hand, you cannot put it in \the [src]!")
- return
- if(W)
- W.forceMove(loc)
- else if(istype(W, /obj/item/stack/packageWrap))
+ if(!opened && try_rig(W, user))
return
- else if(istype(W, /obj/item/stack/cable_coil))
+ return ..()
+
+/obj/structure/closet/crate/proc/try_rig(obj/item/W, mob/user)
+ if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W
if(rigged)
to_chat(user, "[src] is already rigged!")
- return
+ return TRUE
if(C.use(15))
to_chat(user, "You rig [src].")
rigged = TRUE
else
to_chat(user, "You need atleast 15 wires to rig [src]!")
- return
- else if(istype(W, /obj/item/radio/electropack))
+ return TRUE
+ if(istype(W, /obj/item/radio/electropack))
if(rigged)
+ if(!user.drop_item())
+ to_chat(user, "[W] seems to be stuck to your hand!")
+ return TRUE
to_chat(user, "You attach [W] to [src].")
- user.drop_item()
W.forceMove(src)
- return
- else if(istype(W, /obj/item/wirecutters))
- if(rigged)
- to_chat(user, "You cut away the wiring.")
- playsound(loc, W.usesound, 100, 1)
- rigged = FALSE
- return
- else if(user.a_intent != INTENT_HARM)
- attack_hand(user)
- else
- return ..()
+ return TRUE
-/obj/structure/closet/singularity_act()
- dump_contents()
- ..()
+/obj/structure/closet/crate/wirecutter_act(mob/living/user, obj/item/I)
+ if(opened)
+ return
+ if(!rigged)
+ return
+
+ if(I.use_tool(src, user))
+ to_chat(user, "You cut away the wiring.")
+ playsound(loc, I.usesound, 100, 1)
+ rigged = FALSE
+ return TRUE
/obj/structure/closet/crate/welder_act()
return
@@ -212,7 +143,7 @@
/obj/structure/closet/crate/proc/notifyRecipient(var/destination)
var/msg = "[capitalize(name)] has arrived at [destination]."
if(destination in announce_beacons)
- for(var/obj/machinery/requests_console/D in allConsoles)
+ for(var/obj/machinery/requests_console/D in GLOB.allRequestConsoles)
if(D.department in src.announce_beacons[destination])
D.createMessage(name, "Your Crate has Arrived!", msg, 1)
@@ -229,9 +160,10 @@
max_integrity = 500
armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
damage_deflection = 25
- var/tamperproof = 0
- broken = 0
- locked = 1
+ var/tamperproof = FALSE
+ broken = FALSE
+ locked = TRUE
+ can_be_emaged = TRUE
/obj/structure/closet/crate/secure/update_icon()
..()
@@ -306,17 +238,8 @@
else
src.toggle(user)
-
-/obj/structure/closet/crate/secure/attackby(obj/item/W, mob/user, params)
- if(is_type_in_list(W, list(/obj/item/stack/packageWrap, /obj/item/stack/cable_coil, /obj/item/radio/electropack, /obj/item/wirecutters,/obj/item/rcs)))
- return ..()
- if((istype(W, /obj/item/card/emag) || istype(W, /obj/item/melee/energy/blade)))
- emag_act(user)
- return
- if(!opened)
- src.togglelock(user)
- return
- return ..()
+/obj/structure/closet/crate/secure/closed_item_click(mob/user)
+ togglelock(user)
/obj/structure/closet/crate/secure/emag_act(mob/user)
if(locked)
diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm
index e2ab534923d..029b0a761ad 100644
--- a/code/game/objects/structures/curtains.dm
+++ b/code/game/objects/structures/curtains.dm
@@ -46,7 +46,7 @@
/obj/structure/curtain/screwdriver_act(mob/user, obj/item/I)
. = TRUE
- if(!I.tool_start_check(user, 0))
+ if(!I.tool_start_check(src, user, 0))
return
if(anchored)
user.visible_message("[user] unscrews [src] from the floor.", "You start to unscrew [src] from the floor...", "You hear rustling noises.")
@@ -65,7 +65,7 @@
if(anchored)
return
. = TRUE
- if(!I.tool_start_check(user, 0))
+ if(!I.tool_start_check(src, user, 0))
return
WIRECUTTER_ATTEMPT_DISMANTLE_MESSAGE
if(I.use_tool(src, user, 50, volume = I.tool_volume))
diff --git a/code/game/objects/structures/decor/machinery/telecomms.dm b/code/game/objects/structures/decor/machinery/telecomms.dm
deleted file mode 100644
index 1068cfb0b4e..00000000000
--- a/code/game/objects/structures/decor/machinery/telecomms.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-/obj/structure/decor/machinery/telecomms/processor
- name = "Processor Unit"
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "processor"
- desc = "This machine is used to process large quantities of information."
-
-/obj/structure/decor/machinery/telecomms/hub
- name = "Telecommunication Hub"
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "hub"
- desc = "A mighty piece of hardware used to send/receive massive amounts of data."
-
-/obj/structure/decor/machinery/telecomms/server
- name = "Telecommunication Server"
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "comm_server"
- desc = "A machine used to store data and network statistics."
-
-/obj/structure/decor/machinery/telecomms/relay
- name = "Telecommunication Relay"
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "relay"
- desc = "A mighty piece of hardware used to send massive amounts of data far away."
diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm
index e970ac911dc..11eb03c94c5 100644
--- a/code/game/objects/structures/depot.dm
+++ b/code/game/objects/structures/depot.dm
@@ -79,7 +79,6 @@
var/beepsound = 'sound/items/timer.ogg'
var/deliberate = FALSE
var/max_cycles = 10
- var/max_fire_range = 9
var/area/syndicate_depot/core/depotarea
/obj/effect/overload/New()
@@ -101,10 +100,6 @@
if(!deliberate)
playsound(loc, beepsound, 50, 0)
cycles++
- var/fire_range = min(cycles, max_fire_range)
-
- for(var/turf/simulated/turf in range(fire_range, T))
- new /obj/effect/hotspot(turf)
return
if(!istype(depotarea))
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 878b03436ff..4531613610e 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -56,7 +56,7 @@
/obj/structure/dresser/crowbar_act(mob/user, obj/item/I)
. = TRUE
- if(!I.tool_start_check(user, 0))
+ if(!I.tool_start_check(src, user, 0))
return
TOOL_ATTEMPT_DISMANTLE_MESSAGE
if(I.use_tool(src, user, 50, volume = I.tool_volume))
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index 2dc0cf415cc..cd7b3525478 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -17,11 +17,11 @@
var/opened = 0
var/material_drop = /obj/item/stack/sheet/metal
-/obj/structure/extinguisher_cabinet/New(turf/loc, ndir = null)
+/obj/structure/extinguisher_cabinet/New(turf/loc, direction = null)
..()
- if(ndir)
- pixel_x = (ndir & EAST|WEST) ? (ndir == EAST ? 28 : -28) : 0
- pixel_y = (ndir & NORTH|SOUTH)? (ndir == WEST ? 28 : -28) : 0
+ if(direction)
+ setDir(direction)
+ set_pixel_offsets_from_dir(28, -28, 30, -30)
switch(extinguishertype)
if(NO_EXTINGUISHER)
return
@@ -165,9 +165,8 @@
else
icon_state = "extinguisher_empty"
-/obj/structure/extinguisher_cabinet/empty/New(turf/loc, ndir = null)
+/obj/structure/extinguisher_cabinet/empty
extinguishertype = NO_EXTINGUISHER
- ..()
#undef NO_EXTINGUISHER
#undef NORMAL_EXTINGUISHER
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 7626abb9a7d..cdc5cdb58c4 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -245,6 +245,7 @@
/obj/structure/falsewall/plasma/attackby(obj/item/W, mob/user, params)
if(is_hot(W) > 300)
+ var/turf/T = locate(user)
message_admins("Plasma falsewall ignited by [key_name_admin(user)] in [ADMIN_VERBOSEJMP(T)]")
log_game("Plasma falsewall ignited by [key_name(user)] in [AREACOORD(T)]")
investigate_log("was ignited by [key_name(user)]","atmos")
diff --git a/code/game/objects/structures/foodcart.dm b/code/game/objects/structures/foodcart.dm
index 198dbf5f195..3a9a3414986 100644
--- a/code/game/objects/structures/foodcart.dm
+++ b/code/game/objects/structures/foodcart.dm
@@ -40,7 +40,7 @@
food_slots[s]=I
update_icon()
success = 1
- break;
+ break
if(!success)
to_chat(user, fail_msg)
else if(istype(I, /obj/item/reagent_containers/food/drinks))
@@ -51,7 +51,7 @@
drink_slots[s]=I
update_icon()
success = 1
- break;
+ break
if(!success)
to_chat(user, fail_msg)
else if(istype(I, /obj/item/wrench))
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index dcb74369d72..5fea799ecb0 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -374,7 +374,7 @@
/obj/structure/girder/CanAStarPass(ID, dir, caller)
. = !density
- if(ismovableatom(caller))
+ if(ismovable(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSGRILLE)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 755d2a3de1b..72acf72f613 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -111,7 +111,7 @@
/obj/structure/grille/CanAStarPass(ID, dir, caller)
. = !density
- if(ismovableatom(caller))
+ if(ismovable(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSGRILLE)
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index 21af7f6e615..c3f36e42f1d 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -69,9 +69,9 @@
if(isliving(G.affecting))
if(!has_buckled_mobs())
if(do_mob(user, src, 120))
- if(spike(G.affecting))
- G.affecting.visible_message("[user] slams [G.affecting] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.")
- qdel(G)
+ var/mob/living/affected = G.affecting
+ if(spike(affected))
+ affected.visible_message("[user] slams [affected] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.")
return
return ..()
@@ -130,16 +130,18 @@
release_mob(M)
/obj/structure/kitchenspike/proc/release_mob(mob/living/M)
- var/matrix/m180 = matrix(M.transform)
- m180.Turn(180)
- animate(M, transform = m180, time = 3)
- M.pixel_y = M.get_standard_pixel_y_offset(180)
M.adjustBruteLoss(30)
src.visible_message(text("[M] falls free of [src]!"))
unbuckle_mob(M, force = TRUE)
M.emote("scream")
M.AdjustWeakened(10)
+/obj/structure/kitchenspike/post_unbuckle_mob(mob/living/M)
+ M.pixel_y = M.get_standard_pixel_y_offset(0)
+ var/matrix/m180 = matrix(M.transform)
+ m180.Turn(180)
+ animate(M, transform = m180, time = 3)
+
/obj/structure/kitchenspike/Destroy()
if(has_buckled_mobs())
for(var/mob/living/L in buckled_mobs)
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 592e67e466d..c657e0056e8 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -131,17 +131,19 @@
AC.ui_interact(user)
if("Voice")
- var/voice_choice = input(user, "Perhaps...", "Voice effects") as null|anything in list("Comic Sans", "Wingdings", "Swedish", "Chav")
+ var/voice_choice = input(user, "Perhaps...", "Voice effects") as null|anything in list("Comic Sans", "Wingdings", "Swedish", "Chav", "Mute")
var/voice_mutation
switch(voice_choice)
if("Comic Sans")
- voice_mutation = COMICBLOCK
+ voice_mutation = GLOB.comicblock
if("Wingdings")
- voice_mutation = WINGDINGSBLOCK
+ voice_mutation = GLOB.wingdingsblock
if("Swedish")
- voice_mutation = SWEDEBLOCK
+ voice_mutation = GLOB.swedeblock
if("Chav")
- voice_mutation = CHAVBLOCK
+ voice_mutation = GLOB.chavblock
+ if("Mute")
+ voice_mutation = GLOB.muteblock
if(voice_mutation)
if(H.dna.GetSEState(voice_mutation))
H.dna.SetSEState(voice_mutation, FALSE)
diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm
index 1497344d5c8..44cbf6c52c9 100644
--- a/code/game/objects/structures/misc.dm
+++ b/code/game/objects/structures/misc.dm
@@ -33,7 +33,7 @@
if(user.z != src.z) return
user.loc.loc.Exited(user)
- user.loc = pick(carplist) // In the future, possibly make specific NinjaTele landmarks, and give him an option to teleport to North/South/East/West of SS13 instead of just hijacking a carpspawn.
+ user.loc = pick(GLOB.carplist) // In the future, possibly make specific NinjaTele landmarks, and give him an option to teleport to North/South/East/West of SS13 instead of just hijacking a carpspawn.
playsound(user.loc, 'sound/effects/phasein.ogg', 25, 1)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 1ea1c277af8..5849d96a158 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -232,7 +232,7 @@
/obj/structure/tray/m_tray/CanAStarPass(ID, dir, caller)
. = !density
- if(ismovableatom(caller))
+ if(ismovable(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSTABLE)
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index 7458c0a4b3b..c3d63c47862 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -121,7 +121,7 @@
ui.open()
ui.set_auto_update(1)
-/datum/song/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/datum/song/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
data["lines"] = lines
@@ -309,7 +309,7 @@
song.ui_interact(user, ui_key, ui, force_open)
-/obj/structure/piano/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/structure/piano/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
return song.ui_data(user, ui_key, state)
/obj/structure/piano/Topic(href, href_list)
diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm
index f891aff5592..e659bbeedd9 100644
--- a/code/game/objects/structures/safe.dm
+++ b/code/game/objects/structures/safe.dm
@@ -25,7 +25,7 @@ GLOBAL_LIST_EMPTY(safes)
var/number_of_tumblers = 3 // The amount of tumblers that will be generated.
var/list/tumblers = list() // The list of tumbler dial positions that need to be hit.
- var/list/current_tumbler_index = 1 // The index in the tumblers list of the tumbler dial position that needs to be hit.
+ var/current_tumbler_index = 1 // The index in the tumblers list of the tumbler dial position that needs to be hit.
var/space = 0 // The combined w_class of everything in the safe.
var/maxspace = 24 // The maximum combined w_class of stuff in the safe.
@@ -185,7 +185,7 @@ GLOBAL_LIST_EMPTY(safes)
ui.open()
ui.set_auto_update(1)
-/obj/structure/safe/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+/obj/structure/safe/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
var/data[0]
var/list/contents_names = list()
if(open)
@@ -246,7 +246,7 @@ GLOBAL_LIST_EMPTY(safes)
var/ticks = text2num(href_list["turnright"])
for(var/i = 1 to ticks)
- dial = Wrap(dial - 1, 0, 100)
+ dial = WRAP(dial - 1, 0, 100)
var/invalid_turn = current_tumbler_index % 2 == 0 || current_tumbler_index > number_of_tumblers
if(invalid_turn) // The moment you turn the wrong way or go too far, the tumblers reset
@@ -274,7 +274,7 @@ GLOBAL_LIST_EMPTY(safes)
var/ticks = text2num(href_list["turnleft"])
for(var/i = 1 to ticks)
- dial = Wrap(dial + 1, 0, 100)
+ dial = WRAP(dial + 1, 0, 100)
var/invalid_turn = current_tumbler_index % 2 != 0 || current_tumbler_index > number_of_tumblers
if(invalid_turn) // The moment you turn the wrong way or go too far, the tumblers reset
@@ -373,6 +373,7 @@ GLOBAL_LIST_EMPTY(safes)
info = "
Safe Codes
"
/obj/item/paper/safe_code/Initialize(mapload)
+ ..()
return INITIALIZE_HINT_LATELOAD
/obj/item/paper/safe_code/LateInitialize(mapload)
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 3f5d667a356..ba5258004a0 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -169,7 +169,7 @@
/obj/structure/sign/kiddieplaque
name = "AI developers plaque"
- desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be retarded. Beneath the image, someone has scratched the word \"PACKETS\"."
+ desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child's eyes are crossed, and is drooling. Beneath the image, someone has scratched the word \"PACKETS\"."
icon_state = "kiddieplaque"
/obj/structure/sign/atmosplaque
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 80fd69597c4..22449bb547b 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -288,6 +288,28 @@
return
setDir(turn(dir, 90))
+/obj/structure/statue/kidanstatue
+ name = "Obsidian Kidan warrior statue"
+ desc = "A beautifully carved and menacing statue of a Kidan warrior made out of obsidian. It looks very heavy."
+ icon_state = "kidan"
+ anchored = TRUE
+ oreAmount = 0
+
+/obj/structure/statue/chickenstatue
+ name = "Bronze Chickenman Statue"
+ desc = "An antique and oriental-looking statue of a Chickenman made of bronze."
+ icon_state = "chicken"
+ anchored = TRUE
+ oreAmount = 0
+
+/obj/structure/statue/russian_mulebot
+ desc = "Like a MULEbot, but more Russian and less functional.";
+ icon = 'icons/obj/aibots.dmi';
+ icon_state = "mulebot0";
+ name = "OXENbot"
+ anchored = TRUE
+ oreAmount = 10
+
////////////////////////////////
/obj/structure/snowman
@@ -320,19 +342,3 @@
..()
qdel(src)
-
-/obj/structure/kidanstatue
- name = "Obsidian Kidan warrior statue"
- desc = "A beautifully carved and menacing statue of a Kidan warrior made out of obsidian. It looks very heavy."
- icon = 'icons/obj/decorations.dmi'
- icon_state = "kidanstatue"
- anchored = 1
- density = 1
-
-/obj/structure/chickenstatue
- name = "Bronze Chickenman Statue"
- desc = "An antique and oriental-looking statue of a Chickenman made of bronze."
- icon = 'icons/obj/decorations.dmi'
- icon_state = "chickenstatue"
- anchored = 1
- density = 1
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 5acd4f7d8a3..bdab5ca2466 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -128,7 +128,7 @@
/obj/structure/table/CanAStarPass(ID, dir, caller)
. = !density
- if(ismovableatom(caller))
+ if(ismovable(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSTABLE)
@@ -224,8 +224,8 @@
if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
return
//Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf)
- I.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2)
- I.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2)
+ I.pixel_x = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2)
+ I.pixel_y = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2)
item_placed(I)
else
return ..()
@@ -666,7 +666,7 @@
/obj/structure/rack/CanAStarPass(ID, dir, caller)
. = !density
- if(ismovableatom(caller))
+ if(ismovable(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSTABLE)
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index c4c36d788e2..692d15d79ec 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -1,3 +1,5 @@
+#define MAX_TANK_STORAGE 10
+
/obj/structure/dispenser
name = "tank storage unit"
desc = "A simple yet bulky storage device for gas tanks. Has room for up to ten oxygen tanks, and ten plasma tanks."
@@ -5,29 +7,51 @@
icon_state = "dispenser"
density = 1
anchored = 1.0
- var/oxygentanks = 10
- var/plasmatanks = 10
- var/list/oxytanks = list() //sorry for the similar var names
- var/list/platanks = list()
+ var/starting_oxygen_tanks = MAX_TANK_STORAGE // The starting amount of oxygen tanks the dispenser gets when it's spawned
+ var/starting_plasma_tanks = MAX_TANK_STORAGE // Starting amount of plasma tanks
+ var/list/stored_oxygen_tanks = list() // List of currently stored oxygen tanks
+ var/list/stored_plasma_tanks = list() // And plasma tanks
/obj/structure/dispenser/oxygen
- plasmatanks = 0
+ starting_plasma_tanks = 0
/obj/structure/dispenser/plasma
- oxygentanks = 0
+ starting_oxygen_tanks = 0
/obj/structure/dispenser/New()
..()
+ initialize_tanks()
update_icon()
+/obj/structure/dispenser/Destroy()
+ QDEL_LIST(stored_plasma_tanks)
+ QDEL_LIST(stored_oxygen_tanks)
+ return ..()
+
+/obj/structure/dispenser/proc/initialize_tanks()
+ for(var/I in 1 to starting_plasma_tanks)
+ var/obj/item/tank/plasma/P = new(src)
+ stored_plasma_tanks.Add(P)
+
+ for(var/I in 1 to starting_oxygen_tanks)
+ var/obj/item/tank/oxygen/O = new(src)
+ stored_oxygen_tanks.Add(O)
+
/obj/structure/dispenser/update_icon()
- overlays.Cut()
- switch(oxygentanks)
- if(1 to 3) overlays += "oxygen-[oxygentanks]"
- if(4 to INFINITY) overlays += "oxygen-4"
- switch(plasmatanks)
- if(1 to 4) overlays += "plasma-[plasmatanks]"
- if(5 to INFINITY) overlays += "plasma-5"
+ cut_overlays()
+ var/oxy_tank_amount = LAZYLEN(stored_oxygen_tanks)
+ switch(oxy_tank_amount)
+ if(1 to 3)
+ overlays += "oxygen-[oxy_tank_amount]"
+ if(4 to INFINITY)
+ overlays += "oxygen-4"
+
+ var/pla_tank_amount = LAZYLEN(stored_plasma_tanks)
+ switch(pla_tank_amount)
+ if(1 to 4)
+ overlays += "plasma-[pla_tank_amount]"
+ if(5 to INFINITY)
+ overlays += "plasma-5"
/obj/structure/dispenser/attack_hand(mob/user)
if(..())
@@ -38,7 +62,7 @@
/obj/structure/dispenser/attack_ghost(mob/user)
ui_interact(user)
-/obj/structure/dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
+/obj/structure/dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, master_ui = null, datum/topic_state/state = GLOB.default_state)
user.set_machine(src)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
@@ -47,35 +71,19 @@
/obj/structure/dispenser/ui_data(user)
var/list/data = list()
- data["o_tanks"] = oxygentanks
- data["p_tanks"] = plasmatanks
+ data["o_tanks"] = LAZYLEN(stored_oxygen_tanks)
+ data["p_tanks"] = LAZYLEN(stored_plasma_tanks)
return data
/obj/structure/dispenser/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/tank/oxygen) || istype(I, /obj/item/tank/air) || istype(I, /obj/item/tank/anesthetic))
- if(oxygentanks < 10)
- user.drop_item()
- I.forceMove(src)
- oxytanks.Add(I)
- oxygentanks++
- update_icon()
- to_chat(user, "You put [I] in [src].")
- else
- to_chat(user, "[src] is full.")
- SSnanoui.update_uis(src)
+ try_insert_tank(user, stored_oxygen_tanks, I)
return
+
if(istype(I, /obj/item/tank/plasma))
- if(plasmatanks < 10)
- user.drop_item()
- I.forceMove(src)
- platanks.Add(I)
- plasmatanks++
- update_icon()
- to_chat(user, "You put [I] in [src].")
- else
- to_chat(user, "[src] is full.")
- SSnanoui.update_uis(src)
+ try_insert_tank(user, stored_plasma_tanks, I)
return
+
if(istype(I, /obj/item/wrench))
if(anchored)
to_chat(user, "You lean down and unwrench [src].")
@@ -88,40 +96,55 @@
/obj/structure/dispenser/Topic(href, href_list)
if(..())
- return 1
+ return TRUE
if(Adjacent(usr))
usr.set_machine(src)
+
+ // The oxygen tank button
if(href_list["oxygen"])
- if(oxygentanks > 0)
- var/obj/item/tank/oxygen/O
- if(oxytanks.len == oxygentanks)
- O = oxytanks[1]
- oxytanks.Remove(O)
- else
- O = new /obj/item/tank/oxygen(loc)
- O.loc = loc
- to_chat(usr, "You take [O] out of [src].")
- oxygentanks--
- update_icon()
+ try_remove_tank(usr, stored_oxygen_tanks)
+
+ // The plasma tank button
if(href_list["plasma"])
- if(plasmatanks > 0)
- var/obj/item/tank/plasma/P
- if(platanks.len == plasmatanks)
- P = platanks[1]
- platanks.Remove(P)
- else
- P = new /obj/item/tank/plasma(loc)
- P.loc = loc
- to_chat(usr, "You take [P] out of [src].")
- plasmatanks--
- update_icon()
+ try_remove_tank(usr, stored_plasma_tanks)
+
add_fingerprint(usr)
updateUsrDialog()
- SSnanoui.update_uis(src)
+ SSnanoui.try_update_ui(usr, src)
else
SSnanoui.close_user_uis(usr,src)
- return 1
+ return TRUE
+
+/// Called when the user clicks on the oxygen or plasma tank UI buttons, and tries to withdraw a tank.
+/obj/structure/dispenser/proc/try_remove_tank(mob/living/user, list/tank_list)
+ if(!LAZYLEN(tank_list))
+ return // There are no tanks left to withdraw.
+
+ var/obj/item/tank/T = tank_list[1]
+ tank_list.Remove(T)
+
+ if(!user.put_in_hands(T))
+ T.forceMove(loc) // If the user's hands are full, place it on the tile of the dispenser.
+
+ to_chat(user, "You take [T] out of [src].")
+ update_icon()
+
+/// Called when the user clicks on the dispenser with a tank. Tries to insert the tank into the dispenser, and updates the UI if successful.
+/obj/structure/dispenser/proc/try_insert_tank(mob/living/user, list/tank_list, obj/item/tank/T)
+ if(LAZYLEN(tank_list) >= MAX_TANK_STORAGE)
+ to_chat(user, "[src] is full.")
+ return
+
+ if(!user.drop_item()) // Antidrop check
+ to_chat(user, "[T] is stuck to your hand!")
+ return
+
+ T.forceMove(src)
+ tank_list.Add(T)
+ update_icon()
+ to_chat(user, "You put [T] in [src].")
+ SSnanoui.try_update_ui(user, src)
/obj/structure/tank_dispenser/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
@@ -130,3 +153,5 @@
I.forceMove(loc)
new /obj/item/stack/sheet/metal(loc, 2)
qdel(src)
+
+#undef MAX_TANK_STORAGE
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm
index f8f406d1381..9d06f870fc3 100644
--- a/code/game/objects/structures/transit_tubes/station.dm
+++ b/code/game/objects/structures/transit_tubes/station.dm
@@ -38,7 +38,7 @@
if(pod.contents.len)
to_chat(AM, "")
return
- else if(!pod.moving && pod.dir in directions())
+ else if(!pod.moving && (pod.dir in directions()))
AM.forceMove(pod)
return
@@ -47,7 +47,7 @@
/obj/structure/transit_tube/station/attack_hand(mob/user as mob)
if(!pod_moving)
for(var/obj/structure/transit_tube_pod/pod in loc)
- if(!pod.moving && pod.dir in directions())
+ if(!pod.moving && (pod.dir in directions()))
if(icon_state == "closed")
open_animation()
@@ -100,7 +100,7 @@
/obj/structure/transit_tube/station/proc/launch_pod()
for(var/obj/structure/transit_tube_pod/pod in loc)
- if(!pod.moving && pod.dir in directions())
+ if(!pod.moving && (pod.dir in directions()))
spawn(5)
pod_moving = 1
close_animation()
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
index 7095fd4eeda..8984dc60a52 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
@@ -144,9 +144,7 @@
if(istype(mob, /mob) && mob.client)
// If the pod is not in a tube at all, you can get out at any time.
if(!(locate(/obj/structure/transit_tube) in loc))
- mob.loc = loc
- mob.client.Move(get_step(loc, direction), direction)
- mob.reset_perspective(null)
+ mob.forceMove(loc)
//if(moving && istype(loc, /turf/space))
// Todo: If you get out of a moving pod in space, you should move as well.
@@ -158,9 +156,7 @@
if(!station.pod_moving)
if(direction == station.dir)
if(station.icon_state == "open")
- mob.loc = loc
- mob.client.Move(get_step(loc, direction), direction)
- mob.reset_perspective(null)
+ mob.forceMove(loc)
else
station.open_animation()
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 32c9daf3c76..1a5b275bc01 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -403,75 +403,7 @@
L.ExtinguishMob()
L.adjust_fire_stacks(-20) //Douse ourselves with water to avoid fire more easily
to_chat(L, "You've been drenched in water!")
- if(iscarbon(O))
- var/mob/living/carbon/M = O
- if(M.r_hand)
- M.r_hand.clean_blood()
- if(M.l_hand)
- M.l_hand.clean_blood()
- if(M.back)
- if(M.back.clean_blood())
- M.update_inv_back(0)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- var/washgloves = 1
- var/washshoes = 1
- var/washmask = 1
- var/washears = 1
- var/washglasses = 1
-
- if(H.wear_suit)
- washgloves = !(H.wear_suit.flags_inv & HIDEGLOVES)
- washshoes = !(H.wear_suit.flags_inv & HIDESHOES)
-
- if(H.head)
- washmask = !(H.head.flags_inv & HIDEMASK)
- washglasses = !(H.head.flags_inv & HIDEEYES)
- washears = !(H.head.flags_inv & HIDEEARS)
-
- if(H.wear_mask)
- if(washears)
- washears = !(H.wear_mask.flags_inv & HIDEEARS)
- if(washglasses)
- washglasses = !(H.wear_mask.flags_inv & HIDEEYES)
-
- if(H.head)
- if(H.head.clean_blood())
- H.update_inv_head(0,0)
- if(H.wear_suit)
- if(H.wear_suit.clean_blood())
- H.update_inv_wear_suit(0,0)
- else if(H.w_uniform)
- if(H.w_uniform.clean_blood())
- H.update_inv_w_uniform(0,0)
- if(H.gloves && washgloves)
- if(H.gloves.clean_blood())
- H.update_inv_gloves(0,0)
- if(H.shoes && washshoes)
- if(H.shoes.clean_blood())
- H.update_inv_shoes(0,0)
- if(H.wear_mask && washmask)
- if(H.wear_mask.clean_blood())
- H.update_inv_wear_mask(0)
- if(H.glasses && washglasses)
- if(H.glasses.clean_blood())
- H.update_inv_glasses(0)
- if(H.l_ear && washears)
- if(H.l_ear.clean_blood())
- H.update_inv_ears(0)
- if(H.r_ear && washears)
- if(H.r_ear.clean_blood())
- H.update_inv_ears(0)
- if(H.belt)
- if(H.belt.clean_blood())
- H.update_inv_belt(0)
- else
- if(M.wear_mask) //if the mob is not human, it cleans the mask without asking for bitflags
- if(M.wear_mask.clean_blood())
- M.update_inv_wear_mask(0)
-
- else
- O.clean_blood()
+ L.clean_blood()
if(isturf(loc))
var/turf/tile = loc
@@ -704,7 +636,7 @@
return
if(proximity_flag != 1) //if we aren't next to the wall
return
- if(!(get_dir(on_wall, user) in cardinal))
+ if(!(get_dir(on_wall, user) in GLOB.cardinal))
to_chat(user, "You need to be standing next to a wall to place \the [src].")
return
return 1
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 01136ea1046..9faab45cf97 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -1,6 +1,6 @@
-var/global/wcBar = pick(list("#0d8395", "#58b5c3", "#58c366", "#90d79a", "#ffffff"))
-var/global/wcBrig = pick(list("#aa0808", "#7f0606", "#ff0000"))
-var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8fcf44", "#ffffff"))
+GLOBAL_LIST_INIT(wcBar, pick(list("#0d8395", "#58b5c3", "#58c366", "#90d79a", "#ffffff")))
+GLOBAL_LIST_INIT(wcBrig, pick(list("#aa0808", "#7f0606", "#ff0000")))
+GLOBAL_LIST_INIT(wcCommon, pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8fcf44", "#ffffff")))
/obj/proc/color_windows(obj/W)
var/list/wcBarAreas = list(/area/crew_quarters/bar)
@@ -13,11 +13,11 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
var/area/A = T.loc
if(is_type_in_list(A,wcBarAreas))
- newcolor = wcBar
+ newcolor = GLOB.wcBar
else if(is_type_in_list(A,wcBrigAreas))
- newcolor = wcBrig
+ newcolor = GLOB.wcBrig
else
- newcolor = wcCommon
+ newcolor = GLOB.wcCommon
return newcolor
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 6c10921e6bd..6bc1c4ba142 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -8,12 +8,6 @@
nitrogen = MOLES_N2STANDARD
var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed
var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to
- var/dirtoverlay = null
-
-/turf/simulated/New()
- ..()
- levelupdate()
- visibilityChanged()
/turf/simulated/proc/break_tile()
return
@@ -35,7 +29,12 @@
assume_air(lowertemp)
qdel(hotspot)
-/turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER, infinite = FALSE) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost
+/*
+ * Makes a turf slippery using the given parameters
+ * @param wet_setting The type of slipperyness used
+ * @param time Time the turf is slippery. If null it will pick a random time between 790 and 820 ticks. If INFINITY then it won't dry up ever
+*/
+/turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER, time = null) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost
if(wet >= wet_setting)
return
wet = wet_setting
@@ -55,13 +54,13 @@
else
wet_overlay = image('icons/effects/water.dmi', src, "wet_static")
overlays += wet_overlay
- if(!infinite)
- spawn(rand(790, 820)) // Purely so for visual effect
- if(!istype(src, /turf/simulated)) //Because turfs don't get deleted, they change, adapt, transform, evolve and deform. they are one and they are all.
- return
- MakeDry(wet_setting)
+ if(time == INFINITY)
+ return
+ if(!time)
+ time = rand(790, 820)
+ addtimer(CALLBACK(src, .proc/MakeDry, wet_setting), time)
-/turf/simulated/proc/MakeDry(wet_setting = TURF_WET_WATER)
+/turf/simulated/MakeDry(wet_setting = TURF_WET_WATER)
if(wet > wet_setting)
return
wet = TURF_DRY
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 72513b2e8b3..614b8232b0b 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -1,5 +1,5 @@
//This is so damaged or burnt tiles or platings don't get remembered as the default tile
-var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","damaged4",
+GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","damaged3","damaged4",
"damaged5","panelscorched","floorscorched1","floorscorched2","platingdmg1","platingdmg2",
"platingdmg3","plating","light_on","light_on_flicker1","light_on_flicker2",
"warnplate", "warnplatecorner","metalfoam", "ironfoam",
@@ -11,7 +11,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
"oldburning","light-on-r","light-on-y","light-on-g","light-on-b", "wood", "wood-broken", "carpet",
"carpetcorner", "carpetside", "carpet", "ironsand1", "ironsand2", "ironsand3", "ironsand4", "ironsand5",
"ironsand6", "ironsand7", "ironsand8", "ironsand9", "ironsand10", "ironsand11",
- "ironsand12", "ironsand13", "ironsand14", "ironsand15")
+ "ironsand12", "ironsand13", "ironsand14", "ironsand15"))
/turf/simulated/floor
name = "floor"
@@ -27,24 +27,16 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
var/burnt = 0
var/current_overlay = null
var/floor_tile = null //tile that this floor drops
- var/obj/item/stack/tile/builtin_tile = null //needed for performance reasons when the singularity rips off floor tiles
var/list/broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
var/list/burnt_states = list("floorscorched1", "floorscorched2")
var/list/prying_tool_list = list(TOOL_CROWBAR) //What tool/s can we use to pry up the tile?
-/turf/simulated/floor/New()
- ..()
- if(icon_state in icons_to_ignore_at_floor_init) //so damaged/burned tiles or plating icons aren't saved as the default
+/turf/simulated/floor/Initialize(mapload)
+ . = ..()
+ if(icon_state in GLOB.icons_to_ignore_at_floor_init) //so damaged/burned tiles or plating icons aren't saved as the default
icon_regular_floor = "floor"
else
icon_regular_floor = icon_state
- if(floor_tile)
- builtin_tile = new floor_tile
-
-/turf/simulated/floor/Destroy()
- QDEL_NULL(builtin_tile)
- return ..()
-
//turf/simulated/floor/CanPass(atom/movable/mover, turf/target, height=0)
// if((istype(mover, /obj/machinery/vehicle) && !(src.burnt)))
@@ -187,7 +179,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
if(T.turf_type == type)
return
var/obj/item/thing = user.get_inactive_hand()
- if(!prying_tool_list.Find(thing.tool_behaviour))
+ if(!thing || !prying_tool_list.Find(thing.tool_behaviour))
return
var/turf/simulated/floor/plating/P = pry_tile(thing, user, TRUE)
if(!istype(P))
@@ -209,30 +201,26 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
else
if(user && !silent)
to_chat(user, "You remove the floor tile.")
- if(builtin_tile && make_tile)
- builtin_tile.forceMove(src)
- builtin_tile = null
+ if(floor_tile && make_tile)
+ new floor_tile(src)
return make_plating()
/turf/simulated/floor/singularity_pull(S, current_size)
..()
if(current_size == STAGE_THREE)
if(prob(30))
- if(builtin_tile)
- builtin_tile.loc = src
- builtin_tile = null
+ if(floor_tile)
+ new floor_tile(src)
make_plating()
else if(current_size == STAGE_FOUR)
if(prob(50))
- if(builtin_tile)
- builtin_tile.loc = src
- builtin_tile = null
+ if(floor_tile)
+ new floor_tile(src)
make_plating()
else if(current_size >= STAGE_FIVE)
- if(builtin_tile)
+ if(floor_tile)
if(prob(70))
- builtin_tile.loc = src
- builtin_tile = null
+ new floor_tile(src)
make_plating()
else if(prob(50))
ReplaceWithLattice()
diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm
index 983b5abaced..6118885a921 100644
--- a/code/game/turfs/simulated/floor/asteroid.dm
+++ b/code/game/turfs/simulated/floor/asteroid.dm
@@ -205,7 +205,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
length = set_length
// Get our directiosn
- forward_cave_dir = pick(alldirs - exclude_dir)
+ forward_cave_dir = pick(GLOB.alldirs - exclude_dir)
// Get the opposite direction of our facing direction
backward_cave_dir = angle2dir(dir2angle(forward_cave_dir) + 180)
@@ -227,7 +227,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
break
var/list/L = list(45)
- if(IsOdd(dir2angle(dir))) // We're going at an angle and we want thick angled tunnels.
+ if(ISODD(dir2angle(dir))) // We're going at an angle and we want thick angled tunnels.
L += -45
// Expand the edges of our tunnel
diff --git a/code/game/turfs/simulated/floor/chasm.dm b/code/game/turfs/simulated/floor/chasm.dm
index 1fb97430026..d8ed888bc27 100644
--- a/code/game/turfs/simulated/floor/chasm.dm
+++ b/code/game/turfs/simulated/floor/chasm.dm
@@ -186,7 +186,7 @@
AM.alpha = oldalpha
AM.color = oldcolor
AM.transform = oldtransform
- AM.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1, 10),rand(1, 10))
+ AM.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1, 10),rand(1, 10))
/turf/simulated/floor/chasm/straight_down/lava_land_surface/normal_air
oxygen = MOLES_O2STANDARD
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index 3ab424e69cc..bfbfa70331e 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -31,9 +31,8 @@
if(make_tile)
if(user && !silent)
to_chat(user, "You unscrew the planks.")
- if(builtin_tile)
- builtin_tile.forceMove(src)
- builtin_tile = null
+ if(floor_tile)
+ new floor_tile(src)
else
if(user && !silent)
to_chat(user, "You forcefully pry off the planks, destroying them in the process.")
@@ -50,9 +49,9 @@
floor_tile = /obj/item/stack/tile/grass
broken_states = list("sand")
-/turf/simulated/floor/grass/Initialize()
+/turf/simulated/floor/grass/Initialize(mapload)
+ . = ..()
update_icon()
- ..()
/turf/simulated/floor/grass/update_icon()
icon_state = "grass[pick("1","2","3","4")]"
@@ -81,10 +80,9 @@
)
-/turf/simulated/floor/carpet/New()
- ..()
- if(broken || burnt)
- make_plating()
+/turf/simulated/floor/carpet/Initialize(mapload)
+ . = ..()
+ update_icon()
/turf/simulated/floor/carpet/update_icon()
if(!..())
@@ -120,18 +118,18 @@
broken_states = list("damaged")
plane = PLANE_SPACE
-/turf/simulated/floor/fakespace/New()
- ..()
- icon_state = "[rand(0,25)]"
-
-/turf/simulated/floor/carpet/arcade
- icon = 'icons/goonstation/turf/floor.dmi'
- icon_state = "arcade"
- floor_tile = /obj/item/stack/tile/arcade_carpet
- smooth = SMOOTH_FALSE
+/turf/simulated/floor/fakespace/Initialize(mapload)
+ . = ..()
+ icon_state = SPACE_ICON_STATE
/turf/simulated/floor/fakespace/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
underlay_appearance.icon = 'icons/turf/space.dmi'
underlay_appearance.icon_state = SPACE_ICON_STATE
underlay_appearance.plane = PLANE_SPACE
return TRUE
+
+/turf/simulated/floor/carpet/arcade
+ icon = 'icons/goonstation/turf/floor.dmi'
+ icon_state = "arcade"
+ floor_tile = /obj/item/stack/tile/arcade_carpet
+ smooth = SMOOTH_FALSE
diff --git a/code/game/turfs/simulated/floor/indestructible.dm b/code/game/turfs/simulated/floor/indestructible.dm
index f231a4fd0b3..4f551fb485a 100644
--- a/code/game/turfs/simulated/floor/indestructible.dm
+++ b/code/game/turfs/simulated/floor/indestructible.dm
@@ -45,6 +45,7 @@
oxygen = 14
nitrogen = 23
temperature = 300
+ planetary_atmos = TRUE
/turf/simulated/floor/indestructible/necropolis/Initialize(mapload)
. = ..()
@@ -52,8 +53,8 @@
icon_state = "necro[rand(2,3)]"
/turf/simulated/floor/indestructible/necropolis/air
- oxygen = 0
- nitrogen = 0
+ oxygen = MOLES_O2STANDARD
+ nitrogen = MOLES_N2STANDARD
temperature = T20C
/turf/simulated/floor/indestructible/boss //you put stone tiles on this and use it as a base
@@ -64,6 +65,7 @@
oxygen = 14
nitrogen = 23
temperature = 300
+ planetary_atmos = TRUE
/turf/simulated/floor/indestructible/boss/air
oxygen = MOLES_O2STANDARD
@@ -77,6 +79,7 @@
oxygen = 14
nitrogen = 23
temperature = 300
+ planetary_atmos = TRUE
smooth = SMOOTH_TRUE
/turf/simulated/floor/indestructible/hierophant/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
diff --git a/code/game/turfs/simulated/floor/lava.dm b/code/game/turfs/simulated/floor/lava.dm
index 57e90840920..14a08639132 100644
--- a/code/game/turfs/simulated/floor/lava.dm
+++ b/code/game/turfs/simulated/floor/lava.dm
@@ -8,9 +8,6 @@
light_power = 0.75
light_color = LIGHT_COLOR_LAVA
-/turf/simulated/floor/plating/lava/New()
- ..()
-
/turf/simulated/floor/plating/lava/ex_act()
return
@@ -80,8 +77,8 @@
O.resistance_flags |= FLAMMABLE //Even fireproof things burn up in lava
if(O.resistance_flags & FIRE_PROOF)
O.resistance_flags &= ~FIRE_PROOF
- if(O.armor["fire"] > 50) //obj with 100% fire armor still get slowly burned away.
- O.armor["fire"] = 50
+ if(O.armor.getRating("fire") > 50) //obj with 100% fire armor still get slowly burned away.
+ O.armor = O.armor.setRating(fire_value = 50)
O.fire_act(10000, 1000)
else if(isliving(thing))
@@ -113,6 +110,9 @@
/turf/simulated/floor/plating/lava/attackby(obj/item/C, mob/user, params) //Lava isn't a good foundation to build on
return
+/turf/simulated/floor/plating/lava/screwdriver_act()
+ return
+
/turf/simulated/floor/plating/lava/welder_act()
return
diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm
index 332cf745a4c..8276c0de33f 100644
--- a/code/game/turfs/simulated/floor/light_floor.dm
+++ b/code/game/turfs/simulated/floor/light_floor.dm
@@ -20,8 +20,8 @@
var/state = LIGHTFLOOR_ON
var/can_modify_colour = TRUE
-/turf/simulated/floor/light/New()
- ..()
+/turf/simulated/floor/light/Initialize(mapload)
+ . = ..()
update_icon()
/turf/simulated/floor/light/update_icon()
@@ -77,14 +77,13 @@
/turf/simulated/floor/light/attackby(obj/item/C, mob/user, params)
if(istype(C,/obj/item/light/bulb)) //only for light tiles
- if(istype(builtin_tile, /obj/item/stack/tile/light))
- if(!state)
- qdel(C)
- state = LIGHTFLOOR_ON
- update_icon()
- to_chat(user, "You replace the light bulb.")
- else
- to_chat(user, "The light bulb seems fine, no need to replace it.")
+ if(!state)
+ qdel(C)
+ state = LIGHTFLOOR_ON
+ update_icon()
+ to_chat(user, "You replace the light bulb.")
+ else
+ to_chat(user, "The light bulb seems fine, no need to replace it.")
else
return ..()
diff --git a/code/game/turfs/simulated/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm
index 5eb387abbae..dd975dc80d9 100644
--- a/code/game/turfs/simulated/floor/mineral.dm
+++ b/code/game/turfs/simulated/floor/mineral.dm
@@ -14,8 +14,8 @@
icon_state = ""
var/list/icons = list()
-/turf/simulated/floor/mineral/New()
- ..()
+/turf/simulated/floor/mineral/Initialize(mapload)
+ . = ..()
broken_states = list("[initial(icon_state)]_dam")
/turf/simulated/floor/mineral/update_icon()
@@ -97,24 +97,24 @@
broken_states = list("titanium_dam1","titanium_dam2","titanium_dam3","titanium_dam4","titanium_dam5")
/turf/simulated/floor/mineral/titanium/airless
- oxygen = 0.01
- nitrogen = 0.01
+ oxygen = 0
+ nitrogen = 0
temperature = TCMB
/turf/simulated/floor/mineral/titanium/blue
icon_state = "titanium_blue"
/turf/simulated/floor/mineral/titanium/blue/airless
- oxygen = 0.01
- nitrogen = 0.01
+ oxygen = 0
+ nitrogen = 0
temperature = TCMB
/turf/simulated/floor/mineral/titanium/yellow
icon_state = "titanium_yellow"
/turf/simulated/floor/mineral/titanium/yellow/airless
- oxygen = 0.01
- nitrogen = 0.01
+ oxygen = 0
+ nitrogen = 0
temperature = TCMB
/turf/simulated/floor/mineral/titanium/purple
@@ -122,8 +122,8 @@
floor_tile = /obj/item/stack/tile/mineral/titanium/purple
/turf/simulated/floor/mineral/titanium/purple/airless
- oxygen = 0.01
- nitrogen = 0.01
+ oxygen = 0
+ nitrogen = 0
temperature = TCMB
//PLASTITANIUM (syndieshuttle)
@@ -137,8 +137,8 @@
icon_state = "plastitanium_red"
/turf/simulated/floor/mineral/plastitanium/red/airless
- oxygen = 0.01
- nitrogen = 0.01
+ oxygen = 0
+ nitrogen = 0
temperature = TCMB
/turf/simulated/floor/mineral/plastitanium/red/brig
@@ -179,14 +179,14 @@
spam_flag = world.time + 10
/turf/simulated/floor/mineral/bananium/airless
- oxygen = 0.01
- nitrogen = 0.01
+ oxygen = 0
+ nitrogen = 0
temperature = TCMB
/turf/simulated/floor/mineral/bananium/lubed/Initialize(mapload)
. = ..()
- MakeSlippery(TURF_WET_LUBE, TRUE)
+ MakeSlippery(TURF_WET_LUBE, INFINITY)
/turf/simulated/floor/mineral/bananium/lubed/pry_tile(obj/item/C, mob/user, silent = FALSE) //I want to get off Mr Honk's Wild Ride
if(ishuman(user))
@@ -254,8 +254,8 @@
floor_tile = /obj/item/stack/tile/mineral/abductor
icons = list("alienpod1", "alienpod2", "alienpod3", "alienpod4", "alienpod5", "alienpod6", "alienpod7", "alienpod8", "alienpod9")
-/turf/simulated/floor/mineral/abductor/New()
- ..()
+/turf/simulated/floor/mineral/abductor/Initialize(mapload)
+ . = ..()
icon_state = "alienpod[rand(1,9)]"
/turf/simulated/floor/mineral/abductor/break_tile()
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index 33ae636090d..0808fef7e95 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -3,23 +3,23 @@
icon_state = "rockvault"
smooth = SMOOTH_FALSE
-/turf/simulated/floor/vault/New(location, vtype)
- ..()
- icon_state = "[vtype]vault"
-
/turf/simulated/wall/vault
icon = 'icons/turf/walls.dmi'
icon_state = "rockvault"
smooth = SMOOTH_FALSE
-/turf/simulated/wall/vault/New(location, vtype)
- ..()
- icon_state = "[vtype]vault"
-
/turf/simulated/floor/bluegrid
icon = 'icons/turf/floors.dmi'
icon_state = "bcircuit"
+/turf/simulated/floor/bluegrid/telecomms
+ nitrogen = 100
+ oxygen = 0
+ temperature = 80
+
+/turf/simulated/floor/bluegrid/telecomms/server
+ name = "server base"
+
/turf/simulated/floor/greengrid
icon = 'icons/turf/floors.dmi'
icon_state = "gcircuit"
@@ -27,12 +27,12 @@
/turf/simulated/floor/greengrid/airless
icon_state = "gcircuit"
name = "airless floor"
- oxygen = 0.01
- nitrogen = 0.01
+ oxygen = 0
+ nitrogen = 0
temperature = TCMB
-/turf/simulated/floor/greengrid/airless/New()
- ..()
+/turf/simulated/floor/greengrid/airless/Initialize(mapload)
+ . = ..()
name = "floor"
/turf/simulated/floor/redgrid
@@ -70,8 +70,8 @@
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/obj/machinery/poolcontroller/linkedcontroller = null
-/turf/simulated/floor/beach/water/New()
- ..()
+/turf/simulated/floor/beach/water/Initialize(mapload)
+ . = ..()
var/image/overlay_image = image('icons/misc/beach.dmi', icon_state = "water5", layer = ABOVE_MOB_LAYER)
overlay_image.plane = GAME_PLANE
overlays += overlay_image
@@ -111,6 +111,7 @@
oxygen = 14
nitrogen = 23
temperature = 300
+ planetary_atmos = TRUE
/turf/simulated/floor/lubed
name = "slippery floor"
@@ -118,7 +119,7 @@
/turf/simulated/floor/lubed/Initialize(mapload)
. = ..()
- MakeSlippery(TURF_WET_LUBE, TRUE)
+ MakeSlippery(TURF_WET_LUBE, INFINITY)
/turf/simulated/floor/lubed/pry_tile(obj/item/C, mob/user, silent = FALSE) //I want to get off Mr Honk's Wild Ride
if(ishuman(user))
diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm
index d36396aaa5f..116d57dc1ef 100644
--- a/code/game/turfs/simulated/floor/plasteel_floor.dm
+++ b/code/game/turfs/simulated/floor/plasteel_floor.dm
@@ -12,12 +12,12 @@
/turf/simulated/floor/plasteel/airless
name = "airless floor"
- oxygen = 0.01
- nitrogen = 0.01
+ oxygen = 0
+ nitrogen = 0
temperature = TCMB
-/turf/simulated/floor/plasteel/airless/New()
- ..()
+/turf/simulated/floor/plasteel/airless/Initialize(mapload)
+ . = ..()
name = "floor"
/turf/simulated/floor/plasteel/airless/indestructible // For bomb testing range
@@ -41,6 +41,11 @@
/turf/simulated/floor/plasteel/dark
icon_state = "darkfull"
+/turf/simulated/floor/plasteel/dark/telecomms
+ nitrogen = 100
+ oxygen = 0
+ temperature = 80
+
/turf/simulated/floor/plasteel/freezer
icon_state = "freezerfloor"
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 85b03d3378d..a6dbe0de281 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -14,17 +14,17 @@
"xeno" = list('sound/effects/footstep/plating_xeno.ogg')
)
-/turf/simulated/floor/plating/New()
- ..()
+/turf/simulated/floor/plating/Initialize(mapload)
+ . = ..()
icon_plating = icon_state
update_icon()
-/turf/simulated/floor/plating/damaged/New()
- ..()
+/turf/simulated/floor/plating/damaged/Initialize(mapload)
+ . = ..()
break_tile()
-/turf/simulated/floor/plating/burnt/New()
- ..()
+/turf/simulated/floor/plating/burnt/Initialize(mapload)
+ . = ..()
burn_tile()
/turf/simulated/floor/plating/update_icon()
@@ -104,7 +104,7 @@
broken = FALSE
update_icon()
-/turf/simulated/floor/plating/proc/remove_plating(mob/user)
+/turf/simulated/floor/plating/remove_plating(mob/user)
if(baseturf == /turf/space)
ReplaceWithLattice()
else
@@ -113,12 +113,12 @@
/turf/simulated/floor/plating/airless
icon_state = "plating"
name = "airless plating"
- oxygen = 0.01
- nitrogen = 0.01
+ oxygen = 0
+ nitrogen = 0
temperature = TCMB
-/turf/simulated/floor/plating/airless/New()
- ..()
+/turf/simulated/floor/plating/airless/Initialize(mapload)
+ . = ..()
name = "plating"
/turf/simulated/floor/engine
@@ -190,8 +190,8 @@
name = "engraved floor"
icon_state = "cult"
-/turf/simulated/floor/engine/cult/New()
- ..()
+/turf/simulated/floor/engine/cult/Initialize(mapload)
+ . = ..()
if(SSticker.mode)//only do this if the round is going..otherwise..fucking asteroid..
icon_state = SSticker.cultdat.cult_floor_icon_state
@@ -205,16 +205,41 @@
color = "#FAE48C"
animate(src, color = previouscolor, time = 8)
-/turf/simulated/floor/engine/n20/New()
- ..()
- var/datum/gas_mixture/adding = new
- var/datum/gas/sleeping_agent/trace_gas = new
+//air filled floors; used in atmos pressure chambers
- trace_gas.moles = 6000
- adding.trace_gases += trace_gas
- adding.temperature = T20C
+/turf/simulated/floor/engine/n20
+ name = "\improper N2O floor"
+ sleeping_agent = 6000
+ oxygen = 0
+ nitrogen = 0
+
+/turf/simulated/floor/engine/co2
+ name = "\improper CO2 floor"
+ carbon_dioxide = 50000
+ oxygen = 0
+ nitrogen = 0
+
+/turf/simulated/floor/engine/plasma
+ name = "plasma floor"
+ toxins = 70000
+ oxygen = 0
+ nitrogen = 0
+
+/turf/simulated/floor/engine/o2
+ name = "\improper O2 floor"
+ oxygen = 100000
+ nitrogen = 0
+
+/turf/simulated/floor/engine/n2
+ name = "\improper N2 floor"
+ nitrogen = 100000
+ oxygen = 0
+
+/turf/simulated/floor/engine/air
+ name = "air floor"
+ oxygen = 2644
+ nitrogen = 10580
- assume_air(adding)
/turf/simulated/floor/engine/singularity_pull(S, current_size)
..()
@@ -250,8 +275,8 @@
icon = 'icons/turf/floors/ironsand.dmi'
icon_state = "ironsand1"
-/turf/simulated/floor/plating/ironsand/New()
- ..()
+/turf/simulated/floor/plating/ironsand/Initialize(mapload)
+ . = ..()
icon_state = "ironsand[rand(1,15)]"
/turf/simulated/floor/plating/ironsand/remove_plating()
@@ -334,8 +359,8 @@
name = "alien floor"
icon_state = "alienpod1"
-/turf/simulated/floor/plating/abductor/New()
- ..()
+/turf/simulated/floor/plating/abductor/Initialize(mapload)
+ . = ..()
icon_state = "alienpod[rand(1,9)]"
/turf/simulated/floor/plating/ice
@@ -353,7 +378,7 @@
/turf/simulated/floor/plating/ice/Initialize(mapload)
. = ..()
- MakeSlippery(TURF_WET_PERMAFROST, TRUE)
+ MakeSlippery(TURF_WET_PERMAFROST, INFINITY)
/turf/simulated/floor/plating/ice/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
return
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index d1f7a287c70..8bf3e820d3d 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -32,7 +32,7 @@
icon = smooth_icon
. = ..()
if(mineralType && mineralAmt && spread && spreadChance)
- for(var/dir in cardinal)
+ for(var/dir in GLOB.cardinal)
if(prob(spreadChance))
var/turf/T = get_step(src, dir)
if(istype(T, /turf/simulated/mineral/random))
@@ -439,7 +439,7 @@
var/area/A = get_area(bombturf)
var/notify_admins = 0
- if(z != 5)
+ if(!is_mining_level(z))
notify_admins = 1
if(!triggered_by_explosion)
message_admins("[key_name_admin(user)] has triggered a gibtonite deposit reaction at [A.name] (JMP).")
diff --git a/code/game/turfs/simulated/river.dm b/code/game/turfs/simulated/river.dm
index c7a3e742b6c..f463f3fb564 100644
--- a/code/game/turfs/simulated/river.dm
+++ b/code/game/turfs/simulated/river.dm
@@ -82,7 +82,7 @@
var/turf/simulated/mineral/M = T
logged_turf_type = M.turf_type
- if(get_dir(src, F) in cardinal)
+ if(get_dir(src, F) in GLOB.cardinal)
cardinal_turfs += F
else
diagonal_turfs += F
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 078a1b8e513..23d0c9789bd 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -34,7 +34,6 @@
var/sheet_type = /obj/item/stack/sheet/metal
var/sheet_amount = 2
var/girder_type = /obj/structure/girder
- var/obj/item/stack/sheet/builtin_sheet = null
canSmoothWith = list(
/turf/simulated/wall,
@@ -46,10 +45,6 @@
/turf/simulated/wall/r_wall/coated)
smooth = SMOOTH_TRUE
-/turf/simulated/wall/New()
- ..()
- builtin_sheet = new sheet_type
-
/turf/simulated/wall/BeforeChange()
for(var/obj/effect/overlay/wall_rot/WR in src)
qdel(WR)
@@ -139,7 +134,7 @@
P.setAngle(new_angle_s)
return TRUE
-/turf/simulated/wall/proc/dismantle_wall(devastated = 0, explode = 0)
+/turf/simulated/wall/dismantle_wall(devastated = FALSE, explode = FALSE)
if(devastated)
devastate_wall()
else
@@ -156,6 +151,7 @@
O.forceMove(src)
ChangeTurf(/turf/simulated/floor/plating)
+ return TRUE
/turf/simulated/wall/proc/break_wall()
new sheet_type(src, sheet_amount)
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index bc04a695da7..8b60be916c3 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -277,6 +277,9 @@
/turf/simulated/wall/mineral/titanium/nodecon/burn_down()
return
+/turf/simulated/wall/mineral/titanium/nodecon/welder_act()
+ return
+
/////////////////////Plastitanium walls/////////////////////
/turf/simulated/wall/mineral/plastitanium
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index e43ea15f53f..56908a7ecae 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -3,15 +3,14 @@
desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound."
icon = 'icons/turf/walls/cult_wall.dmi'
icon_state = "cult"
- builtin_sheet = null
canSmoothWith = null
smooth = SMOOTH_FALSE
sheet_type = /obj/item/stack/sheet/runed_metal
sheet_amount = 1
girder_type = /obj/structure/girder/cult
-/turf/simulated/wall/cult/New()
- ..()
+/turf/simulated/wall/cult/Initialize(mapload)
+ . = ..()
if(SSticker.mode)//game hasn't started offically don't do shit..
new /obj/effect/temp_visual/cult/turf(src)
icon_state = SSticker.cultdat.cult_wall_icon_state
@@ -73,10 +72,7 @@
realappearance.linked = src
/turf/simulated/wall/clockwork/Destroy()
- if(realappearance)
- qdel(realappearance)
- realappearance = null
-
+ QDEL_NULL(realappearance)
return ..()
/turf/simulated/wall/clockwork/ReplaceWithLattice()
@@ -109,6 +105,7 @@
P.roll_and_drop(src)
else
O.forceMove(src)
+ return TRUE
/turf/simulated/wall/clockwork/devastate_wall()
for(var/i in 1 to 2)
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index 502803bc7d3..a3e9c9ae0f2 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -43,7 +43,7 @@
update_icon()
to_chat(user, "You press firmly on the cover, dislodging it.")
return
- else if(RWALL_SUPPORT_RODS && istype(I, /obj/item/gun/energy/plasmacutter))
+ else if(d_state == RWALL_SUPPORT_RODS && istype(I, /obj/item/gun/energy/plasmacutter))
to_chat(user, "You begin slicing through the support rods...")
if(I.use_tool(src, user, 70, volume = I.tool_volume) && d_state == RWALL_SUPPORT_RODS)
d_state = RWALL_SHEATH
@@ -132,11 +132,11 @@
to_chat(user, "You pry off the cover.")
if(RWALL_SHEATH)
to_chat(user, "You struggle to pry off the outer sheath...")
- if(!I.use_tool(src, user, 100, volume = I.tool_volume) || d_state != RWALL_SHEATH)
+ if(!I.use_tool(src, user, 100, volume = I.tool_volume))
return
- to_chat(user, "You pry off the outer sheath.")
- dismantle_wall()
- return
+ if(dismantle_wall())
+ to_chat(user, "You pry off the outer sheath.")
+
if(RWALL_BOLTS)
to_chat(user, "You start to pry the cover back into place...")
playsound(src, I.usesound, 100, 1)
@@ -199,6 +199,9 @@
to_chat(user, "You tighten the bolts anchoring the support rods.")
update_icon()
+/turf/simulated/wall/r_wall/try_decon(obj/item/I, mob/user, params) //Plasma cutter only works in the deconstruction steps!
+ return FALSE
+
/turf/simulated/wall/r_wall/try_destroy(obj/item/I, mob/user, params)
if(istype(I, /obj/item/pickaxe/drill/diamonddrill))
to_chat(user, "You begin to drill though the wall...")
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index c797601d8e1..1a8ccdae550 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -21,6 +21,11 @@
/turf/space/Initialize(mapload)
if(!istype(src, /turf/space/transit))
icon_state = SPACE_ICON_STATE
+ vis_contents.Cut() //removes inherited overlays
+
+ if(initialized)
+ stack_trace("Warning: [src]([type]) initialized multiple times!")
+ initialized = TRUE
var/area/A = loc
if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A))
@@ -34,22 +39,16 @@
return INITIALIZE_HINT_NORMAL
-/turf/space/Destroy(force)
- if(force)
- . = ..()
- else
- return QDEL_HINT_LETMELIVE
-
/turf/space/BeforeChange()
..()
- var/datum/space_level/S = space_manager.get_zlev(z)
+ var/datum/space_level/S = GLOB.space_manager.get_zlev(z)
S.remove_from_transit(src)
if(light_sources) // Turn off starlight, if present
set_light(0)
/turf/space/AfterChange(ignore_air, keep_cabling = FALSE)
..()
- var/datum/space_level/S = space_manager.get_zlev(z)
+ var/datum/space_level/S = GLOB.space_manager.get_zlev(z)
S.add_to_transit(src)
S.apply_transition(src)
@@ -137,8 +136,8 @@
if(!cur_pos) return
cur_x = cur_pos["x"]
cur_y = cur_pos["y"]
- next_x = (--cur_x||global_map.len)
- y_arr = global_map[next_x]
+ next_x = (--cur_x||GLOB.global_map.len)
+ y_arr = GLOB.global_map[next_x]
target_z = y_arr[cur_y]
/*
//debug
@@ -162,8 +161,8 @@
if(!cur_pos) return
cur_x = cur_pos["x"]
cur_y = cur_pos["y"]
- next_x = (++cur_x > global_map.len ? 1 : cur_x)
- y_arr = global_map[next_x]
+ next_x = (++cur_x > GLOB.global_map.len ? 1 : cur_x)
+ y_arr = GLOB.global_map[next_x]
target_z = y_arr[cur_y]
/*
//debug
@@ -186,7 +185,7 @@
if(!cur_pos) return
cur_x = cur_pos["x"]
cur_y = cur_pos["y"]
- y_arr = global_map[cur_x]
+ y_arr = GLOB.global_map[cur_x]
next_y = (--cur_y||y_arr.len)
target_z = y_arr[next_y]
/*
@@ -211,7 +210,7 @@
if(!cur_pos) return
cur_x = cur_pos["x"]
cur_y = cur_pos["y"]
- y_arr = global_map[cur_x]
+ y_arr = GLOB.global_map[cur_x]
next_y = (++cur_y > y_arr.len ? 1 : cur_y)
target_z = y_arr[next_y]
/*
diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm
index 2a14230d467..a96cbae1269 100644
--- a/code/game/turfs/space/transit.dm
+++ b/code/game/turfs/space/transit.dm
@@ -125,9 +125,9 @@
/turf/space/transit/attackby()
return
-/turf/space/transit/New()
+/turf/space/transit/Initialize(mapload)
+ . = ..()
update_icon()
- ..()
/turf/space/transit/proc/update_icon()
var/p = 9
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index d589c3dcb64..8f8e7fdca9a 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -3,15 +3,18 @@
level = 1
luminosity = 1
- var/intact = 1
+ var/intact = TRUE
var/turf/baseturf = /turf/space
var/slowdown = 0 //negative for faster, positive for slower
- //Properties for open tiles (/floor)
+ ///Properties for open tiles (/floor)
+ /// All the gas vars, on the turf, are meant to be utilized for initializing a gas datum and setting its first gas values; the turf vars are never further modified at runtime; it is never directly used for calculations by the atmospherics system.
var/oxygen = 0
var/carbon_dioxide = 0
var/nitrogen = 0
var/toxins = 0
+ var/sleeping_agent = 0
+ var/agent_b = 0
//Properties for airtight tiles (/wall)
var/thermal_conductivity = 0.05
@@ -28,21 +31,29 @@
var/image/obscured //camerachunks
+ var/changing_turf = FALSE
+
var/list/blueprint_data //for the station blueprints, images of objects eg: pipes
- var/list/footstep_sounds = list()
+ var/list/footstep_sounds
var/shoe_running_volume = 50
var/shoe_walking_volume = 20
-/turf/New()
- ..()
+/turf/Initialize(mapload)
+ if(initialized)
+ stack_trace("Warning: [src]([type]) initialized multiple times!")
+ initialized = TRUE
+
+ // by default, vis_contents is inherited from the turf that was here before
+ vis_contents.Cut()
+
+ levelupdate()
+ if(smooth)
+ queue_smooth(src)
+ visibilityChanged()
+
for(var/atom/movable/AM in src)
Entered(AM)
- if(smooth && SSticker && SSticker.current_state == GAME_STATE_PLAYING)
- queue_smooth(src)
-
-/turf/Initialize(mapload)
- . = ..()
var/area/A = loc
if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A))
@@ -51,38 +62,40 @@
if(light_power && light_range)
update_light()
- if (opacity)
+ if(opacity)
has_opaque_atom = TRUE
-/hook/startup/proc/smooth_world()
- var/watch = start_watch()
- log_startup_progress("Smoothing atoms...")
- for(var/turf/T in world)
- if(T.smooth)
- queue_smooth(T)
- for(var/A in T)
- var/atom/AA = A
- if(AA.smooth)
- queue_smooth(AA)
- log_startup_progress(" Smoothed atoms in [stop_watch(watch)]s.")
- return 1
+ return INITIALIZE_HINT_NORMAL
-/turf/Destroy()
-// Adds the adjacent turfs to the current atmos processing
- if(SSair)
- for(var/direction in cardinal)
- if(atmos_adjacent_turfs & direction)
- var/turf/simulated/T = get_step(src, direction)
- if(istype(T))
- SSair.add_to_active(T)
+/turf/Destroy(force)
+ . = QDEL_HINT_IWILLGC
+ if(!changing_turf)
+ stack_trace("Incorrect turf deletion")
+ changing_turf = FALSE
+ if(force)
+ ..()
+ //this will completely wipe turf state
+ var/turf/B = new world.turf(src)
+ for(var/A in B.contents)
+ qdel(A)
+ return
+ // Adds the adjacent turfs to the current atmos processing
+ for(var/direction in GLOB.cardinal)
+ if(atmos_adjacent_turfs & direction)
+ var/turf/simulated/T = get_step(src, direction)
+ if(istype(T))
+ SSair.add_to_active(T)
+ SSair.remove_from_active(src)
+ visibilityChanged()
+ QDEL_LIST(blueprint_data)
+ initialized = FALSE
..()
- return QDEL_HINT_HARDDEL_NOW
/turf/attack_hand(mob/user as mob)
user.Move_Pulled(src)
/turf/ex_act(severity)
- return 0
+ return FALSE
/turf/rpd_act(mob/user, obj/item/rpd/our_rpd) //This is the default turf behaviour for the RPD; override it as required
if(our_rpd.mode == RPD_ATMOS_MODE)
@@ -100,55 +113,53 @@
else if(our_rpd.mode == RPD_DELETE_MODE)
our_rpd.delete_all_pipes(user, src)
-/turf/bullet_act(var/obj/item/projectile/Proj)
- if(istype(Proj ,/obj/item/projectile/beam/pulse))
+/turf/bullet_act(obj/item/projectile/Proj)
+ if(istype(Proj, /obj/item/projectile/beam/pulse))
src.ex_act(2)
..()
- return 0
+ return FALSE
-/turf/bullet_act(var/obj/item/projectile/Proj)
- if(istype(Proj ,/obj/item/projectile/bullet/gyro))
+/turf/bullet_act(obj/item/projectile/Proj)
+ if(istype(Proj, /obj/item/projectile/bullet/gyro))
explosion(src, -1, 0, 2)
..()
- return 0
+ return FALSE
-/turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area)
+/turf/Enter(atom/movable/mover as mob|obj, atom/forget)
if(!mover)
- return 1
-
+ return TRUE
// First, make sure it can leave its square
if(isturf(mover.loc))
// Nothing but border objects stop you from leaving a tile, only one loop is needed
for(var/obj/obstacle in mover.loc)
if(!obstacle.CheckExit(mover, src) && obstacle != mover && obstacle != forget)
- mover.Bump(obstacle, 1)
- return 0
+ mover.Bump(obstacle, TRUE)
+ return FALSE
var/list/large_dense = list()
//Next, check objects to block entry that are on the border
for(var/atom/movable/border_obstacle in src)
- if(border_obstacle.flags&ON_BORDER)
- if(!border_obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != border_obstacle))
- mover.Bump(border_obstacle, 1)
- return 0
+ if(border_obstacle.flags & ON_BORDER)
+ if(!border_obstacle.CanPass(mover, mover.loc, 1) && (forget != border_obstacle))
+ mover.Bump(border_obstacle, TRUE)
+ return FALSE
else
large_dense += border_obstacle
//Then, check the turf itself
if(!src.CanPass(mover, src))
- mover.Bump(src, 1)
- return 0
+ mover.Bump(src, TRUE)
+ return FALSE
//Finally, check objects/mobs to block entry that are not on the border
for(var/atom/movable/obstacle in large_dense)
- if(!obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != obstacle))
- mover.Bump(obstacle, 1)
- return 0
- return 1 //Nothing found to block so return success!
+ if(!obstacle.CanPass(mover, mover.loc, 1) && (forget != obstacle))
+ mover.Bump(obstacle, TRUE)
+ return FALSE
+ return TRUE //Nothing found to block so return success!
-
-/turf/Entered(atom/movable/M, atom/OL, ignoreRest = 0)
+/turf/Entered(atom/movable/M, atom/OL, ignoreRest = FALSE)
..()
if(ismob(M))
var/mob/O = M
@@ -161,7 +172,12 @@
if(loopsanity == 0)
break
loopsanity--
- A.HasProximity(M, 1)
+ A.HasProximity(M)
+
+ // If an opaque movable atom moves around we need to potentially update visibility.
+ if(M.opacity)
+ has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case.
+ reconsider_lights()
/turf/proc/levelupdate()
for(var/obj/O in src)
@@ -172,7 +188,7 @@
/turf/space/levelupdate()
for(var/obj/O in src)
if(O.level == 1)
- O.hide(0)
+ O.hide(FALSE)
// Removes all signs of lattice on the pos of the turf -Donkieyo
/turf/proc/RemoveLattice()
@@ -180,6 +196,9 @@
if(L)
qdel(L)
+/turf/proc/dismantle_wall(devastated = FALSE, explode = FALSE)
+ return
+
/turf/proc/TerraformTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE)
return ChangeTurf(path, defer_change, keep_icon, ignore_air)
@@ -187,7 +206,7 @@
/turf/proc/ChangeTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE)
if(!path)
return
- if(!use_preloader && path == type) // Don't no-op if the map loader requires it to be reconstructed
+ if(!GLOB.use_preloader && path == type) // Don't no-op if the map loader requires it to be reconstructed
return src
set_light(0)
@@ -200,10 +219,10 @@
var/old_corners = corners
BeforeChange()
- if(SSair)
- SSair.remove_from_active(src)
var/old_baseturf = baseturf
+ changing_turf = TRUE
+ qdel(src) //Just get the side effects and call Destroy
var/turf/W = new path(src)
W.baseturf = old_baseturf
@@ -216,7 +235,6 @@
if(SSlighting.initialized)
recalc_atom_opacity()
lighting_object = old_lighting_object
-
affecting_lights = old_affecting_lights
corners = old_corners
if(old_opacity != opacity || dynamic_lighting != old_dynamic_lighting)
@@ -239,7 +257,7 @@
return
// I'm including `ignore_air` because BYOND lacks positional-only arguments
-/turf/proc/AfterChange(ignore_air, keep_cabling = FALSE) //called after a turf has been replaced in ChangeTurf()
+/turf/proc/AfterChange(ignore_air = FALSE, keep_cabling = FALSE) //called after a turf has been replaced in ChangeTurf()
levelupdate()
CalculateAdjacentTurfs()
@@ -250,7 +268,7 @@
for(var/obj/structure/cable/C in contents)
qdel(C)
-/turf/simulated/AfterChange(ignore_air, keep_cabling = FALSE)
+/turf/simulated/AfterChange(ignore_air = FALSE, keep_cabling = FALSE)
..()
RemoveLattice()
if(!ignore_air)
@@ -259,32 +277,38 @@
//////Assimilate Air//////
/turf/simulated/proc/Assimilate_Air()
if(air)
- var/aoxy = 0//Holders to assimilate air from nearby turfs
+ var/aoxy = 0 //Holders to assimilate air from nearby turfs
var/anitro = 0
var/aco = 0
var/atox = 0
+ var/asleep = 0
+ var/ab = 0
var/atemp = 0
var/turf_count = 0
- for(var/direction in cardinal)//Only use cardinals to cut down on lag
- var/turf/T = get_step(src,direction)
- if(istype(T,/turf/space))//Counted as no air
+ for(var/direction in GLOB.cardinal)//Only use cardinals to cut down on lag
+ var/turf/T = get_step(src, direction)
+ if(istype(T, /turf/space))//Counted as no air
turf_count++//Considered a valid turf for air calcs
continue
- else if(istype(T,/turf/simulated/floor))
+ else if(istype(T, /turf/simulated/floor))
var/turf/simulated/S = T
if(S.air)//Add the air's contents to the holders
aoxy += S.air.oxygen
anitro += S.air.nitrogen
aco += S.air.carbon_dioxide
atox += S.air.toxins
+ asleep += S.air.sleeping_agent
+ ab += S.air.agent_b
atemp += S.air.temperature
turf_count++
- air.oxygen = (aoxy/max(turf_count,1))//Averages contents of the turfs, ignoring walls and the like
- air.nitrogen = (anitro/max(turf_count,1))
- air.carbon_dioxide = (aco/max(turf_count,1))
- air.toxins = (atox/max(turf_count,1))
- air.temperature = (atemp/max(turf_count,1))//Trace gases can get bant
+ air.oxygen = (aoxy / max(turf_count, 1)) //Averages contents of the turfs, ignoring walls and the like
+ air.nitrogen = (anitro / max(turf_count, 1))
+ air.carbon_dioxide = (aco / max(turf_count, 1))
+ air.toxins = (atox / max(turf_count, 1))
+ air.sleeping_agent = (asleep / max(turf_count, 1))
+ air.agent_b = (ab / max(turf_count, 1))
+ air.temperature = (atemp / max(turf_count, 1))
if(SSair)
SSair.add_to_active(src)
@@ -292,15 +316,17 @@
ChangeTurf(baseturf)
new /obj/structure/lattice(locate(x, y, z))
+/turf/proc/remove_plating(mob/user)
+ return
+
/turf/proc/kill_creatures(mob/U = null)//Will kill people/creatures and damage mechs./N
//Useful to batch-add creatures to the list.
for(var/mob/living/M in src)
- if(M==U) continue//Will not harm U. Since null != M, can be excluded to kill everyone.
- spawn(0)
- M.gib()
+ if(M == U)
+ continue//Will not harm U. Since null != M, can be excluded to kill everyone.
+ INVOKE_ASYNC(M, /mob/.proc/gib)
for(var/obj/mecha/M in src)//Mecha are not gibbed but are damaged.
- spawn(0)
- M.take_damage(100, "brute")
+ INVOKE_ASYNC(M, /obj/mecha/.proc/take_damage, 100, "brute")
/turf/proc/Bless()
flags |= NOJAUNT
@@ -309,6 +335,10 @@
for(var/atom/movable/AM in contents)
AM.get_spooked()
+// Defined here to avoid runtimes
+/turf/proc/MakeDry(wet_setting = TURF_WET_WATER)
+ return
+
/turf/proc/burn_down()
return
@@ -327,7 +357,7 @@
var/list/L = new()
var/turf/simulated/T
- for(var/dir in cardinal)
+ for(var/dir in GLOB.cardinal)
T = get_step(src, dir)
if(istype(T) && !T.density)
if(!LinkBlockedWithAccess(src, T, ID))
@@ -340,7 +370,7 @@
var/list/L = new()
var/turf/simulated/T
- for(var/dir in cardinal)
+ for(var/dir in GLOB.cardinal)
T = get_step(src, dir)
if(istype(T) && !T.density)
if(!CanAtmosPass(T))
@@ -353,11 +383,11 @@
// Returns the surrounding simulated turfs with open links
// Including through doors openable with the ID
-/turf/proc/AdjacentTurfsWithAccess(var/obj/item/card/id/ID = null,var/list/closed)//check access if one is passed
+/turf/proc/AdjacentTurfsWithAccess(obj/item/card/id/ID = null, list/closed)//check access if one is passed
var/list/L = new()
var/turf/simulated/T
- for(var/dir in list(NORTHWEST,NORTHEAST,SOUTHEAST,SOUTHWEST,NORTH,EAST,SOUTH,WEST)) //arbitrarily ordered list to favor non-diagonal moves in case of ties
- T = get_step(src,dir)
+ for(var/dir in GLOB.alldirs2) //arbitrarily ordered list to favor non-diagonal moves in case of ties
+ T = get_step(src, dir)
if(T in closed) //turf already proceeded in A*
continue
if(istype(T) && !T.density)
@@ -366,11 +396,11 @@
return L
//Idem, but don't check for ID and goes through open doors
-/turf/proc/AdjacentTurfs(var/list/closed)
+/turf/proc/AdjacentTurfs(list/closed)
var/list/L = new()
var/turf/simulated/T
- for(var/dir in list(NORTHWEST,NORTHEAST,SOUTHEAST,SOUTHWEST,NORTH,EAST,SOUTH,WEST)) //arbitrarily ordered list to favor non-diagonal moves in case of ties
- T = get_step(src,dir)
+ for(var/dir in GLOB.alldirs2) //arbitrarily ordered list to favor non-diagonal moves in case of ties
+ T = get_step(src, dir)
if(T in closed) //turf already proceeded by A*
continue
if(istype(T) && !T.density)
@@ -379,11 +409,11 @@
return L
// check for all turfs, including unsimulated ones
-/turf/proc/AdjacentTurfsSpace(var/obj/item/card/id/ID = null, var/list/closed)//check access if one is passed
+/turf/proc/AdjacentTurfsSpace(obj/item/card/id/ID = null, list/closed)//check access if one is passed
var/list/L = new()
var/turf/T
- for(var/dir in list(NORTHWEST,NORTHEAST,SOUTHEAST,SOUTHWEST,NORTH,EAST,SOUTH,WEST)) //arbitrarily ordered list to favor non-diagonal moves in case of ties
- T = get_step(src,dir)
+ for(var/dir in GLOB.alldirs2) //arbitrarily ordered list to favor non-diagonal moves in case of ties
+ T = get_step(src, dir)
if(T in closed) //turf already proceeded by A*
continue
if(istype(T) && !T.density)
@@ -400,20 +430,21 @@
//////////////////////////////
//Distance associates with all directions movement
-/turf/proc/Distance(var/turf/T)
- return get_dist(src,T)
+/turf/proc/Distance(turf/T)
+ return get_dist(src, T)
// This Distance proc assumes that only cardinal movement is
// possible. It results in more efficient (CPU-wise) pathing
// for bots and anything else that only moves in cardinal dirs.
/turf/proc/Distance_cardinal(turf/T)
- if(!src || !T) return 0
+ if(!src || !T)
+ return 0
return abs(src.x - T.x) + abs(src.y - T.y)
////////////////////////////////////////////////////
/turf/acid_act(acidpwr, acid_volume)
- . = 1
+ . = TRUE
var/acid_type = /obj/effect/acid
if(acidpwr >= 200) //alien acid power
acid_type = /obj/effect/acid/alien
@@ -438,7 +469,7 @@
if(!forced)
return
if(has_gravity(src))
- playsound(src, "bodyfall", 50, 1)
+ playsound(src, "bodyfall", 50, TRUE)
/turf/singularity_act()
if(intact)
@@ -448,36 +479,36 @@
if(O.invisibility == INVISIBILITY_MAXIMUM)
O.singularity_act()
ChangeTurf(baseturf)
- return(2)
+ return 2
/turf/proc/visibilityChanged()
if(SSticker)
- cameranet.updateVisibility(src)
+ GLOB.cameranet.updateVisibility(src)
/turf/attackby(obj/item/I, mob/user, params)
if(can_lay_cable())
if(istype(I, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = I
for(var/obj/structure/cable/LC in src)
- if(LC.d1 == 0 || LC.d2==0)
- LC.attackby(C,user)
+ if(LC.d1 == 0 || LC.d2 == 0)
+ LC.attackby(C, user)
return
C.place_turf(src, user)
- return 1
+ return TRUE
else if(istype(I, /obj/item/twohanded/rcl))
var/obj/item/twohanded/rcl/R = I
if(R.loaded)
for(var/obj/structure/cable/LC in src)
- if(LC.d1 == 0 || LC.d2==0)
+ if(LC.d1 == 0 || LC.d2 == 0)
LC.attackby(R, user)
return
R.loaded.place_turf(src, user)
R.is_empty(user)
- return 0
+ return FALSE
/turf/proc/can_have_cabling()
- return 1
+ return TRUE
/turf/proc/can_lay_cable()
return can_have_cabling() & !intact
@@ -502,18 +533,15 @@
I.appearance = AM.appearance
I.appearance_flags = RESET_COLOR|RESET_ALPHA|RESET_TRANSFORM
I.loc = src
- I.dir = AM.dir
+ I.setDir(AM.dir)
I.alpha = 128
-
- if(!blueprint_data)
- blueprint_data = list()
- blueprint_data += I
+ LAZYADD(blueprint_data, I)
/turf/proc/add_blueprints_preround(atom/movable/AM)
if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING)
add_blueprints(AM)
-/turf/proc/empty(turf_type=/turf/space)
+/turf/proc/empty(turf_type = /turf/space)
// Remove all atoms except observers, landmarks, docking ports, and (un)`simulated` atoms (lighting overlays)
var/turf/T0 = src
for(var/X in T0.GetAllContents())
@@ -526,13 +554,13 @@
continue
if(istype(A, /obj/docking_port))
continue
- qdel(A, force=TRUE)
+ qdel(A, force = TRUE)
T0.ChangeTurf(turf_type)
SSair.remove_from_active(T0)
T0.CalculateAdjacentTurfs()
- SSair.add_to_active(T0,1)
+ SSair.add_to_active(T0, TRUE)
/turf/AllowDrop()
return TRUE
diff --git a/code/game/turfs/unsimulated.dm b/code/game/turfs/unsimulated.dm
index 688dc778ce3..02af9173e2b 100644
--- a/code/game/turfs/unsimulated.dm
+++ b/code/game/turfs/unsimulated.dm
@@ -40,6 +40,6 @@
nitrogen = 0
temperature = TCMB
-/turf/unsimulated/floor/plating/airless/New()
- ..()
+/turf/unsimulated/floor/plating/airless/Initialize(mapload)
+ . = ..()
name = "plating"
diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm
index f6a3a62c324..a7c73971e99 100644
--- a/code/game/turfs/unsimulated/beach.dm
+++ b/code/game/turfs/unsimulated/beach.dm
@@ -3,9 +3,9 @@
icon = 'icons/misc/beach.dmi'
var/water_overlay_image = null
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
-
-/turf/unsimulated/beach/New()
- ..()
+
+/turf/unsimulated/beach/Initialize(mapload)
+ . = ..()
if(water_overlay_image)
var/image/overlay_image = image('icons/misc/beach.dmi', icon_state = water_overlay_image, layer = ABOVE_MOB_LAYER)
overlay_image.plane = GAME_PLANE
@@ -15,10 +15,10 @@
name = "Sand"
icon_state = "desert"
mouse_opacity = MOUSE_OPACITY_ICON
-
-/turf/unsimulated/beach/sand/New() //adds some aesthetic randomness to the beach sand
+
+/turf/unsimulated/beach/sand/Initialize(mapload)
+ . = ..() //adds some aesthetic randomness to the beach sand
icon_state = pick("desert", "desert0", "desert1", "desert2", "desert3", "desert4")
- ..()
/turf/unsimulated/beach/sand/dense //for boundary "walls"
density = 1
@@ -42,7 +42,7 @@
/turf/unsimulated/beach/water/Entered(atom/movable/AM, atom/OldLoc)
. = ..()
if(!linkedcontroller)
- return
+ return
if(ismob(AM))
linkedcontroller.mobinpool += AM
@@ -79,8 +79,8 @@
/turf/unsimulated/beach/water/edge_drop)
var/obj/effect/beach_drop_overlay/water_overlay
-/turf/unsimulated/beach/water/drop/New()
- ..()
+/turf/unsimulated/beach/water/drop/Initialize(mapload)
+ . = ..()
water_overlay = new(src)
/turf/unsimulated/beach/water/drop/Destroy()
diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm
index 28f4e359223..750ebe015ae 100644
--- a/code/game/turfs/unsimulated/floor.dm
+++ b/code/game/turfs/unsimulated/floor.dm
@@ -7,8 +7,8 @@
name = "grass patch"
icon_state = "grass1"
-/turf/unsimulated/floor/grass/New()
- ..()
+/turf/unsimulated/floor/grass/Initialize(mapload)
+ . = ..()
icon_state = "grass[rand(1,4)]"
/turf/unsimulated/floor/snow
@@ -20,8 +20,8 @@
name = "alien floor"
icon_state = "alienpod1"
-/turf/unsimulated/floor/abductor/New()
- ..()
+/turf/unsimulated/floor/abductor/Initialize(mapload)
+ . = ..()
icon_state = "alienpod[rand(1,9)]"
/turf/unsimulated/floor/vox
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index e94d04f5dfb..824159487eb 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -1,8 +1,8 @@
-var/global/normal_ooc_colour = "#002eb8"
-var/global/member_ooc_colour = "#035417"
-var/global/mentor_ooc_colour = "#0099cc"
-var/global/moderator_ooc_colour = "#184880"
-var/global/admin_ooc_colour = "#b82e00"
+GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
+GLOBAL_VAR_INIT(member_ooc_colour, "#035417")
+GLOBAL_VAR_INIT(mentor_ooc_colour, "#0099cc")
+GLOBAL_VAR_INIT(moderator_ooc_colour, "#184880")
+GLOBAL_VAR_INIT(admin_ooc_colour, "#b82e00")
//Checks if the client already has a text input open
/client/proc/checkTyping()
@@ -54,21 +54,21 @@ var/global/admin_ooc_colour = "#b82e00"
log_ooc(msg, src)
- var/display_colour = normal_ooc_colour
+ var/display_colour = GLOB.normal_ooc_colour
if(holder && !holder.fakekey)
- display_colour = mentor_ooc_colour
+ display_colour = GLOB.mentor_ooc_colour
if(check_rights(R_MOD,0) && !check_rights(R_ADMIN,0))
- display_colour = moderator_ooc_colour
+ display_colour = GLOB.moderator_ooc_colour
else if(check_rights(R_ADMIN,0))
if(config.allow_admin_ooccolor)
display_colour = src.prefs.ooccolor
else
- display_colour = admin_ooc_colour
+ display_colour = GLOB.admin_ooc_colour
if(prefs.unlock_content)
- if(display_colour == normal_ooc_colour)
+ if(display_colour == GLOB.normal_ooc_colour)
if((prefs.toggles & MEMBER_PUBLIC))
- display_colour = member_ooc_colour
+ display_colour = GLOB.member_ooc_colour
for(var/client/C in GLOB.clients)
if(C.prefs.toggles & CHAT_OOC)
@@ -114,7 +114,7 @@ var/global/admin_ooc_colour = "#b82e00"
if(!check_rights(R_SERVER)) return
- normal_ooc_colour = newColor
+ GLOB.normal_ooc_colour = newColor
message_admins("[key_name_admin(usr)] has set the default player OOC color to [newColor]")
log_admin("[key_name(usr)] has set the default player OOC color to [newColor]")
@@ -128,7 +128,7 @@ var/global/admin_ooc_colour = "#b82e00"
if(!check_rights(R_SERVER)) return
- normal_ooc_colour = initial(normal_ooc_colour)
+ GLOB.normal_ooc_colour = initial(GLOB.normal_ooc_colour)
message_admins("[key_name_admin(usr)] has reset the default player OOC color")
log_admin("[key_name(usr)] has reset the default player OOC color")
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index 2683e236269..95b11353b86 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -27,7 +27,7 @@
entry += " - Observing"
else
entry += " - DEAD"
- else if(istype(C.mob, /mob/new_player))
+ else if(isnewplayer(C.mob))
entry += " - New Player"
else
entry += " - DEAD"
@@ -90,7 +90,7 @@
if(isobserver(C.mob))
msg += " - Observing"
- else if(istype(C.mob,/mob/new_player))
+ else if(isnewplayer(C.mob))
msg += " - Lobby"
else
msg += " - Playing"
@@ -106,7 +106,7 @@
if(isobserver(C.mob))
modmsg += " - Observing"
- else if(istype(C.mob,/mob/new_player))
+ else if(isnewplayer(C.mob))
modmsg += " - Lobby"
else
modmsg += " - Playing"
diff --git a/code/game/world.dm b/code/game/world.dm
index 83407a6ae46..fdb0b8f63be 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -1,14 +1,23 @@
-#define RECOMMENDED_VERSION 510
-
-var/global/list/map_transition_config = MAP_TRANSITION_CONFIG
+GLOBAL_LIST_INIT(map_transition_config, MAP_TRANSITION_CONFIG)
/world/New()
+ //temporary file used to record errors with loading config, moved to log directory once logging is set up
+ GLOB.config_error_log = GLOB.world_game_log = GLOB.world_runtime_log = "data/logs/config_error.log"
+ load_configuration()
+ // Setup all log paths and stamp them with startups
SetupLogs()
enable_debugger() // Enable the extools debugger
log_world("World loaded at [time_stamp()]")
log_world("[GLOB.vars.len - GLOB.gvars_datum_in_built_vars.len] global variables")
+ connectDB() // This NEEDS TO HAPPEN EARLY. I CANNOT STRESS THIS ENOUGH!!!!!!! -aa
+ load_admins() // Same here
- if(byond_version < RECOMMENDED_VERSION)
+ #ifdef UNIT_TESTS
+ log_world("Unit Tests Are Enabled!")
+ #endif
+
+
+ if(byond_version < MIN_COMPILER_VERSION || byond_build < MIN_COMPILER_BUILD)
log_world("Your server's byond version does not meet the recommended requirements for this code. Please update BYOND")
if(config && config.server_name != null && config.server_suffix && world.port > 0)
@@ -17,25 +26,32 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG
GLOB.timezoneOffset = text2num(time2text(0, "hh")) * 36000
- makeDatumRefLists()
- callHook("startup")
+ startup_procs() // Call procs that need to occur on startup (Generate lists, load MOTD, etc)
src.update_status()
- space_manager.initialize() //Before the MC starts up
+ GLOB.space_manager.initialize() //Before the MC starts up
. = ..()
- // Create robolimbs for chargen.
- populate_robolimb_list()
-
Master.Initialize(10, FALSE)
-
-#undef RECOMMENDED_VERSION
+ #ifdef UNIT_TESTS
+ HandleTestRun()
+ #endif
return
+// This is basically a replacement for hook/startup. Please dont shove random bullshit here
+// If it doesnt need to happen IMMEDIATELY on world load, make a subsystem for it
+/world/proc/startup_procs()
+ LoadBans() // Load up who is banned and who isnt. DONT PUT THIS IN A SUBSYSTEM IT WILL TAKE TOO LONG TO BE CALLED
+ jobban_loadbanfile() // Load up jobbans. Again, DO NOT PUT THIS IN A SUBSYSTEM IT WILL TAKE TOO LONG TO BE CALLED
+ load_motd() // Loads up the MOTD (Welcome message players see when joining the server)
+ load_mode() // Loads up the gamemode
+ investigate_reset() // This is part of the admin investigate system. PLEASE DONT SS THIS EITHER
+ makeDatumRefLists() // Setups up lists of datums and their subtypes
+
//world/Topic(href, href_list[])
// to_chat(world, "Received a Topic() call!")
// to_chat(world, "[href]")
@@ -47,8 +63,8 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG
// to_chat(world, "End of Topic() call.")
// ..()
-var/world_topic_spam_protect_ip = "0.0.0.0"
-var/world_topic_spam_protect_time = world.timeofday
+GLOBAL_VAR_INIT(world_topic_spam_protect_ip, "0.0.0.0")
+GLOBAL_VAR_INIT(world_topic_spam_protect_time, world.timeofday)
/world/Topic(T, addr, master, key)
log_misc("WORLD/TOPIC: \"[T]\", from:[addr], master:[master], key:[key]")
@@ -72,10 +88,10 @@ var/world_topic_spam_protect_time = world.timeofday
else if("status" in input)
var/list/s = list()
var/list/admins = list()
- s["version"] = game_version
- s["mode"] = master_mode
- s["respawn"] = config ? abandon_allowed : 0
- s["enter"] = enter_allowed
+ s["version"] = GLOB.game_version
+ s["mode"] = GLOB.master_mode
+ s["respawn"] = config ? GLOB.abandon_allowed : 0
+ s["enter"] = GLOB.enter_allowed
s["vote"] = config.allow_vote_mode
s["ai"] = config.allow_ai
s["host"] = host ? host : null
@@ -123,18 +139,18 @@ var/world_topic_spam_protect_time = world.timeofday
else if("manifest" in input)
var/list/positions = list()
var/list/set_names = list(
- "heads" = command_positions,
- "sec" = security_positions,
- "eng" = engineering_positions,
- "med" = medical_positions,
- "sci" = science_positions,
- "car" = supply_positions,
- "srv" = service_positions,
- "civ" = civilian_positions,
- "bot" = nonhuman_positions
+ "heads" = GLOB.command_positions,
+ "sec" = GLOB.security_positions,
+ "eng" = GLOB.engineering_positions,
+ "med" = GLOB.medical_positions,
+ "sci" = GLOB.science_positions,
+ "car" = GLOB.supply_positions,
+ "srv" = GLOB.service_positions,
+ "civ" = GLOB.civilian_positions,
+ "bot" = GLOB.nonhuman_positions
)
- for(var/datum/data/record/t in data_core.general)
+ for(var/datum/data/record/t in GLOB.data_core.general)
var/name = t.fields["name"]
var/rank = t.fields["rank"]
var/real_rank = t.fields["real_rank"]
@@ -226,7 +242,7 @@ var/world_topic_spam_protect_time = world.timeofday
if(!C)
return "No client with that name on server"
- del(C)
+ qdel(C)
return "Kick Successful"
@@ -242,7 +258,7 @@ var/world_topic_spam_protect_time = world.timeofday
if(!key_valid)
return keySpamProtect(addr)
if(input["req"] == "public")
- hub_password = hub_password_base
+ hub_password = initial(hub_password)
update_status()
return "Set listed status to public."
else
@@ -251,18 +267,22 @@ var/world_topic_spam_protect_time = world.timeofday
return "Set listed status to invisible."
/proc/keySpamProtect(var/addr)
- if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50)
+ if(GLOB.world_topic_spam_protect_ip == addr && abs(GLOB.world_topic_spam_protect_time - world.time) < 50)
spawn(50)
- world_topic_spam_protect_time = world.time
+ GLOB.world_topic_spam_protect_time = world.time
return "Bad Key (Throttled)"
- world_topic_spam_protect_time = world.time
- world_topic_spam_protect_ip = addr
+ GLOB.world_topic_spam_protect_time = world.time
+ GLOB.world_topic_spam_protect_ip = addr
return "Bad Key"
/world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time)
if(reason == 1) //special reboot, do none of the normal stuff
if(usr)
+ if(!check_rights(R_SERVER))
+ message_admins("[key_name_admin(usr)] attempted to restart the server via the Profiler, without access.")
+ log_admin("[key_name(usr)] attempted to restart the server via the Profiler, without access.")
+ return
message_admins("[key_name_admin(usr)] has requested an immediate world restart via client side debugging tools")
log_admin("[key_name(usr)] has requested an immediate world restart via client side debugging tools")
spawn(0)
@@ -270,8 +290,8 @@ var/world_topic_spam_protect_time = world.timeofday
shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss.
if(config && config.shutdown_on_reboot)
sleep(0)
- if(shutdown_shell_command)
- shell(shutdown_shell_command)
+ if(GLOB.shutdown_shell_command)
+ shell(GLOB.shutdown_shell_command)
del(world)
return
else
@@ -294,8 +314,8 @@ var/world_topic_spam_protect_time = world.timeofday
if(!SSticker.delay_end)
world << round_end_sound
sleep(delay)
- if(blackbox)
- blackbox.save_all_data_to_sql()
+ if(GLOB.blackbox)
+ GLOB.blackbox.save_all_data_to_sql()
if(SSticker.delay_end)
to_chat(world, "Reboot was cancelled by an admin.")
return
@@ -304,45 +324,41 @@ var/world_topic_spam_protect_time = world.timeofday
//kick_clients_in_lobby("The round came to an end with you in the lobby.", 1)
Master.Shutdown() //run SS shutdowns
- dbcon.Disconnect() // DCs cleanly from the database
+ GLOB.dbcon.Disconnect() // DCs cleanly from the database
shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss.
+ #ifdef UNIT_TESTS
+ FinishTestRun()
+ return
+ #endif
+
for(var/client/C in GLOB.clients)
if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
C << link("byond://[config.server]")
if(config && config.shutdown_on_reboot)
sleep(0)
- if(shutdown_shell_command)
- shell(shutdown_shell_command)
+ if(GLOB.shutdown_shell_command)
+ shell(GLOB.shutdown_shell_command)
del(world)
return
else
..(0)
-
-/hook/startup/proc/loadMode()
- world.load_mode()
- return 1
-
/world/proc/load_mode()
var/list/Lines = file2list("data/mode.txt")
if(Lines.len)
if(Lines[1])
- master_mode = Lines[1]
- log_game("Saved mode is '[master_mode]'")
+ GLOB.master_mode = Lines[1]
+ log_game("Saved mode is '[GLOB.master_mode]'")
/world/proc/save_mode(var/the_mode)
var/F = file("data/mode.txt")
fdel(F)
F << the_mode
-/hook/startup/proc/loadMOTD()
- world.load_motd()
- return 1
-
/world/proc/load_motd()
- join_motd = file2text("config/motd.txt")
+ GLOB.join_motd = file2text("config/motd.txt")
GLOB.join_tos = file2text("config/tos.txt")
/proc/load_configuration()
@@ -366,7 +382,7 @@ var/world_topic_spam_protect_time = world.timeofday
s += "[config.server_name] — "
s += "[station_name()] "
if(config && config.githuburl)
- s+= "([game_version])"
+ s+= "([GLOB.game_version])"
if(config && config.server_tag_line)
s += " [config.server_tag_line]"
@@ -379,7 +395,7 @@ var/world_topic_spam_protect_time = world.timeofday
s += " "
var/list/features = list()
- if(!enter_allowed)
+ if(!GLOB.enter_allowed)
features += "closed"
if(config && config.server_extra_features)
@@ -391,7 +407,7 @@ var/world_topic_spam_protect_time = world.timeofday
if(config && config.wikiurl)
features += "Wiki"
- if(abandon_allowed)
+ if(GLOB.abandon_allowed)
features += "respawn"
if(features)
@@ -400,8 +416,8 @@ var/world_topic_spam_protect_time = world.timeofday
return s
#define FAILED_DB_CONNECTION_CUTOFF 5
-var/failed_db_connections = 0
-var/failed_old_db_connections = 0
+GLOBAL_VAR_INIT(failed_db_connections, 0)
+GLOBAL_VAR_INIT(failed_old_db_connections, 0)
/world/proc/SetupLogs()
GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")]"
@@ -410,10 +426,12 @@ var/failed_old_db_connections = 0
GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log"
GLOB.world_qdel_log = "[GLOB.log_directory]/qdel.log"
GLOB.world_asset_log = "[GLOB.log_directory]/asset.log"
+ GLOB.tgui_log = "[GLOB.log_directory]/tgui.log"
start_log(GLOB.world_game_log)
start_log(GLOB.world_href_log)
start_log(GLOB.world_runtime_log)
start_log(GLOB.world_qdel_log)
+ start_log(GLOB.tgui_log)
// This log follows a special format and this path should NOT be used for anything else
GLOB.runtime_summary_log = "data/logs/runtime_summary.log"
@@ -427,7 +445,7 @@ var/failed_old_db_connections = 0
fdel(GLOB.config_error_log)
-/hook/startup/proc/connectDB()
+/world/proc/connectDB()
if(!setup_database_connection())
log_world("Your server failed to establish a connection with the feedback database.")
else
@@ -436,11 +454,11 @@ var/failed_old_db_connections = 0
/proc/setup_database_connection()
- if(failed_db_connections > FAILED_DB_CONNECTION_CUTOFF) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to conenct anymore.
+ if(GLOB.failed_db_connections > FAILED_DB_CONNECTION_CUTOFF) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to conenct anymore.
return 0
- if(!dbcon)
- dbcon = new()
+ if(!GLOB.dbcon)
+ GLOB.dbcon = new()
var/user = sqlfdbklogin
var/pass = sqlfdbkpass
@@ -448,22 +466,22 @@ var/failed_old_db_connections = 0
var/address = sqladdress
var/port = sqlport
- dbcon.Connect("dbi:mysql:[db]:[address]:[port]","[user]","[pass]")
- . = dbcon.IsConnected()
+ GLOB.dbcon.Connect("dbi:mysql:[db]:[address]:[port]","[user]","[pass]")
+ . = GLOB.dbcon.IsConnected()
if( . )
- failed_db_connections = 0 //If this connection succeeded, reset the failed connections counter.
+ GLOB.failed_db_connections = 0 //If this connection succeeded, reset the failed connections counter.
else
- failed_db_connections++ //If it failed, increase the failed connections counter.
- log_world(dbcon.ErrorMsg())
+ GLOB.failed_db_connections++ //If it failed, increase the failed connections counter.
+ log_world(GLOB.dbcon.ErrorMsg())
return .
//This proc ensures that the connection to the feedback database (global variable dbcon) is established
proc/establish_db_connection()
- if(failed_db_connections > FAILED_DB_CONNECTION_CUTOFF)
+ if(GLOB.failed_db_connections > FAILED_DB_CONNECTION_CUTOFF)
return 0
- if(!dbcon || !dbcon.IsConnected())
+ if(!GLOB.dbcon || !GLOB.dbcon.IsConnected())
return setup_database_connection()
else
return 1
diff --git a/code/hub.dm b/code/hub.dm
index 665193a9d5b..32fe613399e 100644
--- a/code/hub.dm
+++ b/code/hub.dm
@@ -3,7 +3,6 @@
hub = "Exadv1.spacestation13"
hub_password = "kMZy3U5jJHSiBQjr"
name = "Space Station 13"
- /var/hub_password_base = "kMZy3U5jJHSiBQjr"
/* This is for any host that would like their server to appear on the main SS13 hub.
To use it, simply replace the password above, with the password found below, and it should work.
If not, let us know on the main tgstation IRC channel of irc.rizon.net #tgstation13 we can help you there.
diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm
index 8168583e6fa..09df94dc06e 100644
--- a/code/modules/admin/DB ban/functions.dm
+++ b/code/modules/admin/DB ban/functions.dm
@@ -5,7 +5,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
if(!check_rights(R_BAN)) return
establish_db_connection()
- if(!dbcon.IsConnected())
+ if(!GLOB.dbcon.IsConnected())
return
var/serverip = "[world.internet_address]:[world.port]"
@@ -86,7 +86,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
message_admins("[key_name_admin(usr)] attempted to add a ban based on a non-existent mob, with no ckey provided. Report this bug.",1)
return
- var/DBQuery/query = dbcon.NewQuery("SELECT id FROM [format_table_name("player")] WHERE ckey = '[ckey]'")
+ var/DBQuery/query = GLOB.dbcon.NewQuery("SELECT id FROM [format_table_name("player")] WHERE ckey = '[ckey]'")
query.Execute()
var/validckey = 0
if(query.NextRow())
@@ -127,7 +127,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
reason = sanitizeSQL(reason)
if(maxadminbancheck)
- var/DBQuery/adm_query = dbcon.NewQuery("SELECT count(id) AS num FROM [format_table_name("ban")] WHERE (a_ckey = '[a_ckey]') AND (bantype = 'ADMIN_PERMABAN' OR (bantype = 'ADMIN_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)")
+ var/DBQuery/adm_query = GLOB.dbcon.NewQuery("SELECT count(id) AS num FROM [format_table_name("ban")] WHERE (a_ckey = '[a_ckey]') AND (bantype = 'ADMIN_PERMABAN' OR (bantype = 'ADMIN_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)")
adm_query.Execute()
if(adm_query.NextRow())
var/adm_bans = text2num(adm_query.item[1])
@@ -136,7 +136,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
return
var/sql = "INSERT INTO [format_table_name("ban")] (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)"
- var/DBQuery/query_insert = dbcon.NewQuery(sql)
+ var/DBQuery/query_insert = GLOB.dbcon.NewQuery(sql)
query_insert.Execute()
to_chat(usr, "Ban saved to database.")
message_admins("[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1)
@@ -146,7 +146,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
if(kickbannedckey)
if(banned_mob && banned_mob.client && banned_mob.client.ckey == banckey)
- del(banned_mob.client)
+ qdel(banned_mob.client)
if(isjobban)
jobban_client_fullban(ckey, job)
@@ -201,17 +201,17 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "")
sql += " AND job = '[job]'"
establish_db_connection()
- if(!dbcon.IsConnected())
+ if(!GLOB.dbcon.IsConnected())
return
var/ban_id
var/ban_number = 0 //failsafe
- var/DBQuery/query = dbcon.NewQuery(sql)
+ var/DBQuery/query = GLOB.dbcon.NewQuery(sql)
query.Execute()
while(query.NextRow())
ban_id = query.item[1]
- ban_number++;
+ ban_number++
if(ban_number == 0)
to_chat(usr, "Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin.")
@@ -241,7 +241,7 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null)
to_chat(usr, "Cancelled")
return
- var/DBQuery/query = dbcon.NewQuery("SELECT ckey, duration, reason, job FROM [format_table_name("ban")] WHERE id = [banid]")
+ var/DBQuery/query = GLOB.dbcon.NewQuery("SELECT ckey, duration, reason, job FROM [format_table_name("ban")] WHERE id = [banid]")
query.Execute()
var/eckey = usr.ckey //Editing admin ckey
@@ -271,7 +271,7 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null)
to_chat(usr, "Cancelled")
return
- var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("ban")] SET reason = '[value]', edits = CONCAT(edits,'- [eckey] changed ban reason from \\\"[reason]\\\" to \\\"[value]\\\" ') WHERE id = [banid]")
+ var/DBQuery/update_query = GLOB.dbcon.NewQuery("UPDATE [format_table_name("ban")] SET reason = '[value]', edits = CONCAT(edits,'- [eckey] changed ban reason from \\\"[reason]\\\" to \\\"[value]\\\" ') WHERE id = [banid]")
update_query.Execute()
message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s reason from [reason] to [value]",1)
if("duration")
@@ -281,7 +281,7 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null)
to_chat(usr, "Cancelled")
return
- var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("ban")] SET duration = [value], edits = CONCAT(edits,'- [eckey] changed ban duration from [duration] to [value] '), expiration_time = DATE_ADD(bantime, INTERVAL [value] MINUTE) WHERE id = [banid]")
+ var/DBQuery/update_query = GLOB.dbcon.NewQuery("UPDATE [format_table_name("ban")] SET duration = [value], edits = CONCAT(edits,'- [eckey] changed ban duration from [duration] to [value] '), expiration_time = DATE_ADD(bantime, INTERVAL [value] MINUTE) WHERE id = [banid]")
message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s duration from [duration] to [value]",1)
update_query.Execute()
if("unban")
@@ -304,17 +304,17 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
var/sql = "SELECT ckey FROM [format_table_name("ban")] WHERE id = [id]"
establish_db_connection()
- if(!dbcon.IsConnected())
+ if(!GLOB.dbcon.IsConnected())
return
var/ban_number = 0 //failsafe
var/pckey
- var/DBQuery/query = dbcon.NewQuery(sql)
+ var/DBQuery/query = GLOB.dbcon.NewQuery(sql)
query.Execute()
while(query.NextRow())
pckey = query.item[1]
- ban_number++;
+ ban_number++
if(ban_number == 0)
to_chat(usr, "Database update failed due to a ban id not being present in the database.")
@@ -334,7 +334,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
var/sql_update = "UPDATE [format_table_name("ban")] SET unbanned = 1, unbanned_datetime = Now(), unbanned_ckey = '[unban_ckey]', unbanned_computerid = '[unban_computerid]', unbanned_ip = '[unban_ip]' WHERE id = [id]"
message_admins("[key_name_admin(usr)] has lifted [pckey]'s ban.",1)
- var/DBQuery/query_update = dbcon.NewQuery(sql_update)
+ var/DBQuery/query_update = GLOB.dbcon.NewQuery(sql_update)
query_update.Execute()
flag_account_for_forum_sync(pckey)
@@ -359,7 +359,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
if(!check_rights(R_BAN)) return
establish_db_connection()
- if(!dbcon.IsConnected())
+ if(!GLOB.dbcon.IsConnected())
to_chat(usr, "Failed to establish database connection")
return
@@ -392,13 +392,13 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
output += ""
for(var/j in get_all_jobs())
output += ""
- for(var/j in nonhuman_positions)
+ for(var/j in GLOB.nonhuman_positions)
output += ""
- for(var/j in other_roles)
+ for(var/j in GLOB.other_roles)
output += ""
for(var/j in list("commanddept","securitydept","engineeringdept","medicaldept","sciencedept","supportdept","nonhumandept"))
output += ""
- for(var/j in list("Syndicate") + antag_roles)
+ for(var/j in list("Syndicate") + GLOB.antag_roles)
output += ""
output += ""
output += "Reason: