diff --git a/.gitattributes b/.gitattributes index 8a313292bb1..dd93bd68018 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ *.dmm merge=merge-dmm + diff --git a/_maps/RandomZLevels/centcomAway.dmm b/_maps/RandomZLevels/centcomAway.dmm index 38f86e30290..e47775466b6 100644 --- a/_maps/RandomZLevels/centcomAway.dmm +++ b/_maps/RandomZLevels/centcomAway.dmm @@ -282,7 +282,7 @@ "fv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general) "fw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general) "fx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general) -"fy" = (/obj/structure/sign/greencross,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/general) +"fy" = (/obj/structure/sign/bluecross_2,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/general) "fz" = (/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/awaymission/centcomAway/general) "fA" = (/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor{icon_state = "floor"},/area/awaymission/centcomAway/general) "fB" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "floor"},/area/awaymission/centcomAway/general) @@ -368,7 +368,7 @@ "hd" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar) "he" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/awaymission/centcomAway/hangar) "hf" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar) -"hg" = (/obj/structure/table,/obj/item/weapon/cable_coil,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar) +"hg" = (/obj/structure/table,/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar) "hh" = (/obj/structure/closet/body_bag,/turf/simulated/floor{icon_state = "engine"},/area/awaymission/centcomAway/general) "hi" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/general) "hj" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/PDAs,/turf/simulated/floor{icon_state = "floor"},/area/awaymission/centcomAway/general) diff --git a/_maps/RandomZLevels/stationCollision.dmm b/_maps/RandomZLevels/stationCollision.dmm index 2000f8617a3..f25531c9396 100644 --- a/_maps/RandomZLevels/stationCollision.dmm +++ b/_maps/RandomZLevels/stationCollision.dmm @@ -204,7 +204,7 @@ "dV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/awaymission/northblock) "dW" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "dX" = (/obj/item/weapon/table_parts,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) -"dY" = (/obj/structure/table,/obj/item/weapon/cable_coil{amount = 5},/obj/item/weapon/screwdriver,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) +"dY" = (/obj/structure/table,/obj/item/stack/cable_coil{amount = 5},/obj/item/weapon/screwdriver,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "dZ" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "ea" = (/obj/machinery/light,/obj/structure/computerframe{anchored = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "eb" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) @@ -248,7 +248,7 @@ "eN" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "North Block APC"; pixel_x = 28},/obj/structure/cable,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/awaymission/northblock) "eO" = (/obj/structure/window/reinforced,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/northblock) "eP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/awaymission/northblock) -"eQ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/grown/potato,/obj/item/weapon/cable_coil{amount = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) +"eQ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/grown/potato,/obj/item/stack/cable_coil{amount = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "eR" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "eS" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/computerframe{anchored = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "eT" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/book/manual/research_and_development,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) @@ -271,7 +271,7 @@ "fk" = (/obj/structure/table,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/northblock) "fl" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/awaymission/northblock) "fm" = (/obj/machinery/door/airlock/gold{name = "Airlock"},/turf/simulated/floor,/area/awaymission/northblock) -"fn" = (/obj/structure/table,/obj/item/weapon/cable_coil,/obj/item/weapon/cable_coil{pixel_x = -3; pixel_y = 5},/obj/item/weapon/cell/crap,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) +"fn" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 5},/obj/item/weapon/stock_parts/cell/crap,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "fo" = (/obj/structure/table,/obj/item/weapon/stock_parts/matter_bin{pixel_x = 3},/obj/item/weapon/stock_parts/matter_bin{pixel_x = -3},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "fp" = (/obj/machinery/door/window/eastleft{name = "Windoor"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) "fq" = (/obj/structure/target_stake,/obj/item/target/syndicate,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research) @@ -362,7 +362,7 @@ "gX" = (/obj/effect/decal/remains/human,/turf/simulated/floor{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/awaymission/arrivalblock) "gY" = (/obj/machinery/computer/security,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/awaymission/arrivalblock) "gZ" = (/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/awaymission/arrivalblock) -"ha" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/melee/baton,/obj/item/clothing/head/helmet/warden,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/awaymission/arrivalblock) +"ha" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/melee/baton,/obj/item/clothing/head/helmet/warden,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/awaymission/arrivalblock) "hb" = (/obj/structure/closet/wardrobe/red,/obj/machinery/light{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/awaymission/arrivalblock) "hc" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/awaymission/arrivalblock) "hd" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor{icon_state = "red"; dir = 5},/area/awaymission/arrivalblock) @@ -481,7 +481,7 @@ "jm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "jn" = (/obj/item/ammo_casing/a12mm{pixel_y = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "jo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) -"jp" = (/obj/structure/sign/redcross{pixel_y = -32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) +"jp" = (/obj/structure/sign/bluecross{pixel_y = -32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "jq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "jr" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "js" = (/obj/item/clothing/head/helmet/space/syndicate,/turf/simulated/floor/airless,/area/awaymission/southblock) diff --git a/_maps/map_files/MetaStation.v39G.dmm b/_maps/map_files/MetaStation.v39I.dmm similarity index 97% rename from _maps/map_files/MetaStation.v39G.dmm rename to _maps/map_files/MetaStation.v39I.dmm index 91b92f4ed46..d847d78cb8f 100644 --- a/_maps/map_files/MetaStation.v39G.dmm +++ b/_maps/map_files/MetaStation.v39I.dmm @@ -32,7 +32,7 @@ "aaF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space) "aaG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/camera{c_tag = "Labor Shuttle Control Desk"; dir = 4},/obj/machinery/computer/shuttle/labor,/obj/machinery/light{dir = 8},/obj/machinery/door_control{id = "prison release"; name = "Prison Release Lockdown"; pixel_x = -28; pixel_y = 0; req_access_txt = "2"},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) "aaH" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fore) -"aaI" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aaI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aaJ" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "aaK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/maintenance/fore) "aaL" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape_pod3/station) @@ -91,7 +91,7 @@ "abM" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plating,/area/maintenance/fore) "abN" = (/obj/structure/stool/bed/chair,/turf/simulated/floor{icon_state = "grimy"},/area/security/main) "abO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboard) -"abP" = (/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"abP" = (/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "abQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/security/warden) "abR" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/woodentable,/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1424; listening = 1; name = "Interrogation Intercom"; pixel_x = 0; pixel_y = -31},/turf/simulated/floor{icon_state = "grimy"},/area/security/main) "abS" = (/obj/structure/closet/crate/medical,/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -102,7 +102,7 @@ "abX" = (/obj/structure/rack,/obj/item/clothing/suit/hazardvest,/turf/simulated/floor/plating,/area/maintenance/fore) "abY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/solar/auxport) "abZ" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fore) -"aca" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "bot"},/area/hallway/secondary/construction{name = "\improper Garden"}) +"aca" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "acb" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/starboard) "acc" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/flasher{id = "PCell 3"; pixel_x = -28},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "acd" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) @@ -118,8 +118,8 @@ "acn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/starboard) "aco" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/starboard) "acp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"acq" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"},/obj/machinery/door_control{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"acr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"acq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"acr" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "acs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/fore) "act" = (/obj/machinery/door/airlock/glass_security{name = "Long-Term Cell 3"; req_access_txt = "2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "acu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/fore) @@ -201,7 +201,7 @@ "adS" = (/obj/structure/table/woodentable,/obj/item/weapon/paper,/turf/simulated/floor{icon_state = "neutral"; dir = 10},/area/crew_quarters/courtroom) "adT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Brig Control"; req_access_txt = "3"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "delivery"},/area/security/warden) "adU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) -"adV" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"},/obj/machinery/door_control{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"adV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "adW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/security/brig) "adX" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/ears/earmuffs,/obj/item/clothing/tie/red,/obj/item/clothing/head/soft/red,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "adY" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fore) @@ -222,7 +222,7 @@ "aen" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) "aeo" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 22},/obj/machinery/computer/crew,/obj/machinery/firealarm{dir = 4; pixel_x = 28},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) "aep" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "grimy"},/area/security/main) -"aeq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aeq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aer" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/security/brig) "aes" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/structure/disposaloutlet{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/disposal) "aet" = (/obj/structure/rack,/obj/item/clothing/suit/poncho,/obj/item/clothing/head/sombrero,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -234,7 +234,7 @@ "aez" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/effect/landmark/start{name = "Security Officer"},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 1},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/main) "aeA" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) "aeB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) -"aeC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aeC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aeD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fore) "aeE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) "aeF" = (/obj/structure/closet/secure_closet/warden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) @@ -252,7 +252,7 @@ "aeR" = (/obj/machinery/disposal,/obj/machinery/light_switch{pixel_x = 0; pixel_y = -26},/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/camera{c_tag = "Fitness Room - Aft"; dir = 1},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "aeS" = (/obj/structure/sign/poster{pixel_y = -32},/obj/item/weapon/vending_refill/cigarette,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aeT" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"aeU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aeU" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"},/obj/machinery/door_control{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aeV" = (/obj/machinery/vending/coffee,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "aeW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/wall,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "aeX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore) @@ -275,7 +275,7 @@ "afo" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor,/area/security/main) "afp" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "redfull"},/area/security/main) "afq" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/storage/secure/briefcase,/turf/simulated/floor,/area/security/main) -"afr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/starboard) +"afr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/engine/gravity_generator) "afs" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/machinery/newscaster/security_unit{pixel_x = 32; pixel_y = 1},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -3; pixel_y = 5},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -3; pixel_y = 5},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) "aft" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "redfull"},/area/security/main) "afu" = (/obj/machinery/light_construct/small,/obj/item/weapon/toolbox_tiles_sensor,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -338,7 +338,7 @@ "agz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "agA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{dir = 8; icon_state = "whiteredcorner"},/area/security/brig) "agB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access_txt = "0"; req_one_access_txt = "1;4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/security/range) -"agC" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/machinery/light_construct/small{dir = 1},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/starboard) +"agC" = (/turf/simulated/wall,/area/engine/gravity_generator) "agD" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -3; pixel_y = 5},/obj/item/weapon/packageWrap,/turf/simulated/floor,/area/security/main) "agE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "agF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) @@ -633,7 +633,7 @@ "ami" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck) "amj" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/crew_quarters/sleep) "amk" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engine/engineering) -"aml" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/engineering) +"aml" = (/turf/simulated/wall/r_wall,/area/engine/gravity_generator) "amm" = (/obj/machinery/power/apc{dir = 2; name = "Disposal APC"; pixel_x = 0; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/disposal) "amn" = (/turf/simulated/floor/plating,/area/maintenance/disposal) "amo" = (/obj/machinery/power/apc{dir = 8; name = "Fore Port Solar APC"; pixel_x = -25; pixel_y = 3},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) @@ -655,7 +655,7 @@ "amE" = (/obj/structure/stool/bed/chair,/obj/machinery/flasher{id = "holdingflash"; pixel_x = -25},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) "amF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) "amG" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) -"amH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/hydroponics/constructable,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) +"amH" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "amI" = (/obj/structure/stool/bed/chair,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) "amJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/security/brig) "amK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/brig) @@ -676,7 +676,7 @@ "amZ" = (/obj/machinery/conveyor{dir = 2; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "ana" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "anb" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport) -"anc" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) +"anc" = (/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Room"; req_access_txt = "19;23"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/gravity_generator) "and" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "ane" = (/turf/simulated/wall,/area/security/detectives_office) "anf" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) @@ -689,7 +689,7 @@ "anm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "ann" = (/obj/structure/closet/secure_closet/engineering_personal,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "ano" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) -"anp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"anp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "anq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/sleep) "anr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/sleep) "ans" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fore) @@ -823,7 +823,7 @@ "apQ" = (/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/courtroom) "apR" = (/obj/item/weapon/grown/log,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "apS" = (/obj/machinery/door/window/southright{dir = 4; name = "Engineering Deliveries"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) -"apT" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/light_switch{pixel_x = 23},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/machinery/shower{dir = 8; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (WEST)"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/engine/engineering) +"apT" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/gravity_generator) "apU" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering) "apV" = (/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "apW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = null; req_access_txt = "0"; req_one_access_txt = "1;4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) @@ -893,7 +893,7 @@ "ari" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"; pipe_color = "blue"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard) "arj" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light/small,/turf/simulated/floor/wood,/area/crew_quarters/sleep) "ark" = (/obj/machinery/door/airlock/maintenance{name = "Disposal Access"; req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) -"arl" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"arl" = (/obj/machinery/door/airlock/glass{name = "space-bridge access"},/obj/machinery/door_control{id = "supplybridge"; name = "Shuttle Bay Space Bridge Control"; pixel_x = 0; pixel_y = 27; req_access_txt = "0"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "arm" = (/obj/structure/stool/bed/chair/wood/normal{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep) "arn" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aro" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fore) @@ -925,12 +925,12 @@ "arO" = (/obj/structure/rack,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/plating,/area/maintenance/starboard) "arP" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -26},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/courtroom) "arQ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/starboard) -"arR" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Engineering"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "bot"},/area/maintenance/starboard) +"arR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/table,/obj/item/weapon/paper/gravity_gen{layer = 3},/obj/item/weapon/pen/blue,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/gravity_generator) "arS" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "arT" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/weapon/crowbar/red,/obj/item/weapon/grenade/empgrenade,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "arU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/light/small{dir = 1},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/structure/dresser,/turf/simulated/floor/carpet,/area/crew_quarters/sleep) -"arV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"arW" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Engineering Maintenance"; req_access_txt = "10"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/starboard) +"arV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"arW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/engine/gravity_generator) "arX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "arY" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboard) "arZ" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/security/brig) @@ -971,7 +971,7 @@ "asI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) "asJ" = (/obj/machinery/atmospherics/pipe/simple/general/hidden,/turf/simulated/floor{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) "asK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"asL" = (/obj/structure/table,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"asL" = (/obj/structure/rack,/obj/item/weapon/book/manual/wiki/engineering_guide{pixel_x = 3; pixel_y = 4},/turf/simulated/floor/plating,/area/maintenance/starboard) "asM" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard) "asN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "asO" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/machinery/camera{c_tag = "Dormitories - Fore"; dir = 8},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep) @@ -993,8 +993,8 @@ "ate" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"}) "atf" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/starboard) "atg" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/starboard) -"ath" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"; pipe_color = "blue"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard) -"ati" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboard) +"ath" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/power/terminal,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/gravity_generator) +"ati" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/gravity_generator) "atj" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard) "atk" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboard) "atl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -1238,7 +1238,7 @@ "axP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "axQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/prison) "axR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/prison) -"axS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"axS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "axT" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/door_control{id = "FitnessShower"; name = "Lock Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/structure/mirror{pixel_x = -28},/obj/machinery/light/small,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "axU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera{c_tag = "Fitness Room - Fore"; dir = 2},/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "axV" = (/obj/machinery/door/poddoor/shutters{id = "qm_mine_warehouse"; name = "Warehouse Shutters"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) @@ -1265,7 +1265,7 @@ "ayq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/quartermaster/miningdock{name = "\improper Mining Office"}) "ayr" = (/obj/machinery/door_control{id = "qm_mine_warehouse"; name = "Warehouse Door Control"; pixel_x = 24; pixel_y = 28; req_access_txt = "48"},/turf/simulated/floor{dir = 4; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "ays" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"ayt" = (/obj/machinery/camera{c_tag = "Prison Chamber"; network = list("SS13","Prison")},/turf/simulated/floor,/area/security/prison) +"ayt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "ayu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/starboard) "ayv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "ayw" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) @@ -1436,14 +1436,14 @@ "aBF" = (/obj/machinery/flasher/portable,/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/security/warden) "aBG" = (/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) "aBH" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/secure/briefcase{pixel_x = -2},/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/cartridge/detective,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/security/hos) -"aBI" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor,/area/engine/break_room) -"aBJ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/goonplaque{desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding. The station model number is MSv39G:140319"},/area/hallway/primary/port) +"aBI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aBJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/gravity_generator) "aBK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/wall,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "aBL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/fore) "aBM" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "aBN" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/handcuffs,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = -30},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/fore) "aBO" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/security{name = "Security-Storage Backroom"; req_access = null; req_access_txt = "63"},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/fore) -"aBP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aBP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/maintenance_hatch{name = "Supply Bay Bridge Access"; req_access_txt = "0"; req_one_access_txt = "0"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aBQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Courtroom"; opacity = 1},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/courtroom) "aBR" = (/obj/machinery/light/small,/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/fore) "aBS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "browncorner"},/area/construction/Storage{name = "Storage Wing"}) @@ -1528,7 +1528,7 @@ "aDt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "browncorner"},/area/construction/Storage{name = "Storage Wing"}) "aDu" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aDv" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/machinery/alarm{pixel_y = 28},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) -"aDw" = (/obj/structure/closet{name = "Contraband Locker"},/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) +"aDw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engine/gravity_generator) "aDx" = (/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) "aDy" = (/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/engineering) "aDz" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) @@ -1563,7 +1563,7 @@ "aEc" = (/obj/machinery/space_heater,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aEd" = (/obj/effect/landmark{name = "JoinLate"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aEe" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor{icon_state = "dark"},/area/security/hos) -"aEf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/table,/obj/machinery/microwave{pixel_x = 0; pixel_y = 4},/obj/machinery/camera{c_tag = "Engineering - Foyer - Port"; dir = 1; network = list("SS13")},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/engine/break_room) +"aEf" = (/obj/machinery/camera{c_tag = "Prison Chamber"; network = list("SS13","Prison")},/obj/item/device/radio/intercom{desc = "Talk through this. It looks like it has been modified to not broadcast."; dir = 2; name = "Prison Intercom (General)"; pixel_x = 0; pixel_y = 24; prison_radio = 1},/turf/simulated/floor,/area/security/prison) "aEg" = (/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "aEh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/break_room) "aEi" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) @@ -1790,7 +1790,7 @@ "aIv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor,/area/hallway/primary/fore) "aIw" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/device/multitool,/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"}) "aIx" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/bikehorn/rubberducky,/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/obj/item/weapon/card/id/captains_spare,/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) -"aIy" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/turf/simulated/floor{icon_state = "bot"},/area/hallway/secondary/construction{name = "\improper Garden"}) +"aIy" = (/obj/machinery/camera{c_tag = "Maltese Falcon - Bar"; dir = 2; network = list("SS13")},/obj/machinery/requests_console{department = "Bar"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/table,/obj/item/weapon/reagent_containers/glass/rag{pixel_y = 5},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "aIz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) "aIA" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "aIB" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/janitor) @@ -2380,7 +2380,7 @@ "aTN" = (/obj/structure/rack,/obj/item/clothing/gloves/fyellow,/turf/simulated/floor/plating,/area/maintenance/starboard) "aTO" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; icon_state = "intact-g"; level = 2},/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; dir = 4; icon_state = "intact-c"; level = 2},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/storage) "aTP" = (/obj/structure/table,/obj/item/clothing/gloves/fyellow,/obj/item/device/gps,/turf/simulated/floor{dir = 9; icon_state = "brown"},/area/storage/primary) -"aTQ" = (/obj/machinery/camera{c_tag = "Bar"; dir = 2; network = list("SS13")},/obj/machinery/requests_console{department = "Bar"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/table,/obj/item/weapon/reagent_containers/glass/rag{pixel_y = 5},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) +"aTQ" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Maltese Falcon - Gambling Den Fore"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "aTR" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Custodial Closet"; req_access_txt = "26"},/turf/simulated/floor,/area/janitor) "aTS" = (/obj/structure/transit_tube,/obj/structure/lattice,/turf/space,/area/space) "aTT" = (/obj/machinery/vending/boozeomat,/turf/simulated/wall,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) @@ -2459,7 +2459,7 @@ "aVo" = (/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/structure/table,/turf/simulated/floor{dir = 8; icon_state = "caution"},/area/maintenance/storage) "aVp" = (/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark/start{name = "Head of Personnel"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = 38; pixel_y = -4},/obj/machinery/door_control{id = "hopqueue"; name = "Queue Shutters Control"; pixel_x = 25; pixel_y = -4; req_access_txt = "28"},/obj/machinery/door_control{id = "hop"; name = "Privacy Shutters Control"; pixel_x = 25; pixel_y = 6; req_access_txt = "28"},/obj/machinery/flasher_button{id = "hopflash"; pixel_x = 38; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/heads) "aVq" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/heads) -"aVr" = (/obj/machinery/camera/autoname{dir = 2; network = list("SS13","RD")},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"aVr" = (/obj/machinery/computer/arcade,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "aVs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/central) "aVt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/primary/central) "aVu" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "dark"},/area/security/hos) @@ -2489,13 +2489,13 @@ "aVS" = (/obj/structure/table/woodentable,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Personnel's Desk"; departmentType = 5; name = "Head of Personnel RC"; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/item/weapon/storage/secure/briefcase,/turf/simulated/floor/wood,/area/crew_quarters/heads) "aVT" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/hop,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/heads) "aVU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) -"aVV" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/autoname{dir = 2; network = list("SS13","RD")},/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) -"aVW" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/maintenance/starboard) +"aVV" = (/obj/machinery/disposal{pixel_x = 2; pixel_y = 2},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/wood,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) +"aVW" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "aVX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_Toxins = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "aVY" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Maltese Falcon APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "aVZ" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 29},/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint/engineering) "aWa" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central) -"aWb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"aWb" = (/turf/simulated/floor/wood,/area/crew_quarters/bar) "aWc" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/wall/r_wall,/area/tcommsat/computer{name = "\improper Telecoms Control Room"}) "aWd" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/bridge) "aWe" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/storage/primary) @@ -2566,10 +2566,10 @@ "aXr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/hallway/primary/port) "aXs" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "aXt" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/hallway/primary/central) -"aXu" = (/obj/machinery/computer/arcade,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/maintenance/starboard) -"aXv" = (/obj/machinery/disposal{pixel_x = 2; pixel_y = 2},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/wood,/area/maintenance/starboard) +"aXu" = (/obj/structure/table,/turf/simulated/floor,/area/engine/break_room) +"aXv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/goonplaque{desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding. The station model number is MSv39I:140323"},/area/hallway/primary/port) "aXw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet,/area/crew_quarters/heads) -"aXx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/maintenance/starboard) +"aXx" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = 0; pixel_y = 4},/obj/machinery/camera{c_tag = "Engineering - Foyer - Port"; dir = 1; network = list("SS13")},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/engine/break_room) "aXy" = (/obj/structure/lattice,/obj/structure/grille,/turf/simulated/wall/r_wall,/area/space) "aXz" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/pill_bottle/dice,/obj/structure/sign/maltesefalcon/left{pixel_y = 32},/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/carpet,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "aXA" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) @@ -2608,8 +2608,8 @@ "aYh" = (/turf/simulated/wall,/area/storage/primary) "aYi" = (/obj/machinery/light{dir = 4},/obj/machinery/camera/autoname{dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/carpet,/area/library) "aYj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) -"aYk" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/obj/item/clothing/mask/gas,/obj/machinery/alarm{pixel_y = 23},/obj/structure/table,/turf/simulated/floor{dir = 9; icon_state = "caution"},/area/maintenance/storage) -"aYl" = (/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/structure/table,/turf/simulated/floor{dir = 1; icon_state = "caution"},/area/maintenance/storage) +"aYk" = (/obj/machinery/firealarm{dir = 4; pixel_x = 28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/stool/bed/chair/office/light,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/gravity_generator) +"aYl" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator) "aYm" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/light_switch{pixel_x = 28; pixel_y = 0},/turf/simulated/floor/wood,/area/bridge) "aYn" = (/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/break_room) "aYo" = (/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library) @@ -3049,7 +3049,7 @@ "bgG" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorint.dmi'; name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/starboard) "bgH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard) "bgI" = (/obj/structure/table,/obj/item/weapon/airlock_painter,/turf/simulated/floor,/area/storage/art) -"bgJ" = (/obj/machinery/hydroponics/constructable,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/engine/break_room) +"bgJ" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/engine/break_room) "bgK" = (/obj/structure/transit_tube{tag = "icon-S-NE"; icon_state = "S-NE"},/obj/structure/lattice,/turf/space,/area/space) "bgL" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "bgM" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard) @@ -3308,7 +3308,7 @@ "blF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep) "blG" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1; name = "command chair"},/turf/simulated/floor/carpet,/area/bridge) "blH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/machinery/camera{c_tag = "Dormitories - Aft"; dir = 4},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/sleep) -"blI" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"blI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "blJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep) "blK" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/obj/item/weapon/storage/secure/briefcase{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/lockbox/medal{pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "blL" = (/obj/machinery/light{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/status_display{density = 0; pixel_x = 32; pixel_y = 0; supply_display = 1},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/quartermaster/storage) @@ -3356,7 +3356,7 @@ "bmB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/hallway/primary/port) "bmC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/port) "bmD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/hallway/primary/port) -"bmE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) +"bmE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Gravity Generator APC"; pixel_x = -25; pixel_y = 1},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/gravity_generator) "bmF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Storage"; req_access_txt = "32"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engine/engineering) "bmG" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/port) "bmH" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engineering) @@ -3480,7 +3480,7 @@ "boV" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/obj/machinery/door/window{base_state = "right"; icon_state = "right"; name = "Captain's Desk"; req_access_txt = "20"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/disposalpipe/segment,/obj/item/weapon/stamp/captain,/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "boW" = (/obj/structure/table/woodentable,/obj/item/weapon/hand_tele,/obj/structure/window/reinforced,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 27; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "boX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Port Primary Hallway"},/turf/simulated/floor,/area/hallway/primary/port) -"boY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) +"boY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator) "boZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) "bpa" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/hallway/primary/central) "bpb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central) @@ -3609,7 +3609,7 @@ "bru" = (/obj/machinery/power/apc{dir = 4; name = "Arrivals APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "brv" = (/obj/structure/closet/secure_closet/security/cargo,/obj/machinery/light_switch{pixel_x = -25; pixel_y = 0},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/checkpoint/supply{name = "Security Post - Cargo"}) "brw" = (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/reagent_containers/spray/pestspray{pixel_x = 3; pixel_y = 4},/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh{pixel_x = 2; pixel_y = 1},/obj/structure/table,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"}) -"brx" = (/obj/machinery/camera{c_tag = "Medbay Storage"; dir = 8; network = list("SS13","Medbay")},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_x = 30; pixel_y = 0; pixel_z = 0},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) +"brx" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor{icon_state = "bot"},/area/hallway/secondary/construction{name = "\improper Garden"}) "bry" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor,/area/hallway/secondary/entry{name = "Arrivals"}) "brz" = (/obj/machinery/firealarm{pixel_y = 27},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/quartermaster/storage) "brA" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/clothing/suit/apron,/obj/item/clothing/head/greenbandana,/obj/item/clothing/head/greenbandana,/obj/item/clothing/tie/armband/hydro,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hydroponics) @@ -3619,7 +3619,7 @@ "brE" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/hallway/primary/port) "brF" = (/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{icon_state = "neutral"; dir = 9},/area/hallway/primary/central) "brG" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/turf/simulated/floor{dir = 5; icon_state = "neutral"},/area/hallway/primary/central) -"brH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/hallway/primary/aft) +"brH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "brI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor,/area/hallway/primary/aft) "brJ" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/camera{c_tag = "MiniSat Exterior Starboard"; dir = 4; network = list("MiniSat")},/turf/simulated/floor{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "brK" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 30},/obj/structure/showcase{density = 0; desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; dir = 8; icon = 'icons/mob/robots.dmi'; icon_state = "robot_old"; name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 30; pixel_y = 0},/obj/machinery/camera{c_tag = "MiniSat Exterior Access Fore"; dir = 2; network = list("MiniSat")},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/construction/hallway{name = "\improper MiniSat Exterior"}) @@ -3704,7 +3704,7 @@ "btl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) "btm" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "btn" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/engine/engineering) -"bto" = (/obj/structure/table,/obj/item/device/healthanalyzer,/obj/machinery/firealarm{dir = 4; pixel_x = 26; pixel_y = 28},/obj/item/stack/medical/ointment,/obj/item/stack/medical/bruise_pack,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"bto" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "btp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "btq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/checkpoint/supply{name = "Security Post - Cargo"}) "btr" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "brown"},/area/storage/primary) @@ -3786,7 +3786,7 @@ "buP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/starboard) "buQ" = (/turf/simulated/wall,/area/security/vacantoffice) "buR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/security/vacantoffice) -"buS" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"buS" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "buT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/engine/engineering) "buU" = (/obj/machinery/light_switch,/turf/simulated/wall,/area/engine/engineering) "buV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engine/engineering) @@ -3863,7 +3863,7 @@ "bwo" = (/obj/machinery/photocopier,/obj/machinery/camera{c_tag = "Law Office"; dir = 8; network = list("SS13")},/turf/simulated/floor/wood,/area/lawoffice) "bwp" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/wall/r_wall,/area/turret_protected/ai) "bwq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"bwr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bwr" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"; pipe_color = "blue"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "bws" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/wall/r_wall,/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bwt" = (/turf/simulated/wall,/area/engine/engineering) "bwu" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/stamp/qm{pixel_x = 0; pixel_y = 0},/obj/machinery/status_display{density = 0; pixel_x = 32; pixel_y = 0; supply_display = 1},/turf/simulated/floor,/area/quartermaster/qm) @@ -3887,7 +3887,7 @@ "bwM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "L5"},/area/hallway/primary/central) "bwN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/crew_quarters/locker) "bwO" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/crew_quarters/locker) -"bwP" = (/obj/machinery/power/apc{dir = 1; name = "Cryogenics APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/cryo) +"bwP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bwQ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bwR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Fore Primary Hallway"},/turf/simulated/floor,/area/hallway/primary/fore) "bwS" = (/obj/machinery/door/airlock/hatch{icon_state = "door_closed"; name = "MiniSat Central Foyer"; req_one_access_txt = "32;19"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/tcomwest{name = "\improper MiniSat West Wing"}) @@ -3976,7 +3976,7 @@ "byx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) "byy" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/machinery/computer/security/mining,/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/checkpoint/supply{name = "Security Post - Cargo"}) "byz" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/medical/surgery) -"byA" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "whitegreencorner"},/area/medical/sleeper{name = "Sleepers"}) +"byA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hydroponics/constructable,/turf/simulated/floor{icon_state = "bot"},/area/hallway/secondary/construction{name = "\improper Garden"}) "byB" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{icon_state = "delivery"},/area/medical/sleeper{name = "Sleepers"}) "byC" = (/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) "byD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/hallway/primary/central) @@ -3993,7 +3993,7 @@ "byO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "byP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor,/area/crew_quarters/courtroom) "byQ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"}) -"byR" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/sleeper{name = "Sleepers"}) +"byR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "byS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) "byT" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/atmospherics/binary/pump{dir = 0; icon_state = "intact_off"; name = "Air to Port"; on = 0},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/storage) "byU" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) @@ -4056,7 +4056,7 @@ "bzZ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/brig) "bAa" = (/obj/machinery/door/airlock{id_tag = "Toilet1"; name = "Unit 1"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "bAb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/engine/engineering) -"bAc" = (/obj/machinery/light/small{dir = 1},/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = -3},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"bAc" = (/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/obj/structure/table,/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/camera{c_tag = "Research and Development"; dir = 8; network = list("SS13","RD")},/turf/simulated/floor,/area/toxins/lab) "bAd" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes{capacity = 9e+006; charge = 1e+006},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/engine/chiefs_office) "bAe" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/stool{pixel_y = 8},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "bAf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_Toxins = 0},/obj/structure/table,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/airlock_electronics,/obj/item/device/assembly/timer{pixel_x = -4; pixel_y = 2},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) @@ -4070,7 +4070,7 @@ "bAn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/security/brig) "bAo" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bAp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) -"bAq" = (/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/obj/structure/table,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor,/area/toxins/lab) +"bAq" = (/turf/simulated/floor{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "bAr" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor{icon_state = "redfull"},/area/maintenance/storage) "bAs" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access_txt = "10"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "bAt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) @@ -4142,7 +4142,7 @@ "bBH" = (/obj/structure/window/reinforced{dir = 1; pixel_y = 0},/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bBI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor{dir = 8; icon_state = "loadingarea"; tag = "loading"},/area/quartermaster/storage) "bBJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/toxins/lab) -"bBK" = (/obj/structure/rack,/obj/item/weapon/hatchet,/obj/item/weapon/butch,/turf/simulated/floor/plating,/area/maintenance/starboard) +"bBK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator) "bBL" = (/obj/machinery/camera{c_tag = "AI Chamber - Fore"; dir = 2; network = list("SS13","MiniSat","RD")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bBM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/central) "bBN" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/machinery/camera{c_tag = "Central Primary Hallway - Fore - AI Upload"; dir = 2; network = list("SS13")},/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/hallway/primary/central) @@ -4170,7 +4170,7 @@ "bCj" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bCk" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - O2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) "bCl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) -"bCm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bCm" = (/obj/machinery/power/apc{dir = 1; name = "Cryogenics APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/cryo) "bCn" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/toxins/lab) "bCo" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "bCp" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/engine/engineering) @@ -4191,7 +4191,7 @@ "bCE" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - N2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/maintenance/storage) "bCF" = (/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bCG" = (/turf/simulated/wall/r_wall,/area/gateway) -"bCH" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) +"bCH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/engine/gravity_generator) "bCI" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/machinery/camera{c_tag = "Virology - Lab"; dir = 8; network = list("SS13","Medbay")},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/medical/virology) "bCJ" = (/obj/machinery/light/small,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/hallway/secondary/entry{name = "Arrivals"}) "bCK" = (/obj/item/weapon/cartridge/medical{pixel_x = -2; pixel_y = 6},/obj/item/weapon/cartridge/medical{pixel_x = 6; pixel_y = 3},/obj/item/weapon/cartridge/medical,/obj/item/weapon/cartridge/chemistry{pixel_y = 2},/obj/structure/table/reinforced,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) @@ -4203,7 +4203,7 @@ "bCQ" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bCR" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Incinerator"; luminosity = 2; on = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "bCS" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) -"bCT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/medbay2{name = "Medbay Storage"}) +"bCT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/camera{c_tag = "Research Division Hallway - Central"; dir = 2; network = list("SS13","RD")},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bCU" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/courtroom) "bCV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/crew_quarters/locker) "bCW" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -3; pixel_y = 5},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -3; pixel_y = 5},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -3; pixel_y = 5},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/courtroom) @@ -4232,7 +4232,7 @@ "bDt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "bDu" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "bDv" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/engineering_hacking{pixel_x = 4; pixel_y = 5},/obj/item/weapon/book/manual/wiki/engineering_construction{pixel_x = 0; pixel_y = 3},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/weapon/book/manual/engineering_singularity_safety{pixel_x = -4},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) -"bDw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/cryo) +"bDw" = (/obj/structure/table,/obj/structure/sign/bluecross{pixel_y = 32},/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor/plating,/area/maintenance/starboard) "bDx" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engine/engineering) "bDy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering) "bDz" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering) @@ -4251,11 +4251,11 @@ "bDM" = (/obj/structure/rack,/obj/item/weapon/storage/briefcase,/obj/item/weapon/storage/briefcase{pixel_x = 4; pixel_y = -2},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/locker) "bDN" = (/obj/structure/table,/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/obj/item/trash/raisins{pixel_y = 7},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"}) "bDO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/crew_quarters/locker) -"bDP" = (/obj/machinery/door/poddoor{id = "auxincineratorvent"; name = "Auxiliary Incinerator Vent"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) +"bDP" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "Secure Gate"; name = "security blast door"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/engine/gravity_generator) "bDQ" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "bDR" = (/obj/machinery/vending/cola,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/gateway) "bDS" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/toxins/telesci) -"bDT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/machinery/camera{c_tag = "Research Break Room"; dir = 1; network = list("SS13","RD")},/obj/structure/noticeboard{pixel_y = -32},/obj/machinery/light,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"}) +"bDT" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor{dir = 9; icon_state = "whitepurple"},/area/toxins/lab) "bDU" = (/turf/simulated/wall,/area/toxins/telesci) "bDV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"}) "bDW" = (/obj/machinery/computer/security/mining,/turf/simulated/floor,/area/quartermaster/miningdock{name = "\improper Mining Office"}) @@ -4368,11 +4368,11 @@ "bFZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bGa" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/wood,/area/security/vacantoffice) "bGb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"bGc" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) +"bGc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "bGd" = (/obj/machinery/recharger{pixel_y = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "red"; dir = 10},/area/security/checkpoint/supply{name = "Security Post - Cargo"}) "bGe" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/machinery/shower{dir = 8; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (WEST)"},/turf/simulated/floor{dir = 2; icon_state = "whiteyellowcorner"},/area/medical/medbay{name = "Medbay Central"}) "bGf" = (/obj/structure/window/reinforced{dir = 1; pixel_y = 0},/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space) -"bGg" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 28},/obj/machinery/light{dir = 1},/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor{dir = 9; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"bGg" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "whitebluecorner"},/area/medical/sleeper{name = "Sleepers"}) "bGh" = (/turf/simulated/wall,/area/chapel/office) "bGi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/chemistry) "bGj" = (/turf/simulated/floor{dir = 6; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"}) @@ -4381,7 +4381,7 @@ "bGm" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/machinery/light_switch{pixel_x = 24; pixel_y = 24},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/medical/cryo) "bGn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab) "bGo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central) -"bGp" = (/turf/simulated/floor{dir = 2; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) +"bGp" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/sleeper{name = "Sleepers"}) "bGq" = (/obj/structure/closet/secure_closet/miner,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "bGr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) "bGs" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) @@ -4398,8 +4398,8 @@ "bGD" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/poddoor/preopen{id = "telelab"; name = "test chamber blast door"},/turf/simulated/floor/plating,/area/toxins/telesci) "bGE" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/toxins/telesci) "bGF" = (/obj/structure/stool/bed/chair/office/dark,/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = 24; pixel_y = -24},/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/checkpoint/medical) -"bGG" = (/obj/structure/stool/bed/roller,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) -"bGH" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/sleeper{name = "Sleepers"}) +"bGG" = (/obj/structure/stool/bed/roller,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor{dir = 6; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) +"bGH" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "whitebluecorner"},/area/medical/sleeper{name = "Sleepers"}) "bGI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/gateway) "bGJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{glass = 0; icon = 'icons/obj/doors/Doorresearch.dmi'; id_tag = ""; name = "Research Division"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "47"},/turf/simulated/floor{icon_state = "delivery"},/area/medical/research{name = "Research Division"}) "bGK" = (/obj/machinery/door/poddoor/preopen{id = "telelab"; name = "test chamber blast door"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/engine,/area/toxins/telesci) @@ -4417,7 +4417,7 @@ "bGW" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/obj/machinery/newscaster{pixel_y = -29},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central) "bGX" = (/obj/structure/closet/emcloset{pixel_x = -2},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/telesci) "bGY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/gateway) -"bGZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; icon_state = "off"; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) +"bGZ" = (/obj/machinery/door/airlock/glass_command{name = "Gravity Generator Area"; req_access_txt = "19; 61"},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) "bHa" = (/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bHb" = (/obj/machinery/door/airlock{name = "Unit B"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) "bHc" = (/obj/structure/table,/obj/item/device/gps/science,/obj/item/device/gps/science,/obj/item/device/gps/science,/obj/item/device/gps/science,/obj/item/device/gps/science,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/telesci) @@ -4446,7 +4446,7 @@ "bHz" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/white,/turf/simulated/floor/wood,/area/security/vacantoffice) "bHA" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/weapon/storage/secure/briefcase,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) "bHB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) -"bHC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"}) +"bHC" = (/obj/structure/stool/bed/roller,/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = -30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/machinery/camera{c_tag = "Medbay Sleepers"; dir = 4; network = list("SS13","Medbay")},/turf/simulated/floor{dir = 10; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) "bHD" = (/obj/machinery/chem_dispenser,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "bHE" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/medical/ointment,/obj/item/stack/medical/bruise_pack,/obj/item/weapon/reagent_containers/syringe/antitoxin,/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = -1; pixel_y = 2},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) "bHF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table,/obj/item/weapon/folder/blue,/obj/item/weapon/folder/blue,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) @@ -4480,9 +4480,9 @@ "bIh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/hand_labeler_refill,/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) "bIi" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light/small{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bIj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) -"bIk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) +"bIk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/noticeboard{pixel_y = -32},/obj/machinery/light,/obj/machinery/camera{c_tag = "Research Division - Break Room"; dir = 1; network = list("SS13","RD")},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"}) "bIl" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 6},/turf/simulated/floor{dir = 4; icon_state = "yellowfull"; tag = "icon-whitehall (WEST)"},/area/hallway/primary/aft) -"bIm" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/sleeper{name = "Sleepers"}) +"bIm" = (/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/obj/structure/table,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/toxins/lab) "bIn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/turf/simulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry{name = "Arrivals"}) "bIo" = (/obj/item/device/radio/beacon,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/teleporter{name = "\improper Teleporter Room"}) "bIp" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -4492,7 +4492,7 @@ "bIt" = (/obj/item/weapon/book/manual/wiki/engineering_hacking{pixel_x = 4; pixel_y = 5},/obj/item/weapon/book/manual/wiki/engineering_construction{pixel_x = 0; pixel_y = 3},/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/maintenance/starboard) "bIu" = (/obj/structure/table,/obj/item/weapon/hatchet,/obj/item/weapon/minihoe,/obj/item/weapon/crowbar,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"}) "bIv" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/book/manual/wiki/telescience{pixel_y = 8},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/toxins/telesci) -"bIw" = (/obj/machinery/atmospherics/binary/pump{dir = 2; icon_state = "intact_on"; name = "Gas Pump"; on = 1},/obj/structure/lattice,/obj/structure/disposalpipe/segment,/turf/space,/area/space) +"bIw" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "Secure Gate"; name = "security blast door"},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/engine/gravity_generator) "bIx" = (/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/toxins/lab) "bIy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j1"; tag = "icon-pipe-j1 (EAST)"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bIz" = (/obj/structure/kitchenspike,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) @@ -4506,8 +4506,8 @@ "bIH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bII" = (/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/sign/nosmoking_2{pixel_x = 28},/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) "bIJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/turf/simulated/floor{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/entry{name = "Arrivals"}) -"bIK" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/sleeper{name = "Sleepers"}) -"bIL" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"; pipe_color = "blue"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) +"bIK" = (/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/storage/pill_bottle/inaprovaline{pixel_x = 5; pixel_y = -2},/obj/item/weapon/storage/pill_bottle/inaprovaline{pixel_x = 5; pixel_y = -2},/obj/structure/extinguisher_cabinet{pixel_x = 24; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"bIL" = (/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "bIM" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) "bIN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/hallway/primary/central) "bIO" = (/obj/structure/closet/crate,/obj/item/weapon/crowbar/red,/obj/item/weapon/pen,/obj/item/device/flashlight/pen{pixel_x = 4; pixel_y = 3},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -4522,21 +4522,21 @@ "bIX" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bIY" = (/obj/structure/stool/bed/chair,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "bIZ" = (/obj/structure/rack{dir = 1},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/item/weapon/shovel{pixel_x = -5},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) -"bJa" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) +"bJa" = (/obj/structure/stool/bed/roller,/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "bJb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bJc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/toxins/storage) "bJd" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bJe" = (/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/structure/stool/bed/roller,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) "bJf" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -29},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) -"bJg" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) +"bJg" = (/turf/simulated/floor{dir = 2; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "bJh" = (/obj/machinery/mass_driver{dir = 2; id = "chapelgun"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/item/device/gps,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/chapel/main) "bJi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bJj" = (/obj/structure/showcase{density = 0; desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; dir = 2; icon = 'icons/mob/robots.dmi'; icon_state = "robot_old"; name = "Cyborg Statue"; pixel_x = 0; pixel_y = 23},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bJk" = (/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) -"bJl" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"bJl" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "bJm" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central) -"bJn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) -"bJo" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"bJn" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/sleeper{name = "Sleepers"}) +"bJo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) "bJp" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/wood,/area/library) "bJq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bJr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/quartermaster/storage) @@ -4547,10 +4547,10 @@ "bJw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) "bJx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) "bJy" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"},/turf/simulated/floor{dir = 4; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) -"bJz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"bJz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) "bJA" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/construction) "bJB" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 2; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bJC" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 10; icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) +"bJC" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 10; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) "bJD" = (/obj/machinery/atmospherics/trinary/filter{density = 0; dir = 8; req_access = "0"},/turf/simulated/floor{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "bJE" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "bJF" = (/obj/structure/table,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor,/area/construction) @@ -4560,7 +4560,7 @@ "bJJ" = (/obj/structure/closet/firecloset,/turf/simulated/floor,/area/construction) "bJK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/power/apc{dir = 2; name = "Telescience Lab APC"; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) "bJL" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitepurplecorner"},/area/toxins/telesci) -"bJM" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/cryo) +"bJM" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/sleeper{name = "Sleepers"}) "bJN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/toxins/telesci) "bJO" = (/obj/structure/cable/yellow,/obj/machinery/shieldwallgen,/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/teleporter{name = "\improper Teleporter Room"}) "bJP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/gateway) @@ -4577,7 +4577,7 @@ "bKa" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Mining"; departmentType = 0; pixel_x = 0; pixel_y = -30},/turf/simulated/floor{dir = 10; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "bKb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bKc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) -"bKd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bKd" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/cryo) "bKe" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/portsolar) "bKf" = (/obj/structure/table/woodentable,/obj/item/weapon/dice/d20,/obj/item/weapon/dice,/turf/simulated/floor/wood,/area/library) "bKg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/quartermaster/storage) @@ -4591,7 +4591,7 @@ "bKo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bKp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"}) "bKq" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bKr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"bKr" = (/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "bKs" = (/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "bKt" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bKu" = (/obj/machinery/mecha_part_fabricator{dir = 1; id = "0"; name = "counterfeit fabricator"; req_access = "0"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -4623,7 +4623,7 @@ "bKU" = (/obj/structure/window/reinforced,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "air_in"; name = "Mixed Air Supply Control"; output_tag = "air_out"; pressure_setting = 2000; sensors = list("air_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; dir = 4; icon_state = "intact-g"; level = 2},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/maintenance/storage) "bKV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 10},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) "bKW" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; icon_state = "intact-c"; level = 2},/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; dir = 4; icon_state = "intact-g"; level = 2},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/maintenance/storage) -"bKX" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/sign/nosmoking_2{pixel_x = -28},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"bKX" = (/obj/machinery/computer/area_atmos,/obj/machinery/light/small{dir = 1},/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/storage) "bKY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bKZ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/clothing/head/soft,/obj/item/clothing/head/soft,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Cargo Bay - Starboard"; dir = 8; network = list("SS13")},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/quartermaster/storage) "bLa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -4645,23 +4645,23 @@ "bLq" = (/obj/structure/closet/l3closet/virology,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) "bLr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bLs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) -"bLt" = (/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) +"bLt" = (/obj/structure/stool/bed,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/bedsheet/medical,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/machinery/camera{c_tag = "Medbay Recovery Room"; dir = 1; network = list("SS13","Medbay")},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/surgery) "bLu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/gateway) "bLv" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastright{name = "Chemistry Desk"; req_access_txt = "5; 33"},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bLw" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) +"bLw" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Medbay Hallway Central"; dir = 4; network = list("SS13","Medbay")},/turf/simulated/floor{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "bLx" = (/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "bLy" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "bLz" = (/obj/effect/landmark/start{name = "Chef"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bLA" = (/obj/effect/decal/cleanable/cobweb,/obj/machinery/atmospherics/pipe/tank/toxins{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "bLB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"}) -"bLC" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/insulated{dir = 9},/obj/structure/disposalpipe/segment,/turf/space,/area/space) +"bLC" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "Secure Gate"; name = "security blast door"},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/gravity_generator) "bLD" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/gateway) "bLE" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bLF" = (/obj/machinery/door/window/northleft{dir = 1; icon_state = "left"; name = "Inner Pipe Access"; req_access_txt = "24"},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor{icon_state = "dark"},/area/maintenance/storage) "bLG" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/primary/central) "bLH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor,/area/hallway/secondary/entry{name = "Arrivals"}) -"bLI" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 28},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bLJ" = (/obj/machinery/atmospherics/pipe/simple{dir = 10; icon_state = "intact"; level = 2},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bLI" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "Secure Gate"; name = "security blast door"},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/engine/gravity_generator) +"bLJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) "bLK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/portsolar) "bLL" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/starboard) "bLM" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -4674,7 +4674,7 @@ "bLT" = (/obj/machinery/atmospherics/trinary/filter{dir = 8},/turf/simulated/floor,/area/maintenance/storage) "bLU" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Research Lab Maintenance"; req_access_txt = "7"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "bLV" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor,/area/maintenance/storage) -"bLW" = (/obj/machinery/light{dir = 1},/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = 32},/obj/structure/disposalpipe/trunk,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bLW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) "bLX" = (/obj/machinery/atmospherics/trinary/mixer{dir = 2; icon_state = "intact_on"; name = "Gas mixer (N2/O2)"; node1_concentration = 0.8; node2_concentration = 0.2; on = 1; pixel_x = 0; pixel_y = 0; target_pressure = 4500},/turf/simulated/floor,/area/maintenance/storage) "bLY" = (/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/maintenance/storage) "bLZ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor{icon_state = "L9"},/area/hallway/primary/central) @@ -4693,7 +4693,7 @@ "bMm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bMn" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/light,/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bMo" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"bMp" = (/obj/machinery/door/poddoor{id = "turbinevent"; name = "Turbine Vent"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) +"bMp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) "bMq" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/solar/port) "bMr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/solar/port) "bMs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) @@ -4703,7 +4703,7 @@ "bMw" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Quiet Room"; opacity = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 2; icon_state = "carpetsymbol"},/area/library) "bMx" = (/obj/item/trash/semki,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bMy" = (/obj/structure/closet,/obj/item/stack/sheet/glass{amount = 12},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"bMz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/hallway/primary/aft) +"bMz" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/sign/nosmoking_2{pixel_x = -28},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/surgery) "bMA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/portsolar) "bMB" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) "bMC" = (/obj/structure/girder,/obj/structure/grille,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -4711,7 +4711,7 @@ "bME" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{tag = "icon-warningcorner"; icon_state = "warningcorner"; dir = 2},/area/hallway/secondary/entry{name = "Arrivals"}) "bMF" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"; pipe_color = "red"},/turf/simulated/floor,/area/hallway/secondary/entry{name = "Arrivals"}) "bMG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Corporate Showroom"; req_access_txt = "19"},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"}) -"bMH" = (/obj/item/clothing/glasses/hud/health,/obj/structure/table,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{dir = 10; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) +"bMH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/surgery) "bMI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Corporate Showroom"; req_access_txt = "19"},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bMJ" = (/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/igniter{pixel_x = 3; pixel_y = -7},/obj/item/device/assembly/igniter{pixel_x = 3; pixel_y = -7},/obj/item/device/assembly/igniter{pixel_x = 3; pixel_y = -7},/obj/item/device/assembly/igniter{pixel_x = 3; pixel_y = -7},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table,/turf/simulated/floor{dir = 8; icon_state = "whiteyellow"},/area/medical/chemistry) "bMK" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "red"; dir = 10; icon_state = "intact-r"; level = 2},/turf/simulated/floor,/area/maintenance/storage) @@ -4735,15 +4735,15 @@ "bNc" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bNd" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/maintenance/storage) "bNe" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/maintenance/storage) -"bNf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/medical/medbay2{name = "Medbay Storage"}) +"bNf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/cryo) "bNg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2{name = "Medbay Storage"}) "bNh" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) "bNi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2{name = "Medbay Storage"}) -"bNj" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/rxglasses,/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay2{name = "Medbay Storage"}) -"bNk" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/machinery/shower{dir = 8; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (WEST)"},/turf/simulated/floor{dir = 5; icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) -"bNl" = (/obj/structure/table,/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/clothing/tie/stethoscope,/obj/item/clothing/tie/stethoscope,/obj/item/weapon/gun/syringe,/turf/simulated/floor{dir = 5; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) -"bNm" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) -"bNn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/obj/machinery/alarm{desc = "This particular atmos control unit appears to have no access restrictions."; dir = 8; icon_state = "alarm0"; locked = 0; name = "all-access air alarm"; pixel_x = 24; req_access = "0"; req_one_access = "0"},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bNj" = (/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) +"bNk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/camera{c_tag = "Research Division Hallway - Starboard"; dir = 1; network = list("SS13","RD")},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"bNl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/cryo) +"bNm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) +"bNn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) "bNo" = (/obj/structure/closet,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plating,/area/maintenance/starboard) "bNp" = (/obj/structure/closet/emcloset,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central) "bNq" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/turret_protected/ai_upload) @@ -4764,26 +4764,26 @@ "bNF" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/maintenance/storage) "bNG" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bNH" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Chief Medical Officer's Office"; req_access_txt = "40"; req_one_access_txt = "0"},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) -"bNI" = (/obj/machinery/atmospherics/pipe/vent{dir = 4},/turf/simulated/floor/plating/airless,/area/space) -"bNJ" = (/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bNI" = (/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"bNJ" = (/obj/machinery/camera{c_tag = "Gravity Generator Room"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) "bNK" = (/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/starboard) "bNL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/engine,/area/toxins/telesci) "bNM" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/turf/simulated/floor/engine,/area/toxins/telesci) "bNN" = (/turf/simulated/floor{icon_state = "dark"},/area/maintenance/storage) -"bNO" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 9; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"bNO" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "bNP" = (/mob/living/simple_animal/pug{desc = "It's Pugley III, the loveable four-legged test subject."; dir = 8; name = "Pugley III"; real_name = "Pugley III"},/turf/simulated/floor/engine,/area/toxins/telesci) -"bNQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) -"bNR" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bNQ" = (/obj/machinery/camera{c_tag = "Medbay Storage"; dir = 8; network = list("SS13","Medbay")},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_x = 30; pixel_y = 0; pixel_z = 0},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) +"bNR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/gravity_generator) "bNS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/mining{name = "Mining Office"; req_access_txt = "48"},/turf/simulated/floor,/area/quartermaster/miningdock{name = "\improper Mining Office"}) "bNT" = (/obj/machinery/telepad,/turf/simulated/floor/engine,/area/toxins/telesci) -"bNU" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Exit Button"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 26},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) +"bNU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "bNV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "5; 33"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bNW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 2; icon_state = "greencorner"},/area/hallway/primary/central) "bNX" = (/obj/item/device/radio/beacon,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/engine,/area/toxins/telesci) "bNY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "bNZ" = (/obj/structure/sign/poster{pixel_y = -32},/obj/machinery/light_construct/small,/obj/structure/table/woodentable/poker,/obj/item/toy/cards/deck,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) "bOa" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) -"bOb" = (/obj/structure/disposalpipe/segment,/mob/living/simple_animal/mouse,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bOb" = (/obj/machinery/gravity_generator/main/station,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator) "bOc" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "bOd" = (/obj/item/weapon/storage/secure/safe{pixel_x = 6; pixel_y = 30},/obj/machinery/camera{c_tag = "Chief Engineer's Office"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/engine/chiefs_office) "bOe" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/engine,/area/toxins/telesci) @@ -4798,10 +4798,10 @@ "bOn" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/starboard) "bOo" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/starboard) "bOp" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) -"bOq" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bOq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/gravity_generator) "bOr" = (/turf/simulated/floor{dir = 6; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) -"bOs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 28},/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) -"bOt" = (/obj/machinery/power/apc{cell_type = 10000; dir = 1; name = "Research Division APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/autoname{dir = 2; network = list("SS13","RD")},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/medical/research{name = "Research Division"}) +"bOs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/aft) +"bOt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/medbay2{name = "Medbay Storage"}) "bOu" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "on"; id = "o2_in"; on = 1},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) "bOv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "o2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) "bOw" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "on"; id = "n2_in"; on = 1},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/maintenance/storage) @@ -4809,7 +4809,7 @@ "bOy" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/maintenance/storage) "bOz" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "yellow"; dir = 8; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/maintenance/storage) "bOA" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"bOB" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; level = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bOB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) "bOC" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; icon_state = "intact-g"; level = 2},/turf/simulated/floor{icon_state = "dark"},/area/maintenance/storage) "bOD" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; icon_state = "intact-c"; level = 2},/turf/simulated/floor/plating,/area/maintenance/storage) "bOE" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/storage) @@ -4824,7 +4824,7 @@ "bON" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "dark"},/area/maintenance/storage) "bOO" = (/obj/machinery/chem_master,/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; dir = 1; name = "requests board"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor{dir = 6; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "bOP" = (/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/screwdriver{pixel_x = -2; pixel_y = 6},/obj/machinery/power/apc{dir = 8; name = "Chemistry APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/item/device/radio/headset/headset_med,/obj/structure/table,/turf/simulated/floor{dir = 10; icon_state = "whiteyellow"},/area/medical/chemistry) -"bOQ" = (/obj/machinery/computer/area_atmos,/obj/machinery/light/small{dir = 1},/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/camera{c_tag = "Toxins - Storage"; dir = 2; network = list("SS13","RD")},/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/storage) +"bOQ" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/rxglasses,/turf/simulated/floor{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay2{name = "Medbay Storage"}) "bOR" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/turret_protected/ai_upload) "bOS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bOT" = (/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary) @@ -4864,7 +4864,7 @@ "bPB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/lab) "bPC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "whitepurple"},/area/toxins/lab) "bPD" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/construction) -"bPE" = (/obj/machinery/atmospherics/pipe/simple/insulated,/obj/structure/lattice,/obj/structure/disposalpipe/segment,/turf/space,/area/space) +"bPE" = (/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) "bPF" = (/obj/machinery/door/airlock/maintenance{name = "Research Maintenance"; req_access_txt = "7"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bPG" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; level = 2},/turf/simulated/floor,/area/maintenance/storage) "bPH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/construction) @@ -4873,9 +4873,9 @@ "bPK" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/device/multitool{pixel_x = 3},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/toxins/telesci) "bPL" = (/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 4; name = "Atmos RC"; pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple{pipe_color = "red"; icon_state = "intact-r"; level = 2},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/shower{dir = 8; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (WEST)"},/turf/simulated/floor,/area/maintenance/storage) "bPM" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/starboard) -"bPN" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/toxins/lab) +"bPN" = (/obj/structure/table,/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/clothing/tie/stethoscope,/obj/item/clothing/tie/stethoscope,/obj/item/weapon/gun/syringe,/turf/simulated/floor{dir = 5; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "bPO" = (/turf/simulated/wall,/area/security/checkpoint/science{name = "Security Post - Research Division"}) -"bPP" = (/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) +"bPP" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "bPQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "bPR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/turret_protected/ai_upload) "bPS" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -29},/turf/simulated/floor{dir = 4; icon_state = "whitecorner"},/area/assembly/robotics) @@ -4885,7 +4885,7 @@ "bPW" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastleft{dir = 1; name = "Kitchen Window"; req_access_txt = "28"; req_one_access_txt = "0"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/paper,/obj/machinery/door/window/eastleft{dir = 2; name = "Hydroponics Window"; req_access_txt = "0"; req_one_access_txt = "30;35"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/hydroponics) "bPX" = (/obj/machinery/computer/upload/ai,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/westleft{base_state = "right"; dir = 2; icon_state = "right"; layer = 3.1; name = "Upload Console Window"; req_access_txt = "16"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "bPY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"bPZ" = (/obj/machinery/door/poddoor/shutters/preopen{id = "kitchenhydro"; name = "Service Shutter"},/obj/machinery/door/airlock/glass_medical{id_tag = ""; name = "Service Door"; req_access_txt = "0"; req_one_access_txt = "35;28"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/hydroponics) +"bPZ" = (/obj/item/clothing/glasses/hud/health,/obj/structure/table,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{dir = 10; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "bQa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/construction) "bQb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab) "bQc" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central) @@ -4946,24 +4946,24 @@ "bRf" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/mint,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/power/apc{dir = 2; name = "Kitchen APC"; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "bRg" = (/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) "bRh" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "red"; icon_state = "intact-r"; level = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "caution"},/area/maintenance/storage) -"bRi" = (/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/obj/structure/table,/obj/machinery/camera/autoname{dir = 8; network = list("SS13","RD")},/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/toxins/lab) +"bRi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/aft) "bRj" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "bRk" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/reinforced,/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Security Post - Medbay"; dir = 2; network = list("SS13","Medbay")},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint/medical) -"bRl" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) -"bRm" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{dir = 5; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) -"bRn" = (/obj/structure/closet/secure_closet/medical3,/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) +"bRl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/aft) +"bRm" = (/obj/structure/sign/bluecross,/turf/simulated/wall,/area/medical/medbay{name = "Medbay Central"}) +"bRn" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "bRo" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) -"bRp" = (/obj/structure/closet/l3closet/general,/obj/structure/noticeboard{pixel_y = 32},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) +"bRp" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "bRq" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "L2"},/area/hallway/primary/central) "bRr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "bRs" = (/turf/simulated/floor{dir = 4; icon_state = "yellowfull"; tag = "icon-whitehall (WEST)"},/area/hallway/primary/aft) "bRt" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "5; 33"},/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "bRu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/hallway/primary/aft) "bRv" = (/turf/simulated/floor{icon_state = "purplefull"},/area/hallway/primary/aft) -"bRw" = (/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/hallway/primary/central) -"bRx" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) +"bRw" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{dir = 5; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) +"bRx" = (/obj/structure/closet/secure_closet/medical3,/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "bRy" = (/obj/structure/table,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/door_control{id = "kitchenhydro"; name = "Service Shutter Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "28"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"bRz" = (/obj/machinery/vending/medical,/turf/simulated/floor{dir = 9; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) +"bRz" = (/obj/structure/closet/l3closet/general,/obj/structure/noticeboard{pixel_y = 32},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "bRA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) "bRB" = (/obj/structure/table,/obj/machinery/light{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -24},/obj/item/weapon/aiModule/supplied/protectStation,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "bRC" = (/obj/machinery/door/window/eastright{dir = 1; name = "Hydroponics Delivery"; req_access_txt = "35"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "delivery"},/area/hydroponics) @@ -4997,7 +4997,7 @@ "bSe" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) "bSf" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating/airless,/area/AIsattele) "bSg" = (/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/device/radio/off,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/checkpoint/science{name = "Security Post - Research Division"}) -"bSh" = (/obj/structure/stool/bed,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/bedsheet/medical,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/machinery/camera{c_tag = "Medbay Recovery Room"; dir = 1; network = list("SS13","Medbay")},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"bSh" = (/obj/machinery/vending/medical,/turf/simulated/floor{dir = 9; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "bSi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/turret_protected/ai_upload) "bSj" = (/obj/item/weapon/vending_refill/cola,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bSk" = (/obj/structure/closet/secure_closet/medical2,/obj/structure/sign/nosmoking_2{pixel_x = -28},/turf/simulated/floor,/area/medical/surgery) @@ -5009,7 +5009,7 @@ "bSq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "bSr" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Upload APC"; pixel_y = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/camera/motion{c_tag = "AI Upload Chamber - Port"; dir = 1; network = list("SS13","RD","AIUpload")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bSs" = (/obj/structure/table,/obj/item/weapon/minihoe,/obj/item/weapon/hatchet,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/paper/hydroponics,/obj/item/weapon/coin/silver,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/construction{name = "\improper Garden"}) -"bSt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/medbay{name = "Medbay Central"}) +"bSt" = (/obj/structure/table,/obj/item/device/healthanalyzer,/obj/machinery/firealarm{dir = 4; pixel_x = 26; pixel_y = 28},/obj/item/stack/medical/ointment,/obj/item/stack/medical/bruise_pack,/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "bSu" = (/obj/machinery/door/firedoor,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "bSv" = (/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/clothing/glasses/welding,/obj/structure/table/reinforced,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/lab) "bSw" = (/obj/structure/grille,/obj/structure/lattice,/obj/structure/lattice,/turf/simulated/wall/r_wall,/area/space) @@ -5020,10 +5020,10 @@ "bSB" = (/obj/machinery/door/airlock/maintenance{name = "Incinerator Access"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/incinerator) "bSC" = (/turf/simulated/wall,/area/maintenance/incinerator) "bSD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) -"bSE" = (/obj/structure/stool/bed/roller,/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"bSE" = (/obj/structure/stool/bed/chair,/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "bSF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bSG" = (/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen/red,/obj/structure/table,/obj/machinery/requests_console{department = "Virology"; name = "Virology Requests Console"; pixel_x = 29; pixel_y = 0},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/virology) -"bSH" = (/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) +"bSH" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags,/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "bSI" = (/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/gateway) "bSJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central) "bSK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor,/area/hallway/primary/aft) @@ -5043,13 +5043,13 @@ "bSY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bSZ" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics) "bTa" = (/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics) -"bTb" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/space,/area/space) +"bTb" = (/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator) "bTc" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bTd" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "bTe" = (/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "bTf" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 30; pixel_y = 0},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/library) "bTg" = (/obj/machinery/atmospherics/portables_connector{dir = 1; name = "Connector Port (Air Supply)"},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/medical/cryo) -"bTh" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"bTh" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "bTi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "bTj" = (/obj/structure/table,/obj/item/weapon/aiModule/reset,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -24},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "bTk" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/checkpoint/science{name = "Security Post - Research Division"}) @@ -5076,10 +5076,10 @@ "bTF" = (/obj/structure/rack,/obj/item/clothing/under/color/white,/obj/item/clothing/head/soft/mime,/obj/item/clothing/under/color/white,/obj/item/clothing/head/soft/mime,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/surgical,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bTG" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{dir = 4; icon_state = "whitepurple"},/area/toxins/lab) "bTH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/closet/emcloset,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central) -"bTI" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) +"bTI" = (/obj/machinery/light/small{dir = 1},/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = -3},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "bTJ" = (/obj/effect/landmark/start{name = "Botanist"},/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics) "bTK" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/item/clothing/gloves/yellow,/obj/item/device/t_scanner,/turf/simulated/floor{dir = 4; icon_state = "brown"},/area/storage/primary) -"bTL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/hallway/primary/aft) +"bTL" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/pen,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera{c_tag = "Research Division - Lobby"; dir = 2; network = list("SS13","RD")},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "bTM" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "bTN" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bTO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "kitchenwindow"; name = "kitchen shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) @@ -5125,7 +5125,7 @@ "bUC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/gateway) "bUD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab) "bUE" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2{name = "Medbay Storage"}) -"bUF" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2{name = "Medbay Storage"}) +"bUF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "bUG" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=4"; freq = 1400; location = "Medbay"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/window/northleft{dir = 8; name = "MuleBot Access"; req_access_txt = "50"},/turf/simulated/floor{icon_state = "delivery"},/area/maintenance/aft{name = "Aft Maintenance"}) "bUH" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/flashlight,/turf/simulated/floor/plating/airless,/area/AIsattele) "bUI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/medbay{name = "Medbay Central"}) @@ -5134,14 +5134,14 @@ "bUL" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard) "bUM" = (/obj/machinery/door/airlock{name = "Medbay Emergency Storage"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bUN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/gateway) -"bUO" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) +"bUO" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "bUP" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/AIsattele) "bUQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/gateway) "bUR" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bUS" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - CO2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/maintenance/storage) "bUT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bUU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) -"bUV" = (/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"}) +"bUU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{icon = 'icons/obj/doors/Doorglass.dmi'; id_tag = ""; name = "Hydroponics"; req_access_txt = "35"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) +"bUV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) "bUW" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/solar/port) "bUX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "kitchenwindow"; name = "kitchen shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "bUY" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space) @@ -5149,7 +5149,7 @@ "bVa" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bVb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bVc" = (/obj/item/weapon/tank/air,/obj/item/weapon/tank/air,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) -"bVd" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bVd" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) "bVe" = (/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 4; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/research{name = "Research Division"}) "bVf" = (/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bVg" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -5166,20 +5166,20 @@ "bVr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2{name = "Medbay Storage"}) "bVs" = (/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bVt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j1s"; sortType = 18},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) -"bVu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2{name = "Medbay Storage"}) +"bVu" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) "bVv" = (/obj/structure/table,/obj/item/weapon/folder/white,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bVw" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/wood,/area/library) "bVx" = (/obj/machinery/computer/secure_data,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/machinery/computer/security/telescreen{desc = "Used for watching the RD's goons from the safety of his office."; dir = 8; name = "Research Monitor"; network = list("RD"); pixel_x = 28; pixel_y = 2},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/checkpoint/science{name = "Security Post - Research Division"}) "bVy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) "bVz" = (/obj/structure/girder,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"bVA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"}) +"bVA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) "bVB" = (/obj/structure/rack,/obj/item/weapon/paper,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bVC" = (/obj/structure/stool/bed,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bVD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/construction) "bVE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor,/area/construction) "bVF" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"bVG" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/turbine_computer{id = "incineratorturbine"},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"bVH" = (/obj/structure/table,/obj/structure/sign/greencross{pixel_y = 32},/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor/plating,/area/maintenance/starboard) +"bVG" = (/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/gravity_generator) +"bVH" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) "bVI" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/gibs/limb,/turf/simulated/floor/plating,/area/maintenance/starboard) "bVJ" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bVK" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -5187,17 +5187,17 @@ "bVM" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/turf/simulated/wall/r_wall,/area/space) "bVN" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/closet/firecloset,/turf/simulated/floor{icon_state = "delivery"},/area/medical/research{name = "Research Division"}) "bVO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) -"bVP" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/medbay2{name = "Medbay Storage"}) -"bVQ" = (/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bVP" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/machinery/shower{dir = 8; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (WEST)"},/turf/simulated/floor{dir = 5; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) +"bVQ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator) "bVR" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bVS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "bVT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 4; pixel_y = 5},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = -1},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -4; pixel_y = 6},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/plating,/area/maintenance/starboard) -"bVU" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) -"bVV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) +"bVU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/medbay2{name = "Medbay Storage"}) +"bVV" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/medbay2{name = "Medbay Storage"}) "bVW" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/maintenance/storage) "bVX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/construction) "bVY" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) -"bVZ" = (/obj/structure/disposaloutlet{dir = 2},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating/airless,/area/space) +"bVZ" = (/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/gravity_generator) "bWa" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{dir = 2; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) "bWb" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/table/reinforced,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/lab) "bWc" = (/obj/machinery/power/terminal,/obj/structure/cable,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{dir = 10; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/engine/engineering) @@ -5216,13 +5216,13 @@ "bWp" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/gateway) "bWq" = (/obj/structure/table,/obj/item/weapon/book/manual/hydroponics_pod_people,/obj/machinery/light,/obj/item/weapon/paper/hydroponics,/obj/machinery/camera{c_tag = "Hydroponics - Foyer"; dir = 1; network = list("SS13")},/obj/item/device/radio/intercom{pixel_y = -25},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central) "bWr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/hallway/primary/aft) -"bWs" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = -31},/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bWs" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) "bWt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bWu" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Aft Maintenance APC"; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "bWv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bWw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bWx" = (/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/gateway) -"bWy" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_interior"; locked = 1; name = "Incinerator Interior Airlock"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine,/area/maintenance/incinerator) +"bWy" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/engineering) "bWz" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/turf/simulated/floor{dir = 6; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"}) "bWA" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/camera{c_tag = "Security Post - Research Division"; dir = 8; network = list("SS13","RD"); pixel_x = 0},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/checkpoint/science{name = "Security Post - Research Division"}) "bWB" = (/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"}) @@ -5254,9 +5254,9 @@ "bXb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine,/area/maintenance/incinerator) "bXc" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Geneticist"},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/genetics) "bXd" = (/obj/machinery/hydroponics/constructable,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hydroponics) -"bXe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Desk"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/medbay{name = "Medbay Central"}) +"bXe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Desk"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/medbay{name = "Medbay Central"}) "bXf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/starboard) -"bXg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/medbay{name = "Medbay Central"}) +"bXg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/medbay{name = "Medbay Central"}) "bXh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall,/area/maintenance/aft{name = "Aft Maintenance"}) "bXi" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/carpet,/area/library) "bXj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -5265,7 +5265,7 @@ "bXm" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/plating/airless,/area/AIsattele) "bXn" = (/obj/structure/table/woodentable,/obj/item/weapon/folder,/obj/item/weapon/pen/blue{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/wood,/area/library) "bXo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) -"bXp" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper{name = "Sleepers"}) +"bXp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/medbay{name = "Medbay Central"}) "bXq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "bXr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/effect/landmark/start{name = "Geneticist"},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) "bXs" = (/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) @@ -5275,10 +5275,10 @@ "bXw" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/structure/sign/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central) "bXx" = (/obj/machinery/hydroponics/constructable,/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "Hydroponics APC"; pixel_x = 0; pixel_y = -28},/obj/structure/cable/yellow,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hydroponics) "bXy" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/machinery/newscaster{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/library) -"bXz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/medbay{name = "Medbay Central"}) +"bXz" = (/obj/machinery/light/small{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'TAKE ONLY WHAT YOU NEED - HOARDING PROHIBITED."; name = "\improper TAKE ONLY WHAT YOU NEED - HOARDING PROHIBITED"; pixel_y = 32},/turf/simulated/floor{icon_state = "dark"},/area/toxins/mineral_storeroom) "bXA" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) -"bXB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/sleeper{name = "Sleepers"}) -"bXC" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2{name = "Medbay Storage"}) +"bXB" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/obj/structure/stool,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"}) +"bXC" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) "bXD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central) "bXE" = (/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 8; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"}) "bXF" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central) @@ -5290,11 +5290,11 @@ "bXL" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "yellow"; icon_state = "intact-y"; level = 2},/turf/simulated/floor{icon_state = "dark"},/area/maintenance/storage) "bXM" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; dir = 9; icon_state = "intact-c"; level = 2},/obj/machinery/camera{c_tag = "Atmospherics - Starboard Aft"; dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "dark"},/area/maintenance/storage) "bXN" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "red"; icon_state = "intact-r"; level = 2},/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/camera{c_tag = "Atmospherics - Port-Aft"; dir = 4; network = list("SS13")},/turf/simulated/floor{dir = 8; icon_state = "caution"},/area/maintenance/storage) -"bXO" = (/obj/structure/sign/greencross,/turf/simulated/wall,/area/medical/medbay{name = "Medbay Central"}) +"bXO" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/sleeper{name = "Sleepers"}) "bXP" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hydroponics) "bXQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"}) "bXR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"}) -"bXS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) +"bXS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) "bXT" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2{name = "Medbay Storage"}) "bXU" = (/obj/structure/closet/secure_closet/scientist{pixel_x = -4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/lab) "bXV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2{name = "Medbay Storage"}) @@ -5344,14 +5344,14 @@ "bYN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft) "bYO" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/obj/structure/lattice,/turf/simulated/wall/r_wall,/area/space) "bYP" = (/turf/simulated/wall/r_wall,/area/toxins/lab) -"bYQ" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = 24; pixel_y = 24},/turf/simulated/floor{dir = 5; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"bYQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "bYR" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; icon_state = "intact-c"; level = 2},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/storage) "bYS" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; icon_state = "intact-g"; level = 2},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/storage) -"bYT" = (/obj/structure/stool/bed/chair,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"bYT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "bYU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/preopen{id = "Biohazard"; name = "biohazard containment door"},/turf/simulated/floor{icon_state = "delivery"},/area/medical/research{name = "Research Division"}) "bYV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/poddoor/preopen{id = "Biohazard"; name = "biohazard containment door"},/turf/simulated/floor{icon_state = "delivery"},/area/medical/research{name = "Research Division"}) "bYW" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light_switch{pixel_y = 28},/obj/item/clothing/under/rank/scientist_new,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) -"bYX" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bYX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering) "bYY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2{name = "Medbay Storage"}) "bYZ" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = 30},/obj/machinery/door_control{id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = 0; pixel_y = 6; req_access_txt = "47"},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "ResearchFoyer"; name = "Research Door Button"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -4},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint/science{name = "Security Post - Research Division"}) "bZa" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -5363,23 +5363,23 @@ "bZg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bZh" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bZi" = (/obj/structure/closet/crate,/obj/item/weapon/storage/belt/utility,/obj/item/stack/cable_coil/random,/turf/simulated/floor/plating,/area/maintenance/starboard) -"bZj" = (/obj/machinery/atmospherics/pipe/manifold{dir = 2; icon_state = "manifold"; level = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bZk" = (/obj/machinery/atmospherics/pipe/simple{dir = 10; icon_state = "intact"; level = 2},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bZj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/engine/engineering) +"bZk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) "bZl" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/aft{name = "Aft Maintenance"}) "bZm" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bZn" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/hallway/primary/central) "bZo" = (/turf/simulated/floor/wood{tag = "icon-wood-broken5"; icon_state = "wood-broken5"},/area/maintenance/aft{name = "Aft Maintenance"}) "bZp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r"; level = 2},/turf/simulated/floor,/area/maintenance/storage) "bZq" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "red"; dir = 4; icon_state = "intact-r"; level = 2},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/maintenance/storage) -"bZr" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bZr" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=4"; freq = 1400; location = "Engineering"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor{icon_state = "bot"},/area/maintenance/starboard) "bZs" = (/obj/machinery/computer/arcade,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "bZt" = (/obj/structure/table,/obj/item/weapon/folder/blue,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bZu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/maintenance/aft{name = "Aft Maintenance"}) "bZv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/research{name = "Research Division"}) "bZw" = (/obj/item/weapon/storage/box,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bZx" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"bZy" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"bZz" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"bZy" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/engineering) +"bZz" = (/obj/machinery/light_switch{pixel_x = 23},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/machinery/shower{dir = 8; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (WEST)"},/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/engine/engineering) "bZA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bZB" = (/obj/machinery/disposal{pixel_x = -2; pixel_y = -2},/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light_switch{pixel_y = -28},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hydroponics) "bZC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/starboard) @@ -5394,7 +5394,7 @@ "bZL" = (/obj/machinery/hydroponics/constructable,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hydroponics) "bZM" = (/obj/structure/window/reinforced{dir = 1; pixel_y = 0},/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/light/small,/turf/simulated/floor{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bZN" = (/turf/simulated/wall,/area/medical/chemistry) -"bZO" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"bZO" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Foyer"; req_access_txt = "10"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/gravity_generator) "bZP" = (/obj/structure/closet/secure_closet/chemical,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/chemistry) "bZQ" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) "bZR" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) @@ -5418,10 +5418,10 @@ "caj" = (/obj/item/weapon/reagent_containers/food/drinks/ale,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) "cak" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) "cal" = (/obj/structure/stool,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) -"cam" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 30; pixel_y = 0},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/medbay{name = "Medbay Central"}) +"cam" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "can" = (/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating/airless,/area/AIsattele) "cao" = (/obj/machinery/power/smes{capacity = 9e+006; charge = 10000},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"cap" = (/obj/machinery/disposal{pixel_x = 5},/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 24; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"cap" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 9; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "caq" = (/obj/item/weapon/storage/toolbox/emergency,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "car" = (/obj/structure/disposalpipe/sortjunction{dir = 2; sortType = 20},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) "cas" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -5436,19 +5436,19 @@ "caB" = (/obj/structure/closet/wardrobe/pjs,/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"}) "caC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) "caD" = (/obj/structure/closet/crate,/obj/item/weapon/table_parts,/obj/item/weapon/table_parts,/obj/item/weapon/table_parts,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"caE" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) -"caF" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 10; icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"caE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) +"caF" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "caG" = (/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"caH" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/o2{pixel_x = -2; pixel_y = 4},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) -"caI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) -"caJ" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) +"caH" = (/obj/machinery/power/apc{dir = 1; name = "Medbay Central APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/camera{c_tag = "Medbay Hallway Fore"; dir = 2; network = list("SS13","Medbay")},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) +"caI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 28},/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) +"caJ" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Exit Button"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 26},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "caK" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "red"; dir = 4; icon_state = "intact-r"; level = 2},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 1; icon_state = "caution"},/area/maintenance/storage) "caL" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/reagent_containers/food/drinks/britcup,/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/medbay{name = "Medbay Central"}) "caM" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "red"; dir = 4; icon_state = "intact-r"; level = 2},/turf/simulated/floor{dir = 1; icon_state = "blackcorner"},/area/maintenance/storage) "caN" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Post - Research Division"; req_access_txt = "63"},/turf/simulated/floor{icon_state = "redfull"},/area/security/checkpoint/science{name = "Security Post - Research Division"}) "caO" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "tox_in"; name = "Toxin Supply Control"; output_tag = "tox_out"; sensors = list("tox_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; icon_state = "intact-g"; level = 2},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor{icon_state = "purplefull"},/area/maintenance/storage) -"caP" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) -"caQ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/machinery/power/apc{dir = 2; name = "Medbay Storage APC"; pixel_y = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/obj/machinery/light/small,/turf/simulated/floor{dir = 10; icon_state = "whitegreen"},/area/medical/medbay2{name = "Medbay Storage"}) +"caP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) +"caQ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "caR" = (/obj/machinery/door/window/southleft{dir = 2; name = "Maximum Security Test Chamber"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "Xenolab"; name = "test chamber blast door"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/engine,/area/toxins/xenobiology) "caS" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/camera{c_tag = "Telescience - Test Chamber"; dir = 2; network = list("SS13","RD")},/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/toxins/telesci) "caT" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -5457,36 +5457,37 @@ "caW" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "caX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/hallway/primary/central) "caY" = (/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "35"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"caZ" = (/obj/machinery/atmospherics/pipe/simple{dir = 2; icon_state = "intact"; level = 2},/obj/machinery/meter,/obj/machinery/ignition_switch{id = "Incinerator"; pixel_x = -6; pixel_y = -24},/obj/machinery/embedded_controller/radio/access_controller{exterior_door_tag = "incinerator_airlock_exterior"; id_tag = "incinerator_access_control"; interior_door_tag = "incinerator_airlock_interior"; name = "Incinerator Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "12"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cba" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 5},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"caZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"; pipe_color = "blue"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/gravity_generator) +"cba" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/gravity_generator) "cbb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/courtroom) "cbc" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cbd" = (/obj/machinery/smartfridge/chemistry,/turf/simulated/wall,/area/medical/chemistry) "cbe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cbf" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"cbg" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"cbg" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; dir = 1; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) "cbh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j1"; tag = "icon-pipe-j1 (EAST)"},/turf/simulated/floor,/area/hallway/primary/central) "cbi" = (/turf/simulated/wall,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "cbj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cbk" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/insulated{icon_state = "intact"; dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"cbk" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/starboard) +"cbl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; dir = 1; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/starboard) "cbm" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/structure/sign/nosmoking_2{pixel_x = 28},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 23},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/medical/sleeper{name = "Sleepers"}) -"cbn" = (/obj/machinery/door_control{id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = -6; pixel_y = -24; req_access_txt = "12"},/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door_control{id = "auxincineratorvent"; name = "Auxiliary Vent Control"; pixel_x = 6; pixel_y = -24; req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cbn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engine/gravity_generator) "cbo" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hallway/primary/central) "cbp" = (/obj/machinery/door/window/southleft{dir = 1; name = "Maximum Security Test Chamber"; req_access_txt = "55"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/toxins/xenobiology) "cbq" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/machinery/door/window/northleft{dir = 2; name = "Chemistry Desk"; req_access_txt = "5; 33"},/obj/machinery/door/firedoor,/obj/item/weapon/folder/white,/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "cbr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "cbs" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "cbt" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) -"cbu" = (/obj/machinery/atmospherics/valve{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = -31},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cbu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/starboard) "cbv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) "cbw" = (/obj/machinery/power/apc{dir = 8; name = "Incinerator APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/incinerator) "cbx" = (/obj/machinery/door/airlock/maintenance{icon_state = "door_closed"; locked = 0; name = "Storage Room"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cby" = (/obj/machinery/reagentgrinder,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/requests_console{department = "Chemistry"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/structure/table,/turf/simulated/floor{dir = 8; icon_state = "whiteyellow"},/area/medical/chemistry) -"cbz" = (/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/storage/pill_bottle/inaprovaline{pixel_x = 5; pixel_y = -2},/obj/item/weapon/storage/pill_bottle/inaprovaline{pixel_x = 5; pixel_y = -2},/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"cbz" = (/obj/machinery/disposal{pixel_x = 5},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "cbA" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/machinery/light{dir = 4},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/checkpoint/science{name = "Security Post - Research Division"}) "cbB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central) "cbC" = (/obj/machinery/light/small,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central) -"cbD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/hallway/primary/central) +"cbD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) "cbE" = (/obj/structure/table,/obj/structure/bedsheetbin{pixel_x = 2},/obj/item/clothing/mask/muzzle,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cbF" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/wood,/area/library) "cbG" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; icon_state = "intact-g"; level = 2},/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Inner Pipe Access"; req_access_txt = "24"},/turf/simulated/floor{icon_state = "dark"},/area/maintenance/storage) @@ -5530,8 +5531,8 @@ "ccs" = (/obj/structure/stool/bed/chair{pixel_y = -2},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "cct" = (/turf/simulated/floor{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay{name = "Medbay Central"}) "ccu" = (/obj/effect/landmark/start{name = "Scientist"},/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/telesci) -"ccv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) -"ccw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"ccv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/sign/securearea{desc = "A warning sign which reads 'TAKE ONLY WHAT YOU NEED - HOARDING PROHIBITED."; name = "\improper TAKE ONLY WHAT YOU NEED - HOARDING PROHIBITED"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft) +"ccw" = (/obj/machinery/power/apc{cell_type = 10000; dir = 1; name = "Research Division APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/machinery/camera{c_tag = "Research Division - Airlock"; dir = 2; network = list("SS13","RD")},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/medical/research{name = "Research Division"}) "ccx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "ccy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/checkpoint/science{name = "Security Post - Research Division"}) "ccz" = (/obj/structure/closet/secure_closet/security/science,/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint/science{name = "Security Post - Research Division"}) @@ -5594,7 +5595,7 @@ "cdE" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) "cdF" = (/obj/structure/closet/emcloset,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/library) "cdG" = (/obj/item/stack/sheet/rglass{amount = 50},/obj/item/stack/sheet/rglass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/rods{amount = 50},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/power/apc{dir = 8; name = "E.V.A. Storage APC"; pixel_x = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) -"cdH" = (/obj/structure/sign/greencross,/turf/simulated/wall,/area/medical/chemistry) +"cdH" = (/obj/machinery/light,/obj/structure/stool/bed/roller,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/camera{c_tag = "Medbay Foyer"; dir = 1; network = list("SS13","Medbay")},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "cdI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central) "cdJ" = (/turf/simulated/floor/wood{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/maintenance/aft{name = "Aft Maintenance"}) "cdK" = (/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "28"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) @@ -5638,11 +5639,11 @@ "cew" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "cex" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central) "cey" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) -"cez" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/hallway/primary/central) +"cez" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "ceA" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"}) "ceB" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating/airless,/area/AIsattele) "ceC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/carpet,/area/crew_quarters/theatre) -"ceD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/hallway/primary/central) +"ceD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "ceE" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating/airless,/area/AIsattele) "ceF" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "ceG" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "bot"},/area/maintenance/storage) @@ -5682,6 +5683,7 @@ "cfo" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27;37"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "cfp" = (/obj/structure/closet/fireaxecabinet{pixel_x = -32; pixel_y = 0},/obj/machinery/camera{c_tag = "Atmospherics - Port"; dir = 4; network = list("SS13")},/turf/simulated/floor{dir = 8; icon_state = "caution"},/area/maintenance/storage) "cfq" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/blue,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) +"cfr" = (/obj/machinery/camera{c_tag = "Gravity Generator Foyer"},/obj/structure/closet/radiation,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; dir = 1; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/engine/gravity_generator) "cfs" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "cft" = (/obj/effect/landmark/start{name = "Chef"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "cfu" = (/obj/structure/stool,/obj/structure/sign/poster{pixel_y = 32},/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -5690,14 +5692,15 @@ "cfx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/aft{name = "Aft Maintenance"}) "cfy" = (/turf/simulated/floor{icon_state = "greenfull"},/area/hallway/primary/central) "cfz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hallway/primary/central) -"cfA" = (/obj/structure/stool/bed/roller,/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = -30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/machinery/camera{c_tag = "Medbay Sleepers"; dir = 4; network = list("SS13","Medbay")},/turf/simulated/floor{dir = 10; icon_state = "whitegreen"},/area/medical/sleeper{name = "Sleepers"}) +"cfA" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "cfB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/hallway/primary/aft) "cfC" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cfD" = (/obj/structure/barricade/wooden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/girder,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"cfE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator) "cfF" = (/obj/item/clothing/mask/fakemoustache,/obj/item/clothing/mask/cigarette/pipe,/obj/structure/table/woodentable,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/camera{c_tag = "Theatre - Backstage"; dir = 1; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/theatre) "cfG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cfH" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/storage) -"cfI" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/insulated,/obj/structure/disposalpipe/segment,/turf/space,/area/space) +"cfI" = (/obj/structure/closet/radiation,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; dir = 1; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/gravity_generator) "cfJ" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "red"; icon_state = "intact-r"; level = 2},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; dir = 4; icon_state = "intact-c"; level = 2},/turf/simulated/floor,/area/maintenance/storage) "cfK" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "cyan"; dir = 1; icon_state = "manifold-c"; initialize_directions = 11; level = 2},/turf/simulated/floor{icon_state = "arrival"; dir = 8},/area/maintenance/storage) "cfL" = (/turf/simulated/floor/wood{tag = "icon-wood-broken3"; icon_state = "wood-broken3"},/area/assembly/showroom{name = "\improper Corporate Showroom"}) @@ -5727,9 +5730,9 @@ "cgj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cgk" = (/obj/structure/stool/bed,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/weapon/bedsheet/medical,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cgl" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/gateway) -"cgm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/cryo) +"cgm" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = 24; pixel_y = 24},/turf/simulated/floor{dir = 5; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "cgn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/gateway) -"cgo" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/obj/machinery/hydroponics/constructable,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"}) +"cgo" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 28},/obj/machinery/light{dir = 1},/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor{dir = 9; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "cgp" = (/obj/machinery/atmospherics/pipe/manifold{dir = 2; icon_state = "manifold"; level = 2},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor,/area/medical/cryo) "cgq" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/medical/cryo) "cgr" = (/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "delivery"},/area/medical/cryo) @@ -5741,6 +5744,7 @@ "cgx" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/multitool,/turf/simulated/floor,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "cgy" = (/obj/structure/stool,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"}) "cgz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) +"cgA" = (/obj/structure/closet{name = "Supplies Locker"},/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/ammo_casing/shotgun/beanbag,/obj/item/weapon/grenade/chem_grenade/teargas,/obj/item/weapon/grenade/chem_grenade/teargas,/obj/item/weapon/grenade/chem_grenade/teargas,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) "cgB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/maintenance/storage) "cgC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "cgD" = (/obj/machinery/shieldwallgen,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"}) @@ -5781,13 +5785,13 @@ "chm" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "chn" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/checkpoint/science{name = "Security Post - Research Division"}) "cho" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) -"chp" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/pen,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera/autoname{dir = 2; network = list("SS13","RD")},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) +"chp" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "chq" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 10; icon_state = "green"},/area/hydroponics) "chr" = (/turf/simulated/floor/wood{tag = "icon-wood-broken4"; icon_state = "wood-broken4"},/area/maintenance/aft{name = "Aft Maintenance"}) "chs" = (/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cht" = (/obj/structure/optable,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "chu" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"chv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/turf/simulated/floor,/area/medical/surgery) +"chv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/medbay{name = "Medbay Central"}) "chw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "chx" = (/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = -3; pixel_y = 2},/obj/item/weapon/reagent_containers/food/drinks/ale,/obj/structure/table/woodentable,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) "chy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) @@ -5810,7 +5814,7 @@ "chP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/firealarm{pixel_y = 29},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) "chQ" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 6},/turf/simulated/floor/carpet,/area/security/vacantoffice) "chR" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/gateway) -"chS" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = ""; name = "Hydroponics"; req_access_txt = "35"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) +"chS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 30; pixel_y = 0},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/medbay{name = "Medbay Central"}) "chT" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) "chU" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/machinery/camera{c_tag = "Medbay Cryo"; dir = 1; network = list("SS13","Medbay")},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/cryo) "chV" = (/obj/structure/sign/chemistry,/turf/simulated/wall,/area/medical/chemistry) @@ -5863,12 +5867,14 @@ "ciQ" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood{tag = "icon-wood-broken6"; icon_state = "wood-broken6"},/area/assembly/showroom{name = "\improper Corporate Showroom"}) "ciR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) "ciS" = (/obj/structure/table,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{icon_state = "dark"},/area/maintenance/atmos_control{name = "Telecoms Storage"}) +"ciT" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/obj/item/clothing/mask/gas,/obj/machinery/alarm{pixel_y = 23},/obj/structure/table,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/turf/simulated/floor{dir = 9; icon_state = "caution"},/area/maintenance/storage) "ciU" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/wirecutters,/obj/item/weapon/weldingtool,/turf/simulated/floor/plating,/area/maintenance/starboard) "ciV" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard) "ciW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) +"ciX" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor{dir = 1; icon_state = "caution"},/area/maintenance/storage) "ciY" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/pie,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/crew_quarters/theatre) "ciZ" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=1"; freq = 1400; location = "Research and Development"},/turf/simulated/floor{icon_state = "delivery"},/area/toxins/lab) -"cja" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Medbay Hallway Central"; dir = 4; network = list("SS13","Medbay")},/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) +"cja" = (/obj/structure/sign/bluecross,/turf/simulated/wall,/area/medical/chemistry) "cjb" = (/obj/structure/closet/firecloset,/turf/simulated/floor{icon_state = "dark"},/area/library) "cjc" = (/turf/simulated/wall,/area/assembly/chargebay) "cjd" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "caution"; dir = 4},/area/hallway/primary/starboard) @@ -5880,7 +5886,7 @@ "cjj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/starboard) "cjk" = (/turf/simulated/wall/r_wall,/area/toxins/storage) "cjl" = (/obj/structure/grille,/obj/structure/window/reinforced{layer = 2.9},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/window/reinforced{dir = 8; layer = 2.9},/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"}) -"cjm" = (/obj/machinery/light/small,/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/hallway/primary/central) +"cjm" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 6; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "cjn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"}) "cjo" = (/obj/structure/closet/secure_closet/medical1{pixel_x = 0},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/gateway) "cjp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/maintenance/storage) @@ -5899,11 +5905,11 @@ "cjC" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/medical/surgery) "cjD" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Mineral Storeroom"; req_access_txt = "7"},/turf/simulated/floor{icon_state = "dark"},/area/toxins/mineral_storeroom) "cjE" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cjF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"cjF" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 10; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "cjG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central) "cjH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; pixel_y = -2; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Waste Loop")},/turf/simulated/floor{icon_state = "caution"; dir = 4},/area/maintenance/storage) "cjI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"cjJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cjJ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/o2{pixel_x = -2; pixel_y = 4},/turf/simulated/floor{dir = 6; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "cjK" = (/obj/structure/closet,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cjL" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/storage) "cjM" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) @@ -5933,7 +5939,7 @@ "ckk" = (/obj/machinery/computer/aifixer,/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 5; name = "Research Director RC"; pixel_x = -2; pixel_y = 30},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) "ckl" = (/turf/simulated/floor{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor) "ckm" = (/obj/structure/lamarr,/obj/machinery/light/small{dir = 1},/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/hor) -"ckn" = (/obj/machinery/firealarm{pixel_y = 29},/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/toxins/mineral_storeroom) +"ckn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "cko" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/vending/dinnerware,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "ckp" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating/airless,/area/AIsattele) "ckq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) @@ -6106,17 +6112,18 @@ "cnB" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 2; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "bot"},/area/maintenance/storage) "cnC" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Kitchen"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/maintenance/starboard) "cnD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/starboard) -"cnE" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 6},/obj/structure/lattice,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/space,/area/space) +"cnE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) "cnF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "cnG" = (/obj/structure/morgue,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) "cnH" = (/obj/structure/table/woodentable,/obj/item/device/violin,/turf/simulated/floor/wood,/area/crew_quarters/theatre) "cnI" = (/obj/item/device/radio/intercom{dir = 8; freerange = 1; name = "Station Intercom (Telecoms)"; pixel_x = 0; pixel_y = 29},/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Telecoms - Server Room - Fore-Port"; dir = 2; network = list("SS13","tcomm")},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "cnJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/starboard) -"cnK" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 9},/obj/structure/lattice,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/space,/area/space) +"cnK" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 2; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) "cnL" = (/obj/machinery/door/window/eastleft{dir = 1; name = "Robotics Deliveries"; req_access_txt = "29"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "delivery"},/area/assembly/robotics) -"cnM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) +"cnM" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "cnN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/hallway/primary/aft) "cnO" = (/obj/item/device/radio/intercom{dir = 8; freerange = 1; name = "Station Intercom (Telecoms)"; pixel_x = 0; pixel_y = 29},/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Telecoms - Server Room - Fore-Starboard"; dir = 2; network = list("SS13","tcomm")},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) +"cnP" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/space,/area/maintenance/aft{name = "Aft Maintenance"}) "cnQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "cnR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/medical/genetics) "cnS" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -6126,9 +6133,10 @@ "cnW" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "cnX" = (/obj/structure/rack,/obj/item/weapon/weldingtool,/obj/item/weapon/screwdriver{pixel_y = 16},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cnY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=8-Central-Aft"; location = "7.5-Starboard-Aft-Corner"},/turf/simulated/floor,/area/hallway/primary/central) -"cnZ" = (/obj/machinery/hologram/holopad,/obj/machinery/light,/obj/machinery/camera/autoname{dir = 1; network = list("SS13","RD")},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) +"cnZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "coa" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "cob" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 2; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) +"coc" = (/obj/structure/disposaloutlet{dir = 2},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator) "cod" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "coe" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor{icon_state = "bot"},/area/toxins/storage) "cof" = (/obj/item/weapon/cigbutt,/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/toxins/storage) @@ -6136,6 +6144,7 @@ "coh" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/weapon/wrench,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/item/weapon/crowbar,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/maintenance/storage) "coi" = (/obj/structure/table/woodentable,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/crap{name = "\improper NanoTrasen-brand rechargable AA battery"},/turf/simulated/floor/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "coj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=10.1-Aft-Port-Corner"; location = "10-Aft-Central"},/turf/simulated/floor{icon_state = "L5"},/area/hallway/primary/central) +"cok" = (/obj/structure/lattice,/turf/space,/area/maintenance/incinerator) "col" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39;25;28"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "com" = (/obj/structure/table,/obj/item/device/paicard,/obj/machinery/newscaster{pixel_x = -1; pixel_y = -29},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "con" = (/obj/machinery/light/small,/obj/structure/table/woodentable,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"}) @@ -6172,7 +6181,7 @@ "coS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) "coT" = (/obj/structure/closet/coffin,/obj/machinery/light/small{dir = 1},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/chapel/main) "coU" = (/obj/machinery/door/airlock/research{name = "Xenobiology Access"; req_access_txt = "47"},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) -"coV" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology) +"coV" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/machinery/power/apc{dir = 2; name = "Medbay Storage APC"; pixel_y = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/obj/machinery/light/small,/turf/simulated/floor{dir = 10; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "coW" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology) "coX" = (/obj/structure/sign/atmosplaque{desc = "A plaque commemorating the fallen, may they rest in peace, forever asleep amongst the stars. Someone has drawn a picture of a crying badger at the bottom."; icon_state = "kiddieplaque"; name = "Remembrance Plaque"; pixel_x = 0; pixel_y = 32},/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet,/area/chapel/main) "coY" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) @@ -6209,12 +6218,14 @@ "cpD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay3{name = "Medbay Aft"}) "cpE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=7.5-Starboard-Aft-Corner"; location = "7-Command-Starboard"},/turf/simulated/floor,/area/hallway/primary/central) "cpF" = (/obj/item/seeds/berryseed,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"cpG" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/binary/pump{dir = 2; icon_state = "intact_on"; name = "Gas Pump"; on = 1},/turf/space,/area/maintenance/starboard) "cpH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Command Hallway"},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "cpI" = (/obj/item/seeds/moonflowerseed,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cpJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/camera/autoname{dir = 4; network = list("SS13","RD")},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"cpJ" = (/obj/machinery/door/poddoor/shutters/preopen{id = "kitchenhydro"; name = "Service Shutter"},/obj/machinery/door/airlock/glass_medical{icon = 'icons/obj/doors/Doorglass.dmi'; id_tag = ""; name = "Service Door"; req_access_txt = "0"; req_one_access_txt = "35;28"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/hydroponics) "cpK" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/medical/medbay3{name = "Medbay Aft"}) "cpL" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #4"; req_access_txt = "55"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/toxins/xenobiology) "cpM" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central) +"cpN" = (/obj/machinery/atmospherics/pipe/vent{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator) "cpO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/device/radio/intercom{pixel_y = -25},/obj/item/weapon/kitchen/rollingpin,/obj/machinery/camera{c_tag = "Kitchen"; dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "cpP" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #3"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cpQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) @@ -6425,7 +6436,7 @@ "ctN" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "ctO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera{c_tag = "Kitchen - Coldroom"; dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "ctP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/aft) -"ctQ" = (/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/hallway/primary/central) +"ctQ" = (/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "ctR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/assembly/robotics) "ctS" = (/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/solar/port) "ctT" = (/obj/machinery/door/window{dir = 4; name = "Mass Driver"; req_access_txt = "22"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) @@ -6449,7 +6460,7 @@ "cul" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cum" = (/obj/machinery/camera{c_tag = "Arrivals - Aft Arm - Far"; dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "cun" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Telecoms Server Room APC"; pixel_x = 25; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "Telecoms - Server Room - Aft-Starboard"; dir = 8; network = list("SS13","tcomm")},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) -"cuo" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/toxins/storage) +"cuo" = (/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "cup" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics) "cuq" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "cur" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6489,7 +6500,7 @@ "cuZ" = (/obj/structure/flora/ausbushes/fernybush,/obj/structure/flora/ausbushes/fullgrass,/obj/structure/flora/ausbushes/brflowers,/obj/structure/flora/ausbushes/sunnybush,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/grass,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cva" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "cvb" = (/obj/machinery/mecha_part_fabricator,/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics) -"cvc" = (/obj/structure/optable{name = "Robotics Operating Table"},/obj/machinery/camera/autoname{dir = 1; network = list("SS13","RD")},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor{dir = 1; icon_state = "whitehall"},/area/assembly/robotics) +"cvc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "cvd" = (/obj/structure/stool/bed/chair,/obj/effect/landmark/start{name = "Chaplain"},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "cve" = (/turf/simulated/floor/plating{icon_state = "warnplate"},/area/chapel/main) "cvf" = (/obj/structure/table,/obj/item/candle,/turf/simulated/floor{icon_state = "delivery"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) @@ -6546,7 +6557,7 @@ "cwe" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/hallway/primary/aft) "cwf" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "isolb"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/patients_rooms{name = "Patient Room A"}) "cwg" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Chapel - Funeral Parlour"; dir = 8; network = list("SS13")},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"cwh" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/door_control{id = "isolb"; name = "Privacy Shutters"; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/patients_rooms{name = "Patient Room A"}) +"cwh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "cwi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) "cwj" = (/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/obj/machinery/camera{c_tag = "Departure Lounge - Starboard Aft"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cwk" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/chapel/main) @@ -6556,7 +6567,7 @@ "cwo" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cwp" = (/obj/structure/rack,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cwq" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/patients_rooms{name = "Patient Room A"}) -"cwr" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/clothing/tie/stethoscope,/obj/machinery/light/small{dir = 8},/obj/machinery/power/apc{dir = 8; name = "Patient Room A APC"; pixel_x = -26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/patients_rooms{name = "Patient Room A"}) +"cwr" = (/obj/machinery/camera{c_tag = "Central Primary Hallway - Aft-Port"; dir = 1; network = list("SS13")},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "cws" = (/obj/machinery/light_switch{pixel_x = -27},/obj/machinery/camera{c_tag = "Chapel - Port"; dir = 4; network = list("SS13")},/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main) "cwt" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cwu" = (/turf/simulated/wall/r_wall,/area/medical/virology) @@ -6572,6 +6583,7 @@ "cwE" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; icon_state = "intact-c"; level = 2},/turf/space,/area/space) "cwF" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/stack/cable_coil{pixel_x = -1; pixel_y = -3},/obj/item/stack/cable_coil,/turf/simulated/floor,/area/assembly/chargebay) "cwG" = (/obj/machinery/computer/scan_consolenew,/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/genetics) +"cwH" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/insulated{dir = 5},/turf/space,/area/maintenance/aft{name = "Aft Maintenance"}) "cwI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/obj/structure/stool/bed/chair,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cwJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main) "cwK" = (/obj/machinery/atmospherics/pipe/manifold{dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"; pipe_color = "blue"},/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main) @@ -6598,11 +6610,13 @@ "cxf" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "cxg" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cxh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) +"cxi" = (/obj/structure/rack,/obj/item/weapon/hatchet,/obj/item/weapon/butch,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cxj" = (/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/genetics) "cxk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cxl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/structure/dispenser,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cxm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/assembly/robotics) "cxn" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plating,/area/maintenance/starboard) +"cxo" = (/obj/machinery/camera{active_power_usage = 0; c_tag = "Turbine Vent"; dir = 4; network = list("Turbine"); use_power = 0},/turf/space,/area/space) "cxp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/toxins/xenobiology) "cxq" = (/obj/structure/stool/bed/chair,/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cxr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics) @@ -6639,13 +6653,13 @@ "cxW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 17},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "cxX" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/toxins/storage) "cxY" = (/obj/machinery/vending/wallmed1{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/medical/patients_rooms{name = "Patient Room A"}) -"cxZ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/patients_rooms{name = "Patient Room A"}) +"cxZ" = (/obj/machinery/light/small,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "cya" = (/obj/structure/sign/vacuum{pixel_x = -32},/turf/simulated/floor{icon_state = "delivery"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cyb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cyc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/toxins/xenobiology) "cyd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology) "cye" = (/obj/machinery/door/airlock/medical{name = "Patient Room A"; req_access_txt = "5"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/patients_rooms{name = "Patient Room A"}) -"cyf" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/machinery/light_switch{pixel_x = 24; pixel_y = 24},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/patients_rooms{name = "Patient Room A"}) +"cyf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "cyg" = (/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) "cyh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "cyi" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) @@ -6688,7 +6702,7 @@ "cyT" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) "cyU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "cyV" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/toxins/test_area) -"cyW" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/insulated{dir = 10},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/space,/area/space) +"cyW" = (/turf/space,/area/maintenance/incinerator) "cyX" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cyY" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "cyZ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/structure/grille,/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) @@ -6712,17 +6726,17 @@ "czr" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area) "czs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{name = "Solar Maintenance"; req_access = null; req_access_txt = "10; 13"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "czt" = (/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) -"czu" = (/obj/machinery/power/apc{dir = 1; name = "Medbay Central APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/camera{c_tag = "Medbay Hallway Fore"; dir = 2; network = list("SS13","Medbay")},/turf/simulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) +"czu" = (/obj/machinery/vending/cola,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/camera{c_tag = "Maltese Falcon - Gambling Den Aft"; dir = 1; network = list("SS13")},/turf/simulated/floor/carpet,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "czv" = (/obj/machinery/light/small,/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/chapel/main) "czw" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "czx" = (/obj/structure/bookcase{name = "Holy Bookcase"},/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main) -"czy" = (/obj/machinery/light,/obj/structure/stool/bed/roller,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/camera{c_tag = "Medbay Foyer"; dir = 1; network = list("SS13","Medbay")},/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/medbay{name = "Medbay Central"}) +"czy" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Maltese Falcon - Hatch"; dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "czz" = (/obj/machinery/light/small,/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) "czA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "czB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "czC" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "czD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera{c_tag = "Aft Primary Hallway - Aft"; dir = 8; network = list("SS13")},/turf/simulated/floor{dir = 2; icon_state = "escape"},/area/hallway/primary/aft) -"czE" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) +"czE" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/sign/electricshock{pixel_x = 32},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "czF" = (/turf/simulated/wall/r_wall,/area/hallway/primary/aft) "czG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39;25;28"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "czH" = (/obj/structure/table,/obj/item/device/assembly/igniter{pixel_x = -5; pixel_y = 3},/obj/item/device/assembly/igniter{pixel_x = 5; pixel_y = -4},/obj/item/device/assembly/igniter{pixel_x = 2; pixel_y = 6},/obj/item/device/assembly/igniter{pixel_x = 2; pixel_y = -1},/obj/machinery/power/apc{dir = 4; name = "Toxins Lab APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) @@ -6749,6 +6763,7 @@ "cAc" = (/obj/item/device/assembly/timer{pixel_x = 5; pixel_y = 4},/obj/item/device/assembly/timer{pixel_x = -4; pixel_y = 2},/obj/item/device/assembly/timer{pixel_x = 6; pixel_y = -4},/obj/item/device/assembly/timer{pixel_x = 0; pixel_y = 0},/obj/structure/table/reinforced,/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cAd" = (/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cAe" = (/obj/structure/closet/bombcloset,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) +"cAf" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cAg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple{dir = 4},/turf/simulated/floor/plating,/area/toxins/server{name = "\improper Research Division Server Room"}) "cAh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/virology) "cAi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/medical/patients_rooms{name = "Patient Room A"}) @@ -6798,7 +6813,7 @@ "cBa" = (/obj/machinery/computer/arcade,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cBb" = (/obj/structure/closet/emcloset,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cBc" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Break Room"; req_access_txt = "39"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "whitegreenfull"},/area/medical/virology) -"cBd" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/medical/medbay{name = "Medbay Central"}) +"cBd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cBe" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cBf" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) "cBg" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft) @@ -6849,6 +6864,8 @@ "cBZ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/solar/starboard) "cCa" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/virology) "cCb" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/virology) +"cCc" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/alarm{desc = "This particular atmos control unit appears to have no access restrictions."; dir = 8; icon_state = "alarm0"; locked = 0; name = "all-access air alarm"; pixel_x = 24; req_access = "0"; req_one_access = "0"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cCd" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "plasma tank pump"},/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 28},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cCe" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/virology) "cCf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cCg" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) @@ -6908,7 +6925,7 @@ "cDi" = (/turf/simulated/floor/plating/airless,/area/solar/starboard) "cDj" = (/turf/space,/area/syndicate_station/southwest) "cDk" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cDl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) +"cDl" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cDm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cDn" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio7"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/toxins/xenobiology) "cDo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio7"; name = "containment blast door"},/turf/simulated/floor/engine,/area/toxins/xenobiology) @@ -6975,12 +6992,12 @@ "cEx" = (/obj/structure/sign/biohazard{pixel_x = -32},/turf/space,/area/space) "cEy" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/space) "cEz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/crate,/obj/item/clothing/gloves/fyellow,/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cEA" = (/obj/structure/table/woodentable,/obj/item/weapon/nullrod{pixel_x = 4},/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater{pixel_x = -2; pixel_y = 2},/obj/item/device/soulstone,/obj/item/organ/heart,/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office) +"cEA" = (/obj/machinery/atmospherics/pipe/simple{dir = 10; icon_state = "intact"; level = 2},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cEB" = (/obj/machinery/atmospherics/pipe/vent{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space) "cEC" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space) "cED" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/storage/fancy/candle_box{pixel_x = 0; pixel_y = 5},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "cEE" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating/airless,/area/space) -"cEF" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay3{name = "Medbay Aft"}) +"cEF" = (/obj/structure/optable{name = "Robotics Operating Table"},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/camera{c_tag = "Robotics - Aft"; dir = 1; network = list("SS13","RD")},/turf/simulated/floor{dir = 1; icon_state = "whitehall"},/area/assembly/robotics) "cEG" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/infections{pixel_y = 7},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 5; icon_state = "whitegreen"},/area/medical/virology) "cEH" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/wrench,/obj/item/clothing/mask/gas,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cEI" = (/turf/simulated/floor/plating/airless{dir = 8; icon_state = "warnplate"},/area/space) @@ -7266,7 +7283,7 @@ "cKc" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/carrotseed,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "cKd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cKe" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor,/area/centcom/evac) -"cKf" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/camera{c_tag = "Xenobiology - Entrance"; dir = 8; network = list("SS13","RD")},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cKf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cKg" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/shuttle/floor,/area/centcom/evac) "cKh" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor,/area/centcom/evac) "cKi" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 0},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor,/area/centcom/evac) @@ -7332,14 +7349,14 @@ "cLq" = (/obj/machinery/door_control{dir = 2; id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/door_control{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/turf/simulated/shuttle/floor,/area/supply/dock) "cLr" = (/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/medical/medbay3{name = "Medbay Aft"}) "cLs" = (/obj/machinery/vending/coffee,/obj/structure/sign/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/medical/medbay3{name = "Medbay Aft"}) -"cLt" = (/obj/machinery/light{dir = 4},/obj/structure/sign/vacuum{pixel_x = 32},/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/obj/machinery/camera{c_tag = "Departure Lounge - Starboard Fore"; dir = 8; network = list("SS13")},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) +"cLt" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/camera{c_tag = "Research Division Hallway - Xenobiology Access"; dir = 4; network = list("SS13","RD")},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology) "cLu" = (/obj/structure/stool,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/camera{c_tag = "Aft Starboard Solar Maintenance"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cLv" = (/obj/machinery/recharge_station,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "bot"},/area/assembly/chargebay) "cLw" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cLx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cLy" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/supply/dock) "cLz" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 2; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/machinery/dna_scannernew,/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/genetics_cloning) -"cLA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) +"cLA" = (/obj/machinery/door/firedoor/border_only,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology) "cLB" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/supply/dock) "cLC" = (/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/aft) "cLD" = (/turf/unsimulated/wall,/area/centcom/control) @@ -7399,14 +7416,15 @@ "cMF" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape/centcom) "cMG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/genetics) "cMH" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) -"cMI" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3{name = "Medbay Aft"}) +"cMI" = (/obj/machinery/light{dir = 4},/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/obj/machinery/camera{c_tag = "Departure Lounge - Starboard Fore"; dir = 8; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cMJ" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central) "cMK" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "whitebluecorner"},/area/medical/medbay3{name = "Medbay Aft"}) +"cML" = (/obj/machinery/light{dir = 1},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cMM" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) "cMN" = (/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/evac) "cMO" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) "cMP" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) -"cMQ" = (/obj/machinery/light/small{dir = 4},/obj/effect/landmark/start{name = "Chaplain"},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) +"cMQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cMR" = (/obj/machinery/status_display,/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/escape/centcom) "cMS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) "cMT" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) @@ -7464,7 +7482,7 @@ "cNT" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/evac) "cNU" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "cNV" = (/obj/structure/stool/bed/roller,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"cNW" = (/obj/machinery/camera{c_tag = "Central Primary Hallway - Aft-Port"; dir = 1; network = list("SS13")},/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/hallway/primary/central) +"cNW" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cNX" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) "cNY" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control) "cNZ" = (/turf/space/transit/north/shuttlespace_ns11,/area/shuttle/escape/transit) @@ -7492,7 +7510,7 @@ "cOv" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/escape/centcom) "cOw" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_station/start) "cOx" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_station/start) -"cOy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/exam_room{name = "Patient Room B"}) +"cOy" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 26},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cOz" = (/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "cOA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/assembly/chargebay) "cOB" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/syndicate_station/start) @@ -7662,7 +7680,7 @@ "cRJ" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "cRK" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/weapon/storage/backpack/satchel,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/wizard_station) "cRL" = (/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/wizard_station) -"cRM" = (/obj/machinery/camera{c_tag = "Chapel Office - Backroom"; dir = 8; network = list("SS13")},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) +"cRM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cRN" = (/turf/unsimulated/wall,/area/tdome) "cRO" = (/obj/machinery/igniter,/turf/simulated/floor,/area/tdome) "cRP" = (/turf/simulated/floor,/area/tdome) @@ -7671,6 +7689,7 @@ "cRS" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/table,/obj/item/stack/medical/ointment,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) "cRT" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1480; name = "Confessional Intercom"; pixel_x = -25},/obj/structure/stool/bed/chair,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "cRU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/carpet,/area/chapel/main) +"cRV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple{dir = 10; icon_state = "intact"; level = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cRW" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor,/area/shuttle/laborcamp/station) "cRX" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/laborcamp/station) "cRY" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/wizard_station) @@ -8769,7 +8788,7 @@ "dmZ" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact-f"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/mine/north_outpost) "dna" = (/obj/item/weapon/shard,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/mine/abandoned) "dnb" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/airless,/area/mine/abandoned) -"dnc" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) +"dnc" = (/obj/structure/table/reinforced,/obj/machinery/door/window/westleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Outer Window"; req_access_txt = "0"},/obj/machinery/door/window/brigdoor{dir = 4; name = "Security Desk"; req_access_txt = "1"},/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dnd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "dne" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/carpet,/area/chapel/main) "dnf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/carpet,/area/chapel/main) @@ -8830,7 +8849,7 @@ "doi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "doj" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/plating/airless,/area/mine/abandoned) "dok" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39;37;25;28"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"dol" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/medical/medbay3{name = "Medbay Aft"}) +"dol" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dom" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor,/area/mine/north_outpost) "don" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor,/area/mine/north_outpost) "doo" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/mine/north_outpost) @@ -9457,6 +9476,7 @@ "dAl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor{dir = 4; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "dAm" = (/obj/structure/table,/obj/item/weapon/storage/box/rxglasses{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics_cloning) "dAn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/aft) +"dAo" = (/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/atmospherics/portables_connector{dir = 4; name = "input gas connector port"},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "dAp" = (/obj/machinery/bot/secbot/beepsky{desc = "Powered by tears and swet of laborer."; name = "Prison Ofitser"},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=SMine"; location = "Storage"},/turf/simulated/floor{icon_state = "asteroidfloor"; temperature = 273.15},/area/mine/laborcamp) "dAq" = (/turf/unsimulated/wall/fakedoor{name = "Centcom Security"},/area/centcom/evac) "dAr" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) @@ -9496,6 +9516,7 @@ "dAZ" = (/obj/machinery/telecomms/bus/preset_three,/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "dBa" = (/obj/machinery/airlock_sensor{id_tag = "tox_airlock_sensor"; master_tag = "tox_airlock_control"; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/binary/pump{dir = 4; icon_state = "intact_on"; on = 1},/turf/simulated/floor/engine,/area/toxins/mixing{name = "\improper Toxins Lab"}) "dBb" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac) +"dBc" = (/obj/machinery/meter,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold"; level = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "dBd" = (/obj/machinery/atmospherics/pipe/simple/insulated{icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/toxins/mixing{name = "\improper Toxins Lab"}) "dBe" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/centcom{name = "Morgue"; opacity = 1; req_access_txt = "5"},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) "dBf" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/laborcamp/station) @@ -9505,6 +9526,7 @@ "dBj" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/toxins/mixing{name = "\improper Toxins Lab"}) "dBk" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/toxins/mixing{name = "\improper Toxins Lab"}) "dBl" = (/obj/machinery/power/apc{dir = 1; name = "Mech Bay APC"; pixel_x = 0; pixel_y = 26},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/assembly/chargebay) +"dBm" = (/obj/machinery/atmospherics/portables_connector{dir = 8; name = "output gas connector port"},/obj/machinery/portable_atmospherics/canister,/obj/machinery/ignition_switch{id = "Incinerator"; pixel_x = -6; pixel_y = -24},/obj/machinery/embedded_controller/radio/access_controller{exterior_door_tag = "incinerator_airlock_exterior"; id_tag = "incinerator_access_control"; interior_door_tag = "incinerator_airlock_interior"; name = "Incinerator Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "12"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "dBn" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/laborcamp/station) "dBo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central) "dBp" = (/obj/machinery/mass_driver{dir = 4; id = "toxinsdriver"},/turf/simulated/floor/plating,/area/toxins/mixing{name = "\improper Toxins Lab"}) @@ -9588,8 +9610,10 @@ "dCP" = (/turf/space/transit/east/shuttlespace_ew1,/area/shuttle/escape_pod4/transit) "dCQ" = (/turf/space,/area/shuttle/escape_pod4/centcom) "dCR" = (/obj/machinery/computer/telecrystals/boss,/turf/unsimulated/floor{tag = "icon-podhatch (NORTHEAST)"; icon_state = "podhatch"; dir = 5},/area/syndicate_mothership) +"dCS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/insulated{icon_state = "intact"; dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -31},/mob/living/simple_animal/mouse,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "dCT" = (/obj/structure/sign/map/right{pixel_y = -32},/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_right"; name = "skeletal minibar"},/obj/item/weapon/reagent_containers/food/drinks/bottle/gin,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) "dCU" = (/obj/structure/sign/map/left{pixel_y = -32},/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_left"; name = "skeletal minibar"},/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) +"dCV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door_control{id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = -6; pixel_y = -24; req_access_txt = "12"},/obj/machinery/door_control{id = "auxincineratorvent"; name = "Auxiliary Vent Control"; pixel_x = 6; pixel_y = -24; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple{dir = 2; icon_state = "intact"; level = 2},/obj/machinery/atmospherics/pipe/simple/insulated{icon_state = "intact"; dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "dCW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorsilver.dmi'; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "dCX" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) "dCY" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) @@ -9628,6 +9652,7 @@ "dDF" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/obj/item/weapon/wrench,/obj/item/weapon/handcuffs,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 5; icon_state = "whitegreen"},/area/medical/virology) "dDG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{icon_state = "door_closed"; id_tag = "AuxGenetics"; locked = 0; name = "Genetics Access"; req_access_txt = "9"; req_one_access_txt = "0"},/turf/simulated/floor,/area/medical/genetics) "dDH" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"dDI" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "input port pump"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "dDJ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3{name = "Medbay Aft"}) "dDK" = (/obj/machinery/door/firedoor/border_only{dir = 8},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3{name = "Medbay Aft"}) "dDL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/medbay3{name = "Medbay Aft"}) @@ -9648,21 +9673,21 @@ "dEa" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "dEb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "dEc" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"dEd" = (/obj/structure/table,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/device/flash,/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics) +"dEd" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dEe" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "dEf" = (/obj/machinery/power/apc{dir = 2; name = "RD Office APC"; pixel_x = 0; pixel_y = -27},/obj/structure/cable/yellow,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/structure/flora/kirbyplants/dead,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) -"dEg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay3{name = "Medbay Aft"}) +"dEg" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/firealarm{pixel_y = 28},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dEh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "dEi" = (/obj/structure/disposalpipe/segment,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) -"dEj" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/clothing/tie/stethoscope,/obj/machinery/light/small{dir = 8},/obj/machinery/power/apc{dir = 8; name = "Patient Room B APC"; pixel_x = -26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/exam_room{name = "Patient Room B"}) +"dEj" = (/obj/machinery/light/small{dir = 4},/obj/effect/landmark/start{name = "Chaplain"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "dEk" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/vending/wallmed1{pixel_y = 28},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/exam_room{name = "Patient Room B"}) -"dEl" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/door_control{id = "isola"; name = "Privacy Shutters"; pixel_y = 25},/obj/machinery/light_switch{pixel_x = 24; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/exam_room{name = "Patient Room B"}) +"dEl" = (/obj/machinery/camera{c_tag = "Chapel Office - Backroom"; dir = 8; network = list("SS13")},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "dEm" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "isola"; name = "Privacy Shutters"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/exam_room{name = "Patient Room B"}) "dEn" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/space,/area/mine/north_outpost) "dEo" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "dEp" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "dEq" = (/turf/simulated/wall,/area/medical/exam_room{name = "Patient Room B"}) -"dEr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/medical/medbay3{name = "Medbay Aft"}) +"dEr" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/obj/item/weapon/handcuffs,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/device/radio/off,/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_x = 30; pixel_y = 0},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dEs" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/turf/simulated/wall,/area/mine/laborcamp) "dEt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "dEu" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/medbay3{name = "Medbay Aft"}) @@ -9670,22 +9695,22 @@ "dEw" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "dEx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/server{name = "\improper Research Division Server Room"}) "dEy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/virology) -"dEz" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/exam_room{name = "Patient Room B"}) +"dEz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dEA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "dEB" = (/obj/machinery/vending/coffee,/turf/simulated/floor/carpet,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) "dEC" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) "dED" = (/turf/simulated/floor/plating/asteroid/airless,/area/mine/unexplored) -"dEE" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3{name = "Medbay Aft"}) +"dEE" = (/obj/machinery/computer/secure_data,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dEF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "dEG" = (/obj/machinery/power/apc{dir = 4; name = "Medbay Aft APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/junction,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "dEH" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/wall,/area/mine/laborcamp) "dEI" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "dEJ" = (/turf/simulated/wall/r_wall,/area/mine/laborcamp) "dEK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/genetics) -"dEL" = (/obj/machinery/camera/autoname{dir = 1; network = list("SS13","RD")},/obj/machinery/vending/cola,/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/carpet,/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) +"dEL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dEM" = (/obj/machinery/light_switch{pixel_x = 23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/medical/genetics) "dEN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -26},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) -"dEO" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay3{name = "Medbay Aft"}) +"dEO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "red"; dir = 10},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dEP" = (/obj/structure/table,/obj/item/device/assembly/igniter{pixel_x = -5; pixel_y = 3},/obj/item/device/assembly/igniter{pixel_x = 5; pixel_y = -4},/obj/item/device/assembly/igniter{pixel_x = 2; pixel_y = 6},/obj/item/device/assembly/igniter{pixel_x = 2; pixel_y = -1},/turf/simulated/floor/engine,/area/toxins/xenobiology) "dEQ" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 10},/obj/item/device/radio/electropack,/turf/simulated/floor/engine,/area/toxins/xenobiology) "dER" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics) @@ -9799,7 +9824,7 @@ "dGV" = (/obj/machinery/camera{c_tag = "Labor Camp Central"; network = list("Labor")},/obj/machinery/atmospherics/pipe/manifold{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) "dGW" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact-f"},/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) "dGX" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) -"dGY" = (/obj/machinery/camera/autoname{dir = 1; network = list("SS13","RD")},/obj/machinery/light,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar{name = "\improper Maltese Falcon"}) +"dGY" = (/turf/simulated/floor{icon_state = "red"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dGZ" = (/obj/machinery/mineral/processing_unit_console{machinedir = 6},/turf/simulated/wall,/area/mine/laborcamp) "dHa" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/toxins/storage) "dHb" = (/obj/machinery/door/poddoor/preopen{id = "Labor"; name = "labor camp blast door"},/obj/machinery/door/airlock{name = "Labor Camp External Access"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) @@ -9841,6 +9866,7 @@ "dHL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/plating,/area/maintenance/starboard) "dHM" = (/obj/structure/plasticflaps,/turf/simulated/floor{icon_state = "asteroidfloor"; temperature = 273.15},/area/mine/laborcamp) "dHN" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) +"dHO" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/insulated{dir = 6},/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "dHP" = (/obj/structure/rack,/turf/simulated/floor/airless{icon_state = "asteroidfloor"},/area/mine/abandoned) "dHQ" = (/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/mine/north_outpost) "dHR" = (/obj/machinery/conveyor{dir = 4; id = "mining_north"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/north_outpost) @@ -9879,6 +9905,7 @@ "dIy" = (/turf/simulated/floor{icon_state = "dark"},/area/tcommsat/server) "dIz" = (/obj/machinery/telecomms/receiver/preset_right,/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "dIA" = (/obj/machinery/telecomms/processor/preset_three,/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) +"dIB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = 32},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating,/area/maintenance/incinerator) "dIC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/plating,/area/tcommsat/server) "dID" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/construction/hallway{name = "\improper MiniSat Exterior"}) "dIE" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/mine/north_outpost) @@ -9915,6 +9942,7 @@ "dJj" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "dJk" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "dJl" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) +"dJm" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher,/obj/machinery/light/small,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -31},/turf/simulated/floor/plating,/area/maintenance/incinerator) "dJn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{icon_state = "door_closed"; locked = 0; name = "Storage Room"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "dJo" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "dJp" = (/obj/structure/girder,/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -9946,6 +9974,7 @@ "dJP" = (/obj/machinery/door/airlock{id_tag = "AuxShower"; name = "Shower"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/crew_quarters/toilet{name = "\improper Auxiliary Restrooms"}) "dJQ" = (/obj/machinery/door/airlock{id_tag = "AuxToilet2"; name = "Unit 2"},/turf/simulated/floor,/area/crew_quarters/toilet{name = "\improper Auxiliary Restrooms"}) "dJR" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/crew_quarters/toilet{name = "\improper Auxiliary Restrooms"}) +"dJS" = (/obj/structure/disposalpipe/segment,/obj/machinery/computer/turbine_computer{id = "incineratorturbine"},/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/computer/security/telescreen{desc = "Used for watching the turbine vent."; dir = 8; name = "turbine vent monitor"; network = list("Turbine"); pixel_x = 29; pixel_y = 0},/obj/machinery/door_control{id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = 24; pixel_y = -24; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/incinerator) "dJT" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "floorgrime"},/area/crew_quarters/toilet{name = "\improper Auxiliary Restrooms"}) "dJU" = (/obj/structure/table,/obj/machinery/power/apc{dir = 1; name = "Robotics Lab APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 23},/obj/item/weapon/crowbar,/obj/item/device/multitool{pixel_x = 3},/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/obj/item/device/multitool{pixel_x = 3},/obj/item/stack/cable_coil,/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics) "dJV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "floorgrime"},/area/crew_quarters/toilet{name = "\improper Auxiliary Restrooms"}) @@ -9999,7 +10028,7 @@ "dKR" = (/obj/structure/rack,/obj/item/weapon/tank/oxygen,/obj/item/clothing/suit/space/rig/medical{name = "emergency medical hardsuit"},/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/medical{desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra mobility."; name = "emergency medical hardsuit helmet"},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) "dKS" = (/obj/structure/closet/secure_closet/RD,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) "dKT" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doormaint.dmi'; name = "Theatre Stage"; req_access_txt = "0"; req_one_access_txt = "12;46"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard) -"dKU" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/obj/machinery/door_control{id = "rdprivacy"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -26},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) +"dKU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dKV" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"; pipe_color = "red"},/turf/simulated/floor{icon_state = "whitegreen"},/area/medical/virology) "dKW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/embedded_controller/radio/access_controller{exterior_door_tag = "virology_airlock_exterior"; id_tag = "virology_airlock_control"; interior_door_tag = "virology_airlock_interior"; name = "Virology Access Console"; pixel_x = 26; pixel_y = 26; req_access_txt = "39"},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/virology) "dKX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = -26; pixel_y = 28; req_access_txt = "39"},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology) @@ -10095,6 +10124,7 @@ "dMJ" = (/obj/machinery/computer/scan_consolenew,/obj/machinery/camera{c_tag = "Genetics Lab"; dir = 4; network = list("SS13","Medbay")},/turf/simulated/floor{icon_state = "whitebluefull"},/area/medical/genetics) "dMK" = (/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/genetics) "dML" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) +"dMM" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plating,/area/maintenance/incinerator) "dMN" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) "dMO" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/genetics) "dMP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whiteblue"},/area/medical/genetics) @@ -10137,8 +10167,9 @@ "dNA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/assembly/chargebay) "dNB" = (/obj/structure/stool/bed/roller,/obj/machinery/door/window/westleft{dir = 1; name = "Monkey Pen"; pixel_y = 2; req_access_txt = "9"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/genetics) "dNC" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/stool/bed/roller,/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/genetics) +"dND" = (/obj/machinery/door/poddoor{id = "auxincineratorvent"; name = "Auxiliary Incinerator Vent"},/turf/simulated/floor/engine/vacuum,/area/space) "dNE" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/assembly/chargebay) -"dNF" = (/obj/machinery/light,/obj/machinery/camera/autoname{dir = 1; network = list("SS13","RD")},/turf/simulated/floor/mech_bay_recharge_floor,/area/assembly/chargebay) +"dNF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Departure Lounge Security Post"; req_access_txt = "63"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "redfull"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dNG" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "dNH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Lab"; req_access_txt = "8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "dNI" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"}) @@ -10156,7 +10187,7 @@ "dNU" = (/obj/item/stack/sheet/metal{amount = 5},/obj/structure/closet/crate,/turf/simulated/floor{icon_state = "asteroidfloor"; temperature = 273.15},/area/mine/explored) "dNV" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/computer/rdservercontrol,/turf/simulated/floor{icon_state = "dark"},/area/toxins/server{name = "\improper Research Division Server Room"}) "dNW" = (/obj/machinery/mineral/stacking_machine{dir = 1; input_dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) -"dNX" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/light/small{dir = 1},/obj/machinery/camera/autoname{dir = 2; network = list("SS13","RD")},/obj/machinery/mecha_part_fabricator,/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics) +"dNX" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/newscaster/security_unit{pixel_x = 29; pixel_y = 1},/obj/machinery/camera{c_tag = "Departure Lounge - Security Post"; dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "red"; dir = 6},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "dNY" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/mine/production) "dNZ" = (/obj/machinery/door/airlock/external{name = "Labor Camp Shuttle Airlock"},/turf/simulated/floor,/area/mine/laborcamp) "dOa" = (/turf/simulated/floor,/area/mine/laborcamp) @@ -10287,7 +10318,7 @@ "dQv" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "bot"},/area/toxins/storage) "dQw" = (/obj/item/weapon/tank/air,/obj/item/weapon/tank/air,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "dQx" = (/turf/simulated/floor{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/crew_quarters/hor) -"dQy" = (/obj/structure/table,/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/camera/autoname{dir = 8; network = list("SS13","RD")},/turf/simulated/floor,/area/assembly/chargebay) +"dQy" = (/obj/structure/table,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/device/flash,/obj/machinery/camera{c_tag = "Robotics - Fore"; dir = 2; network = list("SS13","RD")},/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics) "dQz" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Uplink Management Control"; req_access_txt = "150"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) "dQA" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) "dQB" = (/obj/structure/table/woodentable,/obj/item/device/syndicatedetonator{desc = "This gaudy button can be used to instantly detonate syndicate bombs that have been activated on the station. It is also fun to press."},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) @@ -10295,6 +10326,7 @@ "dQD" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (WEST)"; icon_state = "podhatch"; dir = 8},/area/syndicate_mothership) "dQE" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) "dQF" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{icon_state = "bot"},/area/toxins/storage) +"dQG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; icon_state = "off"; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "dQH" = (/obj/structure/table,/obj/machinery/cell_charger{pixel_y = 5},/obj/item/stack/cable_coil,/obj/item/device/multitool,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/engine,/area/toxins/xenobiology) "dQI" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 10},/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) "dQJ" = (/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) @@ -10319,6 +10351,39 @@ "dRc" = (/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/mine/living_quarters) "dRd" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/mine/living_quarters) "dRe" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/mine/production) +"dRf" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) +"dRg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/floor/plating,/area/maintenance/starboard) +"dRh" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dRi" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_interior"; locked = 1; name = "Incinerator Interior Airlock"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/insulated{dir = 5},/turf/simulated/floor/engine,/area/maintenance/incinerator) +"dRj" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 10},/turf/simulated/wall/r_wall,/area/maintenance/incinerator) +"dRk" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"dRl" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/valve{dir = 2; name = "output gas to space"},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"dRm" = (/obj/structure/table/woodentable,/obj/item/weapon/spellbook/oneuse/smoke{name = "mysterious old book"},/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater{name = "flask of holy water"; pixel_x = -2; pixel_y = 2},/obj/item/weapon/nullrod{pixel_x = 4},/obj/item/device/soulstone{name = "soul stone shard"},/obj/item/organ/heart,/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office) +"dRn" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/light/small{dir = 1},/obj/machinery/mecha_part_fabricator,/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics) +"dRo" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 2; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay3{name = "Medbay Aft"}) +"dRp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) +"dRq" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/machinery/camera{c_tag = "Research Division Hallway - Robotics"; dir = 4; network = list("SS13","RD")},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"dRr" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) +"dRs" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/clothing/tie/stethoscope,/obj/machinery/light/small{dir = 8},/obj/machinery/power/apc{dir = 8; name = "Patient Room A APC"; pixel_x = -26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/patients_rooms{name = "Patient Room A"}) +"dRt" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/door_control{id = "isolb"; name = "Privacy Shutters"; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/patients_rooms{name = "Patient Room A"}) +"dRu" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "Toxins Storage"; dir = 8; network = list("SS13","RD")},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/toxins/storage) +"dRv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/machinery/light_switch{pixel_x = 24; pixel_y = 24},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/patients_rooms{name = "Patient Room A"}) +"dRw" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/patients_rooms{name = "Patient Room A"}) +"dRx" = (/obj/machinery/hologram/holopad,/obj/machinery/light,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) +"dRy" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/obj/machinery/door_control{id = "rdprivacy"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -26},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("SS13","RD")},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) +"dRz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/camera{c_tag = "Research Division Hallway - Mech Bay"; dir = 4; network = list("SS13","RD")},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"dRA" = (/obj/structure/table,/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/camera{c_tag = "Mech Bay - Starboard"; dir = 8; network = list("SS13","RD")},/turf/simulated/floor,/area/assembly/chargebay) +"dRB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay3{name = "Medbay Aft"}) +"dRC" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/clothing/tie/stethoscope,/obj/machinery/light/small{dir = 8},/obj/machinery/power/apc{dir = 8; name = "Patient Room B APC"; pixel_x = -26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 24},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/exam_room{name = "Patient Room B"}) +"dRD" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/door_control{id = "isola"; name = "Privacy Shutters"; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/exam_room{name = "Patient Room B"}) +"dRE" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/sign/examroom{pixel_x = -32},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) +"dRF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay3{name = "Medbay Aft"}) +"dRG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/exam_room{name = "Patient Room B"}) +"dRH" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/exam_room{name = "Patient Room B"}) +"dRI" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/medbay3{name = "Medbay Aft"}) +"dRJ" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Mech Bay - Aft"; dir = 1; network = list("SS13","RD")},/turf/simulated/floor/mech_bay_recharge_floor,/area/assembly/chargebay) +"dRK" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/medbay3{name = "Medbay Aft"}) +"dRL" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay3{name = "Medbay Aft"}) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10386,7 +10451,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaeaavaavaavaavaavaaeadAaaeaavaavaavaavaavaaeaahaaaaaeaaeaaeaaaaaaaaeaaeaaeaaaabbawmayPaaRayQawoaxKaaaaboakeakfakgaboaboaboaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaeadwaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaadaaaaaTaaTaaOaaTaaTaaaaAwaaaaaTaaTaaOaaTaaTaaaaahaaaaaaaaaaaeaaaaaeaaeaaaaaaaaaaaiawHazaaaCazdayNaaiaaaaboauYauWaqiaviavnaviaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaeaahaahaahaahaahaahaahaaaaelaaaaadaahaahaahaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaeacNacNacNacNacNaaOadAaaOacNacNacNacNacNaaeaadaaaaaaaaaaaeaaeaaeaaaaaaaaiaajaaiaaiaxRaxOaxQaaiaaiaxKaaiavoaczaczaczaczaczaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaabCaupaupaupabCaaaaelaaeaupabCaupaupabCaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaeadxadyadyadyadyaaEadAaaDadCadCadCadCadDaaeaacaaeaaeaaeaaaaaaaaeaaaaaiaaiayCauaaytayvaaRaysaBMaygayeaaiatYaczatWatVatUaczaczaczaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaafgafgafgafgafgaupafhaupafgafgafgafgafgaaeaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaeadxadyadyadyadyaaEadAaaDadCadCadCadCadDaaeaacaaeaaeaaeaaaaaaaaeaaaaaiaaiayCauaaEfayvaaRaysaBMaygayeaaiatYaczatWatVatUaczaczaczaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaafgafgafgafgafgaupafhaupafgafgafgafgafgaaeaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaavaavaavaavaavaaeadAaaeaavaavaavaavaavaaaaahaaaaaaaaeaaaaaaaaeaaaaaiauQaaBaayaayawrawxawuaaJawwawAaaiauMaczauzauxauDauCauOauNaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaeafJafKafKafKafKaaEafMaaDafOafOafOafOafPaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaahaaaaaOaaTaaOaaOaaTaaaajdaaaaaTaaOaaTaaTaaOaaaaaaaaaaaaaaeaaaaaiaajaaiaaiasrawZaayaaxasqaxcaxmaaoaaWazRaaiasEasDasJasIasHasGasCaczaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaeavuavuavuavuavuaaeafMaaeavuavuavuavuavuaaeaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaafaafaafaafaafaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahawLaaTaaTaaOaaOaaOabYaaTaaTaaOaaOaaOawLaaaaaaaaaaaaaaaaaaaaiauUauVatBaaRauRaaRauSauTaaUauPasKaayaayaaiaqiaczatCatoatSatKatmaczatnaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaacaahaahaahaacaahaahaacaaaaaaaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaabCabCaupabCabCaaeagTaaaabCabCaupabCabCaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10394,43 +10459,43 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeavtaugaugaugasnaaeaaeaaeaaeaaeaaeaahaaaaaiabuaboaboabpaboabqaboaEzaboaboaboabtaboaaiaquaczalFalBamNaqtaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaeaauXaaqaaraaraauaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaafJafKafKafKafKaaEafMaaDafOafOafOafOafPaaeaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaeaaaaaeaaaaaaaaaaalaaaaaaaaaaaaaaaaaaaaeaaaabbabJaboabDaayabEabqabFaENabGaboabHaayabIaaiaqiaczaxHaxGamNaqtaaaaaeaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeauvaEgaehaeiaejaekaaaaacaahaacaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaahaaeavuavuavuavuavuaaeafMaaeavuavuavuavuavuaaeaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaaaaagaagaagaagaagaaaaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaeaaaaaeaaeabYaaeaaeaaaaaaaaaaaaaaaaaaaaiaGeaboaccaayacdaceaDRaDSacgaboachaayacgaaiauYaczaxIalBaxLaqtaaaaaeaaeabvabvabvabvabvaaaaaeaaaaaaabwabwaWyaWMaYuabwabwaaaaaeaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaaaeaaElaaMaaraaraaLaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaacaaaabCabCaupabCabCaaaafMaaaabCabCaupabCabCaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaaaaagaagaagaagaagaaaaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaeaaaaaeaaaaaaajEajFajEaaeaaaaaaaaaaaaaaeaaeaaiaboaboabsactaboabqaboaEtabqaboabsacvabqaaiawDaczawCawBawyaczaaeaaeabvabvaDwaDvaIQabvabvaaeaaeabwabwaNTaDAaDCaSMaDOabwabwaaeahwahwaLRahwahwaaeaaeaaeaaeaeaauvaeaaAhaAiaAjaeaaAhaAiaAjaeaaeaaBxaeaaBKaBDaAiaCBaAiaAiaAPaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaahaaaafgafgafgafgafgaupaGSaupafgafgafgafgafgaaeaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaeaaaaaeaaaaaaajEajFajEaaeaaaaaaaaaaaaaaeaaeaaiaboaboabsactaboabqaboaEtabqaboabsacvabqaaiawDaczawCawBawyaczaaeaaeabvabvcgAaDvaIQabvabvaaeaaeabwabwaNTaDAaDCaSMaDOabwabwaaeahwahwaLRahwahwaaeaaeaaeaaeaeaauvaeaaAhaAiaAjaeaaAhaAiaAjaeaaeaaBxaeaaBKaBDaAiaCBaAiaAiaAPaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaahaaaafgafgafgafgafgaupaGSaupafgafgafgafgafgaaeaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaaaaaaaeaaeaaaakhaQJakhaaeaaeaaeaaeaaeaaeaaaaBuaxzaBwaByaBAaAQaARaATaAWaBfaBqaxAaBtaxpaxoaBtaxyawXawEaxkaxdaaeabvabvaKMaEqaEpaEpaJtabvabvaaeabwaFqaEaaEbaEeaUCaVuaFFabwaaeahwaSNaSPaWxahwaaaaaaaaaaaeaeaaujaeaaDpaCUaDoaeaaDXaDGaDWaeaaxFaCEaCCaCFamiamiamiamiamiayEaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaahaaeafJafKafKafKafKaaEafMaaDafOafOafOafOafPaaeaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeakEakFakGakHakIaaaaaeaaaaaaaaeaaaaCNaaCaCTaCOaCPaCIaCJaCGaCHaCLaCMaNbaFYaFcaDgaCHaDhavsaGcaCTaDkaaeabvazEaBBaBzaHMaAXaBEaHKabvaaeaIsaBHaLCaCvaCwaCbaEVaEyaERaaeaEIaAqaFbaCAaLRaaaaBVaBVaBVaeaaxTaymayoaxWaxWaxUaxWaxZaydayFagGagGagGayEamiamiamiamiamiayGaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaahaaeavuavuavuavuavuaaeafMaaeavuavuavuavuavuaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaaaaaeaaeakTakUaFRanWakTaaaaaeaaaaaaaaeaaeaaiaaiazXazZaAaaaiazKazMazKaeMaeMaeMaeMaeMaABaAAaAzaboavwawsaaiaaeabvaCtaBBaCxaBGaCQaBEaCjabvaaeaSJaDbaQgaDcaSKaDMaQgaCXaRvaaeahwaAqaAraCAahwadradradYagRaeaaeaaeaaxJaieavhavhazqayYaznavvavvayWayVayJamiamiamiamiamiayXaeaaeaaeaaaaaaeaaaaaaaaaaaaaaaaaeaaeaaaaaeaaeaaaaaaaaaafMaaaaaaaaeaaaaaaaaeaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaoFaoFaKCalGalGalGalHakTaqaavbareakTaWoagVaWoaWoaaeaaeaaeaaiaaiaAHaaiaaiaaiaAHaaiafQaAGaAEaAFaeMaCdaCKaCzaexaexaexabvabvabvazbayZazlaEmazjayRaBFabvaaeabwavqaCeaBYaCcaAIaBXavpabwaaeahwaAqaAraCAahwaAcadraAdadsaAeaKGaeaavfaieavhavjavkavkavkavxavvavSavNavTamiamiamiamiamiawbauiawdawcaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaeaaaaaaaaaafMaaaaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNOaMzaMuaoHamnaMmaMlakTamoawJamqakTaLOaLEaEHaWoaWoalvalvalvalvalvalvalvalvalvalvakBakAavrakAarGasBaqvaqAaexaikaFMazmabvabvabvaAtaAsabvabvabvabvabvawhabwabwawGawIaEnawzawFabwabwawhahnaDeaDjaEoahwadradradsadsaALaAMaeaaHJaieaxEaiXaiUaiUaxPajJawKahSaliaxBamiamiamiamiamiaxBaxCakOakVaaaaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaeaaeaaeaaeafMaaeaaeaaeaaeaaeaahaaeaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaoFajCaoFaveamnavXaxbalDakTalManbakTaxDazoawYagXaWoaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeafQaeMaeMaeMaeMajLacZajMaexakSailakmabvakuakoakpakxawtatyatwaoTabvanMamBaaQaqTaqwanYattatsaaQahWaqqahnatvatuakvahwamzadsadsadsadsadraeaalraltalsalkaljaljallajJakOajcaliakWamiamiamiamiamiakWaleakOakVaaeaaeaaaaaaaaaaaaaaaaaeaaaaaaaaeaaeaaaaaaagUaiOagUaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaqjamZaqjaqXargaqlaqmarkarJalubGxaWoarTamuasFatQagVaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeafQanianEanjaqyahGahDagPaexaAuailaAvabvaqcaipaiqairaiJakbacBanHakdakwakkajOajNajVajPajXajWajZajYakzakaakjakcarfahwaicadsajwaroaqEadrajfahYaieaiYaiXaiVaiUaiTajJajKahSajHajBamiamiamiamiamiajyajzajkajxaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaamXamYamXaaaaaaaaeaaaaakaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaoFapeaoFanQaisaiDaoOaoFbHMapybKoapKabKapvapRanJaWoaaeaKBagVaKBaKBaKBaaeadradradrafQagtagAafWamOageagOassapWahBahAahBaiNahKahKaiEaiCaiLaiKaiHaiHapMahJahIahHaguahzahyaiAaizaiyaixaiwagBaijaiiahxahwagQadsadsanIadsadraiaahYaieagGaigaifaiPaihahPahQahSagNahUamiamiamiamiamiafFaeaahOaeaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaagUanDaqRanDagUaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaoFamWaqkaqkaqkagnamVaoFaoYaiBbrTaWoanKafAakyanFaWoaKBaKBarnaKBafNaKBafZadraklaicafQagdafXafTagZaeragfaggaexagaagbagcabvagjagkaglaoyabQaenaidanGaexakiafzahiaguahkaffaimahtahvafjahoahnahnanhadradradradradrafHadradraeaagIagHagGagGagLagKagJahrahragMagNahNamiamiamiamiamiafFbWIcsgavAavAavAavAavAavAafravAavAaaaaaaaaeaaeaaeaoBaoCamYaoDaoEaaeaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaeaaaaaeaaaaaeaaaaoFaesaiFaiIajqalKammaoFbrTaiBbrTaKBardbrTbrTbrTdKcaKBbrSaKSaKBaKBaKBaeLacGaeDacLafcaeKafxafvacxacyacwacPabvahgafwaheabvabvacCagyacCabvahhahCagWaduaflafzagxagwaguagsagiaftagDafjagpagoagmafeaeYaeYaeYafGaeXaioaeXaeXahFagEagFafLafLafIadiagzafCafCafCafDafBamiamiamiamiamiafFaUoaQsavAaePakKaQsaeZavAagCackavAavAaaaaaeaaaaaaaptapuaoIandaptaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaKBaKBafUaKBaaeaaaaaeaaeaaeaaeaaeaKBafUaKBaoFahdahfaoFaoFaoFaoFbrTahbbKoaeJabKagqaiWbrTajAaKBbHMagSagvafVaKBacuacsabUabMafQafQafQaeMaeMadWabhacPacIaghaeEaeFafYafbaemaenaeoabvaenacBafkaexafSafzafoafnafqafpaeHaeGabzafjahVacTacTaaQaaQaaQaaQaocadradradradraeaadZadXadFadnadkadjadgaeRaeVaeeaiSaecaebaebaebaebaebaeWaThaQsavAaQsaQsaQsaQsavAaQsaQsafEavAaaaaaeaaaaaaaptanoadfafmaptaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKBajtbMbaKBanLamsamsamsamsamsajsaKBbrSajtaKBaeTaDnaefbMeaspaKBbwqaedbMbaKBardafdafuaeSaeOaKBaeubrTabmafyaKBabkadYahLabladrabiafQabjabnaerabhassadTadUaeAaeNadQaeIadOaeBaevaewaenaaXafsaexaezadRadPadNadMadLadJadKadJadIadHafaadEadEaepadBaaQaocadrabXabZaklabcabcabcabcabcaciacmacfabcabcabcabcabcabVavAabWacbadlavAavAaQsavAaetaQsacnaQsavAaThaddacoavAaaaaaeaaaaaaaptaqZadearbaptaaaaaeaaaaaaaaaaaeaaaaaeaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaeaaaaaaaaaaaaaaeaaeafUaeCaeUadVafRbrTbrTbrTbrTbrTahcacqaeqbKoaaIacrbrTbrTbrTbrTabPaqhbQSadradradradradradradradradradracAadradraaNadradradradradrafQaaGaaYaerabhacPacIacJacQacHacSadoacFaeyaaPabQacDacEaegaduadzadvadcadaadtadmacWacVacYacXacUacTabNadpabNabRaaQaaHaaSaaKaibadsabcaaZaasaaVabyabxabrabdabcabBaatabAabcavAavAaQsaThaQsaUoavAaQsavAadlaQsabOaQsavAabSaQsabOavAavAcgaavAavAarNarNabTaclarNarNcgaarNarNacMarNaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeajGajGaaeaaeajGaaeaaaaaeaaeaaeaKBaKBaxSaKBaKBasWasXasXasXasXasXasYaKBaKBaKBaKBaGraGCaGCaGCaGCaGCaGVbQSadraInatDatEatFawpatGatIasaaFiaoZascasaapcadrdBfapiappdBnaqdapZaowaeraoraosabvabQatpabvabvaEratraDmazpabvaEJaAoaexaexaaQazuaszaslazuaaQazCazBaaQazyacTacTaAbaAbaAbaaQaaQaocadradsauqadsabcarmauoaumaulaukaDYarHausautauuarFabcauravAaufaddacoadGavAaQsavAavAavAbvSavAavAavAavAbvSavAarOaQsbWIaUoaQsaQsaubatRarNaQsaQsaucarNcsgarNaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeajGajGajGajGajGarqajGaaeaaeaKBaKBaKBatHaBPaKBaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaKBasLaUDbHMarlbrTbHMaEsaDuaDFaEvagrasNadradradrataatbatbatbatcadradradrahTaoodpCahTaoqalCaeManPanRassaskaskasiasgaskasjaskasgaskaAyaskasjasbarZashasgaqxapoaskaskaskasgaskasmafQasoainainainainaeMaocadradsadsadsabcabcabcabcabcarMatzaDialZarcabcabcabcatkavAaUoaQsabOaQsavAaQsavAbbNavAatjbvHbvHbvHatiathbYbbYbbYbbYbbYbbYbbYbbuqaQsaQsaQsaQsatgacMasRacMaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaeaaeajGaaeapBaaeajGajGajGajGajGajGaCDaAxaCDafRaqhaKBaKBaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaKBaKBaKBbHMbrTavabHMaGPaAfaGJazTaFuasNadralIaaeaaaaaaaaaaaaaaaaaeaaaadraiRcRXalLcRWamgainamPamQamJaqoaqsaqsaqnaqoaqsazcaqDaqoaqBaqCaqsawvaqQaqPaqsasVaqMaqFalQalQaraaqYaqVaqUaAnaqSajgajhajiaBraeMaocadrasSadYasTabcarUanuaseabyabxabrasOabcasUaasasZabcatdavAavAavAbvSavAavAaQsavAaQsavAatfarNarRarNarWarNarNarNarNarNarNarNarNarNarNbWIarNarNarNarNarNarYaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeajGajGajGajGajGajGaaeajGajGajGaaeaKBaKBaKBarnaqhbrTaKBaaaauIauJauKauJauLalvaaeaaeaaeaKBaovaKBbtwaouaXOaXOaDlbrTaKBaDfarSaoxadraaaavUavUavUavUavUavUavUaaaadraxNaxMasAahTalEalCaeMaoLapqaiGayMapfapnaiGapzapfapqapAapraiMapwapxaxnaoMaoQaoPaoJapaanSamSapaaozaoKapbaoVaoUaoXaoWapNapLaeMaocbaabaabaabaabaaarFarDaryarLarKarIarHarparrarjarmabcartarsbvHbvHaribvHbvHbvHaAgbvHbvHarQarNapSazrapUapTasPaDQasPatLatMatNatMatOarNarNarNatLatMatOatPasPaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeajGajGajGajGajGajGaotajGaaeaaeaaeaaeaKBbHMaqhardafUaaaavLaUaapIavOavLaDLaCraCsaruaruaruaruanOaruaruadradraKBaKBanNadrakYadraaeavUavVavWaBTavYavZavUaaeakRahTarEakXahTaaaaaaacKajjavKajlaeMajmavJajoaeMajpawPajraeMapHajpapsaeMalfanAanzanCanBaldaldalXanxanwaldaldaneaeMaeMaeMaeMaeMaocbaaapVapXanlbaaabcabcabcabcapYaqOaqbalZarcabcabcabcavAaqWaUobWIaQsaUoarhaQsarNarNarNarNarNanVaAJanUanTauyaACauyauAauBatTauBauEatMauFatMauGauBatTatPauHaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeajGajGangajGajGajGajGaaeaaaaaeafUbtwaqhbrTaKBaaaauKawQawRawQauKaCqaADaBdaruazJaBhaCpaBeaBgaruatqamHakCakDakJadrakYadraaaavUaxfaxgaxhaxiaxjavUaaaaiZaiRahZarEahTaknajnaczajQajRajSaeMajTajRajSaeMajUajRajSaeMamKamLaoNaeMamEamGamFamIazLaldaunamyamxamAazkaztaneamDamCamCamCamCansbaaaomaolaokbaaapmakQapmabcaoAaopaonaodaofaobaobatlbvHanXarNarNarNarNarNarNarNannannanaaBsanfancamUamTavFasPasPaaeaaeauBavHauBauBauBauBauBavIauBauBayIaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaajGaaeajGaaeaaeajGajGaaeaaeaKBaKBbMeaqhaKBaKBaaaavLawQawQawQaylazGavRavRazFawUaynaypayqayraxVaqzaywayxayyayzadrakYadraaaavUayAayBasfaxiayDavUaaaahEahTahXarEcRWahuahsaczakqajRakraeMakqajRaksaeMakqajRaktaeMamMacRalNaeMalValUalTalSalRaldayHajualPaoRaoSapGanealOaeXaeXaeXalYalWbaaankanmanlbaaaqNanqanqantanranvahMabcabcabcabcabcavAanyarNamkayaanZamwaxYbwtamlaycaycaycaycampamvamtawNawOasPamraaeaaeaaaaaaaaaaaeaaeaaaaaaaaeaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaajGajGajGaacaaaaaeaaeaaeaKBaKBbHMbHManpafUaaaaaaauKawRawRawRauKaxeawVawWawTawUavRawSavPavQaruahlazOazPazQazIadrakYadraaeazSazwazUazVazWauwavUaaeadrahTahRahRahTahjagYaczakLakMakNafQakLakMakNafQakLakMakNafQalwakPalJafQalfalhalgafQalcaldatAalbalaapEapFatxaneakZbaabaabaaalpbaabaaalqamcbaabaaamfameamdajIamRamjamhalZamaahqabAabcambacjarNalmazraycaycalnaloaAJaANalyalxalxalxalAalzayiayjaykaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaacbmNaAZbmNaahaaaaaeaaaaaeaKBafVarnbGxaqhaKBaKBaaaavLaBaaBbaBcavLbAYaCraCsarubxQavRbzgavPbyraruaBibjyaBkaBlbtbadrakYadraaaaBnavUaBoaBpaBoavUavUaaaadrahaahmahmahpaWuaWvaWubnObnVbnObnZbnObnVbnObyGbnObnVboaboebobbombolbxKbygbywblxafQainanebBiaqrbpXbqsbqWbCXaneakZbaabnubnvbntbpmbpmbpnbjWboHaZHbjVbjTbjUbiQbznbiLarHbhPbhObhMbhGabcaQsacjarNbmMaAJbmLbmJbmHbmFbmEbmAbnyazzazzazzbnwbnxayiayjazDaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabmNbJAbmNaaeaaeaaeaaeaaeaKBbrTbrTbrTarVbaQaKBaaaaCmauJaCnauJaCoalvaaeaaebDYbDWbFNbEMbGCbGqarubglbgmbkxaCybDdadrakYadraaabBjaaabgobgnbgoaaaaaeaaaaWuaWuaknajnaWuaWubaybaVarvbmUbpjbEBbpobplbplbEIbplbprbpobpvbpubogbpsbAgbAhbzRbzZafQainaneanebEcbubanebsianeaneakZbaabaabaabzJbcEboDboEbkkbklbotbkgbjtbkjbkebkebkfbkpabcabcabcabcabcaThacjarNaBZbkbaDxboZboOboIboYboSaAObpgbpebpfaASbpdayiayjaAUaAVaaebooaaaaaaaaaaaabooaaaaaabooaaeaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabmNaAZbmNbmNaDIaDJaDKbmNaKBaKBaKBaKBbrTaqhaKBaaaaaaaaaaaaaaaaaaaaaaaaaaebKpbKabJEbIZbIsbIqarubihaFeaFfaFfaFfbdMbxsbdMbdMbhJbhIbhLbhKbhTbhSbjnbdMaWubicbeVbeVbfHbdhbcNbcNbcKbELbdfbEKbqDbqEbqIbFDbqEbqQaLXbqMbqLbqPbmRbAnbANbbUbBdafQainajvaeMbHmbxdanebxrbwjaeXbqibaabpZbqbbpWbugbaabdxblVbmQbaablHblAblFblNblFblJblMblnbkqbkobbKabcaQsacjarNbpGbpFbpEaCabpObwtbpLbpIaAObpDasPasPaCfasPasPaCgbeQaCiaaeaaaaaaaaaaaaaaabBlaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaabmNbmNaEUbJJaEWaCkaCkaCkaEXbJFaEYaEZaKBaKBaqhaKBaaaaFaaFaaFaaFaaFaaFaaFaaaearuaruarubNybNSaruarubipbimbiqbrzbrpbhrbikbidbqjbkJbrBbrBbjsbrBbknbrLbkQaWublablgbkNaxwaxwbGSaxwaxwaxwaxwaxwaxwaxwaxwbGSaxwbiBawnblTaoaaoaaoabrmbrmbrmbrmbrmaoabrlaoaaqLaqLaqLaqLbrnaqLakZbaabaabaabxtbhDbaabrcbaabHbbaabrkbmVbmWalZbnabnebngalZbnkbnBbnqabcbNoacjarNasPasPasPasPasPbwtbrdaDBaAObqXasPaDDaDEaycbtJaycaDHazDaaeaaaaaaaaeaaeaaeaaeaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaabmNaEUaEUaEUaCkaCkaCkaCkaCkaCkaEUaEUaGtaKBaqhafUaaaaFaaFaaFaaFaaFaaFaaFaaaeaaeaGubymaJbaHZaFVaFDaEBaEAbaTbaUbaRbisaEGbgBbhraCuaBSaBWaDraDtaCVaCYbAQaBOaBLaBNaBRahjaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaabEdbEwbEpbiCaoabiEbiDbivaoebvnaogaohaoiaojaoabyEbqUbtXbvcaDsaqLbynbaabhEbAabcEbhDbaabhCbaabKlbaaaUwaUfaUtaCWaCWaCWaCWaCWaCWaCWaCWaCWavAbzjarNaTMaTBbtgaFZasPbylaAJaDBbhRaDHaEOaEPaEQaoGaAKaESawMazDaaebooaaeaaeajGajGajGaaeblfaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaabmNbwkaCkaCkaCkaCkaCkaCkaCkaCkaEUaEUaEUbstbCmaKBaaaaFaaFaaFaaFaaFaaFaaFaaHVaHWaHXbwlaLnaKYbcGaIcaIdaIebpRbcIbdzbdMbnlbdMbdMbdMbdMbnmaYhbjjbjgbitbjjaYhaYhaYhaYhbjlaaaaaaaFsaFsaFsaFsaFsaFsaFsaaaaaaaxwbjuatZbjwapdbjvaohbjFapgaphbxAapjapkaplaoabyXaDqbyWbjzbzCaqLbnMbaabaabaabiFbiFbaabaabaabaabaaaXEaXXaZaaCWbrwaHebkUaVJaUBbaMaWiaCWciUacjarNaTBaTBbjcaHFaHGazrampaGhbjdbthasPbhfaGkaGlaGmaGnaGoazDaaeaaaaaaaaebtNbwxajGaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebmNaJiaCkaCkaCkaCkaJjaCkaCkaCkaCkaEUaJkaKBanpaKBaaaaFaaFaaFaaFaaFaaFaaFabFOaJmbFOaHYaJnaJoaJpbrgaJraJsbrfbewbetbldbkZbJibJibJibJibUraYhaTPbkWbkRbmIaSLaSAbkPbkLbkMbzwaGUaGUbkIbkKbyLbkHbkBaLUaLUbyVbkwbkzaLXbiCaoabkvaohapOaohapPaohapQaohaohaoabzYaQDbyWaBUbwoaqLbdjaPpaNdaPpbkcbjGbdlaPDbkibdkaPLbiGaIGbfhaCWbfTbdibdibdibdebchbbDaCWbPMacjarNaKhaKhaHEaHFaHGbkbbypbyobjHbjRaHNaHOaHPaHQaHRaHSawMazDaaeaaabyhaaeajGajGajGaaeaaebooaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKqaCkaCkaKraCkaCkaCkaCkaCkaCkaCkbytaKBaKBaqhaKBaaeaFaaFaaFaaFaaFaaFaaFaaKsaKtaKsaKuaJnaKvaKvaKwaKvaIebeKbeLbftaKBaKBaKBaKBaKBaKBasNaYhaWfbmzaWkaWebmxbmxbmxbmvbjlaaaaFsbzuaGYaGYaGYaGYaGYbAJaFsaaaaxwblUawnblTaoablRaqGaqHaohaqIaohaqJaqKaohbmubBvbBDbBhbBtbxiaqLblZbmabliblibliblkbllbllblmblmblBbhvbhwbfBbhzaeQaIyaIyaIybgybiHbgUaCWaiQacjarNaKhblOaUNaGaasPbviaAJbysaAObzxasPaJeblhaDxaDxaDxaDyazDaaeaaaaaaaaeaaeaaeaaeaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLjaLkaLlaaaaLmaCkaCkaCkaCkaCkaCkbPDbPHbPHbQabzKaKBaUDaqhaKBaaeaFaaFaaFaaFaaFaaFaaFaaLoaHWaLpbPkaJnaLraKubvjaLtaLubBAbBIbBkbBrbqrbqnbqJbqHaKBbBOaYhbyjbmzcjRcnmckeckeclsbyIbjlaaabNqbyJaGYbOHbOcbPXaGYbyMbORaaaaxwbiBawnblTaoabyNarxadSarzarAarzarBarCbyPaoacoucpTcwQcxabPtaqLbqYaIEaIFaJSaKRbtHbztbQmbzqbzsbzhbribrebrhbqZbraadhbvCbySbyQbwHbwmaCWaUoacjarNasPbwtbwtasPasPbwtbzNbzMbzObDvasPasPaCfasPasPaCgbdIbDrbDsaaaaaaaaaaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLaMIaMJaMIadqbmNaCkaCkaCkaCkaCkaCkaCkaCkaCkbRIaMMaKBbwqbwraKBaaaaFaaFaaFaaFaaFaaFaaFaaKsaMOaKsaKuaJnaKvaKvaKwaKvaIebpRbEobEsaMRbtKbsUbsobsnaKBbzzbzAbgfbmzbOTbzDbzFbOTcMVbQRbjlaaabPRbsqaLQbPVbDXbPVaLQbRcbSiaaaaxwbiBbzlbQXaoaastasuasuasvaswastasuasxasyaoaaqLcSncNkcRzaqLaqLbCxaIEaJSaKRbAIbnbaIEaIFaKRaKRaJSbwNbAFbsGbsubswaIyaIyacabgybEnbzpaCWaTNacjarNbAlbAkbDHbAmbzPbhxaAJbysaAObAMbpebALaLhbAKayiayjaAUbEeaaebooaaaaaabooaaaaaaaaaaaabooaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaaaNKaNKaNKaNKaMcaNKaNKaNKaNKaMcaNKaNKaNKaNKaMcaNKaNKaNKaNKaaaaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaMIaObaMIaawbmNaJiaEUaCkaCkaCkaCkaCkaCkaCkbUcaOcaKBaqhbrTaKBaaaaFaaFaaFaaFaaFaaFaaFacdhaOecdhaOfaJnaKvaSpaSqaSraSsbKgaIebJraKAbvPbvzaOnbwuaKBbBBaYhbBwbmzbOTbBEbBFbRUcMVbTKbjlaaaaFsbTjbSraLQbTmaGYbRebRBaFsaaaaxwbAXatZbjwaChbKQaueaueaueaojaueauebAZbQtaoabCSdtNdAubBabTobsLbBabBcbChbChbCebupbutbsRburbusbsQbsRbsMbsOaCWbtPbuCbEqbNtauhbIbbEAaCWaQsbuParNbCrbCqbCpbCobCAbAibAbbzVbxfbBPaMDaMDaMEbBQayiaMGazDbENaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaMibUobBHbBHbBHbzTbBHbBHbBHbBHbZMbBHbBHbBHbBHbzSbBHbBHbBHaXfaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaQNaPqaPraPsaQNbmNaCkaEUbVDbVXbVEaCkaCkaCkaCkbUcaEUaKBaqhbrTafUaaaaFaaFaaFaaFaaFaaFaaFaaPtaHWaPuaPvaJnaKvaKvaKwaKvaIebKgaIebKZaKAbyfbyebydbxcaKBasNaYhbDcdDRbTqbTCbTDbOTcMVbDfbjlaaeaFsaFsaFsbCYaNlaNkaFsaFsaFsaaeaxwbjuaIvblTaBQcbbaueaueauebOhaueauebCUaojaBQbkcdDPbCVbwLaIFbvtaIFaIEaJSaIFbDOaIFbwOaJSaKRaIFaKRaJSbDLbDMaCWbSsbIubwwatebPobaMbbDaCWbItacjarNbWcaTgbDCbDBbDIbAVbDKbDJbDxbDyaAKaAKbDzayhayiayjaNYaaaaaaaaeaaaaaaaaaaaaaaeaaaaaabIraaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlbGfbFgbFgaFUbFgbFgbFgbFgaJUbFgbFgbFgbFgaFUbFgbFgbFkaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaQNbCLbCJbCZaQMbmNbueaEUaQPbJGbCdaEUaEUaEUbuwbDAbEmaKBbKdasdaKBaaeaFaaFaaFaaFaaFaaFaaFaaaeaaebpMaPvaQTaJoaJpbtAaSrbmXbopbozblLaPyaPyaPyaPyaPyaKBbsbbsgbshbsdbsdbrQbrRbrNbLjbHobHqaaaaaaaaaaFsaFsaSFaFsaFsaaaaaaaaabEdbEwbHvblTaChbroavlarPbmfaojaojbsDbsIaojaChbkcbsjbslbrPbsrbonbsrbsvbECboqbsmbsrbsrbsrbsrbsrbsrbsJbsPbzGaCWaCWaCWaCWapJaCWaCWaCWaCWavAacjarNbARbAdbAdbtabsZbsVbsTbsSbtkbtlbvubtnbteawMawNaPoasPaaaaaeaaeaaaaaaaaaaaaaaeaaaaaaaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlaGpaaaaaaaFUaaaaaaaaaaaaaJUaaaaaaaaaaaaaFUaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaQNaQNaSiaShaQNaQNaQNbvfaQNaQNbFublSaQNaQNaQNbFraQNaQNblIaQNaQNaaeaFaaFaaFaaFaaFaaFaaFaaaaaaeaZpbqlaJnaKvaKvaKwaKvaIeaJuaIebuKaPybrvbqdbmtbmOaKBasNaYhbtCbtDbtFbtrbtsbttbLlbtxbjlaTLbINaTLaNnbEXbukbHwaNnaTLbINaTLaxwbuhbwRbuiaoaaoaaoaaoaaoabtMbtUbufaojbCWaoabkcbtLbtHbuHaCZaCZaCZaCZaCZaCZaCZbuFbuGbuLbovbuBbuDaCZaPpaPpavAbuObYbbYbborbYbbYbbYbbASbYbbuqarNaNLaNLaNLaNLbuvbuubPnbuybuVbuWbuUaAJbuTavEasPasPasPaaeaaeauBaQIauBauBauBauBauBauBauBauBbvBaaeaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlaGpaaaaaaaFUaFUaFUaFUaFUaJUaFUaFUaFUaFUaFUaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaTpaZDbrsbIdaZfbsfbrsbtfbHybHrbHybHBbIebHybIjbInbIJbILbISaQNaaaaaaaFaaFaaFaaFaaFaaaaaaaaaeaZpbvgaJnaKvaKvaKwbKvaIeaTAbumbujbwKbtqbtjbxSbyyaKBasNaYhaYhaYhbjqbvMbvNbjlbsHbsabjlbSXbTHbNpaNnbvAaNpbvraNnbrFbIVbvdbIUbvebqFbuZbuYbuMbLGbrGaoaaoaazAbvGazvaoaaoabvDbvEbvFbvDaCZbwybJmbowboCboFavAavAavAavAbbOavAavAavAavAavAavAacjaUoaQsaJzaJzaJzaJzaJzaJzaJzaNLbvZbvUbvTaNLbBpbATaNLbwabvObwtbwtbvQbvRbqNauybLcauyaScauBbirauBatLatMaSfatMatOauBbiratPauHaaeaaeaacaahaahaahaacaaeaacaahaahaacaacaahaahaahaacaaeaaeaaeaaeaaeaFvaMibIiaLIaLIaLIaLIaLIavcavcavcbwpavcavcavcaLIbwsaLIaLIaLIbHdaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaaaaaeaaeakTakUaFRanWakTaaaaaeaaaaaaaaeaaeaaiaaiazXazZaAaaaiazKazMazKaeMaeMaeMaeMaeMaABaAAaAzaboavwawsaaiaaeabvaCtaBBaCxaBGaCQaBEaCjabvaaeaSJaDbaQgaDcaSKaDMaQgaCXaRvaaeahwaAqaAraCAahwadradradYagRaeaaeaaeaaxJaieavhavhazqayYaznavvavvayWayVayJamiamiamiamiamiayXaeaaeaaeaaaaaaeaaaaaaaaaaaaaaaaacaaaaaaaaaaaeaaaaaaaaaafMaaaaaaaaeaaaaaaaaeaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaoFaoFaKCalGalGalGalHakTaqaavbareakTaWoagVaWoaWoaaeaaeaaeaaiaaiaAHaaiaaiaaiaAHaaiafQaAGaAEaAFaeMaCdaCKaCzaexaexaexabvabvabvazbayZazlaEmazjayRaBFabvaaeabwavqaCeaBYaCcaAIaBXavpabwaaeahwaAqaAraCAahwaAcadraAdadsaAeaKGaeaavfaieavhavjavkavkavkavxavvavSavNavTamiamiamiamiamiawbauiawdawcaaaaaeaaeaaeaaeaaeaaeaahaaeaaeaaeaaeaaeaaaaaaafMaaaaaaaaaaaaaaaaaeaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNOaMzaMuaoHamnaMmaMlakTamoawJamqakTaLOaLEaEHaWoaWoalvalvalvalvalvalvalvalvalvalvakBakAavrakAarGasBaqvaqAaexaikaFMazmabvabvabvaAtaAsabvabvabvabvabvawhabwabwawGawIaEnawzawFabwabwawhahnaDeaDjaEoahwadradradsadsaALaAMaeaaHJaieaxEaiXaiUaiUaxPajJawKahSaliaxBamiamiamiamiamiaxBaxCakOakVaaaaaeaaaaaeaaaamlamlamlamlamlamlamlaaeaaeaaeafMaaeaaeaaeaaeaaeaahaaeaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaoFajCaoFaveamnavXaxbalDakTalManbakTaxDazoawYagXaWoaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeafQaeMaeMaeMaeMajLacZajMaexakSailakmabvakuakoakpakxawtatyatwaoTabvanMamBaaQaqTaqwanYattatsaaQahWaqqahnatvatuakvahwamzadsadsadsadsadraeaalraltalsalkaljaljallajJakOajcaliakWamiamiamiamiamiakWaleakOakVaaeaaeaaaaaeaaaamlbNIbVZbVQbVGbNIamlaaeaaaagUaiOagUaaaaaaaaeaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaqjamZaqjaqXargaqlaqmarkarJalubGxaWoarTamuasFatQagVaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeafQanianEanjaqyahGahDagPaexaAuailaAvabvaqcaipaiqairaiJakbacBanHakdakwakkajOajNajVajPajXajWajZajYakzakaakjakcarfahwaicadsajwaroaqEadrajfahYaieaiYaiXaiVaiUaiTajJajKahSajHajBamiamiamiamiamiajyajzajkajxaaaaaeaaeaaeaaeamlbVdbTbbNIbTbbPEamlaaeaaaamXamYamXaaaaaaaaeaaaaakaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaoFapeaoFanQaisaiDaoOaoFbHMapybKoapKabKapvapRanJaWoaaeaKBagVaKBaKBaKBaaeadradradrafQagtagAafWamOageagOassapWahBahAahBaiNahKahKaiEaiCaiLaiKaiHaiHapMahJahIahHaguahzahyaiAaizaiyaixaiwagBaijaiiahxahwagQadsadsanIadsadraiaahYaieagGaigaifaiPaihahPahQahSagNahUamiamiamiamiamiafFaeaahOaeaaaaaaaaaeaaaaaaamlbOBbOqbObbNRbNJamlaaeagUanDaqRanDagUaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaoFamWaqkaqkaqkagnamVaoFaoYaiBbrTaWoanKafAakyanFaWoaKBaKBarnaKBafNaKBafZadraklaicafQagdafXafTagZaeragfaggaexagaagbagcabvagjagkaglaoyabQaenaidanGaexakiafzahiaguahkaffaimahtahvafjahoahnahnanhadradradradradrafHadradraeaagIagHagGagGagLagKagJahrahragMagNahNamiamiamiamiamiafFbWIcsgavAavAavAcgaavAavAamlbMpbLWbNIbNnbLJamlaaeaoBaoCamYaoDaoEaaeaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaeaaaaaeaaaaaeaaaaoFaesaiFaiIajqalKammaoFbrTaiBbrTaKBardbrTbrTbrTdKcaKBbrSaKSaKBaKBaKBaeLacGaeDacLafcaeKafxafvacxacyacwacPabvahgafwaheabvabvacCagyacCabvahhahCagWaduaflafzagxagwaguagsagiaftagDafjagpagoagmafeaeYaeYaeYafGaeXaioaeXaeXahFagEagFafLafLafIadiagzafCafCafCafDafBamiamiamiamiamiafFaUoaQsavAaePakKaQsaeZackamlbLCbIwbGZbDPbLIamlaaeaptapuaoIandaptaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaKBaKBafUaKBaaeaaaaaeaaeaaeaaeaaeaKBafUaKBaoFahdahfaoFaoFaoFaoFbrTahbbKoaeJabKagqaiWbrTajAaKBbHMagSagvafVaKBacuacsabUabMafQafQafQaeMaeMadWabhacPacIaghaeEaeFafYafbaemaenaeoabvaenacBafkaexafSafzafoafnafqafpaeHaeGabzafjahVacTacTaaQaaQaaQaaQaocadradradradraeaadZadXadFadnadkadjadgaeRaeVaeeaiSaecaebaebaebaebaebaeWaThaQsavAaQsaQsaQsaQsafEamlbmEaYlbBKboYbCHamlaaeaptanoadfafmaptaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKBajtbMbaKBanLamsamsamsamsamsajsaKBbrSajtaKBaeTaDnaefbMeaspaKBbwqaedbMbaKBardafdafuaeSaeOaKBaeubrTabmafyaKBabkadYahLabladrabiafQabjabnaerabhassadTadUaeAaeNadQaeIadOaeBaevaewaenaaXafsaexaezadRadPadNadMadLadJadKadJadIadHafaadEadEaepadBaaQaocadrabXabZaklabcabcabcabcabcaciacmacfabcabcabcabcabcabVavAabWacbadlavAavAaQsavAaetaQsacnaQsasLarWaDwaBJatiathaYkamlcgaaptaqZadearbaptaaaaaeaaaaaaaaaaaeaaaaaeaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaeaaaaaaaaaaaaaaeaaeafUanparVarlayTaXOaXOaXOaXOaXOamHaeUaeqaeCacradVaXOaXOacqaXOabPacaaaIadradradradradradradradradradracAadradraaNadradradradradrafQaaGaaYaerabhacPacIacJacQacHacSadoacFaeyaaPabQacDacEaegaduadzadvadcadaadtadmacWacVacYacXacUacTabNadpabNabRaaQaaHaaSaaKaibadsabcaaZaasaaVabyabxabrabdabcabBaatabAabcavAavAaQsaThaQsaUoavAaQsavAadlaQsabOaQsagCafrancamlamlapTarRamlbWIarNarNabTaclarNarNcgaarNarNacMarNaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeajGajGaaeaaeajGaaeaaaaaeaaeaaeaKBaKBaBPaKBaKBasWasXasXasXasXasXasYaKBaKBaKBaKBaGraGCaGCaGCaGCaGCaGVbQSadraInatDatEatFawpatGatIasaaFiaoZascasaapcadrdBfapiappdBnaqdapZaowaeraoraosabvabQatpabvabvaEratraDmazpabvaEJaAoaexaexaaQazuaszaslazuaaQazCazBaaQazyacTacTaAbaAbaAbaaQaaQaocadradsauqadsabcarmauoaumaulaukaDYarHausautauuarFabcauravAaufaddacoadGavAaQsavAavAavAbvSavAagCcfIcfEcframlamlamlamlaQsaUoaQsaubatRarNarOabSaucarNcsgarNaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeajGajGajGajGajGarqajGaaeaaeaKBaKBaKBatHaBIaKBaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaKBaUDbtwbrTbHMbrTbHMaEsaDuaDFaEvagrasNadradradrataatbatbatbatcadradradrahTaoodpCahTaoqalCaeManPanRassaskaskasiasgaskasjaskasgaskaAyaskasjasbarZashasgaqxapoaskaskaskasgaskasmafQasoainainainainaeMaocadradsadsadsabcabcabcabcabcarMatzaDialZarcabcabcabcatkavAaUoaQsabOaQsavAaQsavAbbNavAatjcblcbucbncbacaZcbkcbgbYbbYbbYbbYbbYbbuqaQsaQsaQsaQsatgacMasRacMaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaeaaeajGaaeapBaaeajGajGajGajGajGajGaCDaAxaCDafRasNaKBaKBaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaKBaKBaKBbrTbHMavabHMaGPaAfaGJazTaFuasNadralIaaeaaaaaaaaaaaaaaaaaeaaaadraiRcRXalLcRWamgainamPamQamJaqoaqsaqsaqnaqoaqsazcaqDaqoaqBaqCaqsawvaqQaqPaqsasVaqMaqFalQalQaraaqYaqVaqUaAnaqSajgajhajiaBraeMaocadrasSadYasTabcarUanuaseabyabxabrasOabcasUaasasZabcatdavAavAavAbvSavAavAaQsavAaQsavAatfarNamlafrbZOamlamlarNarNarNarNarNarNarNarNbWIarNarNarNarNarNarYaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeajGajGajGajGajGajGaaeajGajGajGaaeaKBaKBaKBarnasNbrTaKBaaaauIauJauKauJauLalvaaeaaeaaeaKBaovaKBaouaXOaXOaXOaDlbrTaKBaDfarSaoxadraaaavUavUavUavUavUavUavUaaaadraxNaxMasAahTalEalCaeMaoLapqaiGayMapfapnaiGapzapfapqapAapraiMapwapxaxnaoMaoQaoPaoJapaanSamSapaaozaoKapbaoVaoUaoXaoWapNapLaeMaocbaabaabaabaabaaarFarDaryarLarKarIarHarparrarjarmabcartarsbvHbvHaribvHbvHbvHaAgbvHbvHarQbZrapSbZyapUbZzasPaDQasPatLatMatNatMatOarNarNarNatLatMatOatPasPaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeajGajGajGajGajGajGaotajGaaeaaeaaeaaeaKBbHMasNardafUaaaavLaUaapIavOavLaDLaCraCsaruaruaruaruanOaruaruadradraKBaKBanNadrakYadraaeavUavVavWaBTavYavZavUaaeakRahTarEakXahTaaaaaaacKajjavKajlaeMajmavJajoaeMajpawPajraeMapHajpapsaeMalfanAanzanCanBaldaldalXanxanwaldaldaneaeMaeMaeMaeMaeMaocbaaapVapXanlbaaabcabcabcabcapYaqOaqbalZarcabcabcabcavAaqWaUobWIaQsaUoarhaQsarNarNarNarNarNanVbWsanUanTauyaACauyauAauBatTauBauEatMauFatMauGauBatTatPauHaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeajGajGangajGajGajGajGaaeaaaaaeafUbtwasNbrTaKBaaaauKawQawRawQauKaCqaADaBdaruazJaBhaCpaBeaBgaruatqaytakCakDakJadrakYadraaaavUaxfaxgaxhaxiaxjavUaaaaiZaiRahZarEahTaknajnaczajQajRajSaeMajTajRajSaeMajUajRajSaeMamKamLaoNaeMamEamGamFamIazLaldaunamyamxamAazkaztaneamDamCamCamCamCansbaaaomaolaokbaaapmakQapmabcaoAaopaonaodaofaobaobatlbvHanXarNarNarNarNarNarNarNannannanaaBsanfbZkamUamTavFasPasPaaeaaeauBavHauBauBauBauBauBavIauBauBayIaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaajGaaeajGaaeaaeajGajGaaeaaeaKBaKBbMeasNaKBaKBaaaavLawQawQawQaylazGavRavRazFawUaynaypayqayraxVaqzaywayxayyayzadrakYadraaaavUayAayBasfaxiayDavUaaaahEahTahXarEcRWahuahsaczakqajRakraeMakqajRaksaeMakqajRaktaeMamMacRalNaeMalValUalTalSalRaldayHajualPaoRaoSapGanealOaeXaeXaeXalYalWbaaankanmanlbaaaqNanqanqantanranvahMabcabcabcabcabcavAanyarNamkayaanZamwaxYbwtbWybYXbYXbYXbYXbZjamvamtawNawOasPamraaeaaeaaaaaaaaaaaeaaeaaaaaaaaeaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaajGajGajGaacaaaaaeaaeaaeaKBaKBbHMbHMaxSafUaaaaaaauKawRawRawRauKaxeawVawWawTawUavRawSavPavQaruahlazOazPazQazIadrakYadraaeazSazwazUazVazWauwavUaaeadrahTahRahRahTahjagYaczakLakMakNafQakLakMakNafQakLakMakNafQalwakPalJafQalfalhalgafQalcaldatAalbalaapEapFatxaneakZbaabaabaaalpbaabaaalqamcbaabaaamfameamdajIamRamjamhalZamaahqabAabcambacjarNalmazraycaycalnalobWsaANalyalxalxalxalAalzayiayjaykaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaacbmNaAZbmNaahaaaaaeaaaaaeaKBafVarnbGxasNaKBaKBaaaavLaBaaBbaBcavLbAYaCraCsarubxQavRbzgavPbyraruaBibjyaBkaBlbtbadrakYadraaaaBnavUaBoaBpaBoavUavUaaaadrahaahmahmahpaWuaWvaWubnObnVbnObnZbnObnVbnObyGbnObnVboaboebobbombolbxKbygbywblxafQainanebBiaqrbpXbqsbqWbCXaneakZbaabnubnvbntbpmbpmbpnbjWboHaZHbjVbjTbjUbiQbznbiLarHbhPbhObhMbhGabcaQsacjarNbmMaAJbmLbmJbmHbmFcnEbmAbnyazzazzazzbnwbnxayiayjazDaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabmNbJAbmNaaeaaeaaeaaeaaeaKBbrTbrTbrTbrHbaQaKBaaaaCmauJaCnauJaCoalvaaeaaebDYbDWbFNbEMbGCbGqarubglbgmbkxaCybDdadrakYadraaabBjaaabgobgnbgoaaaaaeaaaaWuaWuaknajnaWuaWubaybaVarvbmUbpjbEBbpobplbplbEIbplbprbpobpvbpubogbpsbAgbAhbzRbzZafQainaneanebEcbubanebsianeaneakZbaabaabaabzJbcEboDboEbkkbklbotbkgbjtbkjbkebkebkfbkpabcabcabcabcabcaThacjarNaBZbkbaDxboZboOboIcnKboSaAObpgbpebpfaASbpdayiayjaAUaAVaaebooaaaaaaaaaaaabooaaaaaabooaaeaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabmNaAZbmNbmNaDIaDJaDKbmNaKBaKBaKBaKBbSFbtoaKBaaaaaaaaaaaaaaaaaaaaaaaaaaebKpbKabJEbIZbIsbIqarubihaFeaFfaFfaFfbdMbxsbdMbdMbhJbhIbhLbhKbhTbhSbjnbdMaWubicbeVbeVbfHbdhbcNbcNbcKbELbdfbEKbqDbqEbqIbFDbqEbqQaLXbqMbqLbqPbmRbAnbANbbUbBdafQainajvaeMbHmbxdanebxrbwjaeXbqibaabpZbqbbpWbugbaabdxblVbmQbaablHblAblFblNblFblJblMblnbkqbkobbKabcaQsacjarNbpGbpFbpEaCabpObwtbpLbpIaAObpDasPasPaCfasPasPaCgbeQaCiaaeaaaaaaaaaaaaaaabBlaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaabmNbmNaEUbJJaEWaCkaCkaCkaEXbJFaEYaEZaKBaKBasNaKBaaaaFaaFaaFaaFaaFaaFaaFaaaearuaruarubNybNSaruarubipbimbiqbrzbrpbhrbikbidbqjbkJbrBbrBbjsbrBbknbrLbkQaWublablgbkNaxwaxwbGSaxwaxwaxwaxwaxwaxwaxwaxwbGSaxwbiBawnblTaoaaoaaoabrmbrmbrmbrmbrmaoabrlaoaaqLaqLaqLaqLbrnaqLakZbaabaabaabxtbhDbaabrcbaabHbbaabrkbmVbmWalZbnabnebngalZbnkbnBbnqabcbNoacjarNasPasPasPasPasPbwtbrdaDBaAObqXasPaDDaDEaycbtJaycaDHazDaaeaaaaaaaaeaaeaaeaaeaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaabmNaEUaEUaEUaCkaCkaCkaCkaCkaCkaEUaEUaGtaKBasNafUaaaaFaaFaaFaaFaaFaaFaaFaaaeaaeaGubymaJbaHZaFVaFDaEBaEAbaTbaUbaRbisaEGbgBbhraCuaBSaBWaDraDtaCVaCYbAQaBOaBLaBNaBRahjaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaabEdbEwbEpbiCaoabiEbiDbivaoebvnaogaohaoiaojaoabyEbqUbtXbvcaDsaqLbynbaabhEbAabcEbhDbaabhCbaabKlbaaaUwaUfaUtaCWaCWaCWaCWaCWaCWaCWaCWaCWavAbzjarNaTMaTBbtgaFZasPbylaAJaDBbhRaDHaEOaEPaEQaoGaAKaESawMazDaaebooaaeaaeajGajGajGaaeblfaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaabmNbwkaCkaCkaCkaCkaCkaCkaCkaCkaEUaEUaEUbstblIaKBaaaaFaaFaaFaaFaaFaaFaaFaaHVaHWaHXbwlaLnaKYbcGaIcaIdaIebpRbcIbdzbdMbnlbdMbdMbdMbdMbnmaYhbjjbjgbitbjjaYhaYhaYhaYhbjlaaaaaaaFsaFsaFsaFsaFsaFsaFsaaaaaaaxwbjuatZbjwapdbjvaohbjFapgaphbxAapjapkaplaoabyXaDqbyWbjzbzCaqLbnMbaabaabaabiFbiFbaabaabaabaabaaaXEaXXaZaaCWbrwaHebkUaVJaUBbaMaWiaCWciUacjarNaTBaTBbjcaHFaHGazrampaGhbjdbthasPbhfaGkaGlaGmaGnaGoazDaaeaaaaaaaaebtNbwxajGaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebmNaJiaCkaCkaCkaCkaJjaCkaCkaCkaCkaEUaJkaKBaxSaKBaaaaFaaFaaFaaFaaFaaFaaFabFOaJmbFOaHYaJnaJoaJpbrgaJraJsbrfbewbetbldbkZbJibJibJibJibUraYhaTPbkWbkRbmIaSLaSAbkPbkLbkMbzwaGUaGUbkIbkKbyLbkHbkBaLUaLUbyVbkwbkzaLXbiCaoabkvaohapOaohapPaohapQaohaohaoabzYaQDbyWaBUbwoaqLbdjaPpaNdaPpbkcbjGbdlaPDbkibdkaPLbiGaIGbfhaCWbfTbdibdibdibdebchbbDaCWbPMacjarNaKhaKhaHEaHFaHGbkbbypbyobjHbjRaHNaHOaHPaHQaHRaHSawMazDaaeaaabyhaaeajGajGajGaaeaaebooaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKqaCkaCkaKraCkaCkaCkaCkaCkaCkaCkbytaKBaKBasNaKBaaeaFaaFaaFaaFaaFaaFaaFaaKsaKtaKsaKuaJnaKvaKvaKwaKvaIebeKbeLbftaKBaKBaKBaKBaKBaKBasNaYhaWfbmzaWkaWebmxbmxbmxbmvbjlaaaaFsbzuaGYaGYaGYaGYaGYbAJaFsaaaaxwblUawnblTaoablRaqGaqHaohaqIaohaqJaqKaohbmubBvbBDbBhbBtbxiaqLblZbmabliblibliblkbllbllblmblmblBbhvbhwbfBbhzaeQbrxbrxbrxbgybiHbgUaCWaiQacjarNaKhblOaUNaGaasPbviaAJbysaAObzxasPaJeblhaDxaDxaDxaDyazDaaeaaaaaaaaeaaeaaeaaeaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLjaLkaLlaaaaLmaCkaCkaCkaCkaCkaCkbPDbPHbPHbQabzKaKBaUDasNaKBaaeaFaaFaaFaaFaaFaaFaaFaaLoaHWaLpbPkaJnaLraKubvjaLtaLubBAbBIbBkbBrbqrbqnbqJbqHaKBbBOaYhbyjbmzcjRcnmckeckeclsbyIbjlaaabNqbyJaGYbOHbOcbPXaGYbyMbORaaaaxwbiBawnblTaoabyNarxadSarzarAarzarBarCbyPaoacoucpTcwQcxabPtaqLbqYaIEaIFaJSaKRbtHbztbQmbzqbzsbzhbribrebrhbqZbraadhbvCbySbyQbwHbwmaCWaUoacjarNasPbwtbwtasPasPbwtbzNbzMbzObDvasPasPaCfasPasPaCgbdIbDrbDsaaaaaaaaaaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLaMIaMJaMIadqbmNaCkaCkaCkaCkaCkaCkaCkaCkaCkbRIaMMaKBbwqbwPaKBaaaaFaaFaaFaaFaaFaaFaaFaaKsaMOaKsaKuaJnaKvaKvaKwaKvaIebpRbEobEsaMRbtKbsUbsobsnaKBbzzbzAbgfbmzbOTbzDbzFbOTcMVbQRbjlaaabPRbsqaLQbPVbDXbPVaLQbRcbSiaaaaxwbiBbzlbQXaoaastasuasuasvaswastasuasxasyaoaaqLcSncNkcRzaqLaqLbCxaIEaJSaKRbAIbnbaIEaIFaKRaKRaJSbwNbAFbsGbsubswbrxbrxbyAbgybEnbzpaCWaTNacjarNbAlbAkbDHbAmbzPbhxaAJbysaAObAMbpebALaLhbAKayiayjaAUbEeaaebooaaaaaabooaaaaaaaaaaaabooaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaaaNKaNKaNKaNKaMcaNKaNKaNKaNKaMcaNKaNKaNKaNKaMcaNKaNKaNKaNKaaaaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaMIaObaMIaawbmNaJiaEUaCkaCkaCkaCkaCkaCkaCkbUcaOcaKBbyRaDlaKBaaaaFaaFaaFaaFaaFaaFaaFacdhaOecdhaOfaJnaKvaSpaSqaSraSsbKgaIebJraKAbvPbvzaOnbwuaKBbBBaYhbBwbmzbOTbBEbBFbRUcMVbTKbjlaaaaFsbTjbSraLQbTmaGYbRebRBaFsaaaaxwbAXatZbjwaChbKQaueaueaueaojaueauebAZbQtaoabCSdtNdAubBabTobsLbBabBcbChbChbCebupbutbsRburbusbsQbsRbsMbsOaCWbtPbuCbEqbNtauhbIbbEAaCWaQsbuParNbCrbCqbCpbCobCAbAibAbbzVbxfbBPaMDaMDaMEbBQayiaMGazDbENaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaMibUobBHbBHbBHbzTbBHbBHbBHbBHbZMbBHbBHbBHbBHbzSbBHbBHbBHaXfaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaQNaPqaPraPsaQNbmNaCkaEUbVDbVXbVEaCkaCkaCkaCkbUcaEUaKBasNbrTafUaaaaFaaFaaFaaFaaFaaFaaFaaPtaHWaPuaPvaJnaKvaKvaKwaKvaIebKgaIebKZaKAbyfbyebydbxcaKBasNaYhbDcdDRbTqbTCbTDbOTcMVbDfbjlaaeaFsaFsaFsbCYaNlaNkaFsaFsaFsaaeaxwbjuaIvblTaBQcbbaueaueauebOhaueauebCUaojaBQbkcdDPbCVbwLaIFbvtaIFaIEaJSaIFbDOaIFbwOaJSaKRaIFaKRaJSbDLbDMaCWbSsbIubwwatebPobaMbbDaCWbItacjarNbWcaTgbDCbDBbDIbAVbDKbDJbDxbDyaAKaAKbDzayhayiayjaNYaaaaaaaaeaaaaaaaaaaaaaaeaaaaaabIraaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlbGfbFgbFgaFUbFgbFgbFgbFgaJUbFgbFgbFgbFgaFUbFgbFgbFkaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaQNbCLbCJbCZaQMbmNbueaEUaQPbJGbCdaEUaEUaEUbuwbDAbEmaKBcoLasdaKBaaeaFaaFaaFaaFaaFaaFaaFaaaeaaebpMaPvaQTaJoaJpbtAaSrbmXbopbozblLaPyaPyaPyaPyaPyaKBbsbbsgbshbsdbsdbrQbrRbrNbLjbHobHqaaaaaaaaaaFsaFsaSFaFsaFsaaaaaaaaabEdbEwbHvblTaChbroavlarPbmfaojaojbsDbsIaojaChbkcbsjbslbrPbsrbonbsrbsvbECboqbsmbsrbsrbsrbsrbsrbsrbsJbsPbzGaCWaCWaCWaCWapJaCWaCWaCWaCWavAacjarNbARbAdbAdbtabsZbsVbsTbsSbtkbtlbvubtnbteawMawNaPoasPaaaaaeaaeaaaaaaaaaaaaaaeaaaaaaaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlaGpaaaaaaaFUaaaaaaaaaaaaaJUaaaaaaaaaaaaaFUaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaQNaQNaSiaShaQNaQNaQNbvfaQNaQNbFublSaQNaQNaQNbFraQNaQNbuSaQNaQNaaeaFaaFaaFaaFaaFaaFaaFaaaaaaeaZpbqlaJnaKvaKvaKwaKvaIeaJuaIebuKaPybrvbqdbmtbmOaKBasNaYhbtCbtDbtFbtrbtsbttbLlbtxbjlaTLbINaTLaNnbEXbukbHwaNnaTLbINaTLaxwbuhbwRbuiaoaaoaaoaaoaaoabtMbtUbufaojbCWaoabkcbtLbtHbuHaCZaCZaCZaCZaCZaCZaCZbuFbuGbuLbovbuBbuDaCZaPpaPpavAbuObYbbYbborbYbbYbbYbbASbYbbuqarNaNLaNLaNLaNLbuvbuubPnbuybuVbuWbuUaAJbuTavEasPasPasPaaeaaeauBaQIauBauBauBauBauBauBauBauBbvBaaeaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlaGpaaaaaaaFUaFUaFUaFUaFUaJUaFUaFUaFUaFUaFUaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaTpaZDbrsbIdaZfbsfbrsbtfbHybHrbHybHBbIebHybIjbInbIJbwrbISaQNaaaaaaaFaaFaaFaaFaaFaaaaaaaaaeaZpbvgaJnaKvaKvaKwbKvaIeaTAbumbujbwKbtqbtjbxSbyyaKBasNaYhaYhaYhbjqbvMbvNbjlbsHbsabjlbSXbTHbNpaNnbvAaNpbvraNnbrFbIVbvdbIUbvebqFbuZbuYbuMbLGbrGaoaaoaazAbvGazvaoaaoabvDbvEbvFbvDaCZbwybJmbowboCboFavAavAavAavAbbOavAavAavAavAavAavAacjaUoaQsaJzaJzaJzaJzaJzaJzaJzaNLbvZbvUbvTaNLbBpbATaNLbwabvObwtbwtbvQbvRbqNauybLcauyaScauBbirauBatLatMaSfatMatOauBbiratPauHaaeaaeaacaahaahaahaacaaeaacaahaahaacaacaahaahaahaacaaeaaeaaeaaeaaeaFvaMibIiaLIaLIaLIaLIaLIavcavcavcbwpavcavcavcaLIbwsaLIaLIaLIbHdaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaXFbwBaUMaUMbMnaUMaUMaUMaUOaYbbMFbMEbKcbKcbKcbKnbLHaUQbyFaQNaaaaaaaaeaaeaaaaaaaaeaaaaaeaaeaZpbxlaJnaKvbVqbxaaGDbxgaGDbuAbqmbEzbGdbwnbDabBzaKBbpHbxbbOSbITbxebuzbwXbvhbwbbsKbtOaVkcdbaVkbBNbBMaVsbziaVtaVkbJRaVvbwMaVxbLZbuEaVAaVBaVCaVDaVDaVDbvbbpcaVDaVDaVHaVDbpbboQaVDboJaVDbwvboGavAbpTbpUbpVbBsbpUbqybpUbqObpUbqRbYbbASbuqaThaQsaJzbxBbxJbxLbpSbxObxPaNLbzHbxpbxpbOdbxpbzIaNLbxubuVbzkaHoaHoaHoaHoaHoaRfasPaTnatMaToatMauGasPasPasPaTnatMauGatPasPaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaFvbCzaIlaGpaaaaFUatXatXayKbJjaweaxxbBLbJjayLatXaGvaFUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeboibojaPBaWgaQNaTpaWhaTpbwBaUMaWLaWYaTpaWhaTpaZCaWlaWmaVyaKBaKBaKBaKBaWpaWqaWraKBaKBaKBaKBaZpaORaOUaOVaOSaOTaKvaOkaPzaOmaOlaPyaPyaPyaPyaPxaKBaKBaSuaKBaKBaWCaOQaOOaWKaMhaWWaWVaWKaMhaOFaOHaWWaOIaWKaWKaWKbbLaWNaOKazxaITaBjaWSaWTaWKaWKaWKaWKaWUaOAaWKaWKaWVawgaOBaWKaWKaWKaWKaLeaKLaVMaVMaVMapJaVMaVMaVMavAaKJavAacjavAavAaHUaHUaHUaHUaOyaOuaOuaOtaKdaUEaNLaOdaTwaROaQFaSbaStaNLaSjaNSaNRaHoaUIaVZaNMaHoaNQasPasPasPasPasPasPasPaDUasPasPasPasPasPasQaaeaacaFvaFvaacaFvaFvaFvaFvaacaFvaFvaFvaFvaacaFvaFvaFvaFvaFvaFvaFvaFvaMiaIlaGpaaaaFUatXaweaxqaCRaxtaxraxuaCRaxvaweaGvaFUaaaaGqaIlaGpaLKaLKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaULaaeaaaaaeaaaaXFbeNaXFaVgaVgaUTaVbaXFbeNboiaXKaQNaXLaVEaOaayTaXOaXOaXOaRXaXOaXOaNJaXOaNmaNraNsaQSaKzaQhaySaUPaNqaHfaNDaNEaHfaNNaKcaHfaOvaOxaOwaOLaOzaSWaUHaYpaNzaNCaNCaFSaFJaNHaNGaNeaNgaLNaUsaUsaUsaUsaUsaUsaUsaLsaYyaSYaSYaSYaSYaSYaSYaSYaSYaSXaOraNiaTjaSYaNjaSXaSYaSYaLdaYGaUFaVMaJgaJVaJOaIXaIVaVMaOjaMxavAacjavAaaaaHUaINaIKaHUaMAaOgaMFaMyaMwaKaaNLaMTaMUaMVaMWaNXaQKaNLaQuaMoaLPaHoaSEaMkaMfaHoaHFaHFaHFaHFaHFaHFaHFaHFaHFaHFaHFaMpaMqaMpaMqaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaaaMcaMbaIlaGpaaaaFUatXaNyawqatXawlawkawjatXawiaSCaGvaFUaaaaGqaIlaLLaaaaLKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10440,71 +10505,71 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcqbecbedbeebckbefaEdbefaEdbefaEdbefbckbegbehaXFaZjaQUaZlaFGbekaQRbemaQEaFHaZlaXQaEcaFWaFXaGdaGiaGsaGyaGzaFmaFpaMLaFEaFKaFNaFPaFQaGBaGAaGFaGEaGIaGHaGNaHiaYpaRnaZNaGKaFwaYDaJPaZLaDNaFdaTLaaeaaeaFhaKxaEEaDdaRibfaaxlbfcaAYaBmaECaJxaFraaeaaeaZTbfiaClbfkaGTaGLaDVaDzaZTaEMavgaGwazgbfAaExbfAbfwayfaEwbfAbfAbfAaEKbfAayuaEDaMHaJGbfAbfAaCSayubfwaEKaELaxXaCSaybaMSaTmaziaFoaKQaFnaFlaFkaETaEhaDZaDaaFgbcebcedBCdBBdBzdBJaaaaaaaaaaaeaakaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeajGaJJaJEaGbaJEaJKaGpaaaaaaaaaaFUaGfaGgayKaEiaNBaJMaNUaEkaJLatXaGvaFUaFUaFUaFUckMaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfPbckbckbaCbckbefaEdbefbfQbefaEdbefbckbegbehaXFaQQaQpaZlbfSaQnaTzbfVaTzbaHbaHaNcaNvaNxaHfaNuaNfaNtaMXaMZaMKaMNaHfaIwaLWaMnaHjaLVaHfaLTaLqaKVaKUaKTbbcaIHaYpbRAaZNaLSaIoaSwaLMaZLaIPbbsaTLaZPaIIaZPaOEbgsbgwbgubgvbgtbgsbgubgwbgvaNAaZPaIIaZPaZTaYtaYtaYtaIxbgAaQbbgCaZTaPlaLZaLYaLbbgMaJHbgMbgObgMaLcbgMbgMbgMaKKbgMaLvaIjaLgaLfbgMbgMaIJaQmaIiaKKbgSaKKaKOayOaKPaTmawaaKWaKWaKZaLxaKWaKWaLzbbEaMjaLDbcebcedBsdBvdBvdByaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaJIaaaaaaaaaaaeaLJaLJaKpaJRaIlaGpaaaaaaaaaaFUaFUaImatXatXatXaTxatXatXatXatXaLHbwsaLGaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcqbhkbedbeebckbefaEdbefaEdbefaEdbefbckbegbehaXFbhlbhmbhnaKeaKbaJZaJZaKgaKfaKebcCaKiaKkaHfaKyaJwaJyaJNaKmaIRaISaHfaIfaHLaILaIOaPnaHfaKHaKNaKIaKFaKDaSWaKEbbFaKlbleblebleblebleaZLaHDaHcaKobhUbqxaPHaNhbgubgubgubguaDTbgubgubgubguaIgaBCaMBaZPaPXaJYaMabifbigaKjaPfaNoaZTaFCaPwaKnazsbiwaGxbiwaGjbiwaMYbiwbiwaIUbiwbiwaOGaKXbiwaIraIUaFOaHhaOGaGjbiwbiyaPiaPmaIYaEuaJaaFjaJcaJdaJfaMjaJlaJlaJhaZbaFtaJqaTmaTmaTmaawaHTaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaIZaIWaJAaJvaJDaJCajeaJFaIlaFUaFUaFUaFUaFUaJXaLFaJXaJXaLwaLyaLwaMQaMQaNWaMdaMgaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiTbiUbaBbcjbckbckbiVbckbiWbiXbckbiYbckbcqbiZaULaZjbjabmsbbpbbrbbzbbtbbnbblbbpbmPbjkbaXaHfbiobiIbjebixaHfaHfaHfaHfaHfaHfaHfbjEaHfaHfbbcbbbbbabbhbbebbdbbiaYpaXoblebbjaVSbbkblebbybeEbjQaQZaZPbnHaZMbhBbjMbmSbjIbaSbjKbjIbjIbjLbjMbjNbjObnJaZPaZTaYtaYtaYtbljaYtaYtaYtaZTbmTaYpbahbkdbcTbezbcTbkdaSaaSaaSaaSaaSaaSaavAavAbcSavAavAavAbhobgGavAavAavAbdmavAbddbdgaUSbdaaTCbcYbcVbhuaJlaBIbcRbcQaZbaSmaJqaTmbhsbcFbeuaTSaTSbcUbeaaaaaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaIZbcLbcDaaaaaebcubbHbfWbbBbhNbrKaJXbhibkYbfDbhdbhhbhqaJXbofbmbbgNbinbnLbhWbhWbiuaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiTbiUbaBbcjbckbckbiVbckbiWbiXbckbiYbckbcqbiZaULaZjbjabmsbbpbbrbbzbbtbbnbblbbpbmPbjkbaXaHfbiobiIbjebixaHfaHfaHfaHfaHfaHfaHfbjEaHfaHfbbcbbbbbabbhbbebbdbbiaYpaXoblebbjaVSbbkblebbybeEbjQaQZaZPbnHaZMbhBbjMbmSbjIbaSbjKbjIbjIbjLbjMbjNbjObnJaZPaZTaYtaYtaYtbljaYtaYtaYtaZTbmTaYpbahbkdbcTbezbcTbkdaSaaSaaSaaSaaSaaSaavAavAbcSavAavAavAbhobgGavAavAavAbdmavAbddbdgaUSbdaaTCbcYbcVbhuaJlaXubcRbcQaZbaSmaJqaTmbhsbcFbeuaTSaTSbcUbeaaaaaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaIZbcLbcDaaaaaebcubbHbfWbbBbhNbrKaJXbhibkYbfDbhdbhhbhqaJXbofbmbbgNbinbnLbhWbhWbiuaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiTbaBbaCbaBbaDbaBbaBbaDbaBbaCbiUbkDaQNbiabkFbkGaSWbbTaYOaTaaYObbPaSWaZcaXYaZdbaibkXbizaYLaYMbkmbizbjJbkAbizbkEbkXaYNbkXbagaXZaYIaYFbkObkXbjYbibblcbRAaZoaVTaZsaYJbleaTLaTLaTLaTLaZPaQfbloblpblqbeoaQXbssboRbqzaQYblrblqblyblzaQeaPYaZTblCblDblEbigaPRaYtbijaZTbkhaYpaOMbaIbaGbctbgibkdbawbazbfrbaubatbavaSRbyCbDEavAaUqaUnbeDaOhbOoavAbWIbaravAbambaobapbaqbakbakbakbfqbfoaJlaJlbggbfnaPgbgabfYbeGbeybcgbbxbbxbbSbbQbaPaYxbaPbaPaYxbaPbaPbaPbaPbaPbaPaYxbaPbaPbaPbaPbaPbaPaYxbaPbaZbbIbbxbbxbbxaYdbdZbejbebbebberbfsbnhbcfbcibdSbdTbdUbdVbdWbdYbbWbbYbbZbcbbccbcdaYZaLIaLIbrJaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaTpaWhbmpaSlaSlaSlaSlbmqaWhaTpaaaaQNbyKbmrbruaSWbktbdKblPbdKbspaSWbsxbjxbfubmCaBJbrEbmDbmCbmCbfxboMbmGbmBbmCbmCbfvbmCbmCbmCbfzbfybmKbmKboXbBebdPbnUblebdQbtWbcBbleaSobdLbeiaSBbtIblrbmYbeobskbsYbjXbndblGbndaSDboPboybvkbnjaTkaSZaZTbfIbnnbnobnpaTraZTaZTaZTaEMbnraWQbkdbfRbfObgIbkdbzcbyHbgLbgrbvxbgkbgjbgHbgFbgEbgDbgZbhabkTbgYbhebhgbhbavAbddaYabzfaTmaFTbgVaEfbgJbgTbcZbgxbgcbmmaZbbafbadbkybjDaFLaaaaaabgKbcDaaaaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaVNbeUbeaaaaaaeaGqbfLbuobulbtzbtvbsXbrObwZbxnbwTbwVbsNbwSbvKbvLbsCbvJbvIbhWbvlbvsaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaTpaWhbmpaSlaSlaSlaSlbmqaWhaTpaaaaQNbyKbmrbruaSWbktbdKblPbdKbspaSWbsxbjxbfubmCaXvbrEbmDbmCbmCbfxboMbmGbmBbmCbmCbfvbmCbmCbmCbfzbfybmKbmKboXbBebdPbnUblebdQbtWbcBbleaSobdLbeiaSBbtIblrbmYbeobskbsYbjXbndblGbndaSDboPboybvkbnjaTkaSZaZTbfIbnnbnobnpaTraZTaZTaZTaEMbnraWQbkdbfRbfObgIbkdbzcbyHbgLbgrbvxbgkbgjbgHbgFbgEbgDbgZbhabkTbgYbhebhgbhbavAbddaYabzfaTmaFTbgVaXxbgJbgTbcZbgxbgcbmmaZbbafbadbkybjDaFLaaaaaabgKbcDaaaaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaVNbeUbeaaaaaaeaGqbfLbuobulbtzbtvbsXbrObwZbxnbwTbwVbsNbwSbvKbvLbsCbvJbvIbhWbvlbvsaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaTpaaeaaaaaeaaaaXFbzWaXFbpQbqcaVgbpAaXFbzWboibojaQNaZjbwJbpwaSWbqTbdKbdFbdKbpzaSWbpPbhVbdAbdBbosbmobkVbdwboxbdCbnCbosbosbosbosaWPbosbmnbohbkVbdvbosbosbnDboAboBbnUblebbubbVbbfboNbbfbbvbbfbbfbtIaRWaRZboLboLboLbszbppbeJbdEbsyboLboLboLaRNaRLaZPaZTblKboTboUboVboWaZTbbXaXNbaYbpaaWQbcTbeIbeObeMbkdbeRbfEbfCbjfaSaaSaavAavAaTUavAavAavAbjobjpavAavAbeFaRPavAbeAaYabeBaTmaJqaJqaJqaJqbeCaJqaJqaWRbjraZAaTmaTmbffbfebfFaaaaIZbfGaaaaaaaaeaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaVNbeUbeaaaebeSbesbqSbexbqKbtBaJXbrbbqfbqhbqvbqCbhXaJXbqpbpCbqeaMQbqkbqobhWbiuaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaboibojaPBaWgaQNaULaWhaULbtybrsbcybcMaULaWhaULaZDbrrbpNbkFbkGaSWaUUaSVaTaaSVaUUaSWbcWaXraXiaSWaTeaXmaTiaSWaSWaTcaSWbqabqaaXcbaLbaNaXcbqabqabqabqabqabqabqabqgbboaLBaWJaWIaXwaSTbdsaSTaPEaWFaPGbalbaWbcvbqtbbgbqtbqtbqubajbqwboLboLbdyboLbcObdcaZTbdGaRBbqAbdqbqBbdbaZTbdXaYtaAkbqFaLabkdbkdbkdbkdbkdaTTaUkaSaaSaaSaaXzaUlavAaXxaXvaXuavAbbNbdtavAaUqaTZaTXaTYaUhaUiaUbaUgarwarwaXCarwapDbelaJqbhcaYsaYnbduaYvaYTaYzaUjaTSaSSaSgaaeaaeaaeaaeaaeaaeaaaaaeaaaaaeaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaeaJIaaaaVNaUmaJvaWtaWsajeaJRaIlaFUaUraUpaYKaYRaYAaYEaJXaJXaWjaWzaXdaMQaMQbePaYYaPIaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaXFaZDbrsaZfaYXaZfbrsbrsbrtaQOaYbaYWaXMaXMaXMaXJaRzbryaRyaXVaRraRxaRwaRuaRtaRsaRraXnaTqaRIaUxaUxaUyaUxaUxbrSaRHaWDbqaazHaWEbrXbrYbscbqaaWwazhbqaaWwazhbqabqgaYpbRAbleaVqaRGaONbleaOWaOoaNwaVpbtIaZuaZxboLaZnaOYaXSbssbssaYQaYUaXTaYmboLaWGaWdaZTaXBbsAbsBaXbaSIbsEbsFaTdaYtaEMbqFaRkaSaazYaSdaTQazNaRUaRCaQtaSaaVYaXsaXgaVVaVUaVXaVWavAavAavAavAavAavAaRPavAaRRaRSaRTbgXbiJaRQbiJbiJbiJbgXbgXbiJbiKaRMbiNbbAbcsaIMbiRbiSbgXbgXbgXaaeaaaaaaaaaaaeaaaaaeaaaaaeaaaaacaaaaacaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaFvaOXaIlaGpaRDaFUaZKaZOaZQaTJaTKaTVaTWaUuaUAaUKaVcaWcaLIaLIaSQaFUaFUckMaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaXFbwBaUMaUMbfUaUMaZyaUcaUeaUebpxaUebiebhyaZSbcaaZEbiAbacaXjaKebqqbhpbgRbhtaXeaXhbgPbgQbgWbaxbbJbltaZGaUxaYCaXlbrTbqaaYwaYqbrXbrYbscbqaaYobDDbqaaYobDDbqaaWAaYpbRAblebleaYBblebleblebeXbeWaUGbleblublvblwbssbndbndbtQbtRbtSbtTbtTbcHbtVblQbmZblWbdqbtZbuaaZzbucbudaZTbhHaYtaYPbqFaRkaSabilbhYaRUaXRaRUbhZaRUbnAbeHbcPbjbbtdbtcbrZbptbyiaXUaXAbwIbiiavAbyxavAaPTaYaaXWbgXaYkaYlaZVaYebncbgXbnfbabbdHbkuaVRbkabtubjCbjBbcwbjPbkCbgXaaeaaeaaeaaeaaeaaeaaeaaaaacaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaWBaGpaaaaFUbnKboKbniaTJbfbbfJbdRbeqbfNbfXbfKaTJaFUaaaaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaZhbojaQNaWgaPBaWgaQNckJaSlbxFaQNaWgaQNaQNaQNaQQaQpaKBaZwaKBaKBbuQbuRbuQaUXbuQbuQbuQbuQaUxaUxaZIaZFaUxaUxaUxacpbHMbqaaVebrVbrXaYibqabqaaVdbqabqaaUZbqabqabenaYpbRAbgzbgpbfgbeTbfpbeTbfgbfgbkSblsbdcbkrbqtbjZbndbvmbfdbvobvpbvqbfmbjmboLbjibjhaZTbvvbvwbdqbhQbhjbvyaZTaYjaYtaEMbqFaRkaSaaAmaVOaVPaVOaXPaVQaApaSaaBvbcPbcJbcXbcPbeHbdJaXIaVhaVfaViaAlavAaRPavAaXkaVlaVnaUvaVoaVGaVIaVKbfjbgXaQiaZJaZRbmeaUdbjAbmhblXbmibmjbiObPGbgXaaebgXbgXbgXbgXbgXaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaWBaGpaaaaFUaZXaZZaZWaTJaYSaZgaZkaZqaZraZtaZvaTJaFUaaaaaaaNKaNZaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaboibojaPBaWgaQNaULaWhaULbtybrsbcybcMaULaWhaULaZDbrrbpNbkFbkGaSWaUUaSVaTaaSVaUUaSWbcWaXraXiaSWaTeaXmaTiaSWaSWaTcaSWbqabqaaXcbaLbaNaXcbqabqabqabqabqabqabqabqgbboaLBaWJaWIaXwaSTbdsaSTaPEaWFaPGbalbaWbcvbqtbbgbqtbqtbqubajbqwboLboLbdyboLbcObdcaZTbdGaRBbqAbdqbqBbdbaZTbdXaYtaAkbqFaLabkdbkdbkdbkdbkdaTTaUkaSaaSaaSaaXzaUlaSaaVWaVVaVravAbbNbdtavAaUqaTZaTXaTYaUhaUiaUbaUgarwarwaXCarwapDbelaJqbhcaYsaYnbduaYvaYTaYzaUjaTSaSSaSgaaeaaeaaeaaeaaeaaeaaaaaeaaaaaeaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaeaJIaaaaVNaUmaJvaWtaWsajeaJRaIlaFUaUraUpaYKaYRaYAaYEaJXaJXaWjaWzaXdaMQaMQbePaYYaPIaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaXFaZDbrsaZfaYXaZfbrsbrsbrtaQOaYbaYWaXMaXMaXMaXJaRzbryaRyaXVaRraRxaRwaRuaRtaRsaRraXnaTqaRIaUxaUxaUyaUxaUxbrSaRHaWDbqaazHaWEbrXbrYbscbqaaWwazhbqaaWwazhbqabqgaYpbRAbleaVqaRGaONbleaOWaOoaNwaVpbtIaZuaZxboLaZnaOYaXSbssbssaYQaYUaXTaYmboLaWGaWdaZTaXBbsAbsBaXbaSIbsEbsFaTdaYtaEMbqFaRkaSaazYaSdaIyazNaRUaRCaQtaSaaVYaXsaXgaTQaVUaVXbcPavAavAavAavAavAavAaRPavAaRRaRSaRTbgXbiJaRQbiJbiJbiJbgXbgXbiJbiKaRMbiNbbAbcsaIMbiRbiSbgXbgXbgXaaeaaaaaaaaaaaeaaaaaeaaaaaeaaaaacaaaaacaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaFvaOXaIlaGpaRDaFUaZKaZOaZQaTJaTKaTVaTWaUuaUAaUKaVcaWcaLIaLIaSQaFUaFUckMaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaXFbwBaUMaUMbfUaUMaZyaUcaUeaUebpxaUebiebhyaZSbcaaZEbiAbacaXjaKebqqbhpbgRbhtaXeaXhbgPbgQbgWbaxbbJbltaZGaUxaYCaXlbrTbqaaYwaYqbrXbrYbscbqaaYobDDbqaaYobDDbqaaWAaYpbRAblebleaYBblebleblebeXbeWaUGbleblublvblwbssbndbndbtQbtRbtSbtTbtTbcHbtVblQbmZblWbdqbtZbuaaZzbucbudaZTbhHaYtaYPbqFaRkaSabilbhYaRUaXRaRUbhZaRUbnAbeHbcPbjbbtdbtcbrZbptbyiaXUaXAbwIbiiavAbyxavAaPTaYaaXWbgXciTciXaZVaYebncbgXbnfbabbdHbkuaVRbkabtubjCbjBbcwbjPbkCbgXaaeaaeaaeaaeaaeaaeaaeaaaaacaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaWBaGpaaaaFUbnKboKbniaTJbfbbfJbdRbeqbfNbfXbfKaTJaFUaaaaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaZhbojaQNaWgaPBaWgaQNckJaSlbxFaQNaWgaQNaQNaQNaQQaQpaKBaZwaKBaKBbuQbuRbuQaUXbuQbuQbuQbuQaUxaUxaZIaZFaUxaUxaUxacpbHMbqaaVebrVbrXaYibqabqaaVdbqabqaaUZbqabqabenaYpbRAbgzbgpbfgbeTbfpbeTbfgbfgbkSblsbdcbkrbqtbjZbndbvmbfdbvobvpbvqbfmbjmboLbjibjhaZTbvvbvwbdqbhQbhjbvyaZTaYjaYtaEMbqFaRkaSaaAmaVOaVPaVOaXPaVQaApaSaaBvbcPbcJbcXbcPaWbbdJaXIaVhaVfaViaAlavAaRPavAaXkaVlaVnaUvaVoaVGaVIaVKbfjbgXaQiaZJaZRbmeaUdbjAbmhblXbmibmjbiObPGbgXaaebgXbgXbgXbgXbgXaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaWBaGpaaaaFUaZXaZZaZWaTJaYSaZgaZkaZqaZraZtaZvaTJaFUaaaaaaaNKaNZaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfdzWbwgbwhaZjbwiaKBaRHbtwcnSbuQdLtbxHccRdLwdLudLvbuQcpocpocsUdJRdJYcsQaUxacpcbObqadABbJpbrXbrYbrUcbNbrVbrUcbJcbFdJXaXcbqgaYpbRAbgzcsPcsMcsNcsOcsOcsOcsWcsTblsclWcnTaZPaZPaZPdLAdLydLzdLydLxaZPaZPaZPcmjclWaZTaZTbtYaZTaZTaZTaZUaZTcgSaYtcsScsRaRkcjqcjscjscjsaUzcjscjtcjscttbeHbeHcuAbeHbeHbcPdxSduvdIGcimcidciYavAaRPavAdLBaVlcjdaZBcjhblXbnYcjpcjHcjLcjybnPbnQbnRaUdbnSbnTaYcbgdbnXbnWcnVcsXcEebWjbocbodbodbgXaaeaaaaXqaaaaXyaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaWBaGpaaaaFUaFUaFUaFUaTJcoIconcpubfNcrjcpRcrqaTJaFUaaaaGqdIJbBHdLCaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbxDbxEbxFaZjbxGaKBdDUdDYcmDbuQchIbxHccRbWmchLdLqbuQdKkdJVcnjdJTaUxaUxaUxacpaKSbqabXybXnbrXbrYbrXbrXbrXbrXbrXbtEbrXbaLcdicbhcrHcrCcrucrAcrudzQcrucrAcrucsaciachmcfXchocrUcrMcrIcrIcrNcrJcrIcrLcrKcivckxclEclFcrMdAlcipcrMcsocsqcrMcsrcsccsmbyDaWQchWaRUcTiaRUdAraRUaRYaRUdgJbeHbeHcUSbeHbeHbcPdtnduvcigaXUciddxeavAaRPavAbnFciqbeBaUvcirblXblYblXcitciubmcbksbmdbpyaYfbnIbpBbmgbmlbmkblbciybUiaaebNCbpJbodbpKbgXaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaWBaGpaaaaaaaaaaaadIDbUtbMUbMUdICclMdICbMUbMUaSOaLGaFUaFUckMcElcEmaaaaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfcjrdzTcjraZjdHpaKBcmCdwcbGxbuQcfmbxHccRdwwbxHchQbuQaUxdJPaUxdJRdJQcrkaUxacpbrTbqabHlbJpbXibWUbvabvabvabvabvacbPbvabeYboAcqVcqZcrecbrcbscbrcbtccxcqNcqMbZVbZUbZYcqRcqncqOcqncqmcqmcqkcqJcqmcqpcqocpQcpScprdxwdxzcqjcpVcqccpxcpBcprcpscpHcpMcpEbZSchlcdpcLlcyGcyGcLicLjcdpcQwcQMcqacRvbcPcNHbcPcPTcyhcdccgzcgccfUdKTcfWavAbpqcgQcgYcgUcgLcgBcgOcgMdKrcfHdIuaVFaUWaVjaVmaVzaYcaWHbrjaVLaYVcfMbHWczpbRbbrqbodaPUbgXaaeaakaXqaaaaXyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaWBcEgaNKaNKaaaaaaaJUdIvcnIdIwbHidIybHidIzcnOdIAaJUaaaaGqaIlaGpaLKaFvaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbADbAEbxFaZjdCHaKBcmvaKBaKBbuQdBDdCAdBrbxHbxHbxHbuQdJOdJNaUxaZeaUxaUxaUxcnQahccdabrVbrVbtEbZfbzobrVbrVbrVbrVcpnckVaXcbqgbWCcMJbSAbSAcdebSAcddbSAbSAbBqbBqccSbUhbBqcpmblscoNcoMcoPcoOcpacoMcphblscpmbCGbCGcyjccWbCGbCGbDRcdycdrbCGcdlcBKcmYbBybYHcdQbzecobbzecnUcoaaRUaRUcttcuAbeHctpcpjcEkcpjcqacvzceCceycewcesavAbxhavAcfjcxccfebiRceYcePceMceGbiRbiScdfaSkbmjbsWaYraRVaTIaTyaTIaTyaTOcdgcdmaaebgXbgXbgXbgXbgXaaeaaaaXqaaaaXyaaaaXqaahaacaaeaacaahaahaacaacaahaahaahaFvaFvaFvaFvaOXdLmbBHbBHcppajeajeaJUcDBcdOcdVcLMclMcLMcdVcdOdAZaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfdzWaULdAbaZjdALaKBacpaKSaUDbuQcEoccRbCfcnlchQbxHbuQdKmctXaUxdKkdKjctWaUxacpbrTbqabETbETbtEbrYbwDbwDbwEclmbwFckWbqabqacdibCwcaVbSAcllckrckIcjYcnhcbicNedLYcvOckLbBqaaecufcutcoMcoMcuscoMcoMcuqcugaaebCGdLXdvNdvOdvTbCGbCGbCGbCGbCGcPEcBKcmYbCObqGaSadGSbJfcjsbAedGYcjsdHCaSacuAdGGbeHbeHbeHbeHbeHduvdFbcnFdGCcnHavAbxharNcntcnocnubiNcnycnvcnBcnzbiPcohbuxbdNbepbevbevbeZbgqbghbgdbfZbfMcltbHncEebWjbuIbuJbuJbgXaaeaaebYOaaebVMaaeaXqaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaFvaaacEpbFgbFkaIlaGpaaaaJUdJlcdOcdOcdOdJkcdOcdOcdOdJjaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaedLWbojaQNaWgaPBaWgaQNckJaSlbxFaQNaWgaQNaQNaQNbZmbAGcfodnUarXagvbuQcmJcmsbCfcmtbDqbEHbuQaUxaUxaUxaUxaUxaUxaUxacpbrTbqacmpctHbtEbrYbrVbrVcckbrVbyabybbqacjbbqgaYpcaVbSAbDQcgscgxcgCcmqcbicgFcgGcgHcgDcgEaaectIctNctKctJbzvctKctJctMctLaaeckDcjWdLVdLSdLTdLUcvxcPCcOKbCGcgVcBKckKbEhbEibEjbEjbEjcmEcmKbEjcEncmGbEjdCWbEjbICdEBdELdDadDddFabjScmVbjSbjSavAbxhciocvZcvYciobgXbgXbgXbgXbgXbiMbiNcmWaZYcneblXbvVbvWbvXbvYbnTbbmbanbMhbUiaaebNCbwcbwdbwebgXaaeaaaaXqaaaaXyaaabSwaFvaFvaFvaFvaacaFvaFvaFvaFvaacaFvaaeaacaFvaFvaFvaFvaFvaGqaIlaGpaaaaJUceTdJgdJfcdOdJecdOdJddJcceIaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebwfbwfbwfbwfbwfbwfbwfbwfbwfbwfbwfdzWaULdAbaZjdALaKBacpaKSaUDbuQcEoccRbCfcnlchQbxHbuQdKmctXaUxdKkdKjctWaUxacpbrTbqabETbETbtEbrYbwDbwDbwEclmbwFckWbqabqacdibCwcaVbSAcllckrckIcjYcnhcbicNedLYcvOckLbBqaaecufcutcoMcoMcuscoMcoMcuqcugaaebCGdLXdvNdvOdvTbCGbCGbCGbCGbCGcPEcBKcmYbCObqGaSadGSbJfcjsbAeczycjsdHCaSacuAdGGbeHbeHbeHbeHbeHduvdFbcnFdGCcnHavAbxharNcntcnocnubiNcnycnvcnBcnzbiPcohbuxbdNbepbevbevbeZbgqbghbgdbfZbfMcltbHncEebWjbuIbuJbuJbgXaaeaaebYOaaebVMaaeaXqaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaFvaaacEpbFgbFkaIlaGpaaaaJUdJlcdOcdOcdOdJkcdOcdOcdOdJjaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaedLWbojaQNaWgaPBaWgaQNckJaSlbxFaQNaWgaQNaQNaQNbZmbAGcfodnUarXagvbuQcmJcmsbCfcmtbDqbEHbuQaUxaUxaUxaUxaUxaUxaUxacpbrTbqacmpctHbtEbrYbrVbrVcckbrVbyabybbqacjbbqgaYpcaVbSAbDQcgscgxcgCcmqcbicgFcgGcgHcgDcgEaaectIctNctKctJbzvctKctJctMctLaaeckDcjWdLVdLSdLTdLUcvxcPCcOKbCGcgVcBKckKbEhbEibEjbEjbEjcmEcmKbEjcEncmGbEjdCWbEjbICdEBczudDadDddFabjScmVbjSbjSavAbxhciocvZcvYciobgXbgXbgXbgXbgXbiMbiNcmWaZYcneblXbvVbvWbvXbvYbnTbbmbanbMhbUiaaebNCbwcbwdbwebgXaaeaaaaXqaaaaXyaaabSwaFvaFvaFvaFvaacaFvaFvaFvaFvaacaFvaaeaacaFvaFvaFvaFvaFvaGqaIlaGpaaaaJUceTdJgdJfcdOdJecdOdJddJcceIaJUaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaXFaZDbrraZfaZfaZfbrsbrsdLQbrsbrrbrsdLPbrrbrsbpNcuPaKBaZmbHMaqhbuQclnclobxHbxHbxHcljbuQbzmasdarnctrdKedKhaKBacpbMbbqabCtbEYbtEdAHbwCbwCbwGbrVbrVcnkbqacgbbqgaYpcfPbSAcdGcefceqchgceecbiceAcetceuceNbBqcfsbFmcfsbFmbFmbFnbFmbFmcfsbFmcfsbCGcjobJPchRchTdLMcicchNchAbCGcgVcBKdLNbqFbqGbEjcmhbHXbFCbFBdCmcmacmaclSclYbEjbEjbEjbEjbEjbEjbEjbjSdxUclNbgbavAdxTciocvRcuUcvXciodIYctCaQsaSRbgXbxqcfKcfJcfNcuQbxvbxwbxxbxychHbbmcficcCbHWczpbRbbxCbuJcfVbgXaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLKaOXctBaLIaLIdIUaLGdIWdIVcdOdIXcdOdISdITdIDdIUaLIaLIctwaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaXFbwBaUMaUMbfUaUMaUMcumdLIdLHaUeaUeciMcihcgRdLLdLKaKBaZmbMeaqhbuQdLwbGabxHbxHbGabxIbuQdKddKcagSarXagvdKeaKBacpctmbqacjUbxXckacjZbrVccDckdckcctncdtbqacdFbqgaYpcdIbSAcbRbFvdLGcgJcbicbicbUcbXcdPctZbBqctcctactdbGzbGAbGBdLDclGcticthctlbCGdLEbJPcgndLFbCGcglcgXcgWbCGcgVcBKcjGbqFceXcktckubGRckqbOlbGVbFCbFCbVackobEjbMoceWcffceWbIzbEjckSckRcoGckNavAbxhciocuOcuNcuMcioaQsaQsaQsckFbgXbxqceHcerbiJbiJbiJbyTblXckjblXbbmcbGbMhbUiaaebgXbgXbgXbgXbgXaaeaaaaacaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaIlaGpaaaaaaaJUcuucdOcdOcisdINciwcunaJUaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaZhbmqceQaTpaQNbuNbojaQNaWgaQNbuNbojaQNaQNccNaQNaQNaKBaZmbMbaqhbuQbxIbWkbHzbxHbHzcfQbuQdJKbrTbrTaKSbxMbrTaKBacpbHMbqabqabMvbMDbMwbMvbqabqabqabqabCubqabqabGobbFbNwbSAbKsbFvbKkbVpbJQcbibNvbNhbNubMQbBqcNNcNObIfcLFbIgbIfcLLbIfciQcMqcMUbCGbHEbJPbLubLDcNLbWxbWnbWpbCGbQWcBKbXkbqFbqGbUXcwybLzbLEcMTbUZbFCbLzbVaceFbEjbEQbHacchcfhbIzbEjbbwbPsbPrbPvbVmbVtciocjPciSckwcioapCdJCckCcfYbgXbArbZqbZpbVWbiJbAvbxyblXbxwbOybOzccZcltbHncEebWjbAAbABbACbgXaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaIlaGpaaaaaaaJUbVscmNcmObYzcmUcmRbVsaJUaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaXFbeNaXFaaaaaaaaaaaeaaaaaaaaaaaeaaaaKBbUwarXbUxbUybyObUycfwbuQbuQbuQbuQbUvbuQbuQbuQdJGbMebHMbrTbUAbQsaKBacpciAbqabKRbKPbKObHPbHgbKMbKfbqabKNbJYbGObqabqgaYpbWgbSAbDQbFvcnWbHxbDQcbibJSbIocMCbJObBqcincaycxwcfLcoibWQbGUcyvbJHbJIdJHbCGbFsbGIbPJbGNcMBbUQbUCbUNbFpbEFcBKbUBbqFbqGbTObTRbTNbTNcdxbIAcdubUbbUdcdzbEjcMybHacftbKbcepbEjceocfFcQmbTlavAbxhciociociociociocluaQsaQscelbgXbArbZqbZpbUebBXbAvbBYbnTbxwbAwbbmcaObMhbUiaaebNCbCabCbbCcbgXaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaIlaGpaaaaaaaJUclBbMUbZtciJbZFbMUclCaJUaaaaaaaGqaIlaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaULceQaULaaeaaeaaeaaeaaeaaeaaeaaeaaeaKBbSFaXOaXOaXOaXlbrTaqhbHMaUDbtwbrTaDnccJbMbaKBaKBaKBaKBaKBbTcaKBaKBbSYaKSbqabHHbHSbHRbHRbHPcekbTfbqabFccgibFabqaaWAaYpbUjbSAbDQbTdbEfbTecCmcbibDlcKpcJWbBqbBqcegcdDbLdcdjccMccLcdvcdscuhcdqcCkbCGbEadJDcnndJEcLZbSIbSIcKwbCGbGYcBKbSJbqFbqGbEjbRfbRjbRybFCcpOcqdbOlbRYbRZcenbScctOcejbRMbRSbEjbjSbjSbjSbjSavAbxhavAcxnckFaQsaQsaOhaThckEaQsbgXbgXcfpaSkbAubiJccgbDhblXbDibOybbmchBccCbHWczpbRbbDkbABcPDbgXaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaOXckGaFUaFUaFUaLHaLIaLIaLIbwsaLIaLIaLIaSQaFUaFUaFUckMaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaKBaKBaKBaKBbQsbxRaXObQhcdSbQlbKtbKtbKtccabKtbKtcdSbKtbKtbKtbQVbKtbJibQUbrTbqabEZbFtbFqcdTbJpbERbEybqabqabqabqabqabAWaYpcaVbSAbSAbQTbQTbQTbSAbSAbBqbBqcEbbBqbBqcCLcCxbMGcCLcDccDccDccCxbMIcCLcCxbCGbCGbCGbCGbCGbCGbQQbQQbQQbCGbCNcBKbSzbqFbNWaZLbMNbMNbMNbPZbMNbMNbPWbMPbMNbMNbMNbMNbEjcdMcdNcdKcdEcdAcdnaQsbLLbLMavAckCckzckyaQsaOhaQsaQsbWIbgXbPIbmcbPLbiJbiJbiJcdLblXbEDbEEbbmcbGbMhbUiaaebgXbgXbgXbgXbgXaaeaaebSwaaebVMaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaIlaGpaaaaaaaaaaaaaaaaaabQgaaaaaaaaaaaaaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaKBaKBaKBaKBbQsbxRaXObQhcdSbQlbKtbKtbKtccabKtbKtcdSbKtbKtbKtbQVbKtbJibQUbrTbqabEZbFtbFqcdTbJpbERbEybqabqabqabqabqabAWaYpcaVbSAbSAbQTbQTbQTbSAbSAbBqbBqcEbbBqbBqcCLcCxbMGcCLcDccDccDccCxbMIcCLcCxbCGbCGbCGbCGbCGbCGbQQbQQbQQbCGbCNcBKbSzbqFbNWaZLbMNbMNbMNcpJbMNbMNbPWbMPbMNbMNbMNbMNbEjcdMcdNcdKcdEcdAcdnaQsbLLbLMavAckCckzckyaQsaOhaQsaQsbWIbgXbPIbmcbPLbiJbiJbiJcdLblXbEDbEEbbmcbGbMhbUiaaebgXbgXbgXbgXbgXaaeaaebSwaaebVMaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaIlaGpaaaaaaaaaaaaaaaaaabQgaaaaaaaaaaaaaaaaaaaGqaIlaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaKBaKBbzdccPaWoaKBccQaKBaKBaKBcoLbYwbYwbYwbYwbYwbYwbYwbrTbZwaQWbVBbqabVwbUaccebTnbJpbHPbWoccfbVFbtwaKBcbQbqgcorbYeccrccnccicciccicEhcdocxTcEiccidAScosccrccrcoycowcowcowcoxcowcovccccccccKcoEbXwcfSdBocEjcciccicciccObTzcccccmbqFdvRchbcevbWDbWEbXWcmycmBcmZbXWclOclZcmdcmobEjdvYdAacnCcarcnJcnDasMbLMbOnavAavAavAavAavAdvAdvbbgXbgXbgXccbbmcaSkbFPbFQcoqbnIbFSbFTbFUbOzchXcltbHncEebWjbFWbFXbFXbgXaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqaIlcEgaNKaNKaNKaNKaNKaNKbQgaNKaNKaNKaNKaNKaNKaNZaIlaFLaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaacnwcixbzacoBcnwbrTdvaagvdAcaKBcolbYwcnXcnAcnscnrcngbYwbrTbHMaQWbHMbqabqabqabqabqabqabqabqabqabQSbHMaKBcijbqgbOUbOVaWKaWKaWKaWKaWKaWKaWVaWKbPjbOXaWXaWWaWKaWKbOYbOZcojbPbbPcbPdbPebPfaWKaWKcaXbPhaWKaWKaWVaWKaWKaWKaWKbSRaWKbPjcnYcfzcfycawbUmcdkbUmbFFbFFduKduIclibFFcdkduJbEjbEjbEjbEjatJbasaUobWIbQMbOoaUobOocasbZiavAbvSavAbgXcmLcaxcaKcaMcaUchfchfchfaVzblXblXblXbbmcgTbMhbUiaaebNCbHsbHtbHubgXaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaGqdvMbBHbBHbBHbBHbBHbBHbBHcmAbBHbBHbBHbBHbBHbBHbBHdvJaGpaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaacnwclJbyZcifcnwbrTdJyaqhaKBaKBdACbYwcjBclDctGclUdKGbYwavabrTbZAbKtcdSbKtbKtbKtbZDbZEbZEbZEbZEbOMbOSdokcQabTPclHbQdbQcbQebZXbQdbQdbQdchGbQdbTUaVCbUgbQiaVCaVCbRqbQkbRQcxPbQnbQobQpbQqaVCbZnchccgZcgZchacdUchachachachiclAbRXckbchhbSaceVceUdtDdurdiddkCdtobSZbTaddvcgNbSZdcBbMNchJchPbMNatJbasaUoaUoaUoaUoaUobZeasMasMckPcqWbYxbZdbYybYpbYubYkbYmblXblXblXblXblXbnTblXbbmccjccCcksczpbRbbIPbFXbUSbgXaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaabFgbFgbFgbFgbFgbFgbFgbFgcEfbFgbFgbFgbFgbFgbFgbFgbFgaaaaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaaeaacaFvaaecnwcqedzMbyYcnwbVBbrTcVRaKBcjKcvobYwcjwcpqcjucjncuSbYwbYwbYwbYwbYwbYwdJpbYwbYwcjIbYcbYdbHMbMebrTbMbaKBaKBaZLaZLaZLaZLaZLaZLaZLaZLaZLaZLctQbRwbRwcezceDbRwcNWbRwcjmcbDbqFcbBcbCbRDcTgbRDbXDcexbRDbRDdNdaZLbSXbNpbNpbGWaZLcaeaZLcPGcUvcPGbMNcAkcENbTacylcxybSZbTacwnctscvUcrZbMNcfZcgtbMNdHLbXlcfTasMasMasMasMbXfbWTbMicjjbMibMibiNbRhbWLbWMblXbWHbevbevbevbevbevbWGblXbbmcbGcjibgXaaebgXbgXbgXbgXbgXaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLKaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaacnwbLKcracrbcnwaKBaKBaKBaKBbYwcvobYwbSnbSobSpbSqccobYwbSlbSmbRKbYwbRRbSjbREbYwczGbYwbYwbYwbYwbYwbYwbYwbRzbRpbRxbRlbRnbRmcxLbQZbRkbYtcxLbUIbXObUIbXRbXQbUIbXObUIbYIbMzbSKbMSbRLcwbbSNcwbbLObYKcwbbSNcwbbRLbPObPObPObPObPOcpcaZLcclcboccBcevceicdkbTacgNcgNbSZbTJcgNcgNbSZchdbMNbUnbUlbMNatJbSSbSVbMibMibMibMibMibMjavAbSBbSCbSCbgXbXNbLVbLTbLRbLQbnTblXblXbWHbevbLXchHbbmbMgbMhbgXaaeaaeaaeaaeaaeaaeaaeaaebYOaaebVMaaebSwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaabMqbMrbMrbUpbMsbMBbMAaaaaaeaaaaaaaaabYwcvobYwbYwbYwbYwbTwbYwbYwbTtbTubTtbYwbYwbYwbYwbYwbTicjvbYwcdYbxmbAPbxkbUGbUFbUubUEbUubTQbTIbTEbTycwvbTxbSObThbAcbYTbNYbPQbYTbuSbtobXObTLbTSbTTbSNbtibtmbTVbTXbZIbTVbAObAfchpbPObZKbYZchnbPObWwaZLchkchechYchSchqbXZcjgbVlciebXZcjgbVlbVlbXZcjzcjxbVObVybYFbYGbasaUobULbNaavAavAavAavAavAcpebVGcaobgXbVjbMKblXblXbxwbMLbnXbnXbMRbMTbMRbnXbMYbMZbMhbgXbgXbgXaaeaaaaaaaaaaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabIWaaaaaebWRbKjbKjbKeaaeaaeaaeaaeaaebYwbGbbFZbKYbYwbLabLebZbbYwbLgbLhdJrbKubKzbQLbKHbYwbKIbuXbIHbIhbxjbUkbVcbUMbVubVrbTrbYYbGybrxcxLcxLbHjbGFbLibLybMabWdbEObWibWhbKGbXsbXEbTLbTSbTTbVebVfbVgbVhbKqbWSbVkbVkbFwbFybTkbSgbRJbVxbPObPpaZLbWXbWqbXFcevbZBbXPbXdbXKbXxbXKbXGbXKbZLbXKbrAbMNbRPbRCbPwcsVbMjavAavAavAavAbLAbLIbLJbLWcjJbVQbNRbgXbLFbKFbKDbKCbKAbMcbKybKxbKwbMkbKWbKUbKLbKJbMhbWWdOqbWWaaeaaaaaaaaaaaeaaaaXqaaaaaeaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaFvaaeaacaFvaaeaaabIWaaaaaeaaeaaeaaaaaaaaaaaaaaaaaeaaabYwbYwbYwcvobYwbMCbFZbNbbNcbMXbGwbMlbQLbQLbZbbMybYwbMmbMxbYwcuScmzcaWdEcbYwbMHbNmbNjbNibNgbNfbNlbYIbYIbAUbYIbNDbDmbXobXobXqbrMbsebrCbrDbrHbrIbHpbVebVfbVfbVfbWtbUfbTYbWvbBCbXJbXIbWlbVibWAbPObWwaZLaZLaZLaZLbMNbMNcaYbMNbMNbMNbMNbMNbMNbMNbMNbMNbMNbMNbMNbMNatJbNKavAcfRchjavAbNJbOqbOBbObcjJbTvbNnbgXbNNbNNbOCbNNbXLbNNbOCbONbXLbXLbMhbNNbQNbPibXMbgXbgXbgXaaeaaaaaaaaaaaeaaaaXqaaaaaeaaeaaeaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvAaaaaaaaaaaaeaaaaaaaaactSaaaaaaaaeaaaaaaaaaaaaaaaaakaaeaaabYLbYEbYwbYfbYnbYobYwbYwbYwbXYbYabYqbYrbYsbYwbYwbYwcbjbZhbYwaKBbxzbxzbxzbxzbxzbxzbXCbNibXVbXTbGcbYIbGgbYQbZcccwccvbSEczybSEbFjcctdJAbUIbTLbmybTTcwbcpvbFMcomclLcbcccHbDpbXHccIbPOccyccqcbAbPObOAbXXbXXbXXbXXbXXbPgctubXXbXXbXXcbWbXXbXXbXXbXXbXXbZQbOWbZWasMckvbZCbNrbZJdJCavAbZObYXbZjbZkbZrbZybZzbgXbgXbgXbYSbOEbOFbOEbOIbOEbOFbOFbODbOEbYRbgXbgXbgXaaeaaeaaeaaeaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaabwYbwYbwYbwYbwYaaecuLaaebwYbwYbwYbwYbwYaaaaFvaaaaaeaaebYwcaTbPlcaCbYwbYwbYwbxNbYwbYwbYwbYwbYwbYwbYwcaGclwbMmcaDdEebYwcazcaBbGvcagcbmbxzcaQcaPcaJcaIcaHbYIcaFcaEcaLbStcambZNbZNchVbGicbqbGicdHcbvbmybYNcvBcmkciNciNbYPbCncdCbYPbYUbYVbPOccAcczcnfbPObGTcizbWBbWBbWBbWBbPFbWBbEbbEbbEbbEbbEbbEbbEbbEbbEbbZgbYwbQLaQsaQsaQsavAaQsaQsavAcbwcbfcbgcaZcbacbncbucbkcyWaaecxsaaecxFaaecxsaaecyHcwTcwEaaecwEcxdaaeaaeaaeaaaaaaaaeaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecuHcuIcuIcuIcuIcuKcuLbMWbMMbMMbMMbMMbMVajGajGaaaaaeaaabYwbVYbYwbGbbFZbFZcatbFZbFZbVRbZxbZxbZxcbebZxbZxbZxbVSclpcslbVJbUObUUbVUbVVbNkbxzbWfbCTbBZbVPbWfbYIbXebXabYIbXzbXgbZNbDebZPbCvbZRbYjbZNbYMbDocdBclyckhckncjDcavbZZbZTbYPbQrbGJcadcaNcadbPObPOczlbYwbWBbBnbDNcgobNzbFdbEbbFIbFIbFIcaSbNsbNxbFIbEbbZgbYwbWNaUobWFbWJavAciVcjQavAbVdbWsbTsbBWbWybCybTsbTscfIbgXbNFbNCbNFbgXbNFbNCbNFbgXbNEbNCbNBbgXaaeaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaFvaaebwWbwWbwWbwWbwWaaacuLaaabwWbwWbwWbwWbwWaaaaFvaaaaaeaaabYwbYwbYwbYwbYwbYwbYwbYwbYwbQKbYwbYwbXhbXjbXjbXjbXjbJdbXjbXjbXjbXpbXtbXubXvbJgbXBbNObJlbJnbNQbOsczubJobXSbNUbJzbKrbNVbPybPxbYDbYCcapbZNbYMbmycdwciNciNciNciNckTcmMcmFbYPbYJbOJbOtcsdbWBcuScmzcnxcjvbWBbWVccEbunbOfbQwbEbbFIbOebNXbNTbNPbNMbNLbEbbZgbYwbYwbYwbYwbYwavAavAavAavAavAavAarNbWZbXbbWYbTscnEcnKbgXbOwbWObOxbgXbOubSdbOvbgXbOibNdbOmbgXaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaeaaaaaeaaeaaeaaacabaaaaaeaaaaaeaaaaaeaaaaFvaaeaaeaaabYwcfdceZcfnbnGcfucfxbZsbZudIFbYwbzQbyUcbHcbIbzLcaAbEgcbLcbMbYwcfAbyRbHkbyAbGGbGHbHCbRHbzrbzbbRobRrbRobzbbRobFhbGecbdbJucfvbJqbJkbIEbGibYMbmybYNbCnbXUbPNbQxbQvbIxbQubIQbyubyvaXDaYHbWBcaqbQFbQfbPTbWBbGuccGbFGbFHbQPbEbbFIbFIbFJbFIbFIbFLbFKbEbbZgbYwceRbnEbYwbBobVHbVIbBKbVKbVTbWearNbBWbCsbCybTsbPEaaebgXbVLbWPbCEbgXbRgbSebCkbgXbOGbNecbTbgXaaeaaeaaeaaeaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaabwYbwYbwYbwYbwYaaecuLaaebwYbwYbwYbwYbwYaaeaFvaaaaaeaaacfGcfOcaicgIcgPcalbZocgybYwbQKbYwccTccUccVbzXccXbRObGrbzUbIIbYwbIKbJCbIkbJabImbLBbLwbIcbzEbLxbGpbSEbSEbSEbLtbFzbGjbLvbLocfvbnNbJkcbzbZNciWbmybRGbYPcahcaabZHbKSbDFbRibYPbzBbZvbWzbVNbWBbdObYvbQYbQGbWBbrWbJVbDVbDTceLbEbbEbbGEbGDbGMbGLbEbbGKbEbbGQcbxcakbCFbYwbCDaQsaQsaQsbQLcpqbQEbYvbCHbCRbGZbDPbPEaaebgXbVLbGkbVLbgXbRgbGsbRgbgXbLYbGtbLYbgXaaeaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaecuHcuIcuIcuIcuIcuKcuLbMWbMMbMMbMMbMMbMVaaeaFvaaaaaeaaacacbZGbZocaicajcalbmwbYwbYwbFobYwcdZceacebceccedcaAbyzbQjbyzbYwbxzbExbyBcjlbxzbxzbSucyUbEWcemcembFxbHTbFVcemcemcshbZNcbycfvbEUbUqbZNbZNbDbbmybKmbYPbJXbKhbLfbKSbBubAqbYPbDGbGJbRLbRLbWBaUJbYvbEGbWBbWBbRLbKKbxobRLbRLbDUbDSbDZbPKbEkbIvbYBbYhbEbbEJbYwbErbEubYwbTFcpqbZbbQLbZlbQLbYwbYvbTsbMpbTsbTsbIwaaebgXbgXbgXbgXbgXbgXbgXbgXbgXbgXbgXbgXbgXaaeaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaebwWbwWbwWbwWbwWaaabUWaaebwWbwWbwWbwWbwWaaaaFvaaaaaeaaacacccFcaicdWceJcalcdJceKdJpbQKbYwcfacfbcfcccYbQDcaAbCBbDnbEPbYwbwPbyqbFlcflbGmbHUbPPbNYbSDcemcqLbCKcfqbDjbnzcemctGbZNceOcfvbHLbHDbGibIlbykbnsbPqbPubPBbPCbGPbGnbDFbFbbBJbGlbQAbQyaWbaWObVfaVwbFEbOraVrbOpbFibFfbVfbFebDUbEVbEScbSccuccdcbZcbYbEbbZgbYwbYwbVzbYwbVobVvbQLbQLbIXbVCclraaebTscqAbTsbNIbLCaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaabUYaaaaaeaaaaaeaaaaaeaaabIWaaaaaeaaaaaeaaeaaeaaebUYaaaaaeaaacuwcurcaicalcalcaicaictgdJpbQKbYwcgdcgecgfcggcghcaAcjEcgjcgkbRTcgmbLnbLmcgpcgqcgrbUVbNYbPQbOkcgucgvcgwbLpctecembQLbZNbMJbqVbpkbRVbRtbRsbRubmybRFbRvbRNbTpbUDbQbbQzbTGbQObQCbRdbAxbBxbJsbURbBCbIRbUTbZabUTbIybIpbIDbJybwUbIFcrtcqSckQcjXcmrclQcqicmubYwbIMcsYceScfkbZlbQLbQLcotbHfbYwaaebTsbBmbTsbSPbTbaaaaaaaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaabwYbwYbwYbwYbwYaaebJUaaebwYbwYbwYbwYbwYaaeaFvaaaaaeaaacaccvqcaicvjcaicaibmwbYwbYwbxZbLSchscgechtcggchuchvchwbDuchychzbDwbLPchCchDchEchFbVAbLNbDmbPmchKbDgchMbLschMchObTBbZNbOPbOKbTAbOObGibRsbRubmybRFdJWbCnbSWbWbbSvchZbQBbBJbSyclkbzybLrbBVciicikbVnbVkbVkbVkbJBbVbbBGbJTbJNbJLbJKbPabJxbJwbJvbJtbEbbZgbYwbJebJbcfDcakdJxbIXcuJbQLcfCclraaebFRbFYbFRbVZaaeaaeaacaXyaXyaXyaXyaXyaXyaacaXyaXqaXybVMaaeaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaecuHcuIcuIcuIcuIcuKcuLbMWbMMbMMbMMbMMbMVaaeaFvaaeaaeaaacacbNAcalcgIcalchrbZbchxbYwbQKbYwciBciCciDciEciFcaAciGcfgciHbYwbJMchUbKiciLbTgbHUbSHbNYbKTcemciOciPbHAciRcilcembMubZNbZNbZNbMObZNbZNbZNbMfboubMdbYPbYPbYPbYPbYPciZbLUbYPbWBbWBbSQbSTbSUbLbbJZbMtbLkbLkbLkbLkcjkcjkbIBcjkbEbbEbbEbbHcbGXbHedJubEbbZgbYwbIMbElbYwcbEcbKbQLbQLbQLbHhbYwaaeaaeaaeaaeaaeaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaebwWbwWbwWbwWbwWaaabUWaaabwWbwWbwWbwWbwWaaaaFvaaaaaeaaecaccalchrcalbNZbZlcjBcjTbYwbQKbYwbSkcjAcjVcjCbSLcaAbKXcjFbShbYwbPYcehcehcehcehcehcjabAtbTMbNHbKVcjMbHFcjOcsCcembwQbPzbPzbOjbxYbxWbuXbokbHVbpibHYbHZbIabSMbHIbHGbHKbHJbHNbOabHQbHOckfckgbOgckibtGckkcklckmbphcjkdJvbJcbOQbEvbEtbEbbEbbEbbEbbEbbEbbZgbYwbYwbYwbYwbYwbYwbYwclrbYwbYwbYwaaaaaeaaaaaaaaaaaeaaeaaeaacaXqaXqaXqaacaXqaXqaXqaacaXqbSwaXqaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaaaaaaaeaaeaaeaaaaaacvTaaeaaaaaaaaeaaeaaaaaaaFvaaaaaeaaadMEdMFdMFdMDbYwdMCdMBbYwbYwbQKbYwbYwbYwbYwbYwbYwbYwbYwcshbYwbYwbYAbYwcxZcxYcyfcyebVAcukcuDcemdKQdKRdCGcoCcoCcoCcoCcoCcoCcoCcxJdCLcxJcxJctPcrncrobYwcmzdQwdEcbYwcjccjcdAgcjcckUctYckYckZbOgclaclbclccldcledQxcjkclgdHadHccxzcvEbYvdEedEebYwcpXclpdLcbYwcABcjvbYwaaaaaeaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaaaaaaaeaaaaaeaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUYaaaaaaaaaaaaaaaaaaaaacvTaaaaaaaaaaaaaaeaaaaaabUYaaaaaeaaaaaaaaaaaaaaebYwbYwbYwbYwcgKbQKbZhcucdCMbQLcEJcuSbZhclwctGbYwbYlbQLbYwcwrcwqcwhcwfcBdcxhcxfcemcemcemcemcoCctbdMAdMzcsZcsLcoCcsxcsEctodKOctqbTSbYNbYwdDWdNjdODbYwctEdBlclXctFckUcAJcmbcmcdKPcmecmfcmgdDXcmidPxcjkdQvcmldGMcwScuobYvbCQbFAdEadEbbZhdLadEadLbcotclraaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaacaFvaFvaFvaaaaaaaaacvTaaaaaaaaaaFvaFvaFvbUYaFvaaeaaeaaeaaeaaeaaeaaeajGbYwdNlbYwbIOdJtbXXbXXbXXbXXbXXbXXbXXbXXbXXcwtbQLczwbYwczYczRcAiczRczEczIcyYctjcQFcxvcxxcoCdMJbTZcwYbUJcwGcoCcxjbXccxAcxEctqbTSbYNbYwbYwbYwbYwbYwcxScxUcxIcxKckUbTXcmXcBEdMscnacnbcnccnccndcmicjkdQFcmldHjcnicJRbYvdJwdKHbYwbZgbQLcOzbYwbQLcpZbYwaaaaaeaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaFvaaecBBaaeaFvaaaaaaaaeaaaaaaaaeaaaaaaaaaaaaaaeaaecELcEKbPlckAcxtckAdJrbQLbQLbQLbQLcizdNkdInbQLbQLcpWdKGckXbYwdEjdEkdEldEmdEgdEhdEictjczmczocEMcoCcuFcuGcuBcuEdMIcoCdMHdMGcxJcxJcvGbTScBgcmPdNgdNfcwzdNidNhcwFcvHdQyckUcpJcjeczqbLkdEfcnZdKUdKSbTWdQEcjkcoecofdHicxXcnibYvbYwbYwbYwbEJbYwdLdbYwbYwbYwbYwaaeaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaFvaaaaaeaaaaFvaaaaaaaaeaaeaaeaaeaaaaaaaaaaaeaaeaaaajGajGbYwdBhbYwbQLbZhbQLbQLdNzbYwbYwbYwbYwbYwbZhcpWcuScmzbYwdEzcNScOycOucMIdEocMKcNjcLNcMmcLzcMGdMPcNmcJOcJPcBQctocCMcDYcJQcxJcbvbWrcNBclRdNAcmScmScmSdBtcmTcmTcmTcOAcuRcjecpfbLkbLkbLkbLkbLkbLkbLkcjkcjkcjkdLgcjkcjkbYvcpXclpclpcpYbYwbQLdLecubdKZcubaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaakaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaFvaFvaFvaFvaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaeajGbYwbYwbYwcdYbYwcmzcJZclfbYwdKIdKJdKIbYwcdYcpWbYwbYwbYwdEqdEqdEqdEqdErdEtdEucyscyncyqcxVdDzdMOdMNbXrdMLdMKdDAcyIcyRcAKdDGcDSbTSdBMcjcdNndNmdNmdNmdNhcmTczKczLbIGcBOcKNdJidovbYWbYgcEOdHlbXAdJqcafdKydKCdKDdKMdoBcdYdJobQLbQLbYwbYwdLfbYwbYwbYwbYwaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaeaaeaaeaaeaaeaaabYwbYwbYwbYwbYwbYwbYwbYwbYwbYwbYwbQLcpWbYwcqucpKcLscLrbWKctvdEOdAPdARctjdNadNbdMZcoCdMXdMWdMWdMWdMYcoCdNcdEKdEMcnRdENcnNcNBcpbdOfcmScmScmSdBtcmTcmTcmTcOAdAdcqGdNodNpdOddOecEPcEQdOmdOndNrbJDdOndNvdNwdoBdovcqQdBwdovdovdNudOjdOhdOidNtaaeaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecYFdpecYFaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaeaaeaaaaaaaaaaaeaaaaaabYwbQLdECcshcLPcJYcpDcpCcpzcpydEEdEFdEGctjcKjdAmcJUcoCcaudNCdNBdMQdMTcoCdMVcKOcKOcxJdMUbTSbYNcjcdNEdNfdNFdNGdNhdBAcLvcLYckUbTXcrEcrFdNHdNIdNMdLhdNJdNJdMfdMydMRdMSdLpdLRdoBdppdNQdNRdNSdLodNOdNOdNOdNPdOgaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecYQcYFdsCcYFcYQaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaeaaaaaabYwbZhdKabYwcuecqqdCIcOccsbcrDdolcrBdMkctjctjcryctjcoCcoCcoCcoCcoCcoCcoCdATcxJcxJcnpcrmcrncnqcjcckUckUckUcOAdBGckUckUckUckUcrpcjecqldrxdssdptdsgdshdspcBCcBFdsedsfcLmcOecKJdsrdtidtkdoPdsEdtJdufdoVdpcduiaaeaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecsGcszcsFcsHcsKcszcsGaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecwucwucwucyJcwucwucwuaaaaaeaaaaaaaaaaaeaaaaaabYwcizcpWbYwbSxdnEcEFdMicqIctvdmVdnddnDctvdmJcrdcqXckOclIclKclIdMjclIcwBclKcwAckOclPbYMbTSbRFdJWcjSdnJdNXcvbdBEdJUdEddERcvJcqUbSTcqDdovcAecAecBlcAbcAccxlcxBcxNcyycyCczHdoBdpvdpwdpxdovdpydqGdrbdovdrxdovajGaaeaaaaaaaaeaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaecrScrTcrVcrWcrWcrWcstcrScrTaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaaeaacaFvaaecnwcqedzMbyYcnwbVBbrTcVRaKBcjKcvobYwcjwcpqcjucjncuSbYwbYwbYwbYwbYwbYwdJpbYwbYwcjIbYcbYdbHMbMebrTbMbaKBaKBaZLaZLaZLaZLaZLaZLaZLaZLaZLaZLctQcuocuocwhcvccuocwrcuocxZcyfbqFcbBcbCbRDcTgbRDbXDcexbRDbRDdNdaZLbSXbNpbNpbGWaZLcaeaZLcPGcUvcPGbMNcAkcENbTacylcxybSZbTacwnctscvUcrZbMNcfZcgtbMNdHLbXlcfTasMasMasMasMbXfbWTbMicjjbMibMibiNbRhbWLbWMblXbWHbevbevbevbevbevbWGblXbbmcbGcjibgXaaebgXbgXbgXbgXbgXaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLKaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaacnwbLKcracrbcnwaKBaKBaKBaKBbYwcvobYwbSnbSobSpbSqccobYwbSlbSmbRKbYwbRRbSjbREbYwczGbYwbYwbYwbYwbYwbYwbYwbShbRzbRpbRnbRxbRwcxLbQZbRkbYtcxLbUIbRmbUIbXRbXQbUIbRmbUIbYIbRlbSKbMSbRLcwbbSNcwbbLObYKcwbbSNcwbbRLbPObPObPObPObPOcpcaZLcclcboccBcevceicdkbTacgNcgNbSZbTJcgNcgNbSZchdbMNbUnbUlbMNatJbSSbSVbMibMibMibMibMibMjavAbSBbSCbSCbgXbXNbLVbLTbLRbLQbnTblXblXbWHbevbLXchHbbmbMgbMhbgXaaeaaeaaeaaeaaeaaeaaeaaebYOaaebVMaaebSwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaabMqbMrbMrbUpbMsbMBbMAaaaaaeaaaaaaaaabYwcvobYwbYwbYwbYwbTwbYwbYwbTtbTubTtbYwbYwbYwbYwbYwbTicjvbYwcdYbxmbAPbxkbUGbUObUubUEbUubTQbUFbTEbTycwvbTxbSObThbTIbSEbNYbPQbSEbSHbStbRmbOsbTSbTTbSNbtibtmbTVbTXbZIbTVbAObAfbTLbPObZKbYZchnbPObWwaZLchkchechYbUUchqbXZcjgbVlciebXZcjgbVlbVlbXZcjzcjxbVObVybYFbYGbasaUobULbNaavAavAavAavAavAcpedIBcaobgXbVjbMKblXblXbxwbMLbnXbnXbMRbMTbMRbnXbMYbMZbMhbgXbgXbgXaaeaaaaaaaaaaaeaaaaXqaaaaXyaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabIWaaaaaebWRbKjbKjbKeaaeaaeaaeaaeaaebYwbGbbFZbKYbYwbLabLebZbbYwbLgbLhdJrbKubKzbQLbKHbYwbKIbuXbIHbIhbxjbUkbVcbUMbNUbVrbTrbYYbGybNQcxLcxLbHjbGFbLibLybMabWdbEObWibWhbKGbXsbXEbOsbTSbTTbVebVfbVgbVhbKqbWSbVkbVkbFwbFybTkbSgbRJbVxbPObPpaZLbWXbWqbXFcevbZBbXPbXdbXKbXxbXKbXGbXKbZLbXKbrAbMNbRPbRCbPwcsVbMjavAavAavAavAbLAcCdcEAcMLcRVcAfcCcbgXbLFbKFbKDbKCbKAbMcbKybKxbKwbMkbKWbKUbKLbKJbMhbWWdOqbWWaaeaaaaaaaaaaaeaaaaXqaaaaaeaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaFvaaeaacaFvaaeaaabIWaaaaaeaaeaaeaaaaaaaaaaaaaaaaaeaaabYwbYwbYwcvobYwbMCbFZbNbbNcbMXbGwbMlbQLbQLbZbbMybYwbMmbMxbYwcuScmzcaWdEcbYwbPZbPPbOQbNibNgbOtbPNbYIbYIbAUbYIbNDbDmbXobXobXqbrMbsebrCbrDbRibrIbHpbVebVfbVfbVfbWtbUfbTYbWvbBCbXJbXIbWlbVibWAbPObWwaZLaZLaZLaZLbMNbMNcaYbMNbMNbMNbMNbMNbMNbMNbMNbMNbMNbMNbMNbMNatJbNKavAcfRchjavAdAodDIdHOdCSdCVdBcdBmbgXbNNbNNbOCbNNbXLbNNbOCbONbXLbXLbMhbNNbQNbPibXMbgXbgXbgXaaeaaaaaaaaaaaeaaaaXqaaaaaeaaeaaeaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvAaaaaaaaaaaaeaaaaaaaaactSaaaaaaaaeaaaaaaaaaaaaaaaaakaaeaaabYLbYEbYwbYfbYnbYobYwbYwbYwbXYbYabYqbYrbYsbYwbYwbYwcbjbZhbYwaKBbxzbxzbxzbxzbxzbxzchpbNibXVbXTcfAbYIcgocgmbZcceDcezbJacdHbJabFjcctdJAbUIbOsbmybTTcwbcpvbFMcomclLcbcccHbDpbXHccIbPOccyccqcbAbPObOAbXXbXXbXXbXXbXXbPgctubXXbXXbXXcbWbXXbXXbXXbXXbXXbZQbOWbZWasMckvbZCbNrbZJdJCavAdRkbTvdRhbTsbBWdRidRjbgXbgXbgXbYSbOEbOFbOEbOIbOEbOFbOFbODbOEbYRbgXbgXbgXaaeaaeaaeaaeaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaabwYbwYbwYbwYbwYaaecuLaaebwYbwYbwYbwYbwYaaaaFvaaaaaeaaebYwcaTbPlcaCbYwbYwbYwbxNbYwbYwbYwbYwbYwbYwbYwcaGclwbMmcaDdEebYwcazcaBbGvcagcbmbxzcoVcnZcnMckncjJbYIcjFcjmcaLchvchSbZNbZNchVbGicbqbGicjacbvbmybYNcvBcmkciNciNbYPbCncdCbYPbYUbYVbPOccAcczcnfbPObGTcizbWBbWBbWBbWBbPFbWBbEbbEbbEbbEbbEbbEbbEbbEbbEbbZgbYwbQLaQsaQsaQsavAaQsaQsavAcbwcbfdRlbTsbWZbXbbWYbTsaaeaaecxsaaecxFaaecxsaaecyHcwTcwEaaecwEcxdaaeaaeaaeaaaaaaaaeaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecuHcuIcuIcuIcuIcuKcuLbMWbMMbMMbMMbMMbMVajGajGaaaaaeaaabYwbVYbYwbGbbFZbFZcatbFZbFZbVRbZxbZxbZxcbebZxbZxbZxbVSclpcslbVJbVubUVbVHbVAbVPbxzbWfbVUbBZbVVbWfbYIbXebXabYIbXpbXgbZNbDebZPbCvbZRbYjbZNbYMbDocdBclyckhbXzcjDcavbZZbZTbYPbQrbGJcadcaNcadbPObPOczlbYwbWBbBnbDNbXBbNzbFdbEbbFIbFIbFIcaSbNsbNxbFIbEbbZgbYwbWNaUobWFbWJavAciVcjQavAdMMdJmdJSbTsbBWbCsbCybTsaaebgXbNFbNCbNFbgXbNFbNCbNFbgXbNEbNCbNBbgXaaeaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaFvaaebwWbwWbwWbwWbwWaaacuLaaabwWbwWbwWbwWbwWaaaaFvaaaaaeaaabYwbYwbYwbYwbYwbYwbYwbYwbYwbQKbYwbYwbXhbXjbXjbXjbXjbJdbXjbXjbXjbXCbXtbXubXvbXSbXOcapcambYTbYQcaIcaHcaFcaEcaJcaPcaQbNVbPybPxbYDbYCcbzbZNcbDbmyccvciNciNciNciNckTcmMcmFbYPbYJbOJccwcsdbWBcuScmzcnxcjvbWBbWVccEbunbOfbQwbEbbFIbOebNXbNTbNPbNMbNLbEbbZgbYwbYwbYwbYwbYwavAavAavAavAavAavAdRgbTsdRfbCRdQGdNDaaebgXbOwbWObOxbgXbOubSdbOvbgXbOibNdbOmbgXaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaeaaaaaeaaeaaeaaacabaaaaaeaaaaaeaaaaaeaaaaFvaaeaaeaaabYwcfdceZcfnbnGcfucfxbZsbZudIFbYwbzQbyUcbHcbIbzLcaAbEgcbLcbMbYwbHCbGHbHkbGgbGGbGpbGcbRHbzrbzbbRobRrbRobzbbRobFhbGecbdbJucfvbJqbJkbIEbGibYMbmybYNbCnbXUbDTbQxbQvbIxbQubIQbyubyvaXDaYHbWBcaqbQFbQfbPTbWBbGuccGbFGbFHbQPbEbbFIbFIbFJbFIbFIbFLbFKbEbbZgbYwceRbnEbYwbBobDwbVIbVKbVTbWeavAcpGbTsbTscqAbTsajeaaebgXbVLbWPbCEbgXbRgbSebCkbgXbOGbNecbTbgXaaeaaeaaeaaeaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaabwYbwYbwYbwYbwYaaecuLaaebwYbwYbwYbwYbwYaaeaFvaaaaaeaaacfGcfOcaicgIcgPcalbZocgybYwbQKbYwccTccUccVbzXccXbRObGrbzUbIIbYwbJMbJCbJzbJobJnbLBbJlbIcbzEbLxbJgbJabJabJabILbFzbGjbLvbLocfvbnNbJkbIKbZNciWbmybRGbYPcahcaabZHbKSbDFbImbYPbzBbZvbWzbVNbWBbdObYvbQYbQGbWBbrWbJVbDVbIkceLbEbbEbbGEbGDbGMbGLbEbbGKbEbbGQcbxcakbCFbYwbCDaQsaQsaQscpqbQEbYwcwHcpNbTsbBmbTsbtNaaebgXbVLbGkbVLbgXbRgbGsbRgbgXbLYbGtbLYbgXaaeaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaecuHcuIcuIcuIcuIcuKcuLbMWbMMbMMbMMbMMbMVaaeaFvaaaaaeaaacacbZGbZocaicajcalbmwbYwbYwbFobYwcdZceacebceccedcaAbyzbQjbyzbYwbxzbExbyBcjlbxzbxzbSucyUbEWcemcembFxbHTbFVcemcemcshbZNcbycfvbEUbUqbZNbZNbDbbmybKmbYPbJXbKhbLfbKSbBubAcbYPbDGbGJbRLbRLbWBaUJbYvbEGbWBbWBbRLbKKbxobRLbRLbDUbDSbDZbPKbEkbIvbYBbYhbEbbEJbYwbErbEubYwbTFcpqbZbbQLbZlbQLbYwcnPcocbFRbFYbFRajGaaebgXbgXbgXbgXbgXbgXbgXbgXbgXbgXbgXbgXbgXaaeaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaebwWbwWbwWbwWbwWaaabUWaaebwWbwWbwWbwWbwWaaaaFvaaaaaeaaacacccFcaicdWceJcalcdJceKdJpbQKbYwcfacfbcfcccYbQDcaAbCBbDnbEPbYwbCmbyqbFlcflbGmbHUbAqbNYbSDcemcqLbCKcfqbDjbnzcemctGbZNceOcfvbHLbHDbGibIlbykbnsbPqbPubPBbPCbGPbGnbDFbFbbBJbGlbQAbQybCTaWObVfaVwbFEbOrbVfbOpbFibFfbVfbFebDUbEVbEScbSccuccdcbZcbYbEbbZgbYwbYwbVzbYwbVobVvbQLbQLbIXbVCclraaecokcokcokaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaabUYaaaaaeaaaaaeaaaaaeaaabIWaaaaaeaaaaaeaaeaaeaaebUYaaaaaeaaacuwcurcaicalcalcaicaictgdJpbQKbYwcgdcgecgfcggcghcaAcjEcgjcgkbRTbNfbLnbLmcgpcgqcgrbNjbNYbPQbOkcgucgvcgwbLpctecembQLbZNbMJbqVbpkbRVbRtbRsbRubmybRFbRvbRNbTpbUDbQbbQzbTGbQObQCbRdbAxbBxbJsbURbBCbIRbUTbZabUTbIybIpbIDbJybwUbIFcrtcqSckQcjXcmrclQcqicmubYwbIMcsYceScfkbZlbQLbQLcotbHfbYwcxocokcyWcyWcyWaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaabwYbwYbwYbwYbwYaaebJUaaebwYbwYbwYbwYbwYaaeaFvaaaaaeaaacaccvqcaicvjcaicaibmwbYwbYwbxZbLSchscgechtcggchubNOchwbDuchychzbNlbLPchCchDchEchFbNmbLNbDmbPmchKbDgchMbLschMchObTBbZNbOPbOKbTAbOObGibRsbRubmybRFdJWbCnbSWbWbbSvchZbQBbBJbSyclkbzybLrbBVciicikbVnbVkbVkbNkbJBbVbbBGbJTbJNbJLbJKbPabJxbJwbJvbJtbEbbZgbYwbJebJbcfDcakdJxbIXcuJbQLcfCclraaacokcyWcyWaaaaaeaaeaacaXyaXyaXyaXyaXyaXyaacaXyaXqaXybVMaaeaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaecuHcuIcuIcuIcuIcuKcuLbMWbMMbMMbMMbMMbMVaaeaFvaaeaaeaaacacbNAcalcgIcalchrbZbchxbYwbQKbYwciBciCciDciEciFcaAciGcfgciHbYwbKdchUbKiciLbTgbHUbKrbNYbKTcemciOciPbHAciRcilcembMubZNbZNbZNbMObZNbZNbZNbMfboubMdbYPbYPbYPbYPbYPciZbLUbYPbWBbWBbSQbSTbSUbLbbJZbMtbLkbLkbLkbLkcjkcjkbIBcjkbEbbEbbEbbHcbGXbHedJubEbbZgbYwbIMbElbYwcbEcbKcxibQLbQLbHhbYwaaeaaeaaeaaeaaeaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaaaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaebwWbwWbwWbwWbwWaaabUWaaabwWbwWbwWbwWbwWaaaaFvaaaaaeaaecaccalchrcalbNZbZlcjBcjTbYwbQKbYwbSkcjAcjVcjCbSLcaAbMzbMHbLtbYwbPYcehcehcehcehcehbLwbAtbTMbNHbKVcjMbHFcjOcsCcembwQbPzbPzbOjbxYbxWbuXbokbHVbpibHYbHZbIabSMbHIbHGbHKbHJbHNbOabHQbHOckfckgbOgckibtGckkcklckmbphcjkdJvbJcbKXbEvbEtbEbbEbbEbbEbbEbbEbbZgbYwbYwbYwbYwbYwbYwbYwclrbYwbYwbYwaaaaaeaaaaaaaaaaaeaaeaaeaacaXqaXqaXqaacaXqaXqaXqaacaXqbSwaXqaXqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaaaaaaaeaaeaaeaaaaaacvTaaeaaaaaaaaeaaeaaaaaaaFvaaaaaeaaadMEdMFdMFdMDbYwdMCdMBbYwbYwbQKbYwbYwbYwbYwbYwbYwbYwbYwcshbYwbYwbYAbYwdRwcxYdRvcyebNmcukcuDcemdKQdKRdCGcoCcoCcoCcoCcoCcoCcoCcxJdCLcxJcxJctPcrncrobYwcmzdQwdEcbYwcjccjcdAgcjcckUctYckYckZbOgclaclbclccldcledQxcjkclgdHadHccxzcvEbYvdEedEebYwcpXclpdLcbYwcABcjvbYwaaaaaeaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaaaaaaaeaaaaaeaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUYaaaaaaaaaaaaaaaaaaaaacvTaaaaaaaaaaaaaaeaaaaaabUYaaaaaeaaaaaaaaaaaaaaebYwbYwbYwbYwcgKbQKbZhcucdCMbQLcEJcuSbZhclwctGbYwbYlbQLbYwdRscwqdRtcwfdRrcxhcxfcemcemcemcemcoCctbdMAdMzcsZcsLcoCcsxcsEctodKOctqbTScdwbYwdDWdNjdODbYwctEdBlclXctFckUcAJcmbcmcdKPcmecmfcmgdDXcmidPxcjkdQvcmldGMcwSdRubYvbCQbFAdEadEbbZhdLadEadLbcotclraaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaacaFvaFvaFvaaaaaaaaacvTaaaaaaaaaaFvaFvaFvbUYaFvaaeaaeaaeaaeaaeaaeaaeajGbYwdNlbYwbIOdJtbXXbXXbXXbXXbXXbXXbXXbXXbXXcwtbQLczwbYwczYczRcAiczRdREczIcyYctjcQFcxvcxxcoCdMJbTZcwYbUJcwGcoCcxjbXccxAcxEctqbTSbYNbYwbYwbYwbYwbYwcxScxUcxIcxKckUbTXcmXcBEdMscnacnbcnccnccndcmicjkdQFcmldHjcnicJRbYvdJwdKHbYwbZgbQLcOzbYwbQLcpZbYwaaaaaeaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaFvaaecBBaaeaFvaaaaaaaaeaaaaaaaaeaaaaaaaaaaaaaaeaaecELcEKbPlckAcxtckAdJrbQLbQLbQLbQLcizdNkdInbQLbQLcpWdKGckXbYwdRCdEkdRDdEmdRBdEhdEictjczmczocEMcoCcuFcuGcuBcuEdMIcoCdMHdMGcxJcxJcvGbTScBgcmPdNgdNfcwzdNidNhcwFcvHdRAckUdRzcjeczqbLkdEfdRxdRydKSbTWdQEcjkcoecofdHicxXcnibYvbYwbYwbYwbEJbYwdLdbYwbYwbYwbYwaaeaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaFvaaaaaeaaaaFvaaaaaaaaeaaeaaeaaeaaaaaaaaaaaeaaeaaaajGajGbYwdBhbYwbQLbZhbQLbQLdNzbYwbYwbYwbYwbYwbZhcpWcuScmzbYwdRHcNSdRGcOudRIdEocMKcNjcLNcMmcLzcMGdMPcNmcJOcJPcBQctocCMcDYcJQcxJcbvbWrcNBclRdNAcmScmScmSdBtcmTcmTcmTcOAcuRcjecpfbLkbLkbLkbLkbLkbLkbLkcjkcjkcjkdLgcjkcjkbYvcpXclpclpcpYbYwbQLdLecubdKZcubaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaakaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaFvaFvaFvaFvaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaeajGbYwbYwbYwcdYbYwcmzcJZclfbYwdKIdKJdKIbYwcdYcpWbYwbYwbYwdEqdEqdEqdEqdRFdEtdEucyscyncyqcxVdDzdMOdMNbXrdMLdMKdDAcyIcyRcAKdDGcDSbTSdBMcjcdNndNmdNmdNmdNhcmTczKczLbIGcBOcKNdJidovbYWbYgcEOdHlbXAdJqcafdKydKCdKDdKMdoBcdYdJobQLbQLbYwbYwdLfbYwbYwbYwbYwaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaeaaeaaeaaeaaeaaabYwbYwbYwbYwbYwbYwbYwbYwbYwbYwbYwbQLcpWbYwcqucpKcLscLrbWKctvdRLdAPdARctjdNadNbdMZcoCdMXdMWdMWdMWdMYcoCdNcdEKdEMcnRdENcnNcNBcpbdOfcmScmScmSdBtcmTcmTcmTcOAdAdcqGdNodNpdOddOecEPcEQdOmdOndNrbJDdOndNvdNwdoBdovcqQdBwdovdovdNudOjdOhdOidNtaaeaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecYFdpecYFaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaeaaeaaaaaaaaaaaeaaaaaabYwbQLdECcshcLPcJYcpDcpCcpzcpydRKdEFdEGctjcKjdAmcJUcoCcaudNCdNBdMQdMTcoCdMVcKOcKOcxJdMUbTScLkcjcdNEdNfdRJdNGdNhdBAcLvcLYckUbTXcrEcrFdNHdNIdNMdLhdNJdNJdMfdMydMRdMSdLpdLRdoBdppdNQdNRdNSdLodNOdNOdNOdNPdOgaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecYQcYFdsCcYFcYQaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaaeaaaaaabYwbZhdKabYwcuecqqdCIcOccsbcrDdRocrBdMkctjctjcryctjcoCcoCcoCcoCcoCcoCcoCdATcxJcxJcnpcrmcrncnqcjcckUckUckUcOAdBGckUckUckUckUcrpcjecqldrxdssdptdsgdshdspcBCcBFdsedsfcLmcOecKJdsrdtidtkdoPdsEdtJdufdoVdpcduiaaeaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecsGcszcsFcsHcsKcszcsGaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecwucwucwucyJcwucwucwuaaaaaeaaaaaaaaaaaeaaaaaabYwcizcpWbYwbSxdnEcqqdMicqIctvdmVdnddnDctvdmJcrdcqXckOclIclKclIdMjclIcwBclKcwAckOclPbYMbTSbRFdJWcjSdnJdRncvbdBEdJUdQydERcvJcqUbSTcqDdovcAecAecBlcAbcAccxlcxBcxNcyycyCczHdoBdpvdpwdpxdovdpydqGdrbdovdrxdovajGaaeaaaaaaaaeaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaecrScrTcrVcrWcrWcrWcstcrScrTaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaacwudCudCvdCudCrdCucwucwucyJcwucyJcwucwuaaeaaebYwdEecpWbYwbYwbYwbYwbYwbYwbYwdMqduXduRduUduYcAactfckOcDPdBIclIclKclIduAduNcDRckOdBFbYMbTSbRFbRvcsfcsicrzcrzdAycrxdAzdKgcvJbTXcjeckZdrYdoBdoBdoBdoBdoBdowdoBduzdvIcEHdujdoBdovcqQdBwdovdBpdBjdBkdBgcEIajGajGaaeaaeaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeczXcBoczXcrWcMocrWcCKcGdcYFaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaFvaaecwudzYdzXdAhdzZdzYdAidAAcEGdzSdzRdzUcwuaaaaaabYwbYwdrHdtrdtrdtrdtrdtsdttbPYdpjdpqdpudpzdpIdqAcsndBecoScyEcoScoScyOcyTdoCdMndoAcsBcnMcnNcyrcsecsecoocuicuidAwcwOcqEbBRcvJcpJcjebBbdoBdvPdzPdCpdCqdBddBadBddAEdAKdstdoBbYvcvpdACcjvdovdovdovdovdovcEuaBVajGaaeaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaecrScrTcyVcrWcrWcrWczrcrScrTaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaacwuczcdJLdJIdJBczcczcdJzdJsczgdJZbSGcwuaaaaaaaaacwucwucwucwucwuctvdKBctvctvdADdAFdKbctvdAvdAxcujckOcnGclKclIclKclIcsjcskcLocrGcLCdAGcfBdKtcsecrYcpAcLQcLQdAwcqTcqEcrvcvJcAJcuabCgdrxdvPdzPdwfdwfdwsdvBdvEdvHdvIdJMdoBcuScdXcvobQLdAIbYwaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecsGcYQcYTcYMcYNcYLcsGaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaFvaaecwudzYdzXdAhdzZdzYdAidAAcEGdzSdzRdzUcwuaaaaaabYwbYwdrHdtrdtrdtrdtrdtsdttbPYdpjdpqdpudpzdpIdqAcsndBecoScyEcoScoScyOcyTdoCdMndoAcsBdRpcnNcyrcsecsecoocuicuidAwcwOcqEbBRcvJbTXcjebBbdoBdvPdzPdCpdCqdBddBadBddAEdAKdstdoBbYvcvpdACcjvdovdovdovdovdovcEuaBVajGaaeaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaecrScrTcyVcrWcrWcrWczrcrScrTaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaacwuczcdJLdJIdJBczcczcdJzdJsczgdJZbSGcwuaaaaaaaaacwucwucwucwucwuctvdKBctvctvdADdAFdKbctvdAvdAxcujckOcnGclKclIclKclIcsjcskcLocrGcLCdAGcfBdKtcsecrYcpAcLQcLQdAwcqTcqEcrvcvJdRqcuabCgdrxdvPdzPdwfdwfdwsdvBdvEdvHdvIdJMdoBcuScdXcvobQLdAIbYwaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecsGcYQcYTcYMcYNcYLcsGaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaecwudEUdDSdEAdEydDFdDBdDQdDMdEIcBebBSdAfdAedzVcAhdAfdwbdwFdxxcwudCJdCNctvdvVcrXdzOdDybYwbYwbYwbYwckOclIclKclIcKnclIctDctAcKkckOcJVdAnbTSbYNcsedOpcpAcsucsvctycqzctRcupdwtbBTdCobBUdoBdvPdzPdwfdKfdBddIIdBddAjdIHdAkdoBcvmbQLcvobQLdvubYwaaeaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecszcYFcYGcYFcYJaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaacyJdMddMcdDHdMadMmdMldMhdMedCFdMrdMpdModDCdMudKWdMtdKXdDHdDDdMvdDKdDLdMwdDJdDOdMxcrXbYwdGIbIXdGFbYwbYwbYwbYwbYwbYwbYwcvWbYwbYwcnpdDrbTSbYNcsecsscpAcuicuicLQcxrcGhcLObCMbCPdGDcAxdExdExdExdExdExdExdBUdExdCzdAMdCCdoBbQLbQLcvobQLbYwbYwbYwaaeaaeaaaaaaaaeaaaaaaaakaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecYFdpecYFaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjaaacDjcDjcDjcDjcDjaaacDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaacwudKFdKEdKYdKVbCCdLidLldLkdLrdLnbCIcwudDpdDodDqcwudKqdIRcyMcwudBqdIZctvdCsdCxdCydKwbYwdFSdFTdFVbYwdAWbZxbZxcbebZxdKlcARclpcsldKpdKncwecLkcsedKNcrhcsycsycsycxmcvLcwRdwybCldDxcASdJhdBxdKsdLsdLJdLOdJbcBPbYidAUclpdILclpclpbCidLjbCjcwpbYwbYwbYwajGaaaaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjaaacDjcDjcDjcDjcDjaaacDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecwucACcAGczccAFcACcADcAycAzcAlcAwbLqcwucExaaaaaacwucwucwucwucwuctvcwCctvctvctvctvctvbYwcmmcwNclhbYwcwocuxcuxcuxcuxcuxcuxcuxcuxcnpczJczZczDczFdMbbJWcsJcplcuicxucmHcnLcvJbVfdAVdKicAIdIxdIPdIQdIMdIOdGmcBPclwcxCbYwbYwbYwbYwbYwcwNbAoclTbPlcmnbPlcEyaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaacwucBmcBnczccBncBhcBiczcczccBcczcczccwuaaeaaeaaebYwcmzcdYdIncxgcBJcBIclpcBLcBHcEzdKubYwcogbJbbGwcBDcwMcuxcAZcBbcBacuxcAXcAYcANcuxcALcAMcAHczFbPScvcdBucsAcuicmQcsedAYcsebWacvVclqcAIcAtdNVcmxcAgczkcDgcBPbQLcxCbYwcmIcmwcpkbYwdDZbApdCDbYwbYwbYwajGaaaaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaacDjcDjcDjcDjcDjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaacwucBmcBnczccBncBhcBiczcczccBcczcczccwuaaeaaeaaebYwcmzcdYdIncxgcBJcBIclpcBLcBHcEzdKubYwcogbJbbGwcBDcwMcuxcAZcBbcBacuxcAXcAYcANcuxcALcAMcAHczFbPScEFdBucsAcuicmQcsedAYcsebWacvVclqcAIcAtdNVcmxcAgczkcDgcBPbQLcxCbYwcmIcmwcpkbYwdDZbApdCDbYwbYwbYwajGaaaaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaacwucCacCbczccBRcCecBibRabRWcBNcJTcBMcwuaaaaaeaaabYwcxRcxQcxQcybcxWbNGbNGbNGbNGcxOcxCbYwbYwbYwbYwbYwcwocuxcCjcClcCycCzcCAcCBcwDcCfcCgcChcCicsecsecsecsecsecyxcsecsectGcsecvKcwPbWBcBPcBPcBPcBPcBPcBPcBPcBPbQLcrQdJncAjcAdcqHcygcygbAscyicygaaaaaaaaaaaaaaeaaeaaaaaaaaeaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaacwucCWcCXczccCXcCWcCYcCZcDacCCcCJbAycyJaaaaaaaBVbYwcAAbYwbYwbYwcAEbYwbYwbYwbYwcwmcAncAmcDbdIKcAmcAmcBfcDMcDLcvhcJScKdcGccGlcDwcDwcDkcDlcDIcAQcDGclpclpclpcBkcBjclpcslcytcyzcymcykcytcyoclpclpclpdILclpclpclpcudbYwbWNctVcswcygcyubAzcywcygaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecwucwucyJcwucyJcwucNfcMXcNbcNCcNDcNhcwuaaeaaeaBVcGkcGjbGhcrfcGbcGacDTcMccEAbYwbYwbYwbYwcMpbYwbYwbYwbYwcuxcKUcvhcKqcvhcKvcKTcLwcvhcLxcLAcLtcuxbYwbYwbYwcdYcOzbWucxqbQLcBScoVcoWcKfcBScmzcdYcxqbYwbYwbYwbYwbYwbYwbYwbYwbYwbVzcygcLubAHcoYcygaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaeaaeaaebSPcECcEBcNKcOtcOGcPtcPFcPRcwuaaaaaaaBVdKvcMQbGhcMYcMDcMhbSbbGhbGhbpYcRucPrdJJcQLdJacRkcQXdKocvfcvgcvhcKqcvhcuvcvtcvgcvhcLxcLAcuvcvlaaaaaebYwbYwcNnbYwclrbYwcBScBTcoUcBScBSbYwbYwclrbYwcBGcKycKlbYwcKccKScKMbYwbEucygcrgdAscqFcygaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaaaaeaaaaaacEEaaeaaecwucwucwucwucwucwucwuaaaaaaaBVcoKcRMbGhcOMcOZcEDcribGhcRTcPScSjdlGcRUdlydltcSScSSdlZdmbdmjdmvdmHcvhcuvdmIcvgcvhcLxcLAdnccuxaaaaaeaaabYwdKxbYwaaaaaeaaacxpcwicxpaaaaaaaaeaaabYwcuJbQLbQLdMgbGwcNRbGwcxkcwIcygcqfczscqgcygaaaaaeaaaaaeaaeaaaaaaaaebUYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaeaaeaaaaaaaaaaaeaaeaaeaaaaaaaaaaaeaaaaaaaaaaBVcTMdKAdiLdcndkOdkGdkRbGhdlobGhdlxdlvdlCdnfdnedlGdlGdnudnvdnncuzdoadoscuvdnwcvgcvhcLxcLAcuvcvlaaaaaeaaebYwcNnbYwaaeaaeaaecxMclvcxMaaeaaeaaeaaabYwcpIbQLbQLdKzcpFcjBcpwbYwclrcygczWdAtczWaaeaaaaaeaaaaaaaaeaaeaaeaaeaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaBVcoKcoJbGhcqKcoHcoFcoDcoAcozbGhbKEbwzcvkbxTcvibwAduMdKocvfcvgcvhcuVcuWcuXcuZcuycuzcuCcuTcuvcuxaaaaaeaaaaaaaaeaaaaaeaaaaaacyccydcycaaaaaaaaeaaebYwcqCcqwcqvbYwcqycqtcqvbYwaaaaaecAvczscAvaaeaaaaaeaaaaaaaaeaaeaaaaaaaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaacwucCWcCXczccCXcCWcCYcCZcDacCCcCJbAycyJaaaaaaaBVbYwcAAbYwbYwbYwcAEbYwbYwbYwbYwcwmcAncAmcDbdIKcAmcAmcBfcDMcDLcvhcJScKdcGccGlcDwcDwcDkcKfcDIcAQcDGclpclpclpcBkcBjclpcslcytcyzcymcykcytcyoclpclpclpdILclpclpclpcudbYwbWNctVcswcygcyubAzcywcygaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecwucwucyJcwucyJcwucNfcMXcNbcNCcNDcNhcwuaaeaaeaBVcGkcGjbGhcrfcGbcGacDTcMcdRmbYwbYwbYwbYwcMpbYwbYwbYwbYwcuxcKUcvhcKqcvhcKvcKTcLwcvhcLxcMQcMIcuxcuxcuxcuxcuxcOzbWucxqcdYcBScLtcoWcLAcBScmzcdYcxqbYwbYwbYwbYwbYwbYwbYwbYwbYwbVzcygcLubAHcoYcygaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaeaaeaaebSPcECcEBcNKcOtcOGcPtcPFcPRcwuaaaaaaaBVdKvdEjbGhcMYcMDcMhbSbbGhbGhbpYcRucPrdJJcQLdJacRkcQXdKocvfcvgcvhcKqcvhcuvcvtcvgcvhdoldEdcRMdnccNWcOydEgcuxcNnbYwclrbYwcBScBTcoUcBScBSbYwbYwclrbYwcBGcKycKlbYwcKccKScKMbYwbEucygcrgdAscqFcygaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaaaaaeaaaaaacEEaaeaaecwucwucwucwucwucwucwuaaaaaaaBVcoKdElbGhcOMcOZcEDcribGhcRTcPScSjdlGcRUdlydltcSScSSdlZdmbdmjdmvdmHcvhcuvdmIcvgcvhcLxcMQcuvdEzdEEcvhdErcuxdKxbYwaaaaaeaaacxpcwicxpaaaaaaaaeaaabYwcuJbQLbQLdMgbGwcNRbGwcxkcwIcygcqfczscqgcygaaaaaeaaaaaeaaeaaaaaaaaebUYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaeaaeaaaaaaaaaaaeaaeaaeaaaaaaaaaaaeaaaaaaaaaaBVcTMdKAdiLdcndkOdkGdkRbGhdlobGhdlxdlvdlCdnfdnedlGdlGdnudnvdnncuzdoadoscuvdnwcvgcvhcLxdELdKUdNFdEOdGYdNXcuxcNnbYwaaeaaeaaecxMclvcxMaaeaaeaaeaaabYwcpIbQLbQLdKzcpFcjBcpwbYwclrcygczWdAtczWaaeaaaaaeaaaaaaaaeaaeaaeaaeaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaBVcoKcoJbGhcqKcoHcoFcoDcoAcozbGhbKEbwzcvkbxTcvibwAduMdKocvfcvgcvhcuVcuWcuXcuZcuycuzcuCcuTczEcuxcBdcDlcuxcuxaaeaaaaaeaaaaaacyccydcycaaaaaaaaeaaebYwcqCcqwcqvbYwcqycqtcqvbYwaaaaaecAvczscAvaaeaaaaaeaaaaaaaaeaaeaaaaaaaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaacaaaaaaaaeaacaahaacaaeaacaacaacaaeaBVbpYbGhbGhbGhbGhbGhcoQcoRbGhbGhbGhcvwbxUcvybxTcvubxVcvvbpYbpYcvgcvhcvhcvhcuvcvtcvgcvhcvncvrcuvcvlaaeaaeaaaaaaaaeaaaaaeaaacwXcwZciKcwZcwXaaaaaeaaabYwbYwbYwbYwbYwbYwbYwbYwbYwaaaaaeaaacAWaaaaaeaaeaaeaaeaaeaaeaaaaaaaaeaFvaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaacEqcoTbKBbpYcvPcoXcvNcpicpgcpdbpYcvMcvIcvFcvCbxTcvibwAduMcwkbpYcwlcvhcwwcvScwxbAjcvQcvSdNscvhcwjcuxaaaaaeaaeaaeaaeaaeaaeaaecwZcjNclxcyFcwZaaeaaeaaaaaaaaeaaaaaaaaaaaaaaaaaeaaaaaaaaeaaacAWaaaaaeaaeaaaaaaaaaaaeaaaaaaaaabUYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaahaaaaaacErcqYbKBcqrcqscqscqscqxcqPcqBcqbcqhcwJcqhcpUcqscwKcpUcwLciIdKocxecwWcwVcwWcwWcwWcwWcwWcwVcwWcxbcvlaaaaaeaaaaaaaaeaaaaaaaaacwZcyPcodcwacyScEsaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaacBXcBYcBYcBYcBZaaaaaaaaaaaaaaaaaaaFvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm index 5c9363a3209..0930ef014d0 100644 --- a/_maps/map_files/MiniStation/MiniStation.dmm +++ b/_maps/map_files/MiniStation/MiniStation.dmm @@ -1559,975 +1559,1024 @@ "aDY" = (/obj/structure/lattice,/obj/structure/transit_tube{tag = "icon-N-S-Pass"; icon_state = "N-S-Pass"},/turf/space,/area) "aDZ" = (/turf/simulated/wall,/area/tcommsat/computer) "aEa" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/tcommsat/computer) -"aEb" = (/obj/structure/transit_tube{icon_state = "N-SE"},/obj/structure/lattice,/turf/space,/area) -"aEc" = (/obj/structure/transit_tube{icon_state = "D-SW"},/obj/structure/lattice,/turf/space,/area) -"aEd" = (/obj/machinery/door/airlock/external{name = "Telecomms Emergency Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aEe" = (/turf/simulated/floor/plating,/area/tcommsat/computer) -"aEf" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/tcommsat/computer) -"aEg" = (/obj/structure/transit_tube{icon_state = "D-NE"},/turf/space,/area) -"aEh" = (/obj/structure/transit_tube{icon_state = "E-NW"},/turf/space,/area) -"aEi" = (/obj/structure/lattice,/obj/structure/transit_tube{tag = "icon-E-W-Pass"; icon_state = "E-W-Pass"},/turf/space,/area) -"aEj" = (/obj/structure/transit_tube,/obj/structure/lattice,/turf/space,/area) -"aEk" = (/obj/structure/transit_tube{icon_state = "W-SE"},/obj/structure/lattice,/turf/space,/area) -"aEl" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aEm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aEn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aEo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aEp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aEq" = (/obj/structure/transit_tube{icon_state = "NW-SE"},/obj/structure/lattice,/turf/space,/area) -"aEr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aEs" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/tcommsat/computer) -"aEt" = (/turf/simulated/floor,/area/tcommsat/computer) -"aEu" = (/obj/structure/table,/turf/simulated/floor,/area/tcommsat/computer) -"aEv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aEw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/tcommsat/computer) -"aEx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aEy" = (/obj/machinery/computer/telecomms/traffic{network = "tcommsat"},/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/tcommsat/computer) -"aEz" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/tcommsat/computer) -"aEA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor,/area/tcommsat/computer) -"aEB" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/paper/monitorkey,/turf/simulated/floor,/area/tcommsat/computer) -"aEC" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aED" = (/obj/machinery/telecomms/processor/preset_one/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aEE" = (/obj/machinery/telecomms/bus/preset_one/ministation,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aEF" = (/obj/machinery/telecomms/server/presets/common/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aEG" = (/obj/machinery/message_server,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aEH" = (/obj/machinery/computer/telecomms/server{network = "tcommsat"},/turf/simulated/floor{icon_state = "yellow"; dir = 10},/area/tcommsat/computer) -"aEI" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor,/area/tcommsat/computer) -"aEJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/tcommsat/computer) -"aEK" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/item/weapon/pen/blue,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) -"aEL" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aEM" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer) -"aEN" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aEO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aEP" = (/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aEQ" = (/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aER" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aES" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/tcommsat/computer) -"aET" = (/obj/machinery/door/airlock/glass_command{name = "Control Room"; req_access_txt = "19; 61"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/tcommsat/computer) -"aEU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aEV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer) -"aEW" = (/obj/machinery/atmospherics/pipe/tank/air{icon_state = "intact"; dir = 8},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aEX" = (/obj/structure/transit_tube/station/reverse{tag = "icon-closed (EAST)"; icon_state = "closed"; dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer) -"aEY" = (/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aEZ" = (/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Telecoms Server APC"; pixel_x = -25; pixel_y = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aFa" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aFb" = (/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aFc" = (/obj/machinery/door/airlock/glass_engineering{name = "Server Room"; req_access_txt = "61"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/tcommsat/computer) -"aFd" = (/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/tcommsat/computer) -"aFe" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/tcommsat/computer) -"aFf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/tcommsat/computer) -"aFg" = (/obj/structure/closet/emcloset,/obj/machinery/camera/autoname{network = list("SS13")},/turf/simulated/floor,/area/tcommsat/computer) -"aFh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aFi" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aFj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer) -"aFk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/tcommsat/computer) -"aFl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aFm" = (/obj/machinery/atmospherics/pipe/vent{dir = 8},/turf/simulated/floor/plating/airless,/area) -"aFn" = (/obj/structure/transit_tube{tag = "icon-Block (NORTH)"; icon_state = "Block"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer) -"aFo" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aFp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aFq" = (/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aFr" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 0},/turf/simulated/wall,/area/tcommsat/computer) -"aFs" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor,/area/tcommsat/computer) -"aFt" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor,/area/tcommsat/computer) -"aFu" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Telecoms Admin"; departmentType = 5; name = "Telecoms RC"; pixel_x = 30; pixel_y = 0},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/machinery/recharge_station,/turf/simulated/floor,/area/tcommsat/computer) -"aFv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aFw" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8},/turf/simulated/floor/plating,/area/tcommsat/computer) -"aFx" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/obj/machinery/light/small,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer) -"aFy" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/tcommsat/computer) -"aFz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aFA" = (/obj/machinery/telecomms/receiver/preset_left/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aFB" = (/obj/machinery/telecomms/hub/preset,/obj/structure/sign/nosmoking_2{pixel_y = -32},/obj/machinery/light/small,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aFC" = (/obj/machinery/telecomms/broadcaster/preset_left/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aFD" = (/obj/machinery/blackbox_recorder,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) -"aFE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/wall,/area/tcommsat/computer) -"aFF" = (/obj/structure/table,/obj/item/device/multitool,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/tcommsat/computer) -"aFG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) -"aFH" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor,/area/tcommsat/computer) -"aFI" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) -"aFJ" = (/turf/space,/area/syndicate_station/southwest) -"aFK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aFL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"aFM" = (/obj/structure/table,/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/tcommsat/computer) -"aFN" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/tcommsat/computer) -"aFO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor,/area/tcommsat/computer) -"aFP" = (/obj/machinery/door/airlock/engineering{name = "Telecommunications"; req_access_txt = "61"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) -"aFQ" = (/turf/space,/area/syndicate_station/southeast) -"aFR" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/floor{icon_state = "yellow"; dir = 10},/area/tcommsat/computer) -"aFS" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/obj/effect/landmark/start{name = "AI"},/turf/simulated/floor,/area/tcommsat/computer) -"aFT" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor,/area/tcommsat/computer) -"aFU" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/computer) -"aFV" = (/turf/space,/area/syndicate_station/south) -"aFW" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns15,/area) -"aFX" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns9,/area) -"aFY" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns5,/area) -"aFZ" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns12,/area) -"aGa" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns8,/area) -"aGb" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns3,/area) -"aGc" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns6,/area) -"aGd" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns7,/area) -"aGe" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns4,/area) -"aGf" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns14,/area) -"aGg" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns1,/area) -"aGh" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns11,/area) -"aGi" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns13,/area) -"aGj" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns2,/area) -"aGk" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns10,/area) -"aGl" = (/turf/space/transit/east/shuttlespace_ew13,/area) -"aGm" = (/turf/space/transit/east/shuttlespace_ew14,/area) -"aGn" = (/turf/space/transit/east/shuttlespace_ew15,/area) -"aGo" = (/turf/space/transit/east/shuttlespace_ew1,/area) -"aGp" = (/turf/space/transit/east/shuttlespace_ew2,/area) -"aGq" = (/turf/space/transit/east/shuttlespace_ew3,/area) -"aGr" = (/turf/space/transit/east/shuttlespace_ew4,/area) -"aGs" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew5,/area) -"aGt" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew6,/area) -"aGu" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew7,/area) -"aGv" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew8,/area) -"aGw" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew9,/area) -"aGx" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew10,/area) -"aGy" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew11,/area) -"aGz" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew12,/area) -"aGA" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew13,/area) -"aGB" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew14,/area) -"aGC" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew15,/area) -"aGD" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew1,/area) -"aGE" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew2,/area) -"aGF" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew3,/area) -"aGG" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew4,/area) -"aGH" = (/turf/space{icon_state = "black"},/area) -"aGI" = (/turf/space/transit/north/shuttlespace_ns8,/area) -"aGJ" = (/turf/space/transit/north/shuttlespace_ns4,/area) -"aGK" = (/turf/space/transit/north/shuttlespace_ns11,/area) -"aGL" = (/turf/space/transit/north/shuttlespace_ns7,/area) -"aGM" = (/turf/space/transit/north/shuttlespace_ns2,/area) -"aGN" = (/turf/space/transit/north/shuttlespace_ns5,/area) -"aGO" = (/turf/space/transit/north/shuttlespace_ns6,/area) -"aGP" = (/turf/space/transit/north/shuttlespace_ns14,/area) -"aGQ" = (/turf/space/transit/north/shuttlespace_ns3,/area) -"aGR" = (/turf/space/transit/north/shuttlespace_ns13,/area) -"aGS" = (/turf/space/transit/north/shuttlespace_ns15,/area) -"aGT" = (/turf/space/transit/north/shuttlespace_ns10,/area) -"aGU" = (/turf/space/transit/north/shuttlespace_ns12,/area) -"aGV" = (/turf/space/transit/north/shuttlespace_ns1,/area) -"aGW" = (/turf/space/transit/north/shuttlespace_ns9,/area) -"aGX" = (/turf/space/transit/east/shuttlespace_ew5,/area) -"aGY" = (/turf/space/transit/east/shuttlespace_ew6,/area) -"aGZ" = (/turf/space/transit/east/shuttlespace_ew7,/area) -"aHa" = (/turf/space/transit/east/shuttlespace_ew8,/area) -"aHb" = (/turf/space/transit/east/shuttlespace_ew10,/area) -"aHc" = (/turf/space/transit/east/shuttlespace_ew11,/area) -"aHd" = (/turf/space/transit/east/shuttlespace_ew12,/area) -"aHe" = (/turf/space/transit/east/shuttlespace_ew9,/area) -"aHf" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew13,/area) -"aHg" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew7,/area) -"aHh" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew8,/area) -"aHi" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew9,/area) -"aHj" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew10,/area) -"aHk" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew3,/area) -"aHl" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns13,/area) -"aHm" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns11,/area) -"aHn" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area) -"aHo" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area) -"aHp" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area) -"aHq" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area) -"aHr" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns9,/area) -"aHs" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns2,/area) -"aHt" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns13,/area) -"aHu" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area) -"aHv" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area) -"aHw" = (/turf/space/transit/east/shuttlespace_ew2,/area/shuttle/escape_pod4/transit) -"aHx" = (/turf/space/transit/east/shuttlespace_ew3,/area/shuttle/escape_pod4/transit) -"aHy" = (/turf/space/transit/east/shuttlespace_ew4,/area/shuttle/escape_pod4/transit) -"aHz" = (/turf/space/transit/east/shuttlespace_ew5,/area/shuttle/escape_pod4/transit) -"aHA" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew13,/area) -"aHB" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns9,/area) -"aHC" = (/turf/space/transit/north/shuttlespace_ns11,/area/shuttle/escape/transit) -"aHD" = (/turf/space/transit/north/shuttlespace_ns3,/area/shuttle/escape/transit) -"aHE" = (/turf/space/transit/north/shuttlespace_ns13,/area/shuttle/escape/transit) -"aHF" = (/turf/space/transit/north/shuttlespace_ns7,/area/shuttle/escape/transit) -"aHG" = (/turf/space/transit/north/shuttlespace_ns14,/area/shuttle/escape/transit) -"aHH" = (/turf/space/transit/north/shuttlespace_ns4,/area/shuttle/escape/transit) -"aHI" = (/turf/space/transit/north/shuttlespace_ns10,/area/shuttle/escape/transit) -"aHJ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns1,/area) -"aHK" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew2,/area) -"aHL" = (/turf/space/transit/east/shuttlespace_ew14,/area/shuttle/escape_pod4/transit) -"aHM" = (/turf/space/transit/east/shuttlespace_ew15,/area/shuttle/escape_pod4/transit) -"aHN" = (/turf/space/transit/east/shuttlespace_ew1,/area/shuttle/escape_pod4/transit) -"aHO" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; stopper = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew7,/area) -"aHP" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area) -"aHQ" = (/turf/space/transit/north/shuttlespace_ns2,/area/shuttle/escape/transit) -"aHR" = (/turf/space/transit/north/shuttlespace_ns12,/area/shuttle/escape/transit) -"aHS" = (/turf/space/transit/north/shuttlespace_ns6,/area/shuttle/escape/transit) -"aHT" = (/turf/space/transit/north/shuttlespace_ns9,/area/shuttle/escape/transit) -"aHU" = (/turf/space/transit/north/shuttlespace_ns15,/area/shuttle/escape/transit) -"aHV" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area) -"aHW" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; stopper = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew12,/area) -"aHX" = (/turf/space/transit/north/shuttlespace_ns1,/area/shuttle/escape/transit) -"aHY" = (/turf/space/transit/north/shuttlespace_ns5,/area/shuttle/escape/transit) -"aHZ" = (/turf/space/transit/north/shuttlespace_ns8,/area/shuttle/escape/transit) -"aIa" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area) -"aIb" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew15,/area) -"aIc" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew4,/area) -"aId" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew5,/area) -"aIe" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew6,/area) -"aIf" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns2,/area) -"aIg" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns1,/area) -"aIh" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area) -"aIi" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew14,/area) -"aIj" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew1,/area) -"aIk" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns14,/area) -"aIl" = (/turf/space/transit/east/shuttlespace_ew7,/area/shuttle/escape_pod3/transit) -"aIm" = (/turf/space/transit/east/shuttlespace_ew8,/area/shuttle/escape_pod3/transit) -"aIn" = (/turf/space/transit/east/shuttlespace_ew9,/area/shuttle/escape_pod3/transit) -"aIo" = (/turf/space/transit/east/shuttlespace_ew10,/area/shuttle/escape_pod3/transit) -"aIp" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew14,/area) -"aIq" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns13,/area) -"aIr" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew11,/area) -"aIs" = (/turf/space/transit/east/shuttlespace_ew2,/area/shuttle/escape_pod3/transit) -"aIt" = (/turf/space/transit/east/shuttlespace_ew3,/area/shuttle/escape_pod3/transit) -"aIu" = (/turf/space/transit/east/shuttlespace_ew4,/area/shuttle/escape_pod3/transit) -"aIv" = (/turf/space/transit/east/shuttlespace_ew5,/area/shuttle/escape_pod3/transit) -"aIw" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; stopper = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew1,/area) -"aIx" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area) -"aIy" = (/turf/space/transit/east/shuttlespace_ew14,/area/shuttle/escape_pod3/transit) -"aIz" = (/turf/space/transit/east/shuttlespace_ew15,/area/shuttle/escape_pod3/transit) -"aIA" = (/turf/space/transit/east/shuttlespace_ew1,/area/shuttle/escape_pod3/transit) -"aIB" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; stopper = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew10,/area) -"aIC" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns11,/area) -"aID" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew12,/area) -"aIE" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area) -"aIF" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns9,/area) -"aIG" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area) -"aIH" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns7,/area) -"aII" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area) -"aIJ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns7,/area) -"aIK" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area) -"aIL" = (/turf/space/transit/north/shuttlespace_ns5,/area/syndicate_station/transit) -"aIM" = (/turf/space/transit/north/shuttlespace_ns11,/area/syndicate_station/transit) -"aIN" = (/turf/space/transit/north/shuttlespace_ns3,/area/syndicate_station/transit) -"aIO" = (/turf/space/transit/north/shuttlespace_ns13,/area/syndicate_station/transit) -"aIP" = (/turf/space/transit/north/shuttlespace_ns7,/area/syndicate_station/transit) -"aIQ" = (/turf/space/transit/north/shuttlespace_ns14,/area/syndicate_station/transit) -"aIR" = (/turf/space/transit/north/shuttlespace_ns4,/area/syndicate_station/transit) -"aIS" = (/turf/space/transit/north/shuttlespace_ns10,/area/syndicate_station/transit) -"aIT" = (/turf/space/transit/north/shuttlespace_ns1,/area/syndicate_station/transit) -"aIU" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area) -"aIV" = (/turf/space/transit/north/shuttlespace_ns2,/area/syndicate_station/transit) -"aIW" = (/turf/space/transit/north/shuttlespace_ns12,/area/syndicate_station/transit) -"aIX" = (/turf/space/transit/north/shuttlespace_ns6,/area/syndicate_station/transit) -"aIY" = (/turf/space/transit/north/shuttlespace_ns9,/area/syndicate_station/transit) -"aIZ" = (/turf/space/transit/north/shuttlespace_ns15,/area/syndicate_station/transit) -"aJa" = (/turf/space/transit/north/shuttlespace_ns8,/area/syndicate_station/transit) -"aJb" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area) -"aJc" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns2,/area) -"aJd" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns1,/area) -"aJe" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area) -"aJf" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns7,/area) -"aJg" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area) -"aJh" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns14,/area) -"aJi" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns14,/area) -"aJj" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area) -"aJk" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area) -"aJl" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area) -"aJm" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns11,/area) -"aJn" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns2,/area) -"aJo" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area) -"aJp" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area) -"aJq" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns14,/area) -"aJr" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area) -"aJs" = (/turf/space/transit/north/shuttlespace_ns12,/area/shuttle/escape_pod1/transit) -"aJt" = (/turf/space/transit/north/shuttlespace_ns7,/area/shuttle/escape_pod1/transit) -"aJu" = (/turf/space/transit/north/shuttlespace_ns9,/area/shuttle/escape_pod1/transit) -"aJv" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area) -"aJw" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area) -"aJx" = (/turf/space/transit/north/shuttlespace_ns3,/area/shuttle/escape_pod2/transit) -"aJy" = (/turf/space/transit/north/shuttlespace_ns14,/area/shuttle/escape_pod2/transit) -"aJz" = (/turf/space/transit/north/shuttlespace_ns11,/area/shuttle/escape_pod2/transit) -"aJA" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns7,/area) -"aJB" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area) -"aJC" = (/turf/space/transit/north/shuttlespace_ns11,/area/shuttle/escape_pod1/transit) -"aJD" = (/turf/space/transit/north/shuttlespace_ns6,/area/shuttle/escape_pod1/transit) -"aJE" = (/turf/space/transit/north/shuttlespace_ns8,/area/shuttle/escape_pod1/transit) -"aJF" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area) -"aJG" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns9,/area) -"aJH" = (/turf/space/transit/north/shuttlespace_ns2,/area/shuttle/escape_pod2/transit) -"aJI" = (/turf/space/transit/north/shuttlespace_ns13,/area/shuttle/escape_pod2/transit) -"aJJ" = (/turf/space/transit/north/shuttlespace_ns10,/area/shuttle/escape_pod2/transit) -"aJK" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area) -"aJL" = (/turf/space/transit/north/shuttlespace_ns10,/area/shuttle/escape_pod1/transit) -"aJM" = (/turf/space/transit/north/shuttlespace_ns5,/area/shuttle/escape_pod1/transit) -"aJN" = (/turf/space/transit/north/shuttlespace_ns1,/area/shuttle/escape_pod2/transit) -"aJO" = (/turf/space/transit/north/shuttlespace_ns12,/area/shuttle/escape_pod2/transit) -"aJP" = (/turf/space/transit/north/shuttlespace_ns9,/area/shuttle/escape_pod2/transit) -"aJQ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area) -"aJR" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area) -"aJS" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area) -"aJT" = (/turf/space/transit/north/shuttlespace_ns4,/area/shuttle/escape_pod1/transit) -"aJU" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns1,/area) -"aJV" = (/turf/space/transit/north/shuttlespace_ns15,/area/shuttle/escape_pod2/transit) -"aJW" = (/turf/space/transit/north/shuttlespace_ns8,/area/shuttle/escape_pod2/transit) -"aJX" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area) -"aJY" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns11,/area) -"aJZ" = (/turf/unsimulated/wall,/area/start) -"aKa" = (/obj/effect/landmark/start,/turf/unsimulated/floor,/area/start) -"aKb" = (/turf/unsimulated/wall/splashscreen,/area/start) -"aKc" = (/turf/space,/area/shuttle/escape_pod1/centcom) -"aKd" = (/turf/space,/area/shuttle/escape_pod2/centcom) -"aKe" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/centcom/evac) -"aKf" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/space,/area/centcom/evac) -"aKg" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/space,/area/centcom/evac) -"aKh" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/space,/area/centcom/evac) -"aKi" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/centcom/evac) -"aKj" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/centcom/evac) -"aKk" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/turf/simulated/floor/plating/airless,/area/centcom/evac) -"aKl" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/centcom/evac) -"aKm" = (/turf/simulated/shuttle/wall{icon_state = "swall8"; dir = 2},/area/centcom/evac) -"aKn" = (/obj/machinery/door/airlock/external{name = "Salvage Shuttle Dock"},/turf/simulated/shuttle/plating,/area/centcom/evac) -"aKo" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/centcom/evac) -"aKp" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/centcom/evac) -"aKq" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/centcom/evac) -"aKr" = (/turf/simulated/shuttle/plating,/area/centcom/evac) -"aKs" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/centcom/evac) -"aKt" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/centcom/evac) -"aKu" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aKv" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/centcom/evac) -"aKw" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aKx" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor,/area/centcom/evac) -"aKy" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 0},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor,/area/centcom/evac) -"aKz" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/centcom/evac) -"aKA" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2},/area/centcom/evac) -"aKB" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/centcom/evac) -"aKC" = (/turf/simulated/shuttle/floor,/area/centcom/evac) -"aKD" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/centcom/evac) -"aKE" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "101"},/turf/simulated/shuttle/plating,/area/centcom/evac) -"aKF" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/centcom/evac) -"aKG" = (/turf/simulated/shuttle/wall{icon_state = "swallc1"; dir = 2},/area/centcom/evac) -"aKH" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) -"aKI" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) -"aKJ" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) -"aKK" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) -"aKL" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aKM" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aKN" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/centcom/evac) -"aKO" = (/turf/simulated/shuttle/wall{icon_state = "swallc2"; dir = 2},/area/centcom/evac) -"aKP" = (/obj/machinery/computer/secure_data,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) -"aKQ" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) -"aKR" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) -"aKS" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/stamp,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) -"aKT" = (/obj/structure/table,/obj/item/device/flash,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) -"aKU" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) -"aKV" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/centcom/evac) -"aKW" = (/turf/space,/area/shuttle/escape_pod3/centcom) -"aKX" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) -"aKY" = (/obj/machinery/door/window/northright{base_state = "right"; dir = 4; icon_state = "right"; name = "Security Desk"; req_access_txt = "103"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) -"aKZ" = (/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/centcom/evac) -"aLa" = (/obj/structure/stool/bed,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLb" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/centcom/evac) -"aLc" = (/obj/machinery/door/airlock/hatch{name = "Rest Room"; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/centcom/evac) -"aLd" = (/turf/simulated/shuttle/wall{icon_state = "swall2"; dir = 2},/area/centcom/evac) -"aLe" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLf" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLg" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLh" = (/turf/unsimulated/wall,/area) -"aLi" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/centcom/evac) -"aLj" = (/turf/simulated/shuttle/wall{icon_state = "swallc4"; dir = 2},/area/centcom/evac) -"aLk" = (/obj/machinery/door/airlock/hatch{name = "Cockpit"; req_access_txt = "109"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/centcom/evac) -"aLl" = (/turf/space,/area/centcom/suppy) -"aLm" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLn" = (/obj/structure/stool/bed/chair{dir = 4; name = "Prosecution"},/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLo" = (/obj/structure/filingcabinet,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLp" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/space,/area/supply/dock) -"aLq" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLr" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/supply/dock) -"aLs" = (/turf/simulated/shuttle/wall{icon_state = "swall15"; dir = 2},/area/supply/dock) -"aLt" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/supply/dock) -"aLu" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/supply/dock) -"aLv" = (/obj/structure/table,/obj/item/weapon/storage/lockbox,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLw" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLx" = (/obj/machinery/computer/shuttle,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLy" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLz" = (/obj/structure/table,/obj/item/weapon/paper_bin,/turf/simulated/shuttle/floor,/area/centcom/evac) -"aLA" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/supply/dock) -"aLB" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/supply/dock) -"aLC" = (/turf/simulated/shuttle/floor,/area/supply/dock) -"aLD" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/supply/dock) -"aLE" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/supply/dock) -"aLF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/centcom/evac) -"aLG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/centcom/evac) -"aLH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/centcom/evac) -"aLI" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/supply/dock) -"aLJ" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/plating,/area/supply/dock) -"aLK" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/centcom/suppy) -"aLL" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/supply/dock) -"aLM" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/supply/dock) -"aLN" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/supply/dock) -"aLO" = (/turf/unsimulated/wall,/area/centcom/control) -"aLP" = (/turf/unsimulated/wall/fakedoor,/area/centcom/control) -"aLQ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/control) -"aLR" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"aLS" = (/turf/unsimulated/floor{icon_state = "green"; dir = 5},/area/centcom/control) -"aLT" = (/turf/unsimulated/wall,/area/centcom/prison) -"aLU" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/control) -"aLV" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/control) -"aLW" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/control) -"aLX" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 5},/area/centcom/control) -"aLY" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{name = "plating"},/area/centcom/prison) -"aLZ" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) -"aMa" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control) -"aMb" = (/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) -"aMc" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control) -"aMd" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape/centcom) -"aMe" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"aMf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"aMg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"aMh" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape/centcom) -"aMi" = (/obj/machinery/door/poddoor{id = "CentComPort"; name = "security door"},/turf/unsimulated/floor{dir = 1; icon_state = "loadingarea"},/area/centcom/control) -"aMj" = (/obj/machinery/door/airlock/centcom{name = "Centcom Security"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"aMk" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/obj{anchored = 1; icon_state = "floor3"; layer = 1; name = "floor"},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape/centcom) -"aMl" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/extinguisher,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aMm" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"aMn" = (/obj/machinery/computer/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"aMo" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aMp" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/obj{anchored = 1; icon_state = "floor3"; layer = 1; name = "floor"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape/centcom) -"aMq" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"aMr" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/centcom/control) -"aMs" = (/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "CentComPort"; name = "Security Doors"; pixel_y = 28; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"aMt" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape/centcom) -"aMu" = (/obj/machinery/computer/atmos_alert,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aMv" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"aMw" = (/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"aMx" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"aMy" = (/obj/machinery/computer/security,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aMz" = (/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/control) -"aMA" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Centcom Customs"; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"aMB" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"aMC" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aMD" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"aME" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aMF" = (/turf/unsimulated/wall,/area/centcom/ferry) -"aMG" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"aMH" = (/obj/structure/table,/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/weapon/stamp/denied{pixel_x = 4; pixel_y = -2},/obj/item/weapon/paper/centcom,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"aMI" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/shuttle/escape/centcom) -"aMJ" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape/centcom) -"aMK" = (/obj/machinery/status_display,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape/centcom) -"aML" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access_txt = "19"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"aMM" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/escape/centcom) -"aMN" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_y = 4},/obj/item/weapon/pen,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) -"aMO" = (/obj/structure/mirror{pixel_y = 32},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) -"aMP" = (/obj/structure/dresser,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) -"aMQ" = (/obj/machinery/door/poddoor/preopen{id = "CentComPort"; name = "security door"},/turf/unsimulated/floor{dir = 1; icon_state = "loadingarea"},/area/centcom/control) -"aMR" = (/turf/unsimulated/wall,/area/centcom/evac) -"aMS" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/obj/item/weapon/extinguisher,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aMT" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aMU" = (/obj/structure/stool,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) -"aMV" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) -"aMW" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area) -"aMX" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/control) -"aMY" = (/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/control) -"aMZ" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) -"aNa" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) -"aNb" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aNc" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aNd" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) -"aNe" = (/obj/machinery/door/airlock/centcom{name = "Dressing Room"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) -"aNf" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/control) -"aNg" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/control) -"aNh" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/centcom/control) -"aNi" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/centcom/control) -"aNj" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/evac) -"aNk" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/centcom/evac) -"aNl" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/centcom/evac) -"aNm" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aNn" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) -"aNo" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/ferry) -"aNp" = (/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry) -"aNq" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) -"aNr" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/ferry) -"aNs" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/control) -"aNt" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/control) -"aNu" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac) -"aNv" = (/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/evac) -"aNw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"aNx" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"aNy" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) -"aNz" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) -"aNA" = (/turf/unsimulated/wall,/area/syndicate_mothership) -"aNB" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport1/centcom) -"aNC" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/transport1/centcom) -"aND" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/transport1/centcom) -"aNE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/transport1/centcom) -"aNF" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/transport1/centcom) -"aNG" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area/shuttle/transport1/centcom) -"aNH" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/ferry) -"aNI" = (/turf/unsimulated/wall/fakeglass,/area/centcom/control) -"aNJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"aNK" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) -"aNL" = (/obj/structure/flora/grass/brown,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) -"aNM" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) -"aNN" = (/obj/structure/flora/grass/both,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) -"aNO" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/transport1/centcom) -"aNP" = (/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"aNQ" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport1/centcom) -"aNR" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/transport1/centcom) -"aNS" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"aNT" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/transport1/centcom) -"aNU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/ferry) -"aNV" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 6},/area/centcom/ferry) -"aNW" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/evac) -"aNX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) -"aNY" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; req_access_txt = "0"},/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape/centcom) -"aNZ" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/device/radio/intercom{pixel_x = 25},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aOa" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"aOb" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"aOc" = (/obj/machinery/door/airlock/external{name = "Ferry Airlock"; req_access_txt = "0"},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) -"aOd" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/ferry) -"aOe" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/centcom/ferry) -"aOf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) -"aOg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"aOh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"aOi" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall,/area/centcom/evac) -"aOj" = (/obj/structure/flora/bush,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) -"aOk" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport1/centcom) -"aOl" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/transport1/centcom) -"aOm" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport1/centcom) -"aOn" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"aOo" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 5},/area/centcom/ferry) -"aOp" = (/obj/machinery/door/airlock/centcom{name = "Transport Shuttle"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) -"aOq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) -"aOr" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/transport1/centcom) -"aOs" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/transport1/centcom) -"aOt" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/ferry) -"aOu" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/evac) -"aOv" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aOw" = (/turf/unsimulated/wall/fakeglass,/area/centcom/ferry) -"aOx" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership) -"aOy" = (/turf/unsimulated/wall,/area/centcom/holding) -"aOz" = (/turf/unsimulated/wall/fakedoor{name = "Shuttle Bay B"},/area/centcom/holding) -"aOA" = (/obj/machinery/door/airlock/centcom{name = "Centcom Security"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) -"aOB" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/centcom/evac) -"aOC" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aOD" = (/obj/machinery/status_display,/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/escape/centcom) -"aOE" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aOF" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_station/start) -"aOG" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_station/start) -"aOH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor/shutters{id = "syndieshutters"; name = "blast shutters"},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"aOI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/poddoor/shutters{id = "syndieshutters"; name = "blast shutters"},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"aOJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/poddoor/shutters{id = "syndieshutters"; name = "blast shutters"},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"aOK" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/syndicate_station/start) -"aOL" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) -"aOM" = (/obj/machinery/sleeper{dir = 8; icon_state = "sleeper-open"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aON" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"aOO" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"aOP" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aOQ" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aOR" = (/obj/structure/table,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aOS" = (/obj/machinery/computer/syndicate_station{req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aOT" = (/obj/structure/table,/obj/machinery/door_control{id = "syndieshutters"; name = "remote shutter control"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aOU" = (/obj/structure/computerframe,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aOV" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) -"aOW" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/syndicate_mothership) -"aOX" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/syndicate_mothership) -"aOY" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/grass/both,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership) -"aOZ" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/tree/pine,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership) -"aPa" = (/turf/unsimulated/wall,/area/tdome/tdomeobserve) -"aPb" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/tdome/tdomeobserve) -"aPc" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/tdome/tdomeobserve) -"aPd" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdomeobserve) -"aPe" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/tdome/tdomeobserve) -"aPf" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 5},/area/tdome/tdomeobserve) -"aPg" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 28; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aPh" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) -"aPi" = (/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) -"aPj" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) -"aPk" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aPl" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aPm" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership) -"aPn" = (/obj/item/weapon/storage/fancy/crayons,/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"aPo" = (/obj/machinery/washing_machine,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"aPp" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) -"aPq" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) -"aPr" = (/turf/unsimulated/wall/fakeglass,/area/tdome/tdomeobserve) -"aPs" = (/turf/unsimulated/floor{icon_state = "neutral"; dir = 8},/area/tdome/tdomeobserve) -"aPt" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdomeobserve) -"aPu" = (/turf/unsimulated/floor{icon_state = "neutral"; dir = 4},/area/tdome/tdomeobserve) -"aPv" = (/obj/machinery/door/window/northleft{name = "Centcom Security"; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) -"aPw" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) -"aPx" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) -"aPy" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) -"aPz" = (/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aPA" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/shuttle/escape/centcom) -"aPB" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 10},/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aPC" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_y = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aPD" = (/obj/structure/closet/syndicate/personal,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aPE" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"aPF" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) -"aPG" = (/obj/structure/stool/bed/chair/comfy/teal,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) -"aPH" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/wiki/engineering_hacking,/obj/item/weapon/book/manual/robotics_cyborgs,/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/item/weapon/book/manual/detective,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) -"aPI" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) -"aPJ" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) -"aPK" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) -"aPL" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) -"aPM" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) -"aPN" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape/centcom) -"aPO" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/escape/centcom) -"aPP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/escape/centcom) -"aPQ" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape/centcom) -"aPR" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_station/start) -"aPS" = (/obj/machinery/door/window{name = "Cockpit"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aPT" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_station/start) -"aPU" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/grass/brown,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership) -"aPV" = (/obj/item/weapon/paper{info = "GET DAT FUCKEN DISK"; name = "memo"},/obj/structure/noticeboard{pixel_x = -32; pixel_y = 0},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"aPW" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"aPX" = (/obj/machinery/door/airlock/centcom{name = "Study"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"aPY" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) -"aPZ" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/tdome/tdomeobserve) -"aQa" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/escape/centcom) -"aQb" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aQc" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aQd" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_surround"; dir = 8},/area/syndicate_mothership) -"aQe" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 6},/area/syndicate_mothership) -"aQf" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = -2; pixel_y = 5},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"aQg" = (/obj/structure/table/woodentable,/obj/item/pizzabox{ismessy = 1},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"aQh" = (/obj/structure/stool,/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"aQi" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (NORTHWEST)"; icon_state = "podhatch"; dir = 9},/area/syndicate_mothership) -"aQj" = (/obj/structure/stool/bed/chair/comfy/lime{icon_state = "comfychair_lime"; dir = 1},/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) -"aQk" = (/obj/structure/table/woodentable,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) -"aQl" = (/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/tdome/tdomeobserve) -"aQm" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/tdome/tdomeobserve) -"aQn" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) -"aQo" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/syndicate_mothership) -"aQp" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/syndicate_mothership) -"aQq" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"aQr" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = 5; pixel_y = -2; step_x = 0},/obj/item/toy/cards/deck/syndicate{icon_state = "deck_syndicate_full"; pixel_x = -6; pixel_y = 6},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"aQs" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (WEST)"; icon_state = "podhatch"; dir = 8},/area/syndicate_mothership) -"aQt" = (/turf/unsimulated/floor{icon_state = "red"; dir = 10},/area/tdome/tdomeobserve) -"aQu" = (/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/tdome/tdomeobserve) -"aQv" = (/turf/unsimulated/floor{icon_state = "green"},/area/tdome/tdomeobserve) -"aQw" = (/turf/unsimulated/floor{icon_state = "green"; dir = 6},/area/tdome/tdomeobserve) -"aQx" = (/turf/unsimulated/wall/fakedoor{name = "Centcom Security"},/area/centcom/evac) -"aQy" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership) -"aQz" = (/turf/unsimulated/floor,/area/syndicate_mothership) -"aQA" = (/obj/machinery/door/airlock/external{req_access_txt = "150"},/turf/unsimulated/floor,/area/syndicate_mothership) -"aQB" = (/obj/machinery/door/poddoor/shutters{id = "nukeop_ready"; name = "shuttle dock"},/turf/unsimulated/floor,/area/syndicate_mothership) -"aQC" = (/obj/effect/landmark{name = "Syndicate-Uplink"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aQD" = (/turf/unsimulated/wall/fakeglass,/area/syndicate_mothership) -"aQE" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (SOUTHWEST)"; icon_state = "podhatch"; dir = 10},/area/syndicate_mothership) -"aQF" = (/obj/structure/urinal{pixel_y = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"aQG" = (/obj/structure/toilet{pixel_y = 8},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/obj/machinery/door/window{name = "Tactical Toilet"; opacity = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"aQH" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aQI" = (/obj/structure/table,/obj/item/weapon/gun/energy/ionrifle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aQJ" = (/obj/machinery/door/poddoor{auto_close = 300; id = "smindicate"; name = "outer blast door"},/obj/machinery/door_control{id = "smindicate"; name = "external door control"; pixel_x = -26; pixel_y = 0; req_access_txt = "150"},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"aQK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_station/start) -"aQL" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 5},/area/syndicate_mothership) -"aQM" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) -"aQN" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) -"aQO" = (/obj/structure/table/woodentable,/obj/item/device/syndicatedetonator{desc = "This gaudy button can be used to instantly detonate syndicate bombs that have been activated on the station. It is also fun to press."},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) -"aQP" = (/obj/machinery/door/airlock/centcom{name = "Restroom"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"aQQ" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"aQR" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"aQS" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'FOURTH WALL'."; name = "\improper FOURTH WALL"; pixel_x = -32},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) -"aQT" = (/obj/structure/table,/obj/item/device/aicard,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aQU" = (/obj/machinery/door_control{id = "nukeop_ready"; name = "mission launch control"; pixel_x = -26; pixel_y = 0; req_access_txt = "150"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) -"aQV" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) -"aQW" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) -"aQX" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Uplink Management Control"; req_access_txt = "150"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) -"aQY" = (/obj/structure/mopbucket,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"aQZ" = (/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) -"aRa" = (/obj/structure/stool/bed/chair,/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) -"aRb" = (/obj/machinery/door/window{dir = 4; name = "Equipment Room"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRc" = (/obj/machinery/door/airlock/external{req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRd" = (/obj/machinery/computer/telecrystals/boss,/turf/unsimulated/floor{tag = "icon-podhatch (NORTHEAST)"; icon_state = "podhatch"; dir = 5},/area/syndicate_mothership) -"aRe" = (/obj/structure/sign/map/left{pixel_y = -32},/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_left"; name = "skeletal minibar"},/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) -"aRf" = (/obj/structure/sign/map/right{pixel_y = -32},/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_right"; name = "skeletal minibar"},/obj/item/weapon/reagent_containers/food/drinks/bottle/gin,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) -"aRg" = (/turf/unsimulated/wall/fakedoor{name = "Thunderdome"},/area/tdome/tdomeobserve) -"aRh" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) -"aRi" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Equipment Room"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRj" = (/obj/machinery/atmospherics/pipe/simple{dir = 10},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"aRk" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRl" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership) -"aRm" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRn" = (/turf/unsimulated/wall,/area/wizard_station) -"aRo" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/tdome/tdomeobserve) -"aRp" = (/obj/machinery/recharge_station,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRq" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRr" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/table,/obj/item/stack/medical/bruise_pack,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRs" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/table,/obj/item/stack/medical/ointment,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRt" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/device/assembly/signaler,/obj/item/clothing/glasses/night,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRu" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/clothing/glasses/night,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRv" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/assembly/infra,/obj/item/clothing/glasses/night,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRw" = (/obj/structure/table,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/clothing/glasses/night,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRx" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/clothing/glasses/night,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRy" = (/obj/structure/bookcase{name = "Forbidden Knowledge"},/obj/effect/decal/cleanable/cobweb,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aRz" = (/obj/structure/bookcase{name = "Forbidden Knowledge"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aRA" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aRB" = (/obj/machinery/librarycomp,/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aRC" = (/obj/machinery/vending/magivend,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aRD" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aRE" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/weapon/storage/backpack/satchel,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/wizard_station) -"aRF" = (/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/wizard_station) -"aRG" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/wiz,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/wizard_station) -"aRH" = (/turf/unsimulated/wall,/area/tdome) -"aRI" = (/obj/machinery/igniter,/turf/simulated/floor,/area/tdome) -"aRJ" = (/turf/simulated/floor,/area/tdome) -"aRK" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRL" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRM" = (/obj/structure/table,/obj/item/device/sbeacondrop/bomb,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRN" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/wizard_station) -"aRO" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/wizard_station) -"aRP" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/wizard_station) -"aRQ" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"aRR" = (/obj/machinery/door/poddoor{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"aRS" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) -"aRT" = (/obj/machinery/door/poddoor{id = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{name = "plating"},/area/tdome) -"aRU" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/tdome) -"aRV" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/tdome) -"aRW" = (/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) -"aRX" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"aRY" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aRZ" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSa" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSb" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/grenade/syndieminibomb,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSc" = (/obj/structure/bookcase{name = "bookcase (Tactics)"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aSd" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aSe" = (/obj/structure/table/woodentable,/obj/item/weapon/tray,/obj/item/weapon/reagent_containers/food/snacks/burger/spell,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station) -"aSf" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/wizard_station) -"aSg" = (/obj/structure/table/woodentable,/obj/effect/landmark{name = "Teleport-Scroll"},/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/wizard_station) -"aSh" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) -"aSi" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) -"aSj" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSk" = (/obj/item/weapon/weldingtool,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSl" = (/obj/machinery/door/window{dir = 1; name = "Secure Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSm" = (/obj/item/weapon/crowbar,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSn" = (/obj/structure/stool/bed/chair,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aSo" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"aSp" = (/obj/machinery/camera{pixel_x = 11; pixel_y = -9; network = list("thunder"); c_tag = "Red Team"},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) -"aSq" = (/turf/simulated/floor/bluegrid,/area/tdome) -"aSr" = (/obj/machinery/flasher{id = "flash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome) -"aSs" = (/obj/machinery/camera{pixel_x = 12; pixel_y = -10; network = list("thunder"); c_tag = "Green Team"},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) -"aSt" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSu" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSv" = (/obj/structure/bookcase,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aSw" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aSx" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aSy" = (/obj/structure/table/woodentable,/obj/item/weapon/dice/d20,/obj/item/weapon/dice,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aSz" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"aSA" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"aSB" = (/obj/machinery/camera{pixel_x = 10; network = list("thunder"); c_tag = "Arena"},/turf/simulated/floor/bluegrid,/area/tdome) -"aSC" = (/obj/structure/closet/crate/internals,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSD" = (/obj/structure/closet/crate/medical,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSE" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"aSF" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSG" = (/obj/machinery/teleport/hub,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"aSH" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aSI" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aSJ" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"aSK" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"aSL" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/space,/area/syndicate_station/start) -"aSM" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/syndicate_station/start) -"aSN" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/space,/area/syndicate_station/start) -"aSO" = (/obj/machinery/door/poddoor{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) -"aSP" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/wizard_station) -"aSQ" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/wizard_station) -"aSR" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 5},/area/wizard_station) -"aSS" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"aST" = (/obj/structure/showcase,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) -"aSU" = (/obj/structure/table/reinforced,/obj/structure/kitchenspike,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) -"aSV" = (/obj/structure/table/reinforced,/obj/structure/kitchenspike,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) -"aSW" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/showcase,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) -"aSX" = (/obj/machinery/door/poddoor{id = "thunderdomehea"; name = "Heavy Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"aSY" = (/obj/effect/decal/remains/human,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) -"aSZ" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) -"aTa" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/wizard_station) -"aTb" = (/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) -"aTc" = (/obj/effect/decal/cleanable/blood,/mob/living/carbon/monkey,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) -"aTd" = (/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) -"aTe" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"aTf" = (/turf/unsimulated/wall,/area/tdome/tdomeadmin) -"aTg" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/tdome/tdomeadmin) -"aTh" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/tdome/tdomeadmin) -"aTi" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/tdome/tdomeadmin) -"aTj" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"aTk" = (/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) -"aTl" = (/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) -"aTm" = (/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) -"aTn" = (/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"aTo" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"aTp" = (/obj/effect/decal/cleanable/molten_item,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) -"aTq" = (/turf/unsimulated/wall/fakeglass,/area/wizard_station) -"aTr" = (/obj/structure/rack,/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) -"aTs" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) -"aTt" = (/obj/structure/rack,/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) -"aTu" = (/obj/machinery/computer/security/telescreen{pixel_y = -32},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"aTv" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) -"aTw" = (/turf/unsimulated/wall/fakedoor{name = "Thunderdome Admin"},/area/tdome/tdomeadmin) -"aTx" = (/obj/structure/table,/obj/machinery/door_control{id = "thunderdomehea"; name = "Heavy Supply Control"; pixel_y = 0; req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) -"aTy" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) -"aTz" = (/obj/structure/table,/obj/machinery/door_control{id = "thunderdomegen"; name = "General Supply Control"; pixel_y = 0; req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) -"aTA" = (/obj/structure/table,/obj/machinery/door_control{id = "thunderdome"; name = "Main Blast Doors Control"; pixel_y = 0; req_access_txt = "102"},/obj/machinery/computer/security/telescreen{pixel_y = -32},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) -"aTB" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) -"aTC" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) -"aTD" = (/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) -"aTE" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) -"aTF" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) -"aTG" = (/obj/structure/rack,/obj/item/device/camera,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) -"aTH" = (/obj/structure/rack,/obj/item/toy/sword,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) -"aTI" = (/obj/structure/rack,/obj/item/toy/gun,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) -"aTJ" = (/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) -"aTK" = (/turf/unsimulated/beach/sand,/area/centcom/holding) -"aTL" = (/obj/effect/overlay/palmtree_r,/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/centcom/holding) -"aTM" = (/obj/effect/overlay/palmtree_l,/turf/unsimulated/beach/sand,/area/centcom/holding) -"aTN" = (/obj/structure/table,/obj/item/clothing/head/that,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) -"aTO" = (/obj/structure/stool{pixel_y = 8},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) -"aTP" = (/obj/item/device/camera,/turf/unsimulated/beach/sand,/area/centcom/holding) -"aTQ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) -"aTR" = (/obj/structure/table,/obj/item/weapon/lighter/zippo,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) -"aTS" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) -"aTT" = (/obj/structure/table,/obj/item/weapon/dice/d20,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) -"aTU" = (/obj/structure/stool{pixel_y = 8},/obj/item/clothing/head/bandana{pixel_y = -10},/obj/item/clothing/glasses/sunglasses,/turf/unsimulated/beach/sand,/area/centcom/holding) -"aTV" = (/obj/structure/stool{pixel_y = 8},/turf/unsimulated/beach/sand,/area/centcom/holding) -"aTW" = (/obj/structure/rack,/obj/item/clothing/head/that,/obj/item/clothing/under/suit_jacket,/obj/item/clothing/tie/waistcoat,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) -"aTX" = (/obj/item/weapon/beach_ball,/turf/unsimulated/beach/sand,/area/centcom/holding) -"aTY" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) -"aTZ" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) -"aUa" = (/turf/unsimulated/beach/coastline,/area/centcom/holding) -"aUb" = (/obj/item/clothing/head/collectable/paper,/turf/unsimulated/beach/coastline,/area/centcom/holding) -"aUc" = (/obj/structure/rack,/obj/item/clothing/shoes/laceup,/obj/item/clothing/under/suit_jacket/female{desc = "A black trouser suit for women. Very formal."; name = "black suit"; pixel_x = 3; pixel_y = 1},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) -"aUd" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) -"aUe" = (/turf/unsimulated/beach/water,/area/centcom/holding) -"aUf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) -"aUg" = (/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/holding) -"aUh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) -"aUi" = (/obj/effect/landmark{name = "Holding Facility"},/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/holding) -"aUj" = (/turf/simulated/floor{icon_state = "solarpanel"},/area) -"aUk" = (/turf/simulated/wall/r_wall,/area/AIsattele) -"aUl" = (/obj/structure/computerframe,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUm" = (/obj/machinery/teleport/station,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUn" = (/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUo" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUp" = (/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUq" = (/obj/structure/rack,/obj/item/clothing/gloves/yellow,/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUr" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUs" = (/obj/item/weapon/stock_parts/cell,/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUt" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUu" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUv" = (/obj/structure/closet,/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUw" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUx" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area) -"aUy" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUz" = (/obj/structure/closet/crate,/obj/item/device/aicard,/obj/item/device/multitool,/turf/simulated/floor/plating/airless,/area/AIsattele) -"aUA" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area) -"aUB" = (/obj/machinery/power/solar/fake,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/djstation/solars) -"aUC" = (/turf/simulated/floor/plating/airless,/area/djstation/solars) -"aUD" = (/turf/simulated/wall,/area/djstation) -"aUE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/djstation) -"aUF" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/djstation) -"aUG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/djstation) -"aUH" = (/turf/simulated/floor/plating,/area/djstation) -"aUI" = (/obj/machinery/telecomms/relay/preset/ruskie,/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/djstation) -"aUJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/djstation) -"aUK" = (/obj/machinery/power/terminal,/turf/simulated/floor/plating,/area/djstation) -"aUL" = (/obj/item/device/multitool,/turf/simulated/floor/plating,/area/djstation) -"aUM" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor/plating,/area/djstation) -"aUN" = (/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/djstation) -"aUO" = (/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/plating,/area/djstation) -"aUP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/djstation) -"aUQ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 0; name = "Worn-out APC"; pixel_y = -24},/turf/simulated/floor/plating,/area/djstation) -"aUR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/storage/box/lights/mixed,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/djstation) -"aUS" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/djstation) -"aUT" = (/obj/structure/rack,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/djstation) -"aUU" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"},/turf/simulated/floor/plating,/area/djstation) -"aUV" = (/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aUW" = (/obj/machinery/vending/snack,/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aUX" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aUY" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aUZ" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/djstation) -"aVb" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor{icon_state = "bar"},/area/djstation) -"aVc" = (/turf/simulated/floor{icon_state = "bar"},/area/djstation) -"aVd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/djstation) -"aVe" = (/turf/simulated/floor{icon_state = "grimy"},/area/djstation) -"aVf" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{icon_state = "grimy"},/area/djstation) -"aVg" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor{icon_state = "grimy"},/area/djstation) -"aVh" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "grimy"},/area/djstation) -"aVi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/djstation) -"aVj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/djstation) -"aVk" = (/obj/structure/table,/obj/machinery/microwave{pixel_y = 8},/turf/simulated/floor{icon_state = "bar"},/area/djstation) -"aVl" = (/obj/machinery/door/airlock/glass{name = "Kitchen"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVm" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 0; dir = 8; freerange = 1; listening = 1; name = "Pirate Radio Listening Channel"; pixel_x = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVn" = (/obj/structure/stool/bed/chair/office/light,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVo" = (/obj/machinery/door/airlock/glass{name = "Cabin"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVp" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/djstation) -"aVq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/djstation) -"aVr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/djstation) -"aVs" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{icon_state = "bar"},/area/djstation) -"aVt" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "bar"},/area/djstation) -"aVu" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor{icon_state = "bar"},/area/djstation) -"aVv" = (/obj/structure/table,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVw" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 1; dir = 8; freerange = 1; listening = 0; name = "Pirate Radio Broadcast Channel"; pixel_x = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVx" = (/obj/structure/table,/obj/item/weapon/paper/djstation,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVy" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/floor{icon_state = "grimy"},/area/djstation) -"aVz" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/djstation) -"aVA" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "grimy"},/area/djstation) -"aVB" = (/obj/structure/closet,/turf/simulated/floor{icon_state = "grimy"},/area/djstation) -"aVC" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/djstation) -"aVD" = (/obj/machinery/door/airlock{name = "Restroom"; req_access_txt = "0"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/djstation) -"aVE" = (/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVF" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless,/area) -"aVG" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/djstation) -"aVH" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVI" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/space_heater,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVJ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/rack{dir = 4},/obj/item/clothing/under/soviet,/obj/item/clothing/head/ushanka,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVK" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/light/small,/turf/simulated/floor{icon_state = "freezerfloor"},/area/djstation) -"aVL" = (/obj/structure/toilet{pixel_y = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/djstation) -"aVM" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVN" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) -"aVO" = (/obj/machinery/door/airlock/external{name = "Ruskie DJ Station"; req_access = null; req_access_txt = "0"},/turf/simulated/floor/plating,/area/djstation) -"aVP" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/simulated/floor/plating/airless,/area) -"aVQ" = (/turf/simulated/wall/r_wall,/area/derelict/teleporter) -"aVR" = (/turf/simulated/floor/plating/airless,/area/derelict/teleporter) -"aVS" = (/turf/simulated/floor/airless,/area/derelict/teleporter) -"aVT" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/derelict/teleporter) -"aVU" = (/obj/machinery/light_construct/small{dir = 1},/turf/simulated/floor/airless{icon_state = "damaged3"},/area/derelict/teleporter) -"aVV" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/airless,/area/derelict/teleporter) -"aVW" = (/obj/machinery/teleport/station,/turf/simulated/floor/airless,/area/derelict/teleporter) -"aVX" = (/obj/machinery/teleport/hub,/turf/simulated/floor/airless,/area/derelict/teleporter) -"aVY" = (/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor/plating/airless,/area/derelict/teleporter) -"aVZ" = (/obj/structure/table,/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/floor/airless,/area/derelict/teleporter) -"aWa" = (/turf/simulated/floor/airless{icon_state = "damaged4"},/area/derelict/teleporter) -"aWb" = (/obj/machinery/power/apc{dir = 0; name = "Worn-out APC"; pixel_y = -24},/turf/simulated/floor/airless,/area/derelict/teleporter) -"aWc" = (/turf/simulated/mineral,/area) -"aWd" = (/turf/simulated/floor/plating/asteroid/airless,/area) -"aWe" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area) -"aWf" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area) -"aWg" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/airless,/area) -"aWh" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area) -"aWi" = (/turf/simulated/floor/plating/asteroid/airless,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area) -"aWj" = (/obj/effect/landmark/corpse/clown,/turf/simulated/floor/airless,/area) -"aWk" = (/turf/simulated/floor/airless,/area) -"aWl" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area) -"aWm" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area) -"aWn" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area) -"aWo" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/space,/area) -"aWp" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/asteroid/airless,/area) -"aWq" = (/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area) -"aWr" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area) -"aWs" = (/obj/item/weapon/shard{icon_state = "medium"},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/asteroid/airless,/area) -"aWt" = (/obj/effect/landmark/corpse/clown{name = "Clown Pilot"},/turf/simulated/floor/airless,/area) -"aWu" = (/obj/item/weapon/paper{info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"},/turf/simulated/floor/airless,/area) -"aWv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area) -"aWw" = (/obj/item/weapon/shard,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/airless,/area) -"aWx" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/airless,/area) -"aWy" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area) -"aWz" = (/turf/simulated/floor/airless,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area) -"aWA" = (/obj/item/weapon/pickaxe,/turf/simulated/floor/airless,/area) -"aWB" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area) -"aWC" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/clothing/shoes/clown_shoes{desc = "These shoes appear var-edited!."; name = "uhangi's shoes"; slowdown = -1},/turf/simulated/floor/airless,/area) -"aWD" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area) -"aWE" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area) -"aWF" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area) -"aWG" = (/turf/simulated/mineral/random,/area) -"aWH" = (/turf/simulated/floor/plating/asteroid/airless/cave,/area) +"aEb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer) +"aEc" = (/obj/machinery/atmospherics/pipe/tank/air{icon_state = "intact"; dir = 8},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEd" = (/obj/structure/transit_tube{icon_state = "N-SE"},/obj/structure/lattice,/turf/space,/area) +"aEe" = (/obj/structure/transit_tube{icon_state = "D-SW"},/obj/structure/lattice,/turf/space,/area) +"aEf" = (/obj/machinery/door/airlock/external{name = "Telecomms Emergency Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEg" = (/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEi" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEj" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer) +"aEl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEn" = (/obj/machinery/atmospherics/pipe/vent{dir = 8},/turf/simulated/floor/plating/airless,/area) +"aEo" = (/obj/structure/transit_tube{icon_state = "D-NE"},/turf/space,/area) +"aEp" = (/obj/structure/transit_tube{icon_state = "E-NW"},/turf/space,/area) +"aEq" = (/obj/structure/lattice,/obj/structure/transit_tube{tag = "icon-E-W-Pass"; icon_state = "E-W-Pass"},/turf/space,/area) +"aEr" = (/obj/structure/transit_tube,/obj/structure/lattice,/turf/space,/area) +"aEs" = (/obj/structure/transit_tube{icon_state = "W-SE"},/obj/structure/lattice,/turf/space,/area) +"aEt" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aEv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aEw" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aEx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aEy" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEz" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/obj/machinery/light/small,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer) +"aEA" = (/obj/structure/transit_tube{icon_state = "NW-SE"},/obj/structure/lattice,/turf/space,/area) +"aEB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEC" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/tcommsat/computer) +"aED" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aEE" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/tcommsat/computer) +"aEF" = (/turf/simulated/floor,/area/tcommsat/computer) +"aEG" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/tcommsat/computer) +"aEH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aEI" = (/turf/simulated/wall/r_wall,/area/engine/gravity_generator) +"aEJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aEL" = (/obj/machinery/computer/telecomms/traffic{network = "tcommsat"},/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/tcommsat/computer) +"aEM" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/tcommsat/computer) +"aEN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor,/area/tcommsat/computer) +"aEO" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/paper/monitorkey,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/tcommsat/computer) +"aEP" = (/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"aEQ" = (/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/gravity_generator) +"aER" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator) +"aES" = (/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/gravity_generator) +"aET" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aEU" = (/obj/machinery/telecomms/processor/preset_one/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aEV" = (/obj/machinery/telecomms/bus/preset_one/ministation,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aEW" = (/obj/machinery/telecomms/server/presets/common/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aEX" = (/obj/machinery/message_server,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aEY" = (/obj/machinery/computer/telecomms/server{network = "tcommsat"},/turf/simulated/floor{icon_state = "yellow"; dir = 10},/area/tcommsat/computer) +"aEZ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor,/area/tcommsat/computer) +"aFa" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/tcommsat/computer) +"aFb" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/item/weapon/pen/blue,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor,/area/tcommsat/computer) +"aFc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aFd" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aFe" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"aFf" = (/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator) +"aFg" = (/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"aFh" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer) +"aFi" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aFj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aFk" = (/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aFl" = (/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aFm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aFn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/tcommsat/computer) +"aFo" = (/obj/machinery/door/airlock/glass_command{name = "Control Room"; req_access_txt = "19; 61"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/tcommsat/computer) +"aFp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aFq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/tcommsat/computer) +"aFr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"aFs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/gravity_generator) +"aFt" = (/obj/machinery/gravity_generator/main/station,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator) +"aFu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/gravity_generator) +"aFv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"aFw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aFx" = (/obj/structure/transit_tube/station/reverse{tag = "icon-closed (EAST)"; icon_state = "closed"; dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer) +"aFy" = (/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aFz" = (/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Telecoms Server APC"; pixel_x = -25; pixel_y = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aFA" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aFB" = (/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aFC" = (/obj/machinery/door/airlock/glass_engineering{name = "Server Room"; req_access_txt = "61"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/tcommsat/computer) +"aFD" = (/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/tcommsat/computer) +"aFE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/tcommsat/computer) +"aFF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/tcommsat/computer) +"aFG" = (/obj/structure/closet/emcloset,/obj/machinery/camera/autoname{network = list("SS13")},/turf/simulated/floor,/area/tcommsat/computer) +"aFH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"aFI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"aFJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"aFK" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/camera/autoname{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"aFL" = (/obj/structure/transit_tube{tag = "icon-Block (NORTH)"; icon_state = "Block"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/tcommsat/computer) +"aFM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aFN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aFO" = (/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aFP" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 0},/turf/simulated/wall,/area/tcommsat/computer) +"aFQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor,/area/tcommsat/computer) +"aFR" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor,/area/tcommsat/computer) +"aFS" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Telecoms Admin"; departmentType = 5; name = "Telecoms RC"; pixel_x = 30; pixel_y = 0},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/machinery/recharge_station,/turf/simulated/floor,/area/tcommsat/computer) +"aFT" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aFU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/tcommsat/computer) +"aFV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/gravity_generator) +"aFW" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/engine/gravity_generator) +"aFX" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/gravity_generator) +"aFY" = (/obj/machinery/door/airlock/glass_command{name = "Gravity Generator Area"; req_access_txt = "19; 61"},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"aFZ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/engine/gravity_generator) +"aGa" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engine/gravity_generator) +"aGb" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/tcommsat/computer) +"aGc" = (/obj/machinery/telecomms/receiver/preset_left/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aGd" = (/obj/machinery/telecomms/hub/preset,/obj/structure/sign/nosmoking_2{pixel_y = -32},/obj/machinery/light/small,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aGe" = (/obj/machinery/telecomms/broadcaster/preset_left/ministation,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aGf" = (/obj/machinery/blackbox_recorder,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/computer) +"aGg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/wall,/area/tcommsat/computer) +"aGh" = (/obj/structure/table,/obj/item/device/multitool,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/tcommsat/computer) +"aGi" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) +"aGj" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor,/area/tcommsat/computer) +"aGk" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) +"aGl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aGm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/gravity_generator) +"aGn" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/gravity_generator) +"aGo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator) +"aGp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator) +"aGq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator) +"aGr" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/engine/gravity_generator) +"aGs" = (/turf/space,/area/syndicate_station/southwest) +"aGt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aGu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aGv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"aGw" = (/obj/structure/table,/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/tcommsat/computer) +"aGx" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/tcommsat/computer) +"aGy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor,/area/tcommsat/computer) +"aGz" = (/obj/machinery/door/airlock/engineering{name = "Telecommunications"; req_access_txt = "61"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) +"aGA" = (/obj/machinery/power/apc{dir = 8; name = "Gravity Generator APC"; pixel_x = -25; pixel_y = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/engine/gravity_generator) +"aGB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engine/gravity_generator) +"aGC" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/gravity_generator) +"aGD" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/engine/gravity_generator) +"aGE" = (/turf/simulated/floor,/area/engine/gravity_generator) +"aGF" = (/turf/space,/area/syndicate_station/southeast) +"aGG" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/floor{icon_state = "yellow"; dir = 10},/area/tcommsat/computer) +"aGH" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/obj/effect/landmark/start{name = "AI"},/turf/simulated/floor,/area/tcommsat/computer) +"aGI" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor,/area/tcommsat/computer) +"aGJ" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/newscaster{pixel_x = 32; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/computer) +"aGK" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable,/turf/simulated/floor,/area/engine/gravity_generator) +"aGL" = (/obj/machinery/light,/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor,/area/engine/gravity_generator) +"aGM" = (/obj/structure/table,/obj/item/weapon/paper/gravity_gen{layer = 3},/obj/item/weapon/pen/blue,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/engine/gravity_generator) +"aGN" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/gravity_generator) +"aGO" = (/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Room"; req_access_txt = "19;23"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/gravity_generator) +"aGP" = (/turf/space,/area/space) +"aGQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) +"aGR" = (/obj/structure/closet/radiation,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/tcommsat/computer) +"aGS" = (/turf/space,/area/syndicate_station/south) +"aGT" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns15,/area) +"aGU" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns9,/area) +"aGV" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns5,/area) +"aGW" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns12,/area) +"aGX" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns8,/area) +"aGY" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns3,/area) +"aGZ" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns6,/area) +"aHa" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns7,/area) +"aHb" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns4,/area) +"aHc" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns14,/area) +"aHd" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns1,/area) +"aHe" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns11,/area) +"aHf" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns13,/area) +"aHg" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns2,/area) +"aHh" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns10,/area) +"aHi" = (/turf/space/transit/east/shuttlespace_ew13,/area) +"aHj" = (/turf/space/transit/east/shuttlespace_ew14,/area) +"aHk" = (/turf/space/transit/east/shuttlespace_ew15,/area) +"aHl" = (/turf/space/transit/east/shuttlespace_ew1,/area) +"aHm" = (/turf/space/transit/east/shuttlespace_ew2,/area) +"aHn" = (/turf/space/transit/east/shuttlespace_ew3,/area) +"aHo" = (/turf/space/transit/east/shuttlespace_ew4,/area) +"aHp" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew5,/area) +"aHq" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew6,/area) +"aHr" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew7,/area) +"aHs" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew8,/area) +"aHt" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew9,/area) +"aHu" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew10,/area) +"aHv" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew11,/area) +"aHw" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew12,/area) +"aHx" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew13,/area) +"aHy" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew14,/area) +"aHz" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew15,/area) +"aHA" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew1,/area) +"aHB" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew2,/area) +"aHC" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew3,/area) +"aHD" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew4,/area) +"aHE" = (/turf/space{icon_state = "black"},/area) +"aHF" = (/turf/space/transit/north/shuttlespace_ns8,/area) +"aHG" = (/turf/space/transit/north/shuttlespace_ns4,/area) +"aHH" = (/turf/space/transit/north/shuttlespace_ns11,/area) +"aHI" = (/turf/space/transit/north/shuttlespace_ns7,/area) +"aHJ" = (/turf/space/transit/north/shuttlespace_ns2,/area) +"aHK" = (/turf/space/transit/north/shuttlespace_ns5,/area) +"aHL" = (/turf/space/transit/north/shuttlespace_ns6,/area) +"aHM" = (/turf/space/transit/north/shuttlespace_ns14,/area) +"aHN" = (/turf/space/transit/north/shuttlespace_ns3,/area) +"aHO" = (/turf/space/transit/north/shuttlespace_ns13,/area) +"aHP" = (/turf/space/transit/north/shuttlespace_ns15,/area) +"aHQ" = (/turf/space/transit/north/shuttlespace_ns10,/area) +"aHR" = (/turf/space/transit/north/shuttlespace_ns12,/area) +"aHS" = (/turf/space/transit/north/shuttlespace_ns1,/area) +"aHT" = (/turf/space/transit/north/shuttlespace_ns9,/area) +"aHU" = (/turf/space/transit/east/shuttlespace_ew5,/area) +"aHV" = (/turf/space/transit/east/shuttlespace_ew6,/area) +"aHW" = (/turf/space/transit/east/shuttlespace_ew7,/area) +"aHX" = (/turf/space/transit/east/shuttlespace_ew8,/area) +"aHY" = (/turf/space/transit/east/shuttlespace_ew10,/area) +"aHZ" = (/turf/space/transit/east/shuttlespace_ew11,/area) +"aIa" = (/turf/space/transit/east/shuttlespace_ew12,/area) +"aIb" = (/turf/space/transit/east/shuttlespace_ew9,/area) +"aIc" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew13,/area) +"aId" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew7,/area) +"aIe" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew8,/area) +"aIf" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew9,/area) +"aIg" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew10,/area) +"aIh" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew3,/area) +"aIi" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns13,/area) +"aIj" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns11,/area) +"aIk" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area) +"aIl" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area) +"aIm" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area) +"aIn" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area) +"aIo" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns9,/area) +"aIp" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns2,/area) +"aIq" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns13,/area) +"aIr" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area) +"aIs" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area) +"aIt" = (/turf/space/transit/east/shuttlespace_ew2,/area/shuttle/escape_pod4/transit) +"aIu" = (/turf/space/transit/east/shuttlespace_ew3,/area/shuttle/escape_pod4/transit) +"aIv" = (/turf/space/transit/east/shuttlespace_ew4,/area/shuttle/escape_pod4/transit) +"aIw" = (/turf/space/transit/east/shuttlespace_ew5,/area/shuttle/escape_pod4/transit) +"aIx" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew13,/area) +"aIy" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns9,/area) +"aIz" = (/turf/space/transit/north/shuttlespace_ns11,/area/shuttle/escape/transit) +"aIA" = (/turf/space/transit/north/shuttlespace_ns3,/area/shuttle/escape/transit) +"aIB" = (/turf/space/transit/north/shuttlespace_ns13,/area/shuttle/escape/transit) +"aIC" = (/turf/space/transit/north/shuttlespace_ns7,/area/shuttle/escape/transit) +"aID" = (/turf/space/transit/north/shuttlespace_ns14,/area/shuttle/escape/transit) +"aIE" = (/turf/space/transit/north/shuttlespace_ns4,/area/shuttle/escape/transit) +"aIF" = (/turf/space/transit/north/shuttlespace_ns10,/area/shuttle/escape/transit) +"aIG" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns1,/area) +"aIH" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew2,/area) +"aII" = (/turf/space/transit/east/shuttlespace_ew14,/area/shuttle/escape_pod4/transit) +"aIJ" = (/turf/space/transit/east/shuttlespace_ew15,/area/shuttle/escape_pod4/transit) +"aIK" = (/turf/space/transit/east/shuttlespace_ew1,/area/shuttle/escape_pod4/transit) +"aIL" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; stopper = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew7,/area) +"aIM" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area) +"aIN" = (/turf/space/transit/north/shuttlespace_ns2,/area/shuttle/escape/transit) +"aIO" = (/turf/space/transit/north/shuttlespace_ns12,/area/shuttle/escape/transit) +"aIP" = (/turf/space/transit/north/shuttlespace_ns6,/area/shuttle/escape/transit) +"aIQ" = (/turf/space/transit/north/shuttlespace_ns9,/area/shuttle/escape/transit) +"aIR" = (/turf/space/transit/north/shuttlespace_ns15,/area/shuttle/escape/transit) +"aIS" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area) +"aIT" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; stopper = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew12,/area) +"aIU" = (/turf/space/transit/north/shuttlespace_ns1,/area/shuttle/escape/transit) +"aIV" = (/turf/space/transit/north/shuttlespace_ns5,/area/shuttle/escape/transit) +"aIW" = (/turf/space/transit/north/shuttlespace_ns8,/area/shuttle/escape/transit) +"aIX" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area) +"aIY" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew15,/area) +"aIZ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew4,/area) +"aJa" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew5,/area) +"aJb" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew6,/area) +"aJc" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns2,/area) +"aJd" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns1,/area) +"aJe" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area) +"aJf" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew14,/area) +"aJg" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew1,/area) +"aJh" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns14,/area) +"aJi" = (/turf/space/transit/east/shuttlespace_ew7,/area/shuttle/escape_pod3/transit) +"aJj" = (/turf/space/transit/east/shuttlespace_ew8,/area/shuttle/escape_pod3/transit) +"aJk" = (/turf/space/transit/east/shuttlespace_ew9,/area/shuttle/escape_pod3/transit) +"aJl" = (/turf/space/transit/east/shuttlespace_ew10,/area/shuttle/escape_pod3/transit) +"aJm" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew14,/area) +"aJn" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns13,/area) +"aJo" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew11,/area) +"aJp" = (/turf/space/transit/east/shuttlespace_ew2,/area/shuttle/escape_pod3/transit) +"aJq" = (/turf/space/transit/east/shuttlespace_ew3,/area/shuttle/escape_pod3/transit) +"aJr" = (/turf/space/transit/east/shuttlespace_ew4,/area/shuttle/escape_pod3/transit) +"aJs" = (/turf/space/transit/east/shuttlespace_ew5,/area/shuttle/escape_pod3/transit) +"aJt" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; stopper = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew1,/area) +"aJu" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area) +"aJv" = (/turf/space/transit/east/shuttlespace_ew14,/area/shuttle/escape_pod3/transit) +"aJw" = (/turf/space/transit/east/shuttlespace_ew15,/area/shuttle/escape_pod3/transit) +"aJx" = (/turf/space/transit/east/shuttlespace_ew1,/area/shuttle/escape_pod3/transit) +"aJy" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; stopper = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew10,/area) +"aJz" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns11,/area) +"aJA" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew12,/area) +"aJB" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area) +"aJC" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns9,/area) +"aJD" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area) +"aJE" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns7,/area) +"aJF" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area) +"aJG" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns7,/area) +"aJH" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area) +"aJI" = (/turf/space/transit/north/shuttlespace_ns5,/area/syndicate_station/transit) +"aJJ" = (/turf/space/transit/north/shuttlespace_ns11,/area/syndicate_station/transit) +"aJK" = (/turf/space/transit/north/shuttlespace_ns3,/area/syndicate_station/transit) +"aJL" = (/turf/space/transit/north/shuttlespace_ns13,/area/syndicate_station/transit) +"aJM" = (/turf/space/transit/north/shuttlespace_ns7,/area/syndicate_station/transit) +"aJN" = (/turf/space/transit/north/shuttlespace_ns14,/area/syndicate_station/transit) +"aJO" = (/turf/space/transit/north/shuttlespace_ns4,/area/syndicate_station/transit) +"aJP" = (/turf/space/transit/north/shuttlespace_ns10,/area/syndicate_station/transit) +"aJQ" = (/turf/space/transit/north/shuttlespace_ns1,/area/syndicate_station/transit) +"aJR" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area) +"aJS" = (/turf/space/transit/north/shuttlespace_ns2,/area/syndicate_station/transit) +"aJT" = (/turf/space/transit/north/shuttlespace_ns12,/area/syndicate_station/transit) +"aJU" = (/turf/space/transit/north/shuttlespace_ns6,/area/syndicate_station/transit) +"aJV" = (/turf/space/transit/north/shuttlespace_ns9,/area/syndicate_station/transit) +"aJW" = (/turf/space/transit/north/shuttlespace_ns15,/area/syndicate_station/transit) +"aJX" = (/turf/space/transit/north/shuttlespace_ns8,/area/syndicate_station/transit) +"aJY" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area) +"aJZ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns2,/area) +"aKa" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns1,/area) +"aKb" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area) +"aKc" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns7,/area) +"aKd" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area) +"aKe" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns14,/area) +"aKf" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns14,/area) +"aKg" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area) +"aKh" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area) +"aKi" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area) +"aKj" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns11,/area) +"aKk" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns2,/area) +"aKl" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area) +"aKm" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area) +"aKn" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns14,/area) +"aKo" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area) +"aKp" = (/turf/space/transit/north/shuttlespace_ns12,/area/shuttle/escape_pod1/transit) +"aKq" = (/turf/space/transit/north/shuttlespace_ns7,/area/shuttle/escape_pod1/transit) +"aKr" = (/turf/space/transit/north/shuttlespace_ns9,/area/shuttle/escape_pod1/transit) +"aKs" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area) +"aKt" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area) +"aKu" = (/turf/space/transit/north/shuttlespace_ns3,/area/shuttle/escape_pod2/transit) +"aKv" = (/turf/space/transit/north/shuttlespace_ns14,/area/shuttle/escape_pod2/transit) +"aKw" = (/turf/space/transit/north/shuttlespace_ns11,/area/shuttle/escape_pod2/transit) +"aKx" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns7,/area) +"aKy" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area) +"aKz" = (/turf/space/transit/north/shuttlespace_ns11,/area/shuttle/escape_pod1/transit) +"aKA" = (/turf/space/transit/north/shuttlespace_ns6,/area/shuttle/escape_pod1/transit) +"aKB" = (/turf/space/transit/north/shuttlespace_ns8,/area/shuttle/escape_pod1/transit) +"aKC" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area) +"aKD" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns9,/area) +"aKE" = (/turf/space/transit/north/shuttlespace_ns2,/area/shuttle/escape_pod2/transit) +"aKF" = (/turf/space/transit/north/shuttlespace_ns13,/area/shuttle/escape_pod2/transit) +"aKG" = (/turf/space/transit/north/shuttlespace_ns10,/area/shuttle/escape_pod2/transit) +"aKH" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area) +"aKI" = (/turf/space/transit/north/shuttlespace_ns10,/area/shuttle/escape_pod1/transit) +"aKJ" = (/turf/space/transit/north/shuttlespace_ns5,/area/shuttle/escape_pod1/transit) +"aKK" = (/turf/space/transit/north/shuttlespace_ns1,/area/shuttle/escape_pod2/transit) +"aKL" = (/turf/space/transit/north/shuttlespace_ns12,/area/shuttle/escape_pod2/transit) +"aKM" = (/turf/space/transit/north/shuttlespace_ns9,/area/shuttle/escape_pod2/transit) +"aKN" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area) +"aKO" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area) +"aKP" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area) +"aKQ" = (/turf/space/transit/north/shuttlespace_ns4,/area/shuttle/escape_pod1/transit) +"aKR" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns1,/area) +"aKS" = (/turf/space/transit/north/shuttlespace_ns15,/area/shuttle/escape_pod2/transit) +"aKT" = (/turf/space/transit/north/shuttlespace_ns8,/area/shuttle/escape_pod2/transit) +"aKU" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area) +"aKV" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns11,/area) +"aKW" = (/turf/unsimulated/wall,/area/start) +"aKX" = (/obj/effect/landmark/start,/turf/unsimulated/floor,/area/start) +"aKY" = (/turf/unsimulated/wall/splashscreen,/area/start) +"aKZ" = (/turf/space,/area/shuttle/escape_pod1/centcom) +"aLa" = (/turf/space,/area/shuttle/escape_pod2/centcom) +"aLb" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/centcom/evac) +"aLc" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/space,/area/centcom/evac) +"aLd" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/space,/area/centcom/evac) +"aLe" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/space,/area/centcom/evac) +"aLf" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/centcom/evac) +"aLg" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/centcom/evac) +"aLh" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/turf/simulated/floor/plating/airless,/area/centcom/evac) +"aLi" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/centcom/evac) +"aLj" = (/turf/simulated/shuttle/wall{icon_state = "swall8"; dir = 2},/area/centcom/evac) +"aLk" = (/obj/machinery/door/airlock/external{name = "Salvage Shuttle Dock"},/turf/simulated/shuttle/plating,/area/centcom/evac) +"aLl" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/centcom/evac) +"aLm" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/centcom/evac) +"aLn" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/centcom/evac) +"aLo" = (/turf/simulated/shuttle/plating,/area/centcom/evac) +"aLp" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/centcom/evac) +"aLq" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/centcom/evac) +"aLr" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aLs" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/centcom/evac) +"aLt" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aLu" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor,/area/centcom/evac) +"aLv" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 0},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor,/area/centcom/evac) +"aLw" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/centcom/evac) +"aLx" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2},/area/centcom/evac) +"aLy" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/centcom/evac) +"aLz" = (/turf/simulated/shuttle/floor,/area/centcom/evac) +"aLA" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/centcom/evac) +"aLB" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "101"},/turf/simulated/shuttle/plating,/area/centcom/evac) +"aLC" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/centcom/evac) +"aLD" = (/turf/simulated/shuttle/wall{icon_state = "swallc1"; dir = 2},/area/centcom/evac) +"aLE" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) +"aLF" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) +"aLG" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) +"aLH" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) +"aLI" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aLJ" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aLK" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/centcom/evac) +"aLL" = (/turf/simulated/shuttle/wall{icon_state = "swallc2"; dir = 2},/area/centcom/evac) +"aLM" = (/obj/machinery/computer/secure_data,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) +"aLN" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) +"aLO" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) +"aLP" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/stamp,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) +"aLQ" = (/obj/structure/table,/obj/item/device/flash,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) +"aLR" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) +"aLS" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/centcom/evac) +"aLT" = (/turf/space,/area/shuttle/escape_pod3/centcom) +"aLU" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) +"aLV" = (/obj/machinery/door/window/northright{base_state = "right"; dir = 4; icon_state = "right"; name = "Security Desk"; req_access_txt = "103"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/evac) +"aLW" = (/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/centcom/evac) +"aLX" = (/obj/structure/stool/bed,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aLY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/centcom/evac) +"aLZ" = (/obj/machinery/door/airlock/hatch{name = "Rest Room"; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/centcom/evac) +"aMa" = (/turf/simulated/shuttle/wall{icon_state = "swall2"; dir = 2},/area/centcom/evac) +"aMb" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aMc" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aMd" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aMe" = (/turf/unsimulated/wall,/area) +"aMf" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/centcom/evac) +"aMg" = (/turf/simulated/shuttle/wall{icon_state = "swallc4"; dir = 2},/area/centcom/evac) +"aMh" = (/obj/machinery/door/airlock/hatch{name = "Cockpit"; req_access_txt = "109"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/centcom/evac) +"aMi" = (/turf/space,/area/centcom/suppy) +"aMj" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aMk" = (/obj/structure/stool/bed/chair{dir = 4; name = "Prosecution"},/turf/simulated/shuttle/floor,/area/centcom/evac) +"aMl" = (/obj/structure/filingcabinet,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aMm" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/space,/area/supply/dock) +"aMn" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aMo" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/supply/dock) +"aMp" = (/turf/simulated/shuttle/wall{icon_state = "swall15"; dir = 2},/area/supply/dock) +"aMq" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/supply/dock) +"aMr" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/supply/dock) +"aMs" = (/obj/structure/table,/obj/item/weapon/storage/lockbox,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aMt" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aMu" = (/obj/machinery/computer/shuttle,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aMv" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aMw" = (/obj/structure/table,/obj/item/weapon/paper_bin,/turf/simulated/shuttle/floor,/area/centcom/evac) +"aMx" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/supply/dock) +"aMy" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/supply/dock) +"aMz" = (/turf/simulated/shuttle/floor,/area/supply/dock) +"aMA" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/supply/dock) +"aMB" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/supply/dock) +"aMC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/centcom/evac) +"aMD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/centcom/evac) +"aME" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/centcom/evac) +"aMF" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/supply/dock) +"aMG" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/plating,/area/supply/dock) +"aMH" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/centcom/suppy) +"aMI" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/supply/dock) +"aMJ" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/supply/dock) +"aMK" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/supply/dock) +"aML" = (/turf/unsimulated/wall,/area/centcom/control) +"aMM" = (/turf/unsimulated/wall/fakedoor,/area/centcom/control) +"aMN" = (/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/control) +"aMO" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) +"aMP" = (/turf/unsimulated/floor{icon_state = "green"; dir = 5},/area/centcom/control) +"aMQ" = (/turf/unsimulated/wall,/area/centcom/prison) +"aMR" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/control) +"aMS" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/control) +"aMT" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/control) +"aMU" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 5},/area/centcom/control) +"aMV" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{name = "plating"},/area/centcom/prison) +"aMW" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) +"aMX" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control) +"aMY" = (/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) +"aMZ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control) +"aNa" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape/centcom) +"aNb" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"aNc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"aNd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"aNe" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape/centcom) +"aNf" = (/obj/machinery/door/poddoor{id = "CentComPort"; name = "security door"},/turf/unsimulated/floor{dir = 1; icon_state = "loadingarea"},/area/centcom/control) +"aNg" = (/obj/machinery/door/airlock/centcom{name = "Centcom Security"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) +"aNh" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/obj{anchored = 1; icon_state = "floor3"; layer = 1; name = "floor"},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape/centcom) +"aNi" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/extinguisher,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aNj" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"aNk" = (/obj/machinery/computer/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"aNl" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aNm" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/obj{anchored = 1; icon_state = "floor3"; layer = 1; name = "floor"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape/centcom) +"aNn" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) +"aNo" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/centcom/control) +"aNp" = (/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "CentComPort"; name = "Security Doors"; pixel_y = 28; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) +"aNq" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape/centcom) +"aNr" = (/obj/machinery/computer/atmos_alert,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aNs" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"aNt" = (/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"aNu" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"aNv" = (/obj/machinery/computer/security,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aNw" = (/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/control) +"aNx" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Centcom Customs"; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) +"aNy" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) +"aNz" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aNA" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"aNB" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aNC" = (/turf/unsimulated/wall,/area/centcom/ferry) +"aND" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) +"aNE" = (/obj/structure/table,/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/weapon/stamp/denied{pixel_x = 4; pixel_y = -2},/obj/item/weapon/paper/centcom,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) +"aNF" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/shuttle/escape/centcom) +"aNG" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape/centcom) +"aNH" = (/obj/machinery/status_display,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape/centcom) +"aNI" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access_txt = "19"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"aNJ" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/escape/centcom) +"aNK" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_y = 4},/obj/item/weapon/pen,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) +"aNL" = (/obj/structure/mirror{pixel_y = 32},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) +"aNM" = (/obj/structure/dresser,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) +"aNN" = (/obj/machinery/door/poddoor/preopen{id = "CentComPort"; name = "security door"},/turf/unsimulated/floor{dir = 1; icon_state = "loadingarea"},/area/centcom/control) +"aNO" = (/turf/unsimulated/wall,/area/centcom/evac) +"aNP" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/obj/item/weapon/extinguisher,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aNQ" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aNR" = (/obj/structure/stool,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) +"aNS" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) +"aNT" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area) +"aNU" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/control) +"aNV" = (/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/control) +"aNW" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) +"aNX" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"aNY" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aNZ" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aOa" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) +"aOb" = (/obj/machinery/door/airlock/centcom{name = "Dressing Room"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) +"aOc" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/control) +"aOd" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/control) +"aOe" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/centcom/control) +"aOf" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/centcom/control) +"aOg" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/evac) +"aOh" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/centcom/evac) +"aOi" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/centcom/evac) +"aOj" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aOk" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) +"aOl" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/ferry) +"aOm" = (/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry) +"aOn" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) +"aOo" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/ferry) +"aOp" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/control) +"aOq" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/control) +"aOr" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac) +"aOs" = (/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/evac) +"aOt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"aOu" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"aOv" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) +"aOw" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) +"aOx" = (/turf/unsimulated/wall,/area/syndicate_mothership) +"aOy" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport1/centcom) +"aOz" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/transport1/centcom) +"aOA" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/transport1/centcom) +"aOB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/transport1/centcom) +"aOC" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/transport1/centcom) +"aOD" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area/shuttle/transport1/centcom) +"aOE" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/ferry) +"aOF" = (/turf/unsimulated/wall/fakeglass,/area/centcom/control) +"aOG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"aOH" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) +"aOI" = (/obj/structure/flora/grass/brown,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) +"aOJ" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) +"aOK" = (/obj/structure/flora/grass/both,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) +"aOL" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/transport1/centcom) +"aOM" = (/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"aON" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport1/centcom) +"aOO" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/transport1/centcom) +"aOP" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"aOQ" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/transport1/centcom) +"aOR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/ferry) +"aOS" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 6},/area/centcom/ferry) +"aOT" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/evac) +"aOU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) +"aOV" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; req_access_txt = "0"},/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape/centcom) +"aOW" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/device/radio/intercom{pixel_x = 25},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aOX" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"aOY" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"aOZ" = (/obj/machinery/door/airlock/external{name = "Ferry Airlock"; req_access_txt = "0"},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) +"aPa" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/ferry) +"aPb" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/centcom/ferry) +"aPc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) +"aPd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"aPe" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"aPf" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall,/area/centcom/evac) +"aPg" = (/obj/structure/flora/bush,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) +"aPh" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport1/centcom) +"aPi" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/transport1/centcom) +"aPj" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/transport1/centcom) +"aPk" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"aPl" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 5},/area/centcom/ferry) +"aPm" = (/obj/machinery/door/airlock/centcom{name = "Transport Shuttle"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) +"aPn" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) +"aPo" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/transport1/centcom) +"aPp" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/transport1/centcom) +"aPq" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/ferry) +"aPr" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/evac) +"aPs" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aPt" = (/turf/unsimulated/wall/fakeglass,/area/centcom/ferry) +"aPu" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership) +"aPv" = (/turf/unsimulated/wall,/area/centcom/holding) +"aPw" = (/turf/unsimulated/wall/fakedoor{name = "Shuttle Bay B"},/area/centcom/holding) +"aPx" = (/obj/machinery/door/airlock/centcom{name = "Centcom Security"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) +"aPy" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/centcom/evac) +"aPz" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aPA" = (/obj/machinery/status_display,/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/escape/centcom) +"aPB" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aPC" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_station/start) +"aPD" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_station/start) +"aPE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor/shutters{id = "syndieshutters"; name = "blast shutters"},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"aPF" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/poddoor/shutters{id = "syndieshutters"; name = "blast shutters"},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"aPG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/poddoor/shutters{id = "syndieshutters"; name = "blast shutters"},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"aPH" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/syndicate_station/start) +"aPI" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) +"aPJ" = (/obj/machinery/sleeper{dir = 8; icon_state = "sleeper-open"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aPK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"aPL" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"aPM" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aPN" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aPO" = (/obj/structure/table,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aPP" = (/obj/machinery/computer/syndicate_station{req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aPQ" = (/obj/structure/table,/obj/machinery/door_control{id = "syndieshutters"; name = "remote shutter control"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aPR" = (/obj/structure/computerframe,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aPS" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) +"aPT" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/syndicate_mothership) +"aPU" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/syndicate_mothership) +"aPV" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/grass/both,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership) +"aPW" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/tree/pine,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership) +"aPX" = (/turf/unsimulated/wall,/area/tdome/tdomeobserve) +"aPY" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/tdome/tdomeobserve) +"aPZ" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/tdome/tdomeobserve) +"aQa" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdomeobserve) +"aQb" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/tdome/tdomeobserve) +"aQc" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 5},/area/tdome/tdomeobserve) +"aQd" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 28; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aQe" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) +"aQf" = (/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) +"aQg" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) +"aQh" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aQi" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aQj" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership) +"aQk" = (/obj/item/weapon/storage/fancy/crayons,/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) +"aQl" = (/obj/machinery/washing_machine,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) +"aQm" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) +"aQn" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) +"aQo" = (/turf/unsimulated/wall/fakeglass,/area/tdome/tdomeobserve) +"aQp" = (/turf/unsimulated/floor{icon_state = "neutral"; dir = 8},/area/tdome/tdomeobserve) +"aQq" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdomeobserve) +"aQr" = (/turf/unsimulated/floor{icon_state = "neutral"; dir = 4},/area/tdome/tdomeobserve) +"aQs" = (/obj/machinery/door/window/northleft{name = "Centcom Security"; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) +"aQt" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) +"aQu" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) +"aQv" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) +"aQw" = (/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"aQx" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/shuttle/escape/centcom) +"aQy" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 10},/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aQz" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_y = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aQA" = (/obj/structure/closet/syndicate/personal,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aQB" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"aQC" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) +"aQD" = (/obj/structure/stool/bed/chair/comfy/teal,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) +"aQE" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/wiki/engineering_hacking,/obj/item/weapon/book/manual/robotics_cyborgs,/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/item/weapon/book/manual/detective,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) +"aQF" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) +"aQG" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) +"aQH" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) +"aQI" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) +"aQJ" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) +"aQK" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape/centcom) +"aQL" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/escape/centcom) +"aQM" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/escape/centcom) +"aQN" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape/centcom) +"aQO" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_station/start) +"aQP" = (/obj/machinery/door/window{name = "Cockpit"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aQQ" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_station/start) +"aQR" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/grass/brown,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership) +"aQS" = (/obj/item/weapon/paper{info = "GET DAT FUCKEN DISK"; name = "memo"},/obj/structure/noticeboard{pixel_x = -32; pixel_y = 0},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"aQT" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"aQU" = (/obj/machinery/door/airlock/centcom{name = "Study"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"aQV" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) +"aQW" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/tdome/tdomeobserve) +"aQX" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/escape/centcom) +"aQY" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aQZ" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aRa" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_surround"; dir = 8},/area/syndicate_mothership) +"aRb" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 6},/area/syndicate_mothership) +"aRc" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = -2; pixel_y = 5},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"aRd" = (/obj/structure/table/woodentable,/obj/item/pizzabox{ismessy = 1},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"aRe" = (/obj/structure/stool,/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"aRf" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (NORTHWEST)"; icon_state = "podhatch"; dir = 9},/area/syndicate_mothership) +"aRg" = (/obj/structure/stool/bed/chair/comfy/lime{icon_state = "comfychair_lime"; dir = 1},/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) +"aRh" = (/obj/structure/table/woodentable,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) +"aRi" = (/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/tdome/tdomeobserve) +"aRj" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/tdome/tdomeobserve) +"aRk" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) +"aRl" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/syndicate_mothership) +"aRm" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/syndicate_mothership) +"aRn" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"aRo" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = 5; pixel_y = -2; step_x = 0},/obj/item/toy/cards/deck/syndicate{icon_state = "deck_syndicate_full"; pixel_x = -6; pixel_y = 6},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"aRp" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (WEST)"; icon_state = "podhatch"; dir = 8},/area/syndicate_mothership) +"aRq" = (/turf/unsimulated/floor{icon_state = "red"; dir = 10},/area/tdome/tdomeobserve) +"aRr" = (/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/tdome/tdomeobserve) +"aRs" = (/turf/unsimulated/floor{icon_state = "green"},/area/tdome/tdomeobserve) +"aRt" = (/turf/unsimulated/floor{icon_state = "green"; dir = 6},/area/tdome/tdomeobserve) +"aRu" = (/turf/unsimulated/wall/fakedoor{name = "Centcom Security"},/area/centcom/evac) +"aRv" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership) +"aRw" = (/turf/unsimulated/floor,/area/syndicate_mothership) +"aRx" = (/obj/machinery/door/airlock/external{req_access_txt = "150"},/turf/unsimulated/floor,/area/syndicate_mothership) +"aRy" = (/obj/machinery/door/poddoor/shutters{id = "nukeop_ready"; name = "shuttle dock"},/turf/unsimulated/floor,/area/syndicate_mothership) +"aRz" = (/obj/effect/landmark{name = "Syndicate-Uplink"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aRA" = (/turf/unsimulated/wall/fakeglass,/area/syndicate_mothership) +"aRB" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (SOUTHWEST)"; icon_state = "podhatch"; dir = 10},/area/syndicate_mothership) +"aRC" = (/obj/structure/urinal{pixel_y = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) +"aRD" = (/obj/structure/toilet{pixel_y = 8},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/obj/machinery/door/window{name = "Tactical Toilet"; opacity = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) +"aRE" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aRF" = (/obj/structure/table,/obj/item/weapon/gun/energy/ionrifle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aRG" = (/obj/machinery/door/poddoor{auto_close = 300; id = "smindicate"; name = "outer blast door"},/obj/machinery/door_control{id = "smindicate"; name = "external door control"; pixel_x = -26; pixel_y = 0; req_access_txt = "150"},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"aRH" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_station/start) +"aRI" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 5},/area/syndicate_mothership) +"aRJ" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) +"aRK" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) +"aRL" = (/obj/structure/table/woodentable,/obj/item/device/syndicatedetonator{desc = "This gaudy button can be used to instantly detonate syndicate bombs that have been activated on the station. It is also fun to press."},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) +"aRM" = (/obj/machinery/door/airlock/centcom{name = "Restroom"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"aRN" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) +"aRO" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) +"aRP" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'FOURTH WALL'."; name = "\improper FOURTH WALL"; pixel_x = -32},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) +"aRQ" = (/obj/structure/table,/obj/item/device/aicard,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aRR" = (/obj/machinery/door_control{id = "nukeop_ready"; name = "mission launch control"; pixel_x = -26; pixel_y = 0; req_access_txt = "150"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) +"aRS" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) +"aRT" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) +"aRU" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Uplink Management Control"; req_access_txt = "150"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) +"aRV" = (/obj/structure/mopbucket,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) +"aRW" = (/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) +"aRX" = (/obj/structure/stool/bed/chair,/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) +"aRY" = (/obj/machinery/door/window{dir = 4; name = "Equipment Room"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aRZ" = (/obj/machinery/door/airlock/external{req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSa" = (/obj/machinery/computer/telecrystals/boss,/turf/unsimulated/floor{tag = "icon-podhatch (NORTHEAST)"; icon_state = "podhatch"; dir = 5},/area/syndicate_mothership) +"aSb" = (/obj/structure/sign/map/left{pixel_y = -32},/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_left"; name = "skeletal minibar"},/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) +"aSc" = (/obj/structure/sign/map/right{pixel_y = -32},/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_right"; name = "skeletal minibar"},/obj/item/weapon/reagent_containers/food/drinks/bottle/gin,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) +"aSd" = (/turf/unsimulated/wall/fakedoor{name = "Thunderdome"},/area/tdome/tdomeobserve) +"aSe" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) +"aSf" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Equipment Room"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSg" = (/obj/machinery/atmospherics/pipe/simple{dir = 10},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"aSh" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSi" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership) +"aSj" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSk" = (/turf/unsimulated/wall,/area/wizard_station) +"aSl" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/tdome/tdomeobserve) +"aSm" = (/obj/machinery/recharge_station,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSn" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSo" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/table,/obj/item/stack/medical/bruise_pack,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSp" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/table,/obj/item/stack/medical/ointment,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSq" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/device/assembly/signaler,/obj/item/clothing/glasses/night,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSr" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/clothing/glasses/night,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSs" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/assembly/infra,/obj/item/clothing/glasses/night,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSt" = (/obj/structure/table,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/clothing/glasses/night,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSu" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/clothing/glasses/night,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSv" = (/obj/structure/bookcase{name = "Forbidden Knowledge"},/obj/effect/decal/cleanable/cobweb,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aSw" = (/obj/structure/bookcase{name = "Forbidden Knowledge"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aSx" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aSy" = (/obj/machinery/librarycomp,/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aSz" = (/obj/machinery/vending/magivend,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aSA" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aSB" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/weapon/storage/backpack/satchel,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/wizard_station) +"aSC" = (/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/wizard_station) +"aSD" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/wiz,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/wizard_station) +"aSE" = (/turf/unsimulated/wall,/area/tdome) +"aSF" = (/obj/machinery/igniter,/turf/simulated/floor,/area/tdome) +"aSG" = (/turf/simulated/floor,/area/tdome) +"aSH" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSI" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSJ" = (/obj/structure/table,/obj/item/device/sbeacondrop/bomb,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSK" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/wizard_station) +"aSL" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/wizard_station) +"aSM" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/wizard_station) +"aSN" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"aSO" = (/obj/machinery/door/poddoor{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"aSP" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) +"aSQ" = (/obj/machinery/door/poddoor{id = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{name = "plating"},/area/tdome) +"aSR" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/tdome) +"aSS" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/tdome) +"aST" = (/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) +"aSU" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"aSV" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSW" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSX" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSY" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/grenade/syndieminibomb,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aSZ" = (/obj/structure/bookcase{name = "bookcase (Tactics)"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aTa" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aTb" = (/obj/structure/table/woodentable,/obj/item/weapon/tray,/obj/item/weapon/reagent_containers/food/snacks/burger/spell,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station) +"aTc" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/wizard_station) +"aTd" = (/obj/structure/table/woodentable,/obj/effect/landmark{name = "Teleport-Scroll"},/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/wizard_station) +"aTe" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) +"aTf" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) +"aTg" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aTh" = (/obj/item/weapon/weldingtool,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aTi" = (/obj/machinery/door/window{dir = 1; name = "Secure Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aTj" = (/obj/item/weapon/crowbar,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aTk" = (/obj/structure/stool/bed/chair,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aTl" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) +"aTm" = (/obj/machinery/camera{pixel_x = 11; pixel_y = -9; network = list("thunder"); c_tag = "Red Team"},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) +"aTn" = (/turf/simulated/floor/bluegrid,/area/tdome) +"aTo" = (/obj/machinery/flasher{id = "flash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome) +"aTp" = (/obj/machinery/camera{pixel_x = 12; pixel_y = -10; network = list("thunder"); c_tag = "Green Team"},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) +"aTq" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aTr" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aTs" = (/obj/structure/bookcase,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aTt" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aTu" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aTv" = (/obj/structure/table/woodentable,/obj/item/weapon/dice/d20,/obj/item/weapon/dice,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aTw" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) +"aTx" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) +"aTy" = (/obj/machinery/camera{pixel_x = 10; network = list("thunder"); c_tag = "Arena"},/turf/simulated/floor/bluegrid,/area/tdome) +"aTz" = (/obj/structure/closet/crate/internals,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aTA" = (/obj/structure/closet/crate/medical,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aTB" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"aTC" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aTD" = (/obj/machinery/teleport/hub,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) +"aTE" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aTF" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aTG" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) +"aTH" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) +"aTI" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/space,/area/syndicate_station/start) +"aTJ" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/syndicate_station/start) +"aTK" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/space,/area/syndicate_station/start) +"aTL" = (/obj/machinery/door/poddoor{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) +"aTM" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/wizard_station) +"aTN" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/wizard_station) +"aTO" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 5},/area/wizard_station) +"aTP" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"aTQ" = (/obj/structure/showcase,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) +"aTR" = (/obj/structure/table/reinforced,/obj/structure/kitchenspike,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) +"aTS" = (/obj/structure/table/reinforced,/obj/structure/kitchenspike,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) +"aTT" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/showcase,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) +"aTU" = (/obj/machinery/door/poddoor{id = "thunderdomehea"; name = "Heavy Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"aTV" = (/obj/effect/decal/remains/human,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) +"aTW" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) +"aTX" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/wizard_station) +"aTY" = (/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) +"aTZ" = (/obj/effect/decal/cleanable/blood,/mob/living/carbon/monkey,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) +"aUa" = (/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) +"aUb" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"aUc" = (/turf/unsimulated/wall,/area/tdome/tdomeadmin) +"aUd" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/tdome/tdomeadmin) +"aUe" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/tdome/tdomeadmin) +"aUf" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/tdome/tdomeadmin) +"aUg" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) +"aUh" = (/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) +"aUi" = (/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) +"aUj" = (/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) +"aUk" = (/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) +"aUl" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) +"aUm" = (/obj/effect/decal/cleanable/molten_item,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) +"aUn" = (/turf/unsimulated/wall/fakeglass,/area/wizard_station) +"aUo" = (/obj/structure/rack,/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) +"aUp" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) +"aUq" = (/obj/structure/rack,/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) +"aUr" = (/obj/machinery/computer/security/telescreen{pixel_y = -32},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) +"aUs" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) +"aUt" = (/turf/unsimulated/wall/fakedoor{name = "Thunderdome Admin"},/area/tdome/tdomeadmin) +"aUu" = (/obj/structure/table,/obj/machinery/door_control{id = "thunderdomehea"; name = "Heavy Supply Control"; pixel_y = 0; req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) +"aUv" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) +"aUw" = (/obj/structure/table,/obj/machinery/door_control{id = "thunderdomegen"; name = "General Supply Control"; pixel_y = 0; req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) +"aUx" = (/obj/structure/table,/obj/machinery/door_control{id = "thunderdome"; name = "Main Blast Doors Control"; pixel_y = 0; req_access_txt = "102"},/obj/machinery/computer/security/telescreen{pixel_y = -32},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) +"aUy" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) +"aUz" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) +"aUA" = (/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) +"aUB" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) +"aUC" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) +"aUD" = (/obj/structure/rack,/obj/item/device/camera,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) +"aUE" = (/obj/structure/rack,/obj/item/toy/sword,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) +"aUF" = (/obj/structure/rack,/obj/item/toy/gun,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) +"aUG" = (/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) +"aUH" = (/turf/unsimulated/beach/sand,/area/centcom/holding) +"aUI" = (/obj/effect/overlay/palmtree_r,/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/centcom/holding) +"aUJ" = (/obj/effect/overlay/palmtree_l,/turf/unsimulated/beach/sand,/area/centcom/holding) +"aUK" = (/obj/structure/table,/obj/item/clothing/head/that,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) +"aUL" = (/obj/structure/stool{pixel_y = 8},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) +"aUM" = (/obj/item/device/camera,/turf/unsimulated/beach/sand,/area/centcom/holding) +"aUN" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) +"aUO" = (/obj/structure/table,/obj/item/weapon/lighter/zippo,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) +"aUP" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) +"aUQ" = (/obj/structure/table,/obj/item/weapon/dice/d20,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/holding) +"aUR" = (/obj/structure/stool{pixel_y = 8},/obj/item/clothing/head/bandana{pixel_y = -10},/obj/item/clothing/glasses/sunglasses,/turf/unsimulated/beach/sand,/area/centcom/holding) +"aUS" = (/obj/structure/stool{pixel_y = 8},/turf/unsimulated/beach/sand,/area/centcom/holding) +"aUT" = (/obj/structure/rack,/obj/item/clothing/head/that,/obj/item/clothing/under/suit_jacket,/obj/item/clothing/tie/waistcoat,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) +"aUU" = (/obj/item/weapon/beach_ball,/turf/unsimulated/beach/sand,/area/centcom/holding) +"aUV" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) +"aUW" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) +"aUX" = (/turf/unsimulated/beach/coastline,/area/centcom/holding) +"aUY" = (/obj/item/clothing/head/collectable/paper,/turf/unsimulated/beach/coastline,/area/centcom/holding) +"aUZ" = (/obj/structure/rack,/obj/item/clothing/shoes/laceup,/obj/item/clothing/under/suit_jacket/female{desc = "A black trouser suit for women. Very formal."; name = "black suit"; pixel_x = 3; pixel_y = 1},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) +"aVa" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) +"aVb" = (/turf/unsimulated/beach/water,/area/centcom/holding) +"aVc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"aVd" = (/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/holding) +"aVe" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"aVf" = (/obj/effect/landmark{name = "Holding Facility"},/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/holding) +"aVg" = (/turf/simulated/floor{icon_state = "solarpanel"},/area) +"aVh" = (/turf/simulated/wall/r_wall,/area/AIsattele) +"aVi" = (/obj/structure/computerframe,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVj" = (/obj/machinery/teleport/station,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVk" = (/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVl" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVm" = (/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVn" = (/obj/structure/rack,/obj/item/clothing/gloves/yellow,/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVo" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVp" = (/obj/item/weapon/stock_parts/cell,/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVq" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVr" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVs" = (/obj/structure/closet,/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVt" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVu" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area) +"aVv" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVw" = (/obj/structure/closet/crate,/obj/item/device/aicard,/obj/item/device/multitool,/turf/simulated/floor/plating/airless,/area/AIsattele) +"aVx" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area) +"aVy" = (/obj/machinery/power/solar/fake,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/djstation/solars) +"aVz" = (/turf/simulated/floor/plating/airless,/area/djstation/solars) +"aVA" = (/turf/simulated/wall,/area/djstation) +"aVB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/djstation) +"aVC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/djstation) +"aVD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/djstation) +"aVE" = (/turf/simulated/floor/plating,/area/djstation) +"aVF" = (/obj/machinery/telecomms/relay/preset/ruskie,/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/djstation) +"aVG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/djstation) +"aVH" = (/obj/machinery/power/terminal,/turf/simulated/floor/plating,/area/djstation) +"aVI" = (/obj/item/device/multitool,/turf/simulated/floor/plating,/area/djstation) +"aVJ" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor/plating,/area/djstation) +"aVK" = (/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/djstation) +"aVL" = (/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/plating,/area/djstation) +"aVM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/djstation) +"aVN" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 0; name = "Worn-out APC"; pixel_y = -24},/turf/simulated/floor/plating,/area/djstation) +"aVO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/storage/box/lights/mixed,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/djstation) +"aVP" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/djstation) +"aVQ" = (/obj/structure/rack,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/djstation) +"aVR" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"},/turf/simulated/floor/plating,/area/djstation) +"aVS" = (/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aVT" = (/obj/machinery/vending/snack,/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aVU" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aVV" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aVW" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aVX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/djstation) +"aVY" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor{icon_state = "bar"},/area/djstation) +"aVZ" = (/turf/simulated/floor{icon_state = "bar"},/area/djstation) +"aWa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/djstation) +"aWb" = (/turf/simulated/floor{icon_state = "grimy"},/area/djstation) +"aWc" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{icon_state = "grimy"},/area/djstation) +"aWd" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor{icon_state = "grimy"},/area/djstation) +"aWe" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "grimy"},/area/djstation) +"aWf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/djstation) +"aWg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/djstation) +"aWh" = (/obj/structure/table,/obj/machinery/microwave{pixel_y = 8},/turf/simulated/floor{icon_state = "bar"},/area/djstation) +"aWi" = (/obj/machinery/door/airlock/glass{name = "Kitchen"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWj" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 0; dir = 8; freerange = 1; listening = 1; name = "Pirate Radio Listening Channel"; pixel_x = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWk" = (/obj/structure/stool/bed/chair/office/light,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWl" = (/obj/machinery/door/airlock/glass{name = "Cabin"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWm" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/djstation) +"aWn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/djstation) +"aWo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/djstation) +"aWp" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{icon_state = "bar"},/area/djstation) +"aWq" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "bar"},/area/djstation) +"aWr" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor{icon_state = "bar"},/area/djstation) +"aWs" = (/obj/structure/table,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWt" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 1; dir = 8; freerange = 1; listening = 0; name = "Pirate Radio Broadcast Channel"; pixel_x = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWu" = (/obj/structure/table,/obj/item/weapon/paper/djstation,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWv" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/floor{icon_state = "grimy"},/area/djstation) +"aWw" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/djstation) +"aWx" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "grimy"},/area/djstation) +"aWy" = (/obj/structure/closet,/turf/simulated/floor{icon_state = "grimy"},/area/djstation) +"aWz" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/djstation) +"aWA" = (/obj/machinery/door/airlock{name = "Restroom"; req_access_txt = "0"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/djstation) +"aWB" = (/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWC" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless,/area) +"aWD" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/djstation) +"aWE" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWF" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/space_heater,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWG" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/rack{dir = 4},/obj/item/clothing/under/soviet,/obj/item/clothing/head/ushanka,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWH" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/light/small,/turf/simulated/floor{icon_state = "freezerfloor"},/area/djstation) +"aWI" = (/obj/structure/toilet{pixel_y = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/djstation) +"aWJ" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation) +"aWL" = (/obj/machinery/door/airlock/external{name = "Ruskie DJ Station"; req_access = null; req_access_txt = "0"},/turf/simulated/floor/plating,/area/djstation) +"aWM" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/simulated/floor/plating/airless,/area) +"aWN" = (/turf/simulated/wall/r_wall,/area/derelict/teleporter) +"aWO" = (/turf/simulated/floor/plating/airless,/area/derelict/teleporter) +"aWP" = (/turf/simulated/floor/airless,/area/derelict/teleporter) +"aWQ" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/derelict/teleporter) +"aWR" = (/obj/machinery/light_construct/small{dir = 1},/turf/simulated/floor/airless{icon_state = "damaged3"},/area/derelict/teleporter) +"aWS" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/airless,/area/derelict/teleporter) +"aWT" = (/obj/machinery/teleport/station,/turf/simulated/floor/airless,/area/derelict/teleporter) +"aWU" = (/obj/machinery/teleport/hub,/turf/simulated/floor/airless,/area/derelict/teleporter) +"aWV" = (/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor/plating/airless,/area/derelict/teleporter) +"aWW" = (/obj/structure/table,/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/floor/airless,/area/derelict/teleporter) +"aWX" = (/turf/simulated/floor/airless{icon_state = "damaged4"},/area/derelict/teleporter) +"aWY" = (/obj/machinery/power/apc{dir = 0; name = "Worn-out APC"; pixel_y = -24},/turf/simulated/floor/airless,/area/derelict/teleporter) +"aWZ" = (/turf/simulated/mineral,/area) +"aXa" = (/turf/simulated/floor/plating/asteroid/airless,/area) +"aXb" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area) +"aXc" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area) +"aXd" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/airless,/area) +"aXe" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area) +"aXf" = (/turf/simulated/floor/plating/asteroid/airless,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area) +"aXg" = (/obj/effect/landmark/corpse/clown,/turf/simulated/floor/airless,/area) +"aXh" = (/turf/simulated/floor/airless,/area) +"aXi" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area) +"aXj" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area) +"aXk" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area) +"aXl" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/space,/area) +"aXm" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/asteroid/airless,/area) +"aXn" = (/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area) +"aXo" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area) +"aXp" = (/obj/item/weapon/shard{icon_state = "medium"},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/asteroid/airless,/area) +"aXq" = (/obj/effect/landmark/corpse/clown{name = "Clown Pilot"},/turf/simulated/floor/airless,/area) +"aXr" = (/obj/item/weapon/paper{info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"},/turf/simulated/floor/airless,/area) +"aXs" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area) +"aXt" = (/obj/item/weapon/shard,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/airless,/area) +"aXu" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/airless,/area) +"aXv" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area) +"aXw" = (/turf/simulated/floor/airless,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area) +"aXx" = (/obj/item/weapon/pickaxe,/turf/simulated/floor/airless,/area) +"aXy" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area) +"aXz" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/clothing/shoes/clown_shoes{desc = "These shoes appear var-edited!."; name = "uhangi's shoes"; slowdown = -1},/turf/simulated/floor/airless,/area) +"aXA" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area) +"aXB" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area) +"aXC" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area) +"aXD" = (/turf/simulated/mineral/random,/area) +"aXE" = (/turf/simulated/floor/plating/asteroid/airless/cave,/area) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -2707,7 +2756,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaayAaBaayAazpayZaBWayAayAayAayAaBXaBYaAJaBZaCaayAayAayAayAaCbayZaAKayAaCcayAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaamayAaCdazeayZayZayKayZaCeaBLaBMaAUaBOaBPaCfayZayZayZayZazgaCgayAaChaCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaayAaAeaCjaAaaAaaAfayZaCeaBLaBMaBNaBOaBPaCfayZaCkaAyaAyaClaCmayAaCnaCoaCpaCpaCpaCqaCpaCpaCpaCpaCraCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaaaaaaaaayAaCsaCtaCuayAaAhayAayAaBXaBYaCvaBZaCaayAayAaAlayAaCwaCxaCyayAaamaamaamaamaamaamaamaamaamaamaCnaCzaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaaaaaaaaayAaCsaCtaCuayAaAhayAayAaBXaBYaCvaBZaCaayAayAaAlayAaCwaCxaCyayAaamaamaamaamaamaamaamaamaamaamaCnaCzaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayAayAayAayAayAayAayAayAayAayAaCAaCBaCCaBAaCDaAUaCEaBEaCFaCGaCHaCIayAayAayAayAayAayAayAayAayAaaaaaaaaaaaaaaaaamaCJaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayAaCKaCLaCMaCMaCMaCMaCLaCNayAayZaCOaCPaCQaCRayZaCSaCQaCPaCTaCUayAaCVaCWaCXaCYaCXaCXaCWaCZayAaaaaaaaaaaaaaaaaaaaDaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaayAaDbaCKaCNaCKaCNaCKaCNaDcaDdaDeaDfaDgaDhaBMayZaBOaDiaDjaDkaDlaDmaDnaDoaCZaDoaCZaDoaCZaDpaDqaaaaaaaaaaaaaaaaaaaDaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -2717,56 +2766,56 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayAaDXaDXaDXaDXaDXaDXaDXaDXayAayAayAayAayAayAayAayAayAayAayAayAaCIayAayAayAayAayAayAayAayAayAaamaamaamaamaamaamaDYaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaDWaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaamaamaamaamaamaamaamaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamabLaDZaEaaDZaDZaDZaDZaDZaDZaDZaDZaDZaDZaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEbaEcaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamabLabLaEdaEeaEdaEeaEeaEeaEeaEeaEeaEfaEeaDZaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEgaEhaCpaEiaCpaCpaCpaCpaCpaCpaEiaCpaCpaCpaCpaEiaEjaEkaEcaamaDZaDZaDZaDZaDZaDZaDZaElaEmaEnaEnaEnaEnaEoaEeaEpaamaamaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaCnaEqaEcaEpaEeaEeaEfaEeaEeaEeaEeaEraEsaEtaEtaEuaEraEeaEvaamaamaamaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaCnaCzaEwaEeaEeaEmaEnaEnaEnaEnaExaEyaEzaEAaEBaEraEeaEwaamaamaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaDZaECaDZaEeaEeaEraEDaEEaEFaEGaDZaEHaEIaEJaEKaELaEeaDZaDZaDZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaEpaEMaENaEeaEOaExaEPaEQaEQaEQaDZaERaESaETaEUaEraEeaEVaEWaDZaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaEvaEXaEeaEeaEeaEYaEZaFaaFbaEQaFcaFdaFeaFfaFgaFhaFiaFjaFkaFlaFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaEwaFnaEfaEeaFoaFpaFqaEQaEQaEQaFraFdaFsaFtaFuaFvaFwaFxaEWaDZaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaDZaFyaDZaEeaEeaFzaFAaFBaFCaFDaFEaFFaFGaFHaFIaEYaEeaDZaDZaDZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEpaEeaEeaFKaFvaFvaFvaFvaFLaFMaFNaEtaFOaFPaEeaEpaamaamaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEwaEeaEeaENaEeaEeaEeaEeaEYaFRaFSaFTaFUaEYaEeaEvaamaamaamaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDZaDZaDZaDZaDZaDZaDZaElaEYaEYaEYaEYaEYaEYaEeaEwaamaamaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamabLabLaEdaEeaEdaEeaEeaEeaEeaEeaEeaENaEeaDZaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamabLaDZaEaaDZaDZaDZaDZaDZaDZaDZaDZaDZaDZaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaamaamaamaamaamaamaamaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaaaaFJaFJaFJaFJaFJaaaaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaaaaFQaFQaFQaFQaFQaaaaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaaaaFJaFJaFJaFJaFJaaaaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaaaaFQaFQaFQaFQaFQaaaaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaFJaFJaFJaFJaFJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaFQaFQaFQaFQaFQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaaaaFVaFVaFVaFVaFVaaaaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaaaaFVaFVaFVaFVaFVaaaaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaFVaFVaFVaFVaFVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaamaamaamaamaamaamaamaamaamaDZaDZaDZaDZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamabLaDZaEaaDZaDZaDZaDZaDZaDZaDZaDZaDZaEbaEcaDZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEdaEeaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamabLabLaEfaEgaEfaEgaEgaEgaEgaEgaEhaEiaEjaEkaElaEmaEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEoaEpaCpaEqaCpaCpaCpaCpaCpaCpaEqaCpaCpaCpaCpaEqaEraEsaEeaamaDZaDZaDZaDZaDZaDZaDZaEtaEuaEvaEvaEvaEwaExaEyaEzaEcaDZaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaCnaEAaEeaEBaEgaEgaECaEgaEgaEgaEgaEDaEEaEFaEFaEGaEHaEgaEIaEIaEIaEIaEIaEIaEIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaCnaCzaEJaEgaEgaEuaEvaEvaEvaEvaEKaELaEMaENaEOaEHaEgaEIaEPaEQaERaESaEPaEIaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaDZaETaDZaEgaEgaEDaEUaEVaEWaEXaDZaEYaEZaFaaFbaFcaFdaEIaFeaFfaEPaFfaFgaEIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaEBaFhaFiaEgaFjaEKaFkaFlaFlaFlaDZaFmaFnaFoaFpaEHaFqaEIaFraFsaFtaFuaFvaEIaamaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaFwaFxaEgaEgaEgaFyaFzaFAaFBaFlaFCaFDaFEaFFaFGaEHaFqaEIaFHaFIaEPaFJaFKaEIaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaEJaFLaECaEgaFMaFNaFOaFlaFlaFlaFPaFDaFQaFRaFSaFTaFUaFVaFWaFXaFYaFZaGaaEIaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaDZaGbaDZaEgaEgaEHaGcaGdaGeaGfaGgaGhaGiaGjaGkaFyaGlaGmaGnaGoaGpaGqaGraEIaamaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEBaEgaEgaGtaGuaGuaGuaGuaGvaGwaGxaEFaGyaGzaEgaEIaGAaGBaGCaGDaGEaEIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEJaEgaEgaFiaEgaEgaEgaEgaFyaGGaGHaGIaGJaFyaEgaEIaGEaGEaGKaGLaGMaEIaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDZaDZaDZaDZaDZaDZaDZaEtaFyaFyaFyaFyaFyaFyaEgaGNaGOaGNaEIaEIaEIaEIaGPaGPaGPaGPaGPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamabLabLaEfaEgaEfaEgaEgaEgaEgaEgaEgaFiaEgaEgaEgaGQaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamabLaDZaEaaDZaDZaDZaDZaDZaDZaDZaDZaDZaGRaGRaDZaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaamaamaamaamaamaamaamaamaamaDZaDZaDZaDZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaaaaGsaGsaGsaGsaGsaaaaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaaaaGFaGFaGFaGFaGFaaaaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaaaaGsaGsaGsaGsaGsaaaaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaaaaGFaGFaGFaGFaGFaaaaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaGsaGsaGsaGsaGsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaGFaGFaGFaGFaGFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaaaaGSaGSaGSaGSaGSaaaaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaaaaGSaGSaGSaGSaGSaaaaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaGSaGSaGSaGSaGSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -2788,73 +2837,73 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} (1,1,2) = {" -aFWaFXaFYaFZaGaaGbaGcaGdaFWaGeaGfaGgaGhaGiaGjaGkaGcaGbaGfaFYaFZaGdaGgaGaaGiaGeaGkaGlaGmaGnaGoaGpaGqaGraGsaGtaGuaGvaGwaGxaGyaGzaGAaGBaGCaGDaGEaGFaGGaGsaGtaGuaGvaGwaGxaGyaGzaGAaGBaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGfaGIaGJaGKaGLaGMaGNaGOaGPaGQaGRaGSaGTaGUaGVaGWaGNaGMaGRaGJaGKaGOaGSaGLaGUaGQaFXaGpaGqaGraGXaGYaGZaHaaGwaHbaHcaHdaGlaGmaGnaGoaGpaGqaGraGXaGYaGZaHaaHeaHbaHcaHdaGlaGmaGnaGoaGpaGFaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGiaGLaGQaGTaGOaGVaGJaGNaGRaGMaGUaGPaGWaGKaGSaGIaGJaGVaGUaGQaGTaGNaGPaGOaGKaGMaGaaGmaGnaGoaGpaGqaGraGXaGtaGZaHaaHeaHbaHcaHdaGlaGmaGnaGnaGoaGpaGqaGXaGYaGZaHaaHeaHbaHcaHdaGlaGmaGCaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFZaGOaGMaGWaGNaGSaGQaGJaGUaGVaGKaGRaGIaGTaGPaGLaGQaGSaGKaGMaGWaGJaGRaGNaGTaGVaGdaGXaGYaGZaHaaHeaHbaHcaGzaGlaGmaGnaGoaGpaGqaGraGXaGYaGraGXaGYaGZaHcaHdaGlaGmaGnaGoaGpaGqaGraGXaGtaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGhaGNaGVaGIaGJaGPaGMaGQaGKaGSaGTaGUaGLaGWaGRaGOaGMaGPaGTaGVaGIaGQaGUaGJaGWaGSaGcaHcaHdaGlaGmaGnaGoaGpaGFaGraGXaGYaGZaHaaHeaHbaHcaHdaGoaGpaGqaGraGpaGqaGraGXaGYaGZaHaaHeaHbaHcaGzaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGkaGJaGSaGLaGQaGRaGVaGMaGTaGPaGWaGKaGOaGIaGUaGNaGVaGRaGWaGSaGLaGMaGKaGQaGIaGPaFYaGXaGYaGZaHaaHeaHbaHcaGzaGlaGmaGnaGoaGpaGqaGraGXaGYaGZaHaaHeaHbaHcaHdaGlaGmaGnaGoaGpaGqaGraGXaGtaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFXaGQaGPaGOaGMaGUaGSaGVaGWaGRaGIaGTaGNaGLaGKaGJaGSaGUaGIaGPaGOaGVaGTaGMaGLaGRaGeaGnaGoaGpaGqaGraGXaGYaGuaHaaHeaHbaHcaHdaGlaGmaGnaGoaGlaGmaGnaGoaGYaGZaHaaHeaHbaHcaHdaGlaGmaGnaGDaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGaaGMaGRaGNaGVaGKaGPaGSaGIaGUaGLaGWaGJaGOaGTaGQaGPaGKaGLaGRaGNaGSaGWaGVaGOaGUaGbaHeaHbaHcaHdaGlaGmaGnaGDaGpaGqaGraGXaGYaGZaHaaHeaHfaHgaHhaHiaHjaHkaGoaGpaGqaGraGXaGYaGZaHaaHeaGxaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGdaGVaGUaGJaGSaGTaHlaGPaGLaHmaHnaHoaHpaHqaHraHsaHtaHuaGOaGUaHvaGPaGIaGSaGNaGKaGjaHdaGlaGmaGnaGoaGpaGqaGGaGXaGYaGZaHaaHeaHbaHcaHdaHhaHwaHxaHyaHzaHAaGraGXaGYaGZaHaaHeaHbaHcaHdaGAaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGcaGSaGKaGQaGPaHBaGUaGRaGOaHqaHCaHDaHEaHFaHGaHHaHIaHJaGNaGKaGQaHlaGLaGPaGJaGTaGgaGZaHaaHeaHbaHcaHdaGlaGBaGnaGoaGpaGqaGraGXaGYaGZaHKaHLaHMaHNaHwaHOaGmaGnaGoaGpaGqaGraGXaGYaGZaGvaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFYaGPaGTaGMaGRaGIaGKaGUaHPaHHaHIaHQaHRaHSaHEaHDaHTaHUaHVaGTaGMaGUaGOaGRaGQaGWaFWaGoaGpaGqaGraGXaGYaGZaGvaHeaHbaHcaHdaGlaGmaGnaGoaHgaHMaHNaHwaHxaHWaHaaHeaHbaHcaHdaGlaGmaGnaGoaGEaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGeaGRaGWaGVaGUaGLaGTaGKaHVaHDaHTaHXaHCaHYaHRaHQaHZaHGaIaaGWaGVaGKaGNaGUaGMaGIaGfaGYaGZaHaaHeaHbaHcaHdaGAaGmaGnaGoaGpaGqaGraGXaGYaIbaIcaIdaIeaHgaIdaGlaGmaGnaGoaGpaGqaGraGXaGYaGuaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGbaGUaGIaGSaGKaGOaGWaGTaIaaHQaHZaHUaHIaHHaHCaHXaHFaHEaIfaGIaGSaGTaGJaGKaGVaGLaGiaGmaGnaGoaGpaGqaGraGXaGtaGZaHaaHeaHbaHcaHdaGlaGmaGqaGoaGpaGqaGraHaaGYaGZaHaaHeaHbaHcaHdaGlaGmaGCaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGjaGKaGLaGPaGTaGNaGIaGWaIfaHXaHFaHGaHTaHDaHIaHUaHSaHRaIgaGLaGPaGWaGQaGTaGSaGOaFZaGqaGraGXaGYaGZaHaaHeaGxaHcaHdaGlaGmaGnaGoaGpaGqaGnaGZaHaaHeaHbaGXaHbaHcaHdaGlaGmaGnaGoaGpaGqaGGaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGgaGTaGOaGRaGWaGJaGLaGIaIgaHUaHSaHEaHZaHQaHTaHGaHYaHCaIhaGOaGRaGIaGMaGWaGPaGNaGhaHaaHeaHbaHcaHdaGlaGmaGCaGoaGpaGqaGraGXaGYaGZaHaaIcaHfaIiaIbaIjaHiaGnaGoaGpaGqaGraGXaGYaGZaHaaGwaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFWaGWaGNaGUaGIaGQaGOaGLaIhaHGaHYaHRaHFaHXaHZaHEaHHaHIaIkaGNaGUaGLaGVaGIaGRaGJaGkaHbaHcaHdaGlaGmaGnaGoaGEaGqaGraGXaGYaGZaHaaHeaHbaHiaIlaImaInaIoaIpaGpaGqaGraGXaGYaGZaHaaHeaHbaGyaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGfaGIaGJaGKaGLaGMaGNaGOaIkaHEaHHaHCaHSaHUaHFaHRaHDaHTaIqaGJaGKaGOaGSaGLaGUaGQaFXaGraGXaGYaGZaHaaHeaHbaGyaHdaGlaGmaGnaGoaGpaGqaGraIraIsaItaIuaIvaIwaHcaHdaGlaGmaGnaGoaGpaGqaGraGsaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGiaGLaGQaGTaGOaGVaGJaGNaIqaHRaHDaHIaHYaHGaHSaHCaHQaHZaIxaGQaGTaGNaGPaGOaGKaGMaGaaHeaHbaHcaHdaGlaGmaGnaGDaGpaGqaGraGXaGYaGZaHaaHeaIdaIyaIzaIAaIsaIBaGoaGpaGqaGraGXaGYaGZaHaaHeaGxaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFZaGOaGMaGWaGNaGSaGQaGJaIxaHCaHQaHTaHHaHEaHYaHIaHXaHFaICaGMaGWaGJaGRaGNaGTaGVaGdaGnaGoaGpaGqaGraGXaGYaGuaHaaHeaHbaHcaHdaGlaGmaGnaHjaIraIDaHfaIiaIbaGZaHaaHeaHbaHcaHdaGlaGmaGnaGDaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGhaGNaGVaGIaGJaGPaGMaGQaICaHIaHXaHZaHDaHRaHHaHTaHUaHSaIEaGVaGIaGQaGUaGJaGWaGSaGcaGZaHaaHeaHbaHcaHdaGlaGBaGnaGoaGpaGqaGraGXaGYaGZaHaaHeaHbaHcaHdaGlaGmaGnaGoaGpaGqaGraGXaGYaGZaGvaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGkaGJaGSaGLaGQaGRaGVaGMaIEaHTaHUaHFaHQaHCaHDaHZaHGaHYaIFaGSaGLaGMaGKaGQaGIaGPaFYaGpaGqaGraGXaGYaGZaHaaGwaHbaHcaHdaGlaGmaGnaGoaGpaGqaGraGXaGYaGZaHaaHeaHbaHcaHdaGlaGmaGnaGoaGpaGFaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFXaGQaGPaGOaGMaGUaGSaGVaIFaHZaHGaHSaHXaHIaHQaHFaHEaHHaIGaGPaGOaGVaGTaGMaGLaGRaGeaHdaGlaGmaGnaGoaGpaGqaGGaGXaGYaGZaHaaHeaHbaHcaHdaGlaGmaGnaGoaGpaGqaGraGXaGYaGZaHaaHeaHbaHcaHdaGAaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGaaGMaGRaGNaGVaGKaGPaGSaIGaHFaHEaHYaHUaHTaHXaHSaHRaHDaIHaGRaGNaGSaGWaGVaGOaGUaGbaHbaHcaHdaGlaGmaGnaGoaGEaGqaGraGXaGYaGZaHaaHeaHbaHcaHdaGlaGmaGnaGoaGpaGqaGraGXaGYaGZaHaaHeaHbaGyaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGdaGVaGUaGJaGSaGTaGRaGPaIHaHSaHRaHHaHGaHZaHUaHYaHCaHQaIIaGUaGJaGPaGIaGSaGNaGKaGjaGqaGraGXaGYaGZaHaaHeaGxaHcaHdaGlaGmaGnaGoaGpaGqaGraGXaGYaGZaHaaHeaHbaHcaHdaGlaGmaGnaGoaGpaGqaGGaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGcaGSaGKaGQaGPaGWaGUaGRaIIaHYaHCaHDaHEaHFaHGaHHaHIaHXaHPaGKaGQaGRaGLaGPaGJaGTaGgaGYaGZaHaaHeaHbaHcaHdaGAaGmaGnaGoaGpaGqaGraGXaGYaGZaHaaHeaHbaHcaHdaGlaGmaGnaGoaGpaGqaGraGXaGYaGuaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFYaGPaGTaGMaGRaGIaGKaGUaHPaHHaHIaHQaHRaHSaHEaHDaHTaHUaHVaGTaGMaGUaGOaGRaGQaGWaFWaGoaGpaGqaGraGXaGYaGZaGvaGwaGxaGyaGzaGAaGBaGCaGDaGEaGFaGGaGsaGtaGuaGvaGwaGxaGyaGzaGAaGBaGCaGDaGEaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGeaGRaGWaGVaGUaGLaGTaGKaHVaHDaHTaHXaHCaHYaHRaHQaHZaHGaIaaGWaGVaGKaGNaGUaGMaGIaGfaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGbaGUaGIaGSaGKaGOaGWaGTaIaaHQaHZaHUaHIaHHaHCaHXaHFaHEaIfaGIaGSaGTaGJaGKaGVaGLaGiaGHaFWaFXaFYaFZaGaaGbaGcaGdaFWaGeaGfaGgaGhaGiaGjaGkaGcaGbaGfaFYaFZaGdaGgaGaaGiaGeaGkaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGjaGKaGLaGPaGTaGNaGIaGWaIfaHXaHFaHGaHTaHDaHIaHUaHSaHRaIgaGLaGPaGWaGQaGTaGSaGOaFZaGHaGfaGIaGJaGKaGLaGMaGNaGOaGPaGQaGRaGSaGTaGUaGVaGWaGNaGMaGRaGJaGKaGOaGSaGLaGUaGQaFXaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGgaGTaGOaGRaGWaGJaGLaGIaIgaHPaHUaHQaHRaHGaHDaHCaHFaHVaIhaGOaGRaGIaGMaGWaGPaGNaGhaGHaGiaGLaGQaGTaGOaGVaGJaGNaGRaGMaGUaGPaGWaGKaGSaGIaGJaGVaGUaGQaGTaGNaGPaGOaGKaGMaGaaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFWaGWaGNaGUaGIaGQaGOaGLaGSaHVaIkaIgaICaIqaIfaIEaIIaIaaGPaGNaGUaGLaGVaGIaGRaGJaGkaGHaFZaGOaGMaGWaGNaGSaGQaGJaGUaGVaGKaGRaGIaGTaGPaGLaGQaGSaGKaGMaGWaGJaGRaGNaGTaGVaGdaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGfaGIaGJaGKaGLaGMaGNaGOaGPaGQaGRaGSaGTaGUaGVaGWaGNaGMaGRaGJaGKaGOaGSaGLaGUaGQaFXaGHaGhaGNaGVaGIaGJaGPaGMaGQaGKaGSaGTaGUaGLaGWaGRaGOaGMaGPaGTaGVaGIaGQaGUaGJaGWaGSaGcaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGiaGLaGQaGTaGOaGVaGJaGNaGRaGMaGUaGPaGWaGKaGSaGIaGJaGVaGUaGQaGTaGNaGPaGOaGKaGMaGaaGHaGkaGJaGSaGLaGQaGRaGVaGMaGTaGPaGWaGKaGOaGIaGUaGNaGVaGRaGWaGSaGLaGMaGKaGQaGIaGPaFYaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFZaGOaGMaGWaGNaGSaGQaGJaGUaGVaGKaGRaGIaGTaGPaGLaGQaGSaGKaGMaGWaGJaGRaGNaGTaGVaGdaGHaFXaGQaGPaGOaGMaGUaGSaGVaGWaGRaGIaGTaGNaGLaGKaGJaGSaGUaGIaGPaGOaGVaGTaGMaGLaGRaGeaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGhaGNaGVaGIaGJaGPaGMaGQaGKaGSaGTaGUaGLaGWaGRaGOaGMaGPaGTaGVaGIaGQaGUaGJaGWaGSaGcaGHaGaaGMaGRaGNaGVaGKaGPaGSaGIaGUaGLaGWaGJaGOaGTaGQaGPaGKaGLaGRaGNaGSaGWaGVaGOaGUaGbaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGkaGJaGSaGLaGQaGRaGVaGMaGTaGPaGWaGKaGOaGIaGUaGNaGVaGRaGWaGSaGLaGMaGKaGQaGIaGPaFYaGHaGdaGVaGUaGJaGSaGTaGRaGPaIJaHmaHnaHoaHpaHqaHraHsaHtaHuaIKaGUaGJaGPaGIaGSaGNaGKaGjaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFXaGQaGPaGOaGMaGUaGSaGVaGWaGRaGIaGTaGNaGLaGKaGJaGSaGUaGIaGPaGOaGVaGTaGMaGLaGRaGeaGHaGcaGSaGKaGQaGPaGWaGUaGRaIKaILaIMaINaIOaIPaIQaIRaISaITaIUaGKaGQaGRaGLaGPaGJaGTaGgaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGaaGjaGiaFYaGgaGhaGfaFWaGaaFZaGdaFXaGeaGcaGkaGbaGfaGhaGdaGiaFYaFWaFXaGgaGcaFZaGbaGHaFYaGPaGTaGMaGRaGIaGKaGUaIUaIRaISaIVaIWaIXaIOaINaIYaIZaHvaGTaGMaGUaGOaGRaGQaGWaFWaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGdaGVaGUaGJaGSaGTaGRaGPaGLaGKaGOaGIaGQaGNaGWaGMaGRaGTaGOaGUaGJaGPaGIaGSaGNaGKaGjaGHaGeaGRaGWaGVaGUaGLaGTaGKaHvaINaIYaITaIMaILaIWaIVaJaaIQaJbaGWaGVaGKaGNaGUaGMaGIaGfaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGcaGSaGKaGQaGPaGWaGUaGRaGOaGTaGNaGLaGMaGJaGIaGVaGUaGWaGNaGKaGQaGRaGLaGPaGJaGTaGgaGHaGbaGUaGIaGSaGKaGOaGWaGTaJbaIVaJaaIZaISaIRaIMaITaIPaIOaJcaGIaGSaGTaGJaGKaGVaGLaGiaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFYaGPaGTaGMaGRaGIaGKaGUaGNaGWaGJaGOaGVaGQaGLaGSaGKaGIaGJaGTaGMaGUaGOaGRaGQaGWaFWaGHaGjaGKaGLaGPaGTaGNaGIaGWaJcaITaIPaIQaIYaINaISaIZaIXaIWaJdaGLaGPaGWaGQaGTaGSaGOaFZaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGeaGRaGWaGVaGUaGLaGTaGKaGJaGIaGQaGNaGSaGMaGOaGPaGTaGLaGQaGWaGVaGKaGNaGUaGMaGIaGfaGHaGgaGTaGOaGRaGWaGJaGLaGIaJdaGSaGOaIOaJaaIVaIYaIQaGNaGKaJeaGOaGRaGIaGMaGWaGPaGNaGhaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGbaGUaGIaGSaGKaGOaGWaGTaGQaGLaGMaGJaGPaGVaGNaGRaGWaGOaGMaGIaGSaGTaGJaGKaGVaGLaGiaGHaFWaGWaGNaGUaGIaHpaHnaJfaJgaJhaHqaIWaIPaITaJaaIOaGJaGTaJiaGNaGUaGLaGVaGIaGRaGJaGkaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGjaGKaGLaGPaGTaGNaGIaGWaGMaGOaGVaGQaGRaGSaGJaGUaGIaGNaGVaGLaGPaGWaGQaGTaGSaGOaFZaGHaGfaGIaGJaGKaGLaJcaILaIXaIQaIOaIRaIMaIXaIZaIPaIWaGQaGWaHlaGJaGKaGOaGSaGLaGUaGQaFXaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGgaGTaGOaGRaGWaGJaGLaGIaGVaGNaGSaGMaGUaGPaGQaGKaGLaGJaGSaGOaGRaGIaGMaGWaGPaGNaGhaGHaGiaGLaGQaGTaGOaJdaIRaILaIOaIWaINaISaILaIQaIXaIMaHuaHuaHuaHuaJjaGNaGPaGOaGKaGMaGaaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFWaGWaGNaGUaGIaGQaGOaGLaJkaJlaJhaHJaJmaGRaJnaJoaHnaJpaJqaGNaGUaGLaGVaGIaGRaGJaGkaGHaFZaGOaGMaGWaGNaJeaINaIRaIWaIMaIVaIYaIRaIOaILaISaITaIPaIMaIVaHBaGJaGRaGNaGTaGVaGdaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGfaGIaGJaGKaGLaGMaGNaGOaJraJsaJtaJuaJvaGOaJwaJxaJyaJzaJAaGRaGKaGOaGSaGLaGUaGQaFXaGHaGhaGNaGVaGIaGJaJiaIVaINaIMaISaITaJaaINaIWaIRaIYaIZaIXaISaITaJBaGQaGUaGJaGWaGSaGcaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGiaGLaGQaGTaGOaGVaGJaGNaJAaJCaJDaJEaJFaGNaJGaJHaJIaJJaJKaGUaGTaGNaGPaGOaGKaGMaGaaGHaGkaGJaGSaGLaGQaHlaITaIVaISaIYaIZaIPaIVaIMaINaJaaIQaILaIYaIZaIJaGMaGKaGQaGIaGPaFYaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFZaGOaGMaGWaGNaGSaGQaGJaJKaJLaJMaJtaJnaGJaJraJNaJOaJPaJQaGKaGWaGJaGRaGNaGTaGVaGdaGHaFXaGQaGPaGOaJcaJRaIZaITaIYaJaaIQaIXaITaISaIVaIPaIOaIRaJaaIQaJSaHJaJjaGMaGLaGRaGeaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGhaGNaGVaGIaGJaGPaGMaGQaJQaJuaJTaJDaJUaGQaJAaJVaJzaJWaJvaGTaGIaGQaGUaGJaGWaGSaGcaGHaGaaGMaGRaGNaJdaIMaIQaIZaJaaIPaIOaILaIZaIYaITaIXaIWaINaIPaIOaILaIZaHBaGVaGOaGUaGbaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGkaGJaGSaGLaGQaGRaGVaGMaJvaJraJFaJQaJkaGMaJKaJqaJwaJAaJFaGWaGLaGMaGKaGQaGIaGPaFYaGHaGdaGVaGUaGJaJeaISaIOaIQaIPaIXaIWaIRaIQaJaaIZaILaIMaIVaIXaIWaIRaIQaJBaGSaGNaGKaGjaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFXaGQaGPaGOaGMaGUaGSaGVaGQaGLaGMaGJaGPaGVaGNaGRaGWaGOaGMaGIaGOaGVaGTaGMaGLaGRaGeaGHaGcaGSaGKaGQaJiaIYaIWaIOaIXaILaIMaINaIOaIPaIQaIRaISaITaILaIMaINaIOaIJaGPaGJaGTaGgaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGaaGMaGRaGNaGVaGKaGPaGSaGIaGUaGLaGWaGJaGOaGTaGQaGPaGKaGLaGRaGNaGSaGWaGVaGOaGUaGbaGHaFYaGPaGTaGMaHlaJaaIMaIWaILaIRaISaIVaIWaIXaIOaINaIYaIZaIRaISaIVaIWaIKaGRaGQaGWaFWaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGdaGVaGUaGJaGSaGTaGRaGPaGLaGKaGOaGIaGQaGNaGWaGMaGRaGTaGOaGUaGJaGPaGIaGSaGNaGKaGjaGHaGeaGRaGWaGVaJXaIPaISaIMaIRaINaIYaITaIMaILaIWaIVaJaaIQaINaIYaITaIMaIUaGUaGMaGIaGfaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGcaGSaGKaGQaGPaGWaGUaGRaGOaGTaGNaGLaGMaGJaGIaGVaGUaGWaGNaGKaGQaGRaGLaGPaGJaGTaGgaGHaGbaGUaGIaGSaJYaIXaIYaISaINaIVaJaaIZaISaIRaIMaITaIPaIOaIVaJaaIZaISaHvaGKaGVaGLaGiaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aFYaGPaGTaGMaGRaGIaGKaGUaGNaGWaGJaGOaGVaGQaGLaGSaGKaGIaGJaGTaGMaGUaGOaGRaGQaGWaFWaGHaGjaGKaGLaGPaJjaILaJaaIYaIVaITaGLaIQaIYaINaISaIZaGOaIWaITaIPaIQaIYaJbaGTaGSaGOaFZaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGeaGRaGWaGVaGUaGLaGTaGKaGJaGIaGQaGNaGSaGMaGOaGPaGTaGLaGQaGWaGVaGKaGNaGUaGMaGIaGfaGHaGgaGTaGOaGRaHBaIRaIPaJaaITaILaGSaIVaIWaIQaINaIMaGLaIRaIZaIXaIOaJaaJcaGWaGPaGNaGhaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGbaGUaGIaGSaGKaGOaGWaGTaGQaGLaGMaGJaGPaGVaGNaGRaGWaGOaGMaGIaGSaGTaGJaGKaGVaGLaGiaGHaFWaGWaGNaGUaJBaINaIXaIPaIZaIRaGPaGVaGKaGRaGMaGTaGOaINaIQaILaIWaIPaJdaGIaGRaGJaGkaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGjaGhaGdaGfaGkaFYaGaaFXaGjaGcaGgaGbaGiaFWaGeaFZaGaaFYaGgaGdaGfaFXaGbaGkaFWaGcaFZaGHaGfaGIaGJaGKaIHaIfaHPaIIaIkaIaaIqaIhaIEaIxaIgaIFaHPaIfaIqaHVaICaIIaIhaGLaGUaGQaFXaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGVaGTaGOaGRaGWaGJaGLaGIaGVaGNaGSaGMaGUaGPaGQaGKaGLaGJaGSaGOaGRaGIaGMaGWaGPaGNaGKaGHaGiaGLaGQaGTaGOaGVaGJaGNaGRaGMaGUaGPaGWaGKaGSaGIaGJaGVaGUaGQaGTaGNaGPaGOaGKaGMaGaaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGSaGWaGNaGUaGIaGQaGOaGLaGSaGJaGPaGVaGKaGRaGMaGTaGOaGQaGPaGNaGUaGLaGVaGIaGRaGJaGTaGHaFZaGOaGMaGWaGNaGSaGQaGJaGUaGVaGKaGRaGIaGTaGPaGLaGQaGSaGKaGMaGWaGJaGRaGNaGTaGVaGdaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGPaGIaGJaGKaGLaGMaGNaGOaGPaGQaGRaGSaGTaGUaGVaGWaGNaGMaGRaGJaGKaGOaGSaGLaGUaGQaGWaGHaGhaGNaGVaGIaGJaGPaGMaGQaGKaGSaGTaGUaGLaGWaGRaGOaGMaGPaGTaGVaGIaGQaGUaGJaGWaGSaGcaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGRaGLaGQaGTaGOaGVaGJaGNaGRaGMaGUaGPaGWaGKaGSaGIaGJaGVaGUaGQaGTaGNaGPaGOaGKaGMaGIaGHaGkaGJaGSaGLaGQaGRaGVaGMaGTaGPaGWaGKaGOaGIaGUaGNaGVaGRaGWaGSaGLaGMaGKaGQaGIaGPaFYaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGUaGOaGMaGWaGNaGSaGQaGJaGUaGVaGKaGRaGIaGTaGPaGLaGQaGSaGKaGMaGWaGJaGRaGNaGTaGVaGLaGHaFXaGQaGPaGOaGMaGUaGSaGVaGWaGRaGIaGTaGNaGLaGKaGJaGSaGUaGIaGPaGOaGVaGTaGMaGLaGRaGeaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGKaGNaGVaGIaGJaGPaGMaGQaGKaGSaGTaGUaGLaGWaGRaGOaGMaGPaGTaGVaGIaGQaGUaGJaGWaGSaGOaGHaGaaGjaGiaFYaGgaGhaGfaFWaGaaFZaGdaFXaGeaGcaGkaGbaGfaGhaGdaGiaFYaFWaFXaGgaGcaFZaGbaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGTaGJaGSaGLaGQaGRaGVaGMaGTaGPaGWaGKaGOaGIaGUaGNaGVaGRaGWaGSaGLaGMaGKaGQaGIaGPaGNaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGTaGUaGVaGWaGXaGYaGZaHaaGTaHbaHcaHdaHeaHfaHgaHhaGZaGYaHcaGVaGWaHaaHdaGXaHfaHbaHhaHiaHjaHkaHlaHmaHnaHoaHpaHqaHraHsaHtaHuaHvaHwaHxaHyaHzaHAaHBaHCaHDaHpaHqaHraHsaHtaHuaHvaHwaHxaHyaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHcaHFaHGaHHaHIaHJaHKaHLaHMaHNaHOaHPaHQaHRaHSaHTaHKaHJaHOaHGaHHaHLaHPaHIaHRaHNaGUaHmaHnaHoaHUaHVaHWaHXaHtaHYaHZaIaaHiaHjaHkaHlaHmaHnaHoaHUaHVaHWaHXaIbaHYaHZaIaaHiaHjaHkaHlaHmaHCaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHfaHIaHNaHQaHLaHSaHGaHKaHOaHJaHRaHMaHTaHHaHPaHFaHGaHSaHRaHNaHQaHKaHMaHLaHHaHJaGXaHjaHkaHlaHmaHnaHoaHUaHqaHWaHXaIbaHYaHZaIaaHiaHjaHkaHkaHlaHmaHnaHUaHVaHWaHXaIbaHYaHZaIaaHiaHjaHzaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGWaHLaHJaHTaHKaHPaHNaHGaHRaHSaHHaHOaHFaHQaHMaHIaHNaHPaHHaHJaHTaHGaHOaHKaHQaHSaHaaHUaHVaHWaHXaIbaHYaHZaHwaHiaHjaHkaHlaHmaHnaHoaHUaHVaHoaHUaHVaHWaHZaIaaHiaHjaHkaHlaHmaHnaHoaHUaHqaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHeaHKaHSaHFaHGaHMaHJaHNaHHaHPaHQaHRaHIaHTaHOaHLaHJaHMaHQaHSaHFaHNaHRaHGaHTaHPaGZaHZaIaaHiaHjaHkaHlaHmaHCaHoaHUaHVaHWaHXaIbaHYaHZaIaaHlaHmaHnaHoaHmaHnaHoaHUaHVaHWaHXaIbaHYaHZaHwaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHhaHGaHPaHIaHNaHOaHSaHJaHQaHMaHTaHHaHLaHFaHRaHKaHSaHOaHTaHPaHIaHJaHHaHNaHFaHMaGVaHUaHVaHWaHXaIbaHYaHZaHwaHiaHjaHkaHlaHmaHnaHoaHUaHVaHWaHXaIbaHYaHZaIaaHiaHjaHkaHlaHmaHnaHoaHUaHqaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGUaHNaHMaHLaHJaHRaHPaHSaHTaHOaHFaHQaHKaHIaHHaHGaHPaHRaHFaHMaHLaHSaHQaHJaHIaHOaHbaHkaHlaHmaHnaHoaHUaHVaHraHXaIbaHYaHZaIaaHiaHjaHkaHlaHiaHjaHkaHlaHVaHWaHXaIbaHYaHZaIaaHiaHjaHkaHAaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGXaHJaHOaHKaHSaHHaHMaHPaHFaHRaHIaHTaHGaHLaHQaHNaHMaHHaHIaHOaHKaHPaHTaHSaHLaHRaGYaIbaHYaHZaIaaHiaHjaHkaHAaHmaHnaHoaHUaHVaHWaHXaIbaIcaIdaIeaIfaIgaIhaHlaHmaHnaHoaHUaHVaHWaHXaIbaHuaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHaaHSaHRaHGaHPaHQaIiaHMaHIaIjaIkaIlaImaInaIoaIpaIqaIraHLaHRaIsaHMaHFaHPaHKaHHaHgaIaaHiaHjaHkaHlaHmaHnaHDaHUaHVaHWaHXaIbaHYaHZaIaaIeaItaIuaIvaIwaIxaHoaHUaHVaHWaHXaIbaHYaHZaIaaHxaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGZaHPaHHaHNaHMaIyaHRaHOaHLaInaIzaIAaIBaICaIDaIEaIFaIGaHKaHHaHNaIiaHIaHMaHGaHQaHdaHWaHXaIbaHYaHZaIaaHiaHyaHkaHlaHmaHnaHoaHUaHVaHWaIHaIIaIJaIKaItaILaHjaHkaHlaHmaHnaHoaHUaHVaHWaHsaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGVaHMaHQaHJaHOaHFaHHaHRaIMaIEaIFaINaIOaIPaIBaIAaIQaIRaISaHQaHJaHRaHLaHOaHNaHTaGTaHlaHmaHnaHoaHUaHVaHWaHsaIbaHYaHZaIaaHiaHjaHkaHlaIdaIJaIKaItaIuaITaHXaIbaHYaHZaIaaHiaHjaHkaHlaHBaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHbaHOaHTaHSaHRaHIaHQaHHaISaIAaIQaIUaIzaIVaIOaINaIWaIDaIXaHTaHSaHHaHKaHRaHJaHFaHcaHVaHWaHXaIbaHYaHZaIaaHxaHjaHkaHlaHmaHnaHoaHUaHVaIYaIZaJaaJbaIdaJaaHiaHjaHkaHlaHmaHnaHoaHUaHVaHraHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGYaHRaHFaHPaHHaHLaHTaHQaIXaINaIWaIRaIFaIEaIzaIUaICaIBaJcaHFaHPaHQaHGaHHaHSaHIaHfaHjaHkaHlaHmaHnaHoaHUaHqaHWaHXaIbaHYaHZaIaaHiaHjaHnaHlaHmaHnaHoaHXaHVaHWaHXaIbaHYaHZaIaaHiaHjaHzaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHgaHHaHIaHMaHQaHKaHFaHTaJcaIUaICaIDaIQaIAaIFaIRaIPaIOaJdaHIaHMaHTaHNaHQaHPaHLaGWaHnaHoaHUaHVaHWaHXaIbaHuaHZaIaaHiaHjaHkaHlaHmaHnaHkaHWaHXaIbaHYaHUaHYaHZaIaaHiaHjaHkaHlaHmaHnaHDaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHdaHQaHLaHOaHTaHGaHIaHFaJdaIRaIPaIBaIWaINaIQaIDaIVaIzaJeaHLaHOaHFaHJaHTaHMaHKaHeaHXaIbaHYaHZaIaaHiaHjaHzaHlaHmaHnaHoaHUaHVaHWaHXaIZaIcaJfaIYaJgaIfaHkaHlaHmaHnaHoaHUaHVaHWaHXaHtaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGTaHTaHKaHRaHFaHNaHLaHIaJeaIDaIVaIOaICaIUaIWaIBaIEaIFaJhaHKaHRaHIaHSaHFaHOaHGaHhaHYaHZaIaaHiaHjaHkaHlaHBaHnaHoaHUaHVaHWaHXaIbaHYaIfaJiaJjaJkaJlaJmaHmaHnaHoaHUaHVaHWaHXaIbaHYaHvaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHcaHFaHGaHHaHIaHJaHKaHLaJhaIBaIEaIzaIPaIRaICaIOaIAaIQaJnaHGaHHaHLaHPaHIaHRaHNaGUaHoaHUaHVaHWaHXaIbaHYaHvaIaaHiaHjaHkaHlaHmaHnaHoaJoaJpaJqaJraJsaJtaHZaIaaHiaHjaHkaHlaHmaHnaHoaHpaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHfaHIaHNaHQaHLaHSaHGaHKaJnaIOaIAaIFaIVaIDaIPaIzaINaIWaJuaHNaHQaHKaHMaHLaHHaHJaGXaIbaHYaHZaIaaHiaHjaHkaHAaHmaHnaHoaHUaHVaHWaHXaIbaJaaJvaJwaJxaJpaJyaHlaHmaHnaHoaHUaHVaHWaHXaIbaHuaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGWaHLaHJaHTaHKaHPaHNaHGaJuaIzaINaIQaIEaIBaIVaIFaIUaICaJzaHJaHTaHGaHOaHKaHQaHSaHaaHkaHlaHmaHnaHoaHUaHVaHraHXaIbaHYaHZaIaaHiaHjaHkaIgaJoaJAaIcaJfaIYaHWaHXaIbaHYaHZaIaaHiaHjaHkaHAaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHeaHKaHSaHFaHGaHMaHJaHNaJzaIFaIUaIWaIAaIOaIEaIQaIRaIPaJBaHSaHFaHNaHRaHGaHTaHPaGZaHWaHXaIbaHYaHZaIaaHiaHyaHkaHlaHmaHnaHoaHUaHVaHWaHXaIbaHYaHZaIaaHiaHjaHkaHlaHmaHnaHoaHUaHVaHWaHsaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHhaHGaHPaHIaHNaHOaHSaHJaJBaIQaIRaICaINaIzaIAaIWaIDaIVaJCaHPaHIaHJaHHaHNaHFaHMaGVaHmaHnaHoaHUaHVaHWaHXaHtaHYaHZaIaaHiaHjaHkaHlaHmaHnaHoaHUaHVaHWaHXaIbaHYaHZaIaaHiaHjaHkaHlaHmaHCaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGUaHNaHMaHLaHJaHRaHPaHSaJCaIWaIDaIPaIUaIFaINaICaIBaIEaJDaHMaHLaHSaHQaHJaHIaHOaHbaIaaHiaHjaHkaHlaHmaHnaHDaHUaHVaHWaHXaIbaHYaHZaIaaHiaHjaHkaHlaHmaHnaHoaHUaHVaHWaHXaIbaHYaHZaIaaHxaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGXaHJaHOaHKaHSaHHaHMaHPaJDaICaIBaIVaIRaIQaIUaIPaIOaIAaJEaHOaHKaHPaHTaHSaHLaHRaGYaHYaHZaIaaHiaHjaHkaHlaHBaHnaHoaHUaHVaHWaHXaIbaHYaHZaIaaHiaHjaHkaHlaHmaHnaHoaHUaHVaHWaHXaIbaHYaHvaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHaaHSaHRaHGaHPaHQaHOaHMaJEaIPaIOaIEaIDaIWaIRaIVaIzaINaJFaHRaHGaHMaHFaHPaHKaHHaHgaHnaHoaHUaHVaHWaHXaIbaHuaHZaIaaHiaHjaHkaHlaHmaHnaHoaHUaHVaHWaHXaIbaHYaHZaIaaHiaHjaHkaHlaHmaHnaHDaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGZaHPaHHaHNaHMaHTaHRaHOaJFaIVaIzaIAaIBaICaIDaIEaIFaIUaIMaHHaHNaHOaHIaHMaHGaHQaHdaHVaHWaHXaIbaHYaHZaIaaHxaHjaHkaHlaHmaHnaHoaHUaHVaHWaHXaIbaHYaHZaIaaHiaHjaHkaHlaHmaHnaHoaHUaHVaHraHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGVaHMaHQaHJaHOaHFaHHaHRaIMaIEaIFaINaIOaIPaIBaIAaIQaIRaISaHQaHJaHRaHLaHOaHNaHTaGTaHlaHmaHnaHoaHUaHVaHWaHsaHtaHuaHvaHwaHxaHyaHzaHAaHBaHCaHDaHpaHqaHraHsaHtaHuaHvaHwaHxaHyaHzaHAaHBaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHbaHOaHTaHSaHRaHIaHQaHHaISaIAaIQaIUaIzaIVaIOaINaIWaIDaIXaHTaHSaHHaHKaHRaHJaHFaHcaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGYaHRaHFaHPaHHaHLaHTaHQaIXaINaIWaIRaIFaIEaIzaIUaICaIBaJcaHFaHPaHQaHGaHHaHSaHIaHfaHEaGTaGUaGVaGWaGXaGYaGZaHaaGTaHbaHcaHdaHeaHfaHgaHhaGZaGYaHcaGVaGWaHaaHdaGXaHfaHbaHhaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHgaHHaHIaHMaHQaHKaHFaHTaJcaIUaICaIDaIQaIAaIFaIRaIPaIOaJdaHIaHMaHTaHNaHQaHPaHLaGWaHEaHcaHFaHGaHHaHIaHJaHKaHLaHMaHNaHOaHPaHQaHRaHSaHTaHKaHJaHOaHGaHHaHLaHPaHIaHRaHNaGUaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHdaHQaHLaHOaHTaHGaHIaHFaJdaIMaIRaINaIOaIDaIAaIzaICaISaJeaHLaHOaHFaHJaHTaHMaHKaHeaHEaHfaHIaHNaHQaHLaHSaHGaHKaHOaHJaHRaHMaHTaHHaHPaHFaHGaHSaHRaHNaHQaHKaHMaHLaHHaHJaGXaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGTaHTaHKaHRaHFaHNaHLaHIaHPaISaJhaJdaJzaJnaJcaJBaJFaIXaHMaHKaHRaHIaHSaHFaHOaHGaHhaHEaGWaHLaHJaHTaHKaHPaHNaHGaHRaHSaHHaHOaHFaHQaHMaHIaHNaHPaHHaHJaHTaHGaHOaHKaHQaHSaHaaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHcaHFaHGaHHaHIaHJaHKaHLaHMaHNaHOaHPaHQaHRaHSaHTaHKaHJaHOaHGaHHaHLaHPaHIaHRaHNaGUaHEaHeaHKaHSaHFaHGaHMaHJaHNaHHaHPaHQaHRaHIaHTaHOaHLaHJaHMaHQaHSaHFaHNaHRaHGaHTaHPaGZaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHfaHIaHNaHQaHLaHSaHGaHKaHOaHJaHRaHMaHTaHHaHPaHFaHGaHSaHRaHNaHQaHKaHMaHLaHHaHJaGXaHEaHhaHGaHPaHIaHNaHOaHSaHJaHQaHMaHTaHHaHLaHFaHRaHKaHSaHOaHTaHPaHIaHJaHHaHNaHFaHMaGVaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGWaHLaHJaHTaHKaHPaHNaHGaHRaHSaHHaHOaHFaHQaHMaHIaHNaHPaHHaHJaHTaHGaHOaHKaHQaHSaHaaHEaGUaHNaHMaHLaHJaHRaHPaHSaHTaHOaHFaHQaHKaHIaHHaHGaHPaHRaHFaHMaHLaHSaHQaHJaHIaHOaHbaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHeaHKaHSaHFaHGaHMaHJaHNaHHaHPaHQaHRaHIaHTaHOaHLaHJaHMaHQaHSaHFaHNaHRaHGaHTaHPaGZaHEaGXaHJaHOaHKaHSaHHaHMaHPaHFaHRaHIaHTaHGaHLaHQaHNaHMaHHaHIaHOaHKaHPaHTaHSaHLaHRaGYaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHhaHGaHPaHIaHNaHOaHSaHJaHQaHMaHTaHHaHLaHFaHRaHKaHSaHOaHTaHPaHIaHJaHHaHNaHFaHMaGVaHEaHaaHSaHRaHGaHPaHQaHOaHMaJGaIjaIkaIlaImaInaIoaIpaIqaIraJHaHRaHGaHMaHFaHPaHKaHHaHgaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGUaHNaHMaHLaHJaHRaHPaHSaHTaHOaHFaHQaHKaHIaHHaHGaHPaHRaHFaHMaHLaHSaHQaHJaHIaHOaHbaHEaGZaHPaHHaHNaHMaHTaHRaHOaJHaJIaJJaJKaJLaJMaJNaJOaJPaJQaJRaHHaHNaHOaHIaHMaHGaHQaHdaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGXaHgaHfaGVaHdaHeaHcaGTaGXaGWaHaaGUaHbaGZaHhaGYaHcaHeaHaaHfaGVaGTaGUaHdaGZaGWaGYaHEaGVaHMaHQaHJaHOaHFaHHaHRaJRaJOaJPaJSaJTaJUaJLaJKaJVaJWaIsaHQaHJaHRaHLaHOaHNaHTaGTaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHaaHSaHRaHGaHPaHQaHOaHMaHIaHHaHLaHFaHNaHKaHTaHJaHOaHQaHLaHRaHGaHMaHFaHPaHKaHHaHgaHEaHbaHOaHTaHSaHRaHIaHQaHHaIsaJKaJVaJQaJJaJIaJTaJSaJXaJNaJYaHTaHSaHHaHKaHRaHJaHFaHcaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGZaHPaHHaHNaHMaHTaHRaHOaHLaHQaHKaHIaHJaHGaHFaHSaHRaHTaHKaHHaHNaHOaHIaHMaHGaHQaHdaHEaGYaHRaHFaHPaHHaHLaHTaHQaJYaJSaJXaJWaJPaJOaJJaJQaJMaJLaJZaHFaHPaHQaHGaHHaHSaHIaHfaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGVaHMaHQaHJaHOaHFaHHaHRaHKaHTaHGaHLaHSaHNaHIaHPaHHaHFaHGaHQaHJaHRaHLaHOaHNaHTaGTaHEaHgaHHaHIaHMaHQaHKaHFaHTaJZaJQaJMaJNaJVaJKaJPaJWaJUaJTaKaaHIaHMaHTaHNaHQaHPaHLaGWaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHbaHOaHTaHSaHRaHIaHQaHHaHGaHFaHNaHKaHPaHJaHLaHMaHQaHIaHNaHTaHSaHHaHKaHRaHJaHFaHcaHEaHdaHQaHLaHOaHTaHGaHIaHFaKaaHPaHLaJLaJXaJSaJVaJNaHKaHHaKbaHLaHOaHFaHJaHTaHMaHKaHeaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGYaHRaHFaHPaHHaHLaHTaHQaHNaHIaHJaHGaHMaHSaHKaHOaHTaHLaHJaHFaHPaHQaHGaHHaHSaHIaHfaHEaGTaHTaHKaHRaHFaImaIkaKcaKdaKeaInaJTaJMaJQaJXaJLaHGaHQaKfaHKaHRaHIaHSaHFaHOaHGaHhaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHgaHHaHIaHMaHQaHKaHFaHTaHJaHLaHSaHNaHOaHPaHGaHRaHFaHKaHSaHIaHMaHTaHNaHQaHPaHLaGWaHEaHcaHFaHGaHHaHIaJZaJIaJUaJNaJLaJOaJJaJUaJWaJMaJTaHNaHTaIiaHGaHHaHLaHPaHIaHRaHNaGUaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHdaHQaHLaHOaHTaHGaHIaHFaHSaHKaHPaHJaHRaHMaHNaHHaHIaHGaHPaHLaHOaHFaHJaHTaHMaHKaHeaHEaHfaHIaHNaHQaHLaKaaJOaJIaJLaJTaJKaJPaJIaJNaJUaJJaIraIraIraIraKgaHKaHMaHLaHHaHJaGXaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGTaHTaHKaHRaHFaHNaHLaHIaKhaKiaKeaIGaKjaHOaKkaKlaIkaKmaKnaHKaHRaHIaHSaHFaHOaHGaHhaHEaGWaHLaHJaHTaHKaKbaJKaJOaJTaJJaJSaJVaJOaJLaJIaJPaJQaJMaJJaJSaIyaHGaHOaHKaHQaHSaHaaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHcaHFaHGaHHaHIaHJaHKaHLaKoaKpaKqaKraKsaHLaKtaKuaKvaKwaKxaHOaHHaHLaHPaHIaHRaHNaGUaHEaHeaHKaHSaHFaHGaKfaJSaJKaJJaJPaJQaJXaJKaJTaJOaJVaJWaJUaJPaJQaKyaHNaHRaHGaHTaHPaGZaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHfaHIaHNaHQaHLaHSaHGaHKaKxaKzaKAaKBaKCaHKaKDaKEaKFaKGaKHaHRaHQaHKaHMaHLaHHaHJaGXaHEaHhaHGaHPaHIaHNaIiaJQaJSaJPaJVaJWaJMaJSaJJaJKaJXaJNaJIaJVaJWaJGaHJaHHaHNaHFaHMaGVaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGWaHLaHJaHTaHKaHPaHNaHGaKHaKIaKJaKqaKkaHGaKoaKKaKLaKMaKNaHHaHTaHGaHOaHKaHQaHSaHaaHEaGUaHNaHMaHLaJZaKOaJWaJQaJVaJXaJNaJUaJQaJPaJSaJMaJLaJOaJXaJNaKPaIGaKgaHJaHIaHOaHbaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHeaHKaHSaHFaHGaHMaHJaHNaKNaKraKQaKAaKRaHNaKxaKSaKwaKTaKsaHQaHFaHNaHRaHGaHTaHPaGZaHEaGXaHJaHOaHKaKaaJJaJNaJWaJXaJMaJLaJIaJWaJVaJQaJUaJTaJKaJMaJLaJIaJWaIyaHSaHLaHRaGYaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHhaHGaHPaHIaHNaHOaHSaHJaKsaKoaKCaKNaKhaHJaKHaKnaKtaKxaKCaHTaHIaHJaHHaHNaHFaHMaGVaHEaHaaHSaHRaHGaKbaJPaJLaJNaJMaJUaJTaJOaJNaJXaJWaJIaJJaJSaJUaJTaJOaJNaKyaHPaHKaHHaHgaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGUaHNaHMaHLaHJaHRaHPaHSaHNaHIaHJaHGaHMaHSaHKaHOaHTaHLaHJaHFaHLaHSaHQaHJaHIaHOaHbaHEaGZaHPaHHaHNaKfaJVaJTaJLaJUaJIaJJaJKaJLaJMaJNaJOaJPaJQaJIaJJaJKaJLaJGaHMaHGaHQaHdaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGXaHJaHOaHKaHSaHHaHMaHPaHFaHRaHIaHTaHGaHLaHQaHNaHMaHHaHIaHOaHKaHPaHTaHSaHLaHRaGYaHEaGVaHMaHQaHJaIiaJXaJJaJTaJIaJOaJPaJSaJTaJUaJLaJKaJVaJWaJOaJPaJSaJTaJHaHOaHNaHTaGTaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHaaHSaHRaHGaHPaHQaHOaHMaHIaHHaHLaHFaHNaHKaHTaHJaHOaHQaHLaHRaHGaHMaHFaHPaHKaHHaHgaHEaHbaHOaHTaHSaKUaJMaJPaJJaJOaJKaJVaJQaJJaJIaJTaJSaJXaJNaJKaJVaJQaJJaJRaHRaHJaHFaHcaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGZaHPaHHaHNaHMaHTaHRaHOaHLaHQaHKaHIaHJaHGaHFaHSaHRaHTaHKaHHaHNaHOaHIaHMaHGaHQaHdaHEaGYaHRaHFaHPaKVaJUaJVaJPaJKaJSaJXaJWaJPaJOaJJaJQaJMaJLaJSaJXaJWaJPaIsaHHaHSaHIaHfaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGVaHMaHQaHJaHOaHFaHHaHRaHKaHTaHGaHLaHSaHNaHIaHPaHHaHFaHGaHQaHJaHRaHLaHOaHNaHTaGTaHEaHgaHHaHIaHMaKgaJIaJXaJVaJSaJQaHIaJNaJVaJKaJPaJWaHLaJTaJQaJMaJNaJVaJYaHQaHPaHLaGWaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHbaHOaHTaHSaHRaHIaHQaHHaHGaHFaHNaHKaHPaHJaHLaHMaHQaHIaHNaHTaHSaHHaHKaHRaHJaHFaHcaHEaHdaHQaHLaHOaIyaJOaJMaJXaJQaJIaHPaJSaJTaJNaJKaJJaHIaJOaJWaJUaJLaJXaJZaHTaHMaHKaHeaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aGYaHRaHFaHPaHHaHLaHTaHQaHNaHIaHJaHGaHMaHSaHKaHOaHTaHLaHJaHFaHPaHQaHGaHHaHSaHIaHfaHEaGTaHTaHKaHRaKyaJKaJUaJMaJWaJOaHMaHSaHHaHOaHJaHQaHLaJKaJNaJIaJTaJMaKaaHFaHOaHGaHhaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHgaHeaHaaHcaHhaGVaGXaGUaHgaGZaHdaGYaHfaGTaHbaGWaGXaGVaHdaHaaHcaGUaGYaHhaGTaGZaGWaHEaHcaHFaHGaHHaJEaJcaIMaJFaJhaIXaJnaJeaJBaJuaJdaJCaIMaJcaJnaISaJzaJFaJeaHIaHRaHNaGUaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHSaHQaHLaHOaHTaHGaHIaHFaHSaHKaHPaHJaHRaHMaHNaHHaHIaHGaHPaHLaHOaHFaHJaHTaHMaHKaHHaHEaHfaHIaHNaHQaHLaHSaHGaHKaHOaHJaHRaHMaHTaHHaHPaHFaHGaHSaHRaHNaHQaHKaHMaHLaHHaHJaGXaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHPaHTaHKaHRaHFaHNaHLaHIaHPaHGaHMaHSaHHaHOaHJaHQaHLaHNaHMaHKaHRaHIaHSaHFaHOaHGaHQaHEaGWaHLaHJaHTaHKaHPaHNaHGaHRaHSaHHaHOaHFaHQaHMaHIaHNaHPaHHaHJaHTaHGaHOaHKaHQaHSaHaaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHMaHFaHGaHHaHIaHJaHKaHLaHMaHNaHOaHPaHQaHRaHSaHTaHKaHJaHOaHGaHHaHLaHPaHIaHRaHNaHTaHEaHeaHKaHSaHFaHGaHMaHJaHNaHHaHPaHQaHRaHIaHTaHOaHLaHJaHMaHQaHSaHFaHNaHRaHGaHTaHPaGZaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHOaHIaHNaHQaHLaHSaHGaHKaHOaHJaHRaHMaHTaHHaHPaHFaHGaHSaHRaHNaHQaHKaHMaHLaHHaHJaHFaHEaHhaHGaHPaHIaHNaHOaHSaHJaHQaHMaHTaHHaHLaHFaHRaHKaHSaHOaHTaHPaHIaHJaHHaHNaHFaHMaGVaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHRaHLaHJaHTaHKaHPaHNaHGaHRaHSaHHaHOaHFaHQaHMaHIaHNaHPaHHaHJaHTaHGaHOaHKaHQaHSaHIaHEaGUaHNaHMaHLaHJaHRaHPaHSaHTaHOaHFaHQaHKaHIaHHaHGaHPaHRaHFaHMaHLaHSaHQaHJaHIaHOaHbaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHHaHKaHSaHFaHGaHMaHJaHNaHHaHPaHQaHRaHIaHTaHOaHLaHJaHMaHQaHSaHFaHNaHRaHGaHTaHPaHLaHEaGXaHgaHfaGVaHdaHeaHcaGTaGXaGWaHaaGUaHbaGZaHhaGYaHcaHeaHaaHfaGVaGTaGUaHdaGZaGWaGYaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHQaHGaHPaHIaHNaHOaHSaHJaHQaHMaHTaHHaHLaHFaHRaHKaHSaHOaHTaHPaHIaHJaHHaHNaHFaHMaHKaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaHEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -2862,21 +2911,21 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaKaaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aKbaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaJZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKXaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aKYaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -2896,99 +2945,99 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKcaKcaKcaaaaKdaKdaKdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKcaKcaKcaaaaKdaKdaKdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKcaKcaKcaaaaKdaKdaKdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKeaKfaKgaKhaKiaKcaKcaKcaaaaKdaKdaKdaKeaKfaKgaKhaKiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaKkaKkaKkaKlaKmaKnaKoaKpaKmaKnaKoaKqaKkaKkaKkaKjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaKraKraKsaKtaKuaKvaKwaKxaKyaKvaKuaKzaKAaKraKraKjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaKraKraKBaKCaKCaKvaKCaKCaKCaKvaKCaKCaKBaKraKraKjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKDaKAaKraKEaKCaKvaKvaKvaKvaKvaKvaKvaKCaKEaKraKsaKFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKDaKpaKGaKHaKIaKJaKKaKvaKLaKMaKvaKNaKOaKpaKFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaKPaKQaKRaKSaKvaKCaKCaKvaKNaKjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaKTaKUaKUaKKaKvaKNaKVaKvaKNaKBaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaKXaKUaKUaKYaKvaKNaKVaKvaKvaKnaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKlaKpaKpaKpaKGaKvaKCaKCaKvaKNaKZaKWaKWaKWaKWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaLaaKvaLaaKjaKvaKNaKVaKvaKNaLbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaLaaKvaLaaKBaKvaKNaKVaKvaKNaKZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaLaaKvaKvaLcaKvaKvaKvaKvaKvaKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaLaaKvaLaaLdaKvaKCaKCaKCaKCaLdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaLaaKvaLaaKjaKvaLeaLfaLgaKuaKjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLhaLhaLhaLhaLhaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKDaLiaLiaKpaLjaLkaKoaKpaLiaLiaKFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLlaLlaLlaLlaLlaLlaLlaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKDaKqaLmaKNaKvaLnaLoaKlaKFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLlaLlaLpaLpaLpaLpaLpaLlaLlaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaLgaKCaLqaKCaLmaKjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLlaLraLsaLtaLtaLtaLsaLuaLlaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKjaLvaLwaLxaLyaLzaKjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLlaLAaLBaLCaLCaLCaLDaLEaLlaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKDaLFaLGaLGaLGaLHaKFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLlaLIaLCaLCaLCaLCaLCaLJaLKaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLlaLIaLCaLCaLCaLCaLCaLIaLlaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLlaLIaLCaLCaLCaLCaLCaLIaLlaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLlaLIaLCaLCaLCaLCaLCaLIaLlaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLlaLIaLCaLCaLCaLCaLCaLJaLKaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLlaLLaLMaLMaLMaLMaLMaLNaLlaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLlaLlaLlaLlaLlaLlaLlaLlaLlaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLhaLhaLhaLhaLhaLhaLhaLhaLhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKZaKZaKZaaaaLaaLaaLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKZaKZaKZaaaaLaaLaaLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKZaKZaKZaaaaLaaLaaLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLbaLcaLdaLeaLfaKZaKZaKZaaaaLaaLaaLaaLbaLcaLdaLeaLfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaLhaLhaLhaLiaLjaLkaLlaLmaLjaLkaLlaLnaLhaLhaLhaLgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaLoaLoaLpaLqaLraLsaLtaLuaLvaLsaLraLwaLxaLoaLoaLgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaLoaLoaLyaLzaLzaLsaLzaLzaLzaLsaLzaLzaLyaLoaLoaLgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLAaLxaLoaLBaLzaLsaLsaLsaLsaLsaLsaLsaLzaLBaLoaLpaLCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLAaLmaLDaLEaLFaLGaLHaLsaLIaLJaLsaLKaLLaLmaLCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaLMaLNaLOaLPaLsaLzaLzaLsaLKaLgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaLQaLRaLRaLHaLsaLKaLSaLsaLKaLyaLTaLTaLTaLTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaLUaLRaLRaLVaLsaLKaLSaLsaLsaLkaLTaLTaLTaLTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLiaLmaLmaLmaLDaLsaLzaLzaLsaLKaLWaLTaLTaLTaLTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaLXaLsaLXaLgaLsaLKaLSaLsaLKaLYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaLXaLsaLXaLyaLsaLKaLSaLsaLKaLWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaLXaLsaLsaLZaLsaLsaLsaLsaLsaLkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaLXaLsaLXaMaaLsaLzaLzaLzaLzaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaLXaLsaLXaLgaLsaMbaMcaMdaLraLgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMeaMeaMeaMeaMeaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLAaMfaMfaLmaMgaMhaLlaLmaMfaMfaLCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMiaMiaMiaMiaMiaMiaMiaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLAaLnaMjaLKaLsaMkaMlaLiaLCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMiaMiaMmaMmaMmaMmaMmaMiaMiaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaMdaLzaMnaLzaMjaLgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMiaMoaMpaMqaMqaMqaMpaMraMiaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLgaMsaMtaMuaMvaMwaLgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMiaMxaMyaMzaMzaMzaMAaMBaMiaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLAaMCaMDaMDaMDaMEaLCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMiaMFaMzaMzaMzaMzaMzaMGaMHaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMiaMFaMzaMzaMzaMzaMzaMFaMiaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMiaMFaMzaMzaMzaMzaMzaMFaMiaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMiaMFaMzaMzaMzaMzaMzaMFaMiaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMiaMFaMzaMzaMzaMzaMzaMGaMHaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMiaMIaMJaMJaMJaMJaMJaMKaMiaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMiaMiaMiaMiaMiaMiaMiaMiaMiaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMeaMeaMeaMeaMeaMeaMeaMeaMeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLOaLOaLPaLOaLOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLOaLOaLQaLRaLSaLOaLOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaaaaaaaaaaLOaLUaLVaLRaLWaLXaLOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLTaLYaLTaLYaLTaLYaLTaLYaLTaLYaLTaLYaLTaLYaLTaLYaLTaaaaaaaaaaLOaLZaLRaLRaLRaMaaLOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaaaaaaaaaaLOaMbaLRaLRaLRaMcaLOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLTaLYaLTaLYaLTaLYaLTaLYaLTaLYaLTaLYaLTaLYaLTaLYaLTaaaaaaaaaaLOaMbaLRaLRaLRaMcaLOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMdaMeaMfaMfaMfaMgaMhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaLTaaaaaaaaaaLOaLOaMiaLOaLOaMjaLOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMdaMkaMlaMmaMnaMmaMoaMpaMhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLOaMqaMraMsaMqaLOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMtaMuaMvaMwaMwaMwaMxaMyaMtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLOaMzaMAaMBaMqaLOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMtaMCaMvaMwaMwaMDaMxaMEaMtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMFaMFaMFaMFaMFaaaaaaaLOaMqaMraMGaMHaLOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMIaMJaMJaMKaMLaMJaMJaMJaMMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMFaMNaMOaMPaMFaLhaLOaLOaMQaLOaLOaLOaLOaLOaMRaMRaMRaMRaMRaMRaaaaaaaaaaMtaMSaMTaMTaMwaMTaMTaMSaMtaaaaaaaMRaMRaMRaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMFaMUaMVaMVaMFaMWaMXaLRaMYaMYaMYaMYaMXaMZaMRaNaaNaaNaaNaaMRaMRaaaaaaaMtaNbaMwaMwaMwaMwaMwaNcaMtaaaaaaaMRaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMFaMFaMFaMFaMFaMFaMFaMFaMFaMFaMFaMFaMFaMFaMFaMFaNeaMFaMFaMZaNfaLRaNgaNhaNiaMYaNfaMZaMRaNjaNkaNkaNkaNlaMRaMRaMRaMtaNbaMwaNcaNmaNbaMwaNcaMtaNkaNkaNlaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMFaNnaNnaNnaNnaNnaNnaNnaNnaNnaNnaNnaNnaNnaNoaNpaNqaNraMFaMZaNfaNsaLRaLRaLRaNtaNfaMZaMRaNuaNdaNdaNvaNdaNdaNdaMRaMtaMwaMwaNcaNwaNbaMwaMwaNxaNyaNzaNyaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMFaNnaNBaNCaNDaNBaNCaNCaNCaNEaNCaNCaNFaNGaNHaNpaNqaNraMFaMZaNfaMbaLRaLRaLRaMcaNIaMZaMRaNuaNdaNdaNvaNdaNdaNdaMRaMtaNbaMwaNcaNJaNbaMwaNcaMtaNjaNkaNlaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaNKaNKaNKaNKaNLaNKaNKaNKaNMaNNaNKaNKaNKaNMaNKaNKaNKaNKaNKaNKaNMaNKaNKaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMFaNBaNOaNPaNQaNRaNSaNSaNSaNSaNSaNSaNTaNUaNVaNpaNqaNraMFaMZaNIaMbaLRaLRaLRaLWaLOaMraMRaNWaNdaNdaNvaNdaNdaNdaNXaNwaNbaMwaNcaNYaNbaMwaNZaMtaaaaaaaMRaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNLaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNMaNKaNKaNKaNKaNKaNMaNKaNKaNKaNKaNKaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMFaNEaNPaOaaNPaObaNPaNPaNPaNPaNPaNPaObaOcaNnaNqaNqaOdaMFaOeaMFaLVaLRaLRaLRaLRaLRaLRaNdaNdaNdaNdaNvaNdaNdaNdaOfaOgaNbaMwaNcaNwaNbaMwaNcaOhaaaaaaaOiaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaNKaNKaOjaNKaNKaNKaNKaNKaNLaNKaNKaNNaNMaNKaNKaNMaNKaNKaNMaNNaNKaNMaNKaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMFaOkaOlaNPaOmaNRaOnaOnaOnaOnaOnaOnaNTaNUaOoaNpaNqaNqaOpaNqaNqaLRaLRaLRaLRaLRaLRaLRaNdaNdaNdaNdaNvaNdaNdaNdaOqaNJaNbaMwaNcaNJaNbaMwaNcaMtaaaaaaaMRaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNLaNKaNKaNMaNNaNKaNKaNMaNKaNNaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMFaNnaOkaNCaOraOkaNCaNCaNCaNEaNCaNCaOsaNGaNHaNpaNqaOtaMFaOeaMFaNsaLRaLRaLRaNtaLOaMraMRaOuaNdaNdaNvaNdaNdaNdaMRaMtaNbaMwaNcaOvaNbaMwaNcaMtaNjaNkaNlaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNLaNKaNKaNKaNKaNKaNNaNKaNMaNNaNKaNMaNKaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMFaNnaNnaNnaNnaNnaNnaNnaNnaNnaNnaNnaNnaNnaOwaNpaNqaNraMFaMZaMXaLZaLRaLRaLRaMaaMXaMZaMRaNuaNdaNdaNvaNdaNdaNdaMRaMtaMwaMwaMwaMwaMwaMwaMwaNxaNyaNzaNyaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaNKaOxaOxaOxaOxaOxaOxaOxaNKaNKaNKaNKaNKaNKaNKaNMaNKaNKaOjaNNaNKaNKaNKaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOzaOyaOyaMZaNfaLZaLRaLRaLRaMaaNfaMZaMRaNjaNlaOAaOBaMRaNdaNdaMRaMtaOCaMeaMgaODaMTaMwaOEaMtaNkaNkaNlaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaOFaOGaOHaOIaOIaOIaOJaOGaOKaNKaNKaNKaNKaOjaNKaOxaNLaOxaNLaNKaNMaNKaNMaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaMZaNIaLZaLRaLRaLRaMaaNIaMZaMRaOLaOLaOLaOLaMRaNdaNdaMRaMtaMTaMTaOMaMtaONaOOaONaMtaaaaaaaMRaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaOGaOPaOQaORaOSaOTaOUaOUaOGaOVaNKaNKaOxaNAaNAaOWaOXaNAaNAaOxaOYaOZaOxaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaPaaPaaPbaPcaPdaPeaPfaPaaPaaMRaOLaOLaOLaOLaMRaNdaNdaMRaMtaMTaMTaPgaMtaPhaPiaPjaMtaaaaaaaMRaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaOGaPkaOQaOQaPlaOQaOQaOQaOGaOVaNKaPmaNAaNAaPnaPoaPoaPnaNAaNAaNAaNAaNAaNAaNAaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaPpaPqaPraPsaPtaPuaPraPqaPpaMRaPvaPwaPxaPyaMRaNdaNdaMRaMtaPzaMTaOMaPAaPhaPiaPjaMtaaaaaaaMRaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaOGaPBaOQaOQaOQaPCaOQaPDaOGaOVaOjaPmaNAaPEaPEaPEaPEaPEaPEaPEaPEaNAaPFaPGaPHaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaPqaPIaPJaPsaPtaPuaPJaPKaPqaMRaOLaPLaPMaOLaMRaNdaNdaMRaPNaPOaPPaPPaPPaPPaPPaPOaPQaaaaaaaMRaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaPRaOGaOGaOGaPSaOGaOGaOGaPTaNKaNKaPUaNAaPVaPWaPWaPEaPEaPEaPEaPEaPXaPYaPYaPYaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaPZaPqaPZaPsaPtaPuaPZaPqaPZaMRaOLaOLaOLaOLaMRaNdaNdaMRaaaaPNaQaaQaaQaaQaaQaaPQaaaaaaaaaaMRaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaNKaNKaOGaQbaOQaQcaOGaQdaOxaOxaOxaQeaNAaPEaQfaQgaPWaPEaPEaQhaQiaNAaQjaQkaNAaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaQlaPqaPqaPsaPtaPuaPqaPqaQmaMRaOLaOLaOLaQnaMRaNdaNdaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaNKaNKaOGaOQaOQaOQaOGaQoaQpaQpaOXaNAaNAaPEaQqaQraPWaPEaPEaQhaQsaNAaNAaNAaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaQtaQuaQuaPsaPtaPuaQvaQvaQwaMRaMRaQxaMRaMRaMRaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaOFaOGaOGaOGaOGaOGaOQaOQaOQaOGaQyaQzaQzaQzaQAaQBaPEaPEaPEaPEaPEaPEaQhaQsaNAaNAaNAaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaPaaPaaPaaPaaPtaPaaPaaPaaPaaPaaaaaaaaaaaaaaMRaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaNdaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaOGaPDaOQaOQaQCaOGaOQaOQaOQaOGaQDaQAaOWaOXaNAaNAaPEaPWaPWaPWaPEaPEaQhaQEaNAaQFaQGaNAaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaaPtaPaaaaaaaaaaaaaaaaaaaaaaaaaaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaMRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaOGaPDaOQaQHaQIaOGaOQaOQaOQaOGaOGaQJaQKaOKaQLaNAaQMaQNaQOaQNaQNaPEaPEaPEaQPaQQaQQaQRaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaaPaaPaaPaaPaaPaaPaaPaaPdaPaaPaaPaaPaaPaaPaaPaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaQSaNKaOGaPDaOQaQHaQTaOGaOQaOQaOQaOGaOQaOQaOQaOGaPUaNAaQUaQVaQWaQVaQXaPEaPEaPEaNAaQYaQQaQRaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaaQZaRaaRaaRaaRaaRaaQZaQZaQZaRaaRaaRaaRaaRaaQZaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaOGaPDaOQaOQaOQaRbaOQaOQaOQaRcaOQaOQaOQaOGaPmaNAaNAaQiaRdaReaRfaNAaNAaNAaNAaNAaNAaNAaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRgaQZaQZaQZaRhaQZaQZaQZaQZaQZaQZaQZaRhaQZaQZaQZaRgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaOGaPDaOQaOQaOQaRiaOQaOQaOQaRjaOQaOQaRkaOGaRlaQLaNAaNAaNAaNAaNAaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaaQZaRaaRaaRaaRaaRaaQZaQZaQZaRaaRaaRaaRaaRaaQZaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaOFaOGaOGaOGaOGaOGaOGaRmaOQaOQaOGaOGaOGaOGaOGaOGaOKaQLaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaRnaRnaRnaRnaRnaRnaRnaRnaRnaRnaRnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaaPeaRoaRoaRoaRoaRoaRoaRoaRoaRoaRoaRoaRoaRoaPcaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaOGaRpaRpaRqaRraRsaOGaOQaOQaOQaOGaRtaRuaRvaRwaRxaOGaPmaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaRyaRzaRAaRBaRCaRDaRnaREaRFaRGaRnaaaaaaaRHaRHaRHaRHaRHaRHaRHaRHaRHaRIaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRIaRHaRHaRHaRHaRHaRHaRHaRHaRHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaOGaOQaOQaOQaOQaOQaRKaOQaOQaOQaRLaOQaOQaOQaOQaRMaOGaPmaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaRAaRAaRAaRAaRAaRAaRAaRNaROaRPaRnaaaaaaaRHaRQaRRaRSaRSaRSaRSaRSaRTaRUaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRVaRTaRWaRWaRWaRWaRWaRRaRXaRHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaOGaRYaOQaOQaOQaOQaRZaOQaOQaOQaSaaOQaOQaOQaOQaSbaOGaNKaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaScaScaRAaRAaRAaSdaRnaSeaSfaSgaRnaaaaaaaRHaRQaRRaRSaShaRSaShaRSaRTaRUaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRVaRTaRWaSiaRWaSiaRWaRRaRXaRHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaOGaRYaOQaOQaSjaQbaOGaSkaSlaSmaOGaRMaSbaOQaOQaOQaOGaNKaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaRAaRAaRAaRAaSnaSnaRnaRnaSoaRnaRnaaaaaaaRHaRQaRRaRSaRSaSpaRSaRSaRTaRUaRJaRJaRJaRJaRJaSqaSraSqaRJaRJaRJaRJaRJaRVaRTaRWaRWaSsaRWaRWaRRaRXaRHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaOGaOQaOQaOQaOGaOGaOGaStaSuaOQaOGaOGaOGaOQaOQaOQaOGaNKaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaSvaSvaRAaSwaSxaSyaRnaSzaSoaSAaRnaaaaaaaRHaRQaRRaRSaRSaRSaRSaRSaRTaRUaRJaRJaRJaRJaRJaSqaSBaSqaRJaRJaRJaRJaRJaRVaRTaRWaRWaRWaRWaRWaRRaRXaRHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaOGaQbaSCaSDaOGaNKaOGaSEaSEaSEaOGaNKaOGaOUaSFaSGaOGaNKaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaRAaRAaRAaSwaSHaSIaRnaSJaSoaSKaRnaaaaaaaRHaRQaRRaRSaShaRSaShaRSaRTaRUaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRVaRTaRWaSiaRWaSiaRWaRRaRXaRHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaOGaSEaSEaSEaOGaNKaPRaSLaSMaSNaPTaNKaOGaSEaSEaSEaOGaNKaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaRAaRAaRAaRAaRAaRnaRnaRnaRnaRnaRnaaaaaaaRHaRQaSOaRSaRSaRSaRSaRSaRTaRUaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRVaRTaRWaRWaRWaRWaRWaSOaRXaRHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaPRaSLaSMaSNaPTaNKaNKaNKaNKaNKaNKaNKaPRaSLaSMaSNaPTaNKaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaSPaSQaSRaRAaRAaSSaSTaSUaSVaSWaRnaaaaaaaRHaRHaRHaSXaSXaSXaSXaSXaRHaRIaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRJaRIaRHaSXaSXaSXaSXaSXaRHaRHaRHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNKaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaSYaSZaTaaRAaRAaRAaTbaTcaTbaTdaRnaaaaaaaaaaaaaRHaTeaTeaTeaTeaTeaTfaTgaThaThaThaThaThaThaThaThaThaThaThaThaThaTiaTfaTjaTjaTjaTjaTjaRHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaNAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaSZaTkaTaaRAaRAaRAaTlaTmaTlaTmaRnaaaaaaaaaaaaaRHaRHaRHaRHaRHaRHaTfaTnaToaToaToaToaToaTnaTnaTnaToaToaToaToaToaTnaTfaRHaRHaRHaRHaRHaRHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaSYaTpaTqaRAaRAaSSaTraTdaTsaTtaRnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTfaTnaTnaTnaTuaTnaTvaTvaTvaTvaTvaTnaTuaTnaTnaTnaTfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRnaRnaRnaRnaRnaRnaRnaRnaRnaRnaRnaRnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTfaTfaTwaTfaTfaTfaTfaTxaTyaTzaTfaTfaTfaTfaTwaTfaTfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTfaTfaTAaTfaTfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTfaTfaTfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaTBaTCaTDaTEaTEaTCaTFaTGaTHaTIaTJaTKaTLaTKaTKaTKaTMaOyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaTBaTCaTCaTCaTCaTCaTNaTJaTJaTJaTOaTKaTKaTKaTPaTKaTKaOyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaTBaTCaTQaTBaTRaTSaTTaTJaTJaTJaTJaTKaTKaTUaTKaTVaTLaOyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaTWaTJaTOaTOaTOaTOaTOaTJaTJaTJaTJaTKaTKaTKaTXaTKaTKaOyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaTYaTJaTJaTJaTJaTJaTJaTJaTJaTJaTJaTZaTKaTKaTKaTKaTKaOyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaTYaTJaTJaTJaTJaTJaTJaTJaTJaTOaTJaTZaUaaUaaUaaUbaUaaOyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaUcaTJaTJaTJaTJaTJaTJaTJaTOaUdaTOaTZaUeaUeaUeaUeaUeaOyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaOyaUfaUgaUgaUhaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaOyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaUiaUiaUiaUiaOyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaUiaUiaUiaUiaOyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaOyaOyaOyaOyaOyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMLaMLaMMaMLaMLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMLaMLaMNaMOaMPaMLaMLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaaaaaaaaaaMLaMRaMSaMOaMTaMUaMLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMQaMVaMQaMVaMQaMVaMQaMVaMQaMVaMQaMVaMQaMVaMQaMVaMQaaaaaaaaaaMLaMWaMOaMOaMOaMXaMLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaaaaaaaaaaMLaMYaMOaMOaMOaMZaMLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMQaMVaMQaMVaMQaMVaMQaMVaMQaMVaMQaMVaMQaMVaMQaMVaMQaaaaaaaaaaMLaMYaMOaMOaMOaMZaMLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaaNbaNcaNcaNcaNdaNeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaMQaaaaaaaaaaMLaMLaNfaMLaMLaNgaMLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaaNhaNiaNjaNkaNjaNlaNmaNeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMLaNnaNoaNpaNnaMLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNqaNraNsaNtaNtaNtaNuaNvaNqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMLaNwaNxaNyaNnaMLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNqaNzaNsaNtaNtaNAaNuaNBaNqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNCaNCaNCaNCaNCaaaaaaaMLaNnaNoaNDaNEaMLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNFaNGaNGaNHaNIaNGaNGaNGaNJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNCaNKaNLaNMaNCaMeaMLaMLaNNaMLaMLaMLaMLaMLaNOaNOaNOaNOaNOaNOaaaaaaaaaaNqaNPaNQaNQaNtaNQaNQaNPaNqaaaaaaaNOaNOaNOaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNCaNRaNSaNSaNCaNTaNUaMOaNVaNVaNVaNVaNUaNWaNOaNXaNXaNXaNXaNOaNOaaaaaaaNqaNYaNtaNtaNtaNtaNtaNZaNqaaaaaaaNOaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNCaNCaNCaNCaNCaNCaNCaNCaNCaNCaNCaNCaNCaNCaNCaNCaObaNCaNCaNWaOcaMOaOdaOeaOfaNVaOcaNWaNOaOgaOhaOhaOhaOiaNOaNOaNOaNqaNYaNtaNZaOjaNYaNtaNZaNqaOhaOhaOiaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNCaOkaOkaOkaOkaOkaOkaOkaOkaOkaOkaOkaOkaOkaOlaOmaOnaOoaNCaNWaOcaOpaMOaMOaMOaOqaOcaNWaNOaOraOaaOaaOsaOaaOaaOaaNOaNqaNtaNtaNZaOtaNYaNtaNtaOuaOvaOwaOvaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNCaOkaOyaOzaOAaOyaOzaOzaOzaOBaOzaOzaOCaODaOEaOmaOnaOoaNCaNWaOcaMYaMOaMOaMOaMZaOFaNWaNOaOraOaaOaaOsaOaaOaaOaaNOaNqaNYaNtaNZaOGaNYaNtaNZaNqaOgaOhaOiaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaOHaOHaOHaOHaOIaOHaOHaOHaOJaOKaOHaOHaOHaOJaOHaOHaOHaOHaOHaOHaOJaOHaOHaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNCaOyaOLaOMaONaOOaOPaOPaOPaOPaOPaOPaOQaORaOSaOmaOnaOoaNCaNWaOFaMYaMOaMOaMOaMTaMLaNoaNOaOTaOaaOaaOsaOaaOaaOaaOUaOtaNYaNtaNZaOVaNYaNtaOWaNqaaaaaaaNOaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOIaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOJaOHaOHaOHaOHaOHaOJaOHaOHaOHaOHaOHaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNCaOBaOMaOXaOMaOYaOMaOMaOMaOMaOMaOMaOYaOZaOkaOnaOnaPaaNCaPbaNCaMSaMOaMOaMOaMOaMOaMOaOaaOaaOaaOaaOsaOaaOaaOaaPcaPdaNYaNtaNZaOtaNYaNtaNZaPeaaaaaaaPfaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaOHaOHaPgaOHaOHaOHaOHaOHaOIaOHaOHaOKaOJaOHaOHaOJaOHaOHaOJaOKaOHaOJaOHaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNCaPhaPiaOMaPjaOOaPkaPkaPkaPkaPkaPkaOQaORaPlaOmaOnaOnaPmaOnaOnaMOaMOaMOaMOaMOaMOaMOaOaaOaaOaaOaaOsaOaaOaaOaaPnaOGaNYaNtaNZaOGaNYaNtaNZaNqaaaaaaaNOaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOIaOHaOHaOJaOKaOHaOHaOJaOHaOKaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNCaOkaPhaOzaPoaPhaOzaOzaOzaOBaOzaOzaPpaODaOEaOmaOnaPqaNCaPbaNCaOpaMOaMOaMOaOqaMLaNoaNOaPraOaaOaaOsaOaaOaaOaaNOaNqaNYaNtaNZaPsaNYaNtaNZaNqaOgaOhaOiaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOIaOHaOHaOHaOHaOHaOKaOHaOJaOKaOHaOJaOHaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNCaOkaOkaOkaOkaOkaOkaOkaOkaOkaOkaOkaOkaOkaPtaOmaOnaOoaNCaNWaNUaMWaMOaMOaMOaMXaNUaNWaNOaOraOaaOaaOsaOaaOaaOaaNOaNqaNtaNtaNtaNtaNtaNtaNtaOuaOvaOwaOvaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaOHaPuaPuaPuaPuaPuaPuaPuaOHaOHaOHaOHaOHaOHaOHaOJaOHaOHaPgaOKaOHaOHaOHaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPwaPvaPvaNWaOcaMWaMOaMOaMOaMXaOcaNWaNOaOgaOiaPxaPyaNOaOaaOaaNOaNqaPzaNbaNdaPAaNQaNtaPBaNqaOhaOhaOiaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaPCaPDaPEaPFaPFaPFaPGaPDaPHaOHaOHaOHaOHaPgaOHaPuaOIaPuaOIaOHaOJaOHaOJaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaNWaOFaMWaMOaMOaMOaMXaOFaNWaNOaPIaPIaPIaPIaNOaOaaOaaNOaNqaNQaNQaPJaNqaPKaPLaPKaNqaaaaaaaNOaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaPDaPMaPNaPOaPPaPQaPRaPRaPDaPSaOHaOHaPuaOxaOxaPTaPUaOxaOxaPuaPVaPWaPuaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaPXaPXaPYaPZaQaaQbaQcaPXaPXaNOaPIaPIaPIaPIaNOaOaaOaaNOaNqaNQaNQaQdaNqaQeaQfaQgaNqaaaaaaaNOaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaPDaQhaPNaPNaQiaPNaPNaPNaPDaPSaOHaQjaOxaOxaQkaQlaQlaQkaOxaOxaOxaOxaOxaOxaOxaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaQmaQnaQoaQpaQqaQraQoaQnaQmaNOaQsaQtaQuaQvaNOaOaaOaaNOaNqaQwaNQaPJaQxaQeaQfaQgaNqaaaaaaaNOaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaPDaQyaPNaPNaPNaQzaPNaQAaPDaPSaPgaQjaOxaQBaQBaQBaQBaQBaQBaQBaQBaOxaQCaQDaQEaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaQnaQFaQGaQpaQqaQraQGaQHaQnaNOaPIaQIaQJaPIaNOaOaaOaaNOaQKaQLaQMaQMaQMaQMaQMaQLaQNaaaaaaaNOaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaQOaPDaPDaPDaQPaPDaPDaPDaQQaOHaOHaQRaOxaQSaQTaQTaQBaQBaQBaQBaQBaQUaQVaQVaQVaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaQWaQnaQWaQpaQqaQraQWaQnaQWaNOaPIaPIaPIaPIaNOaOaaOaaNOaaaaQKaQXaQXaQXaQXaQXaQNaaaaaaaaaaNOaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaOHaOHaPDaQYaPNaQZaPDaRaaPuaPuaPuaRbaOxaQBaRcaRdaQTaQBaQBaReaRfaOxaRgaRhaOxaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaRiaQnaQnaQpaQqaQraQnaQnaRjaNOaPIaPIaPIaRkaNOaOaaOaaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaOHaOHaPDaPNaPNaPNaPDaRlaRmaRmaPUaOxaOxaQBaRnaRoaQTaQBaQBaReaRpaOxaOxaOxaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaRqaRraRraQpaQqaQraRsaRsaRtaNOaNOaRuaNOaNOaNOaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaPCaPDaPDaPDaPDaPDaPNaPNaPNaPDaRvaRwaRwaRwaRxaRyaQBaQBaQBaQBaQBaQBaReaRpaOxaOxaOxaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaPXaPXaPXaPXaQqaPXaPXaPXaPXaPXaaaaaaaaaaaaaNOaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaOaaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaPDaQAaPNaPNaRzaPDaPNaPNaPNaPDaRAaRxaPTaPUaOxaOxaQBaQTaQTaQTaQBaQBaReaRBaOxaRCaRDaOxaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPXaQqaPXaaaaaaaaaaaaaaaaaaaaaaaaaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaPDaQAaPNaREaRFaPDaPNaPNaPNaPDaPDaRGaRHaPHaRIaOxaRJaRKaRLaRKaRKaQBaQBaQBaRMaRNaRNaROaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPXaPXaPXaPXaPXaPXaPXaPXaQaaPXaPXaPXaPXaPXaPXaPXaPXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaRPaOHaPDaQAaPNaREaRQaPDaPNaPNaPNaPDaPNaPNaPNaPDaQRaOxaRRaRSaRTaRSaRUaQBaQBaQBaOxaRVaRNaROaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPXaRWaRXaRXaRXaRXaRXaRWaRWaRWaRXaRXaRXaRXaRXaRWaPXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaPDaQAaPNaPNaPNaRYaPNaPNaPNaRZaPNaPNaPNaPDaQjaOxaOxaRfaSaaSbaScaOxaOxaOxaOxaOxaOxaOxaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdaRWaRWaRWaSeaRWaRWaRWaRWaRWaRWaRWaSeaRWaRWaRWaSdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaPDaQAaPNaPNaPNaSfaPNaPNaPNaSgaPNaPNaShaPDaSiaRIaOxaOxaOxaOxaOxaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPXaRWaRXaRXaRXaRXaRXaRWaRWaRWaRXaRXaRXaRXaRXaRWaPXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaPCaPDaPDaPDaPDaPDaPDaSjaPNaPNaPDaPDaPDaPDaPDaPDaPHaRIaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaSkaSkaSkaSkaSkaSkaSkaSkaSkaSkaSkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPXaQbaSlaSlaSlaSlaSlaSlaSlaSlaSlaSlaSlaSlaSlaPZaPXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaPDaSmaSmaSnaSoaSpaPDaPNaPNaPNaPDaSqaSraSsaStaSuaPDaQjaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaSvaSwaSxaSyaSzaSAaSkaSBaSCaSDaSkaaaaaaaSEaSEaSEaSEaSEaSEaSEaSEaSEaSFaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSFaSEaSEaSEaSEaSEaSEaSEaSEaSEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaPDaPNaPNaPNaPNaPNaSHaPNaPNaPNaSIaPNaPNaPNaPNaSJaPDaQjaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaSxaSxaSxaSxaSxaSxaSxaSKaSLaSMaSkaaaaaaaSEaSNaSOaSPaSPaSPaSPaSPaSQaSRaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSSaSQaSTaSTaSTaSTaSTaSOaSUaSEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaPDaSVaPNaPNaPNaPNaSWaPNaPNaPNaSXaPNaPNaPNaPNaSYaPDaOHaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaSZaSZaSxaSxaSxaTaaSkaTbaTcaTdaSkaaaaaaaSEaSNaSOaSPaTeaSPaTeaSPaSQaSRaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSSaSQaSTaTfaSTaTfaSTaSOaSUaSEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaPDaSVaPNaPNaTgaQYaPDaThaTiaTjaPDaSJaSYaPNaPNaPNaPDaOHaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaSxaSxaSxaSxaTkaTkaSkaSkaTlaSkaSkaaaaaaaSEaSNaSOaSPaSPaTmaSPaSPaSQaSRaSGaSGaSGaSGaSGaTnaToaTnaSGaSGaSGaSGaSGaSSaSQaSTaSTaTpaSTaSTaSOaSUaSEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaPDaPNaPNaPNaPDaPDaPDaTqaTraPNaPDaPDaPDaPNaPNaPNaPDaOHaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaTsaTsaSxaTtaTuaTvaSkaTwaTlaTxaSkaaaaaaaSEaSNaSOaSPaSPaSPaSPaSPaSQaSRaSGaSGaSGaSGaSGaTnaTyaTnaSGaSGaSGaSGaSGaSSaSQaSTaSTaSTaSTaSTaSOaSUaSEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaPDaQYaTzaTAaPDaOHaPDaTBaTBaTBaPDaOHaPDaPRaTCaTDaPDaOHaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaSxaSxaSxaTtaTEaTFaSkaTGaTlaTHaSkaaaaaaaSEaSNaSOaSPaTeaSPaTeaSPaSQaSRaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSSaSQaSTaTfaSTaTfaSTaSOaSUaSEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaPDaTBaTBaTBaPDaOHaQOaTIaTJaTKaQQaOHaPDaTBaTBaTBaPDaOHaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaSxaSxaSxaSxaSxaSkaSkaSkaSkaSkaSkaaaaaaaSEaSNaTLaSPaSPaSPaSPaSPaSQaSRaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSSaSQaSTaSTaSTaSTaSTaTLaSUaSEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaQOaTIaTJaTKaQQaOHaOHaOHaOHaOHaOHaOHaQOaTIaTJaTKaQQaOHaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaTMaTNaTOaSxaSxaTPaTQaTRaTSaTTaSkaaaaaaaSEaSEaSEaTUaTUaTUaTUaTUaSEaSFaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSGaSFaSEaTUaTUaTUaTUaTUaSEaSEaSEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOHaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaTVaTWaTXaSxaSxaSxaTYaTZaTYaUaaSkaaaaaaaaaaaaaSEaUbaUbaUbaUbaUbaUcaUdaUeaUeaUeaUeaUeaUeaUeaUeaUeaUeaUeaUeaUeaUfaUcaUgaUgaUgaUgaUgaSEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaOxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaTWaUhaTXaSxaSxaSxaUiaUjaUiaUjaSkaaaaaaaaaaaaaSEaSEaSEaSEaSEaSEaUcaUkaUlaUlaUlaUlaUlaUkaUkaUkaUlaUlaUlaUlaUlaUkaUcaSEaSEaSEaSEaSEaSEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaTVaUmaUnaSxaSxaTPaUoaUaaUpaUqaSkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUcaUkaUkaUkaUraUkaUsaUsaUsaUsaUsaUkaUraUkaUkaUkaUcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkaSkaSkaSkaSkaSkaSkaSkaSkaSkaSkaSkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUcaUcaUtaUcaUcaUcaUcaUuaUvaUwaUcaUcaUcaUcaUtaUcaUcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUcaUcaUxaUcaUcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUcaUcaUcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaUyaUzaUAaUBaUBaUzaUCaUDaUEaUFaUGaUHaUIaUHaUHaUHaUJaPvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaUyaUzaUzaUzaUzaUzaUKaUGaUGaUGaULaUHaUHaUHaUMaUHaUHaPvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaUyaUzaUNaUyaUOaUPaUQaUGaUGaUGaUGaUHaUHaURaUHaUSaUIaPvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaUTaUGaULaULaULaULaULaUGaUGaUGaUGaUHaUHaUHaUUaUHaUHaPvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaUVaUGaUGaUGaUGaUGaUGaUGaUGaUGaUGaUWaUHaUHaUHaUHaUHaPvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaUVaUGaUGaUGaUGaUGaUGaUGaUGaULaUGaUWaUXaUXaUXaUYaUXaPvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaUZaUGaUGaUGaUGaUGaUGaUGaULaVaaULaUWaVbaVbaVbaVbaVbaPvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaPvaVcaVdaVdaVeaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaPvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaVfaVfaVfaVfaPvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaVfaVfaVfaVfaPvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPvaPvaPvaPvaPvaPvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -3164,7 +3213,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -3366,15 +3415,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUkaUkaUkaUkaUkaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaUkaUkaUlaUmaUnaUkaUkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaUkaUkaUoaUnaUpaUnaUqaUkaUkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUraUsaUnaUtaaaaUnaUnaUuaUkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUnaUnaUnaamaamaamaUnaUnaUkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUkaUnaamaamaaaaamaaaaUvaUkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaUkaUkaUwaUxaaaaamaUyaUkaUkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaUkaUkaUzaamaUnaUkaUkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUkaUkaUnaUkaUkaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVhaVhaVhaVhaVhaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaVhaVhaViaVjaVkaVhaVhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaVhaVhaVlaVkaVmaVkaVnaVhaVhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVoaVpaVkaVqaaaaVkaVkaVraVhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVkaVkaVkaamaamaamaVkaVkaVhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVhaVkaamaamaaaaamaaaaVsaVhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaVhaVhaVtaVuaaaaamaVvaVhaVhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaVhaVhaVwaamaVkaVhaVhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVhaVhaVkaVhaVhaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaamaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -3409,29 +3458,29 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUAaUAaUAaUAaUAaUAaUAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUAaUBaUCaUBaUCaUBaUAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUAaUBaUCaUBaUCaUBaUAaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaUAaUBaUCaUBaUCaUBaUAaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaUAaUBaUCaUBaUCaUBaUAaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUAaUAaUAaUAaUAaUDaUEaUFaUDaUEaUFaUDaUAaUAaUAaUAaUAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUAaUBaUBaUBaUBaUGaUHaUHaUIaUHaUHaUGaUBaUBaUBaUBaUAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUAaUCaUCaUCaUCaUJaUHaUHaUHaUHaUHaUJaUCaUCaUCaUCaUAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUAaUBaUBaUBaUBaUDaUHaUHaUKaULaUMaUDaUBaUBaUBaUBaUAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUAaUCaUCaUCaUCaUGaUNaUHaUOaUHaUHaUGaUCaUCaUCaUCaUAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUAaUBaUBaUBaUBaUJaUHaUHaUPaUHaUHaUJaUBaUBaUBaUBaUAaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUAaUAaUAaUAaUAaUDaUQaURaUSaUHaUTaUDaUAaUAaUAaUAaUAaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUDaUDaUDaUUaUDaUDaUDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUDaUDaUDaUDaUDaUDaUVaUWaUXaUYaUZaUDaUDaUDaUDaUDaUDaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVaaVbaVcaVcaVcaVdaUXaUXaUXaUXaUXaVdaVeaVfaVgaVhaViaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVjaVkaVcaVcaVcaVlaUXaVmaVnaVmaUXaVoaVeaVeaVeaVpaVqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVraVsaVtaVuaVcaVdaUXaVvaVwaVxaUXaVdaVyaVzaVAaVBaUJaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUDaVCaUDaUDaVDaUDaUXaUXaUXaUXaVEaUDaUDaUDaUDaUDaUDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVFaamaUDaVGaUDaUDaVHaUXaVIaVJaUDaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaVFaamaUDaVKaVLaUDaVMaUXaVNaUXaUDaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVFaaaaUDaUDaUDaUDaUDaUDaUDaVOaUDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVPaaaaaaaaaaaaaaaaaaaaaaUDaUHaUDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUDaVOaUDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVxaVxaVxaVxaVxaVxaVxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVxaVyaVzaVyaVzaVyaVxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVxaVyaVzaVyaVzaVyaVxaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaVxaVyaVzaVyaVzaVyaVxaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaVxaVyaVzaVyaVzaVyaVxaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVxaVxaVxaVxaVxaVAaVBaVCaVAaVBaVCaVAaVxaVxaVxaVxaVxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVxaVyaVyaVyaVyaVDaVEaVEaVFaVEaVEaVDaVyaVyaVyaVyaVxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVxaVzaVzaVzaVzaVGaVEaVEaVEaVEaVEaVGaVzaVzaVzaVzaVxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVxaVyaVyaVyaVyaVAaVEaVEaVHaVIaVJaVAaVyaVyaVyaVyaVxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVxaVzaVzaVzaVzaVDaVKaVEaVLaVEaVEaVDaVzaVzaVzaVzaVxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVxaVyaVyaVyaVyaVGaVEaVEaVMaVEaVEaVGaVyaVyaVyaVyaVxaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVxaVxaVxaVxaVxaVAaVNaVOaVPaVEaVQaVAaVxaVxaVxaVxaVxaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVAaVAaVAaVRaVAaVAaVAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVAaVAaVAaVAaVAaVAaVSaVTaVUaVVaVWaVAaVAaVAaVAaVAaVAaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVXaVYaVZaVZaVZaWaaVUaVUaVUaVUaVUaWaaWbaWcaWdaWeaWfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWgaWhaVZaVZaVZaWiaVUaWjaWkaWjaVUaWlaWbaWbaWbaWmaWnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWoaWpaWqaWraVZaWaaVUaWsaWtaWuaVUaWaaWvaWwaWxaWyaVGaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVAaWzaVAaVAaWAaVAaVUaVUaVUaVUaWBaVAaVAaVAaVAaVAaVAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWCaamaVAaWDaVAaVAaWEaVUaWFaWGaVAaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaWCaamaVAaWHaWIaVAaWJaVUaWKaVUaVAaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWCaaaaVAaVAaVAaVAaVAaVAaVAaWLaVAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWMaaaaaaaaaaaaaaaaaaaaaaVAaVEaVAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVAaWLaVAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -3474,13 +3523,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaaaaamaamaamaamaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaamaamaamaamabLabLabLabLaamaamaamaamaamaamaaaaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaamaVQaVQaVQaVRaVQaVQaVQabLabLabLaamaaaaaaaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVQaVQaVRaVRaVSaVTaVSaVRaVRaamaamaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVQaVUaVSaVSaVSaVSaVSaVSaVQaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVQaVSaVSaVVaVWaVXaVSaVYaVQaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVQaVZaWaaVRaVSaVSaVSaVTaVQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVQaVQaVSaWbaVSaVSaVRaVQaVQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVQaVQaVQaVQaVQaVRaVRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaamaWNaWNaWNaWOaWNaWNaWNabLabLabLaamaaaaaaaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWNaWNaWOaWOaWPaWQaWPaWOaWOaamaamaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWNaWRaWPaWPaWPaWPaWPaWPaWNaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWNaWPaWPaWSaWTaWUaWPaWVaWNaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWNaWWaWXaWOaWPaWPaWPaWQaWNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWNaWNaWPaWYaWPaWPaWOaWNaWNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWNaWNaWNaWNaWNaWOaWOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -3512,23 +3561,23 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaaaaaaaaaaaaaWdaWdaWdaWdaWdaWdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaaaaaaaWcaWcaWcaWcaWcaWdaWdaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWdaWdaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWdaWdaaaaaaaWeaWfaWfaWgaWgaWfaWfaWfaWfaWhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWdaWeaWfaWiaWdaWjaWkaWkaWlaWlaWmaWkaWnaWoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWpaWkaWkaWkaWkaWkaWqaWkaWnaWraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWsaWtaWkaWuaWqaWkaWqaWkaWqaWnaWraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWvaWkaWwaWkaWxaWkaWjaWkaWkaWkaWqaWnaWraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWyaWfaWzaWkaWAaWkaWkaWBaWCaWlaWkaWnaWDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWEaWfaWfaWgaWgaWfaWfaWfaWfaWFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaaaaWcaWcaWcaWcaWcaWdaWdaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWdaWdaWdaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaaaaaaaaaaaaaWdaWdaWcaWdaWcaWcaWdaWdaWdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaaaaaaaaaaaaaaaaaaaWdaWcaWcaWcaWcaWcaWcaWdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaaaaaaaaaaaaaXaaXaaXaaXaaXaaXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaaaaaaaWZaWZaWZaWZaWZaXaaXaaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXaaXaaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXaaXaaaaaaaaXbaXcaXcaXdaXdaXcaXcaXcaXcaXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXaaXbaXcaXfaXaaXgaXhaXhaXiaXiaXjaXhaXkaXlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXmaXhaXhaXhaXhaXhaXnaXhaXkaXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXpaXqaXhaXraXnaXhaXnaXhaXnaXkaXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXsaXhaXtaXhaXuaXhaXgaXhaXhaXhaXnaXkaXoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXvaXcaXwaXhaXxaXhaXhaXyaXzaXiaXhaXkaXAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXBaXcaXcaXdaXdaXcaXcaXcaXcaXCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaaaaWZaWZaWZaWZaWZaXaaXaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXaaXaaXaaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaaaaaaaaaaaaaXaaXaaWZaXaaWZaWZaXaaXaaXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaaaaaaaaaaaaaaaaaaaXaaWZaWZaWZaWZaWZaWZaXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -3713,73 +3762,73 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaafaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaaaaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaaaaWcaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaafaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWGaWGaWGaWGaafaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaafaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWGaafaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaafaWGaWGaWGaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaafaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWHaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaafaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaafaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaaaaaaaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaafaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWHaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaafaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaafaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaaaaaaaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaafaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaafaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWHaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaafaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaWcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaaaaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaaaaWZaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaafaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXDaXDaXDaXDaafaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaafaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaXDaafaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaafaXDaXDaXDaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaafaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXEaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaafaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaafaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaaaaaaaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaafaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXEaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaafaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaafaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaaaaaaaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaafaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaafaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXEaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaafaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaXDaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/tgstation.2.1.2.dmm b/_maps/map_files/tgstation.2.1.2.dmm index 7b429ff256d..d06ee6c3094 100644 --- a/_maps/map_files/tgstation.2.1.2.dmm +++ b/_maps/map_files/tgstation.2.1.2.dmm @@ -63,11 +63,11 @@ "abk" = (/obj/structure/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) "abl" = (/obj/structure/closet/l3closet/security,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "abm" = (/obj/structure/closet/bombcloset,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"abn" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/cartridge/detective,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/carpet,/area/security/hos) +"abn" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/radio/off,/turf/simulated/floor/carpet,/area/security/hos) "abo" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/carpet,/area/security/hos) "abp" = (/obj/machinery/computer/security,/turf/simulated/floor/carpet,/area/security/hos) "abq" = (/obj/structure/closet/secure_closet/hos,/turf/simulated/floor/carpet,/area/security/hos) -"abr" = (/obj/structure/filingcabinet,/obj/machinery/alarm{pixel_y = 23},/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/carpet,/area/security/hos) +"abr" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/obj/item/weapon/stamp/hos,/turf/simulated/floor/carpet,/area/security/hos) "abs" = (/turf/simulated/wall,/area/security/main) "abt" = (/obj/machinery/door/airlock/external{name = "Security External Airlock"; req_access_txt = "1; 13"},/turf/simulated/floor/plating,/area/security/main) "abu" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/flasher{id = "PCell 3"; pixel_x = -28},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) @@ -95,10 +95,10 @@ "abQ" = (/obj/structure/rack,/obj/item/weapon/gun/energy/gun{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun{pixel_x = 3; pixel_y = -3},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/security/warden) "abR" = (/turf/simulated/floor,/area/security/warden) "abS" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/security/warden) -"abT" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/turf/simulated/floor/carpet,/area/security/hos) -"abU" = (/obj/item/weapon/stamp/hos,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/security/hos) +"abT" = (/obj/structure/filingcabinet,/turf/simulated/floor/carpet,/area/security/hos) +"abU" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/structure/closet/wardrobe/hos,/turf/simulated/floor/carpet,/area/security/hos) "abV" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/security/hos) -"abW" = (/obj/structure/table/woodentable,/obj/item/device/radio/off,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/simulated/floor/carpet,/area/security/hos) +"abW" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/cartridge/detective,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = -31},/turf/simulated/floor/carpet,/area/security/hos) "abX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/security/main) "abY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/security/main) "abZ" = (/turf/simulated/wall/r_wall,/area/security/main) @@ -2622,10 +2622,10 @@ "aYv" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "aYw" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Stbd"; location = "HOP"},/turf/simulated/floor,/area/hallway/primary/central) "aYx" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor,/area/hallway/primary/starboard) -"aYy" = (/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "greencorner"},/area/hallway/primary/starboard) -"aYz" = (/turf/simulated/floor{dir = 2; icon_state = "green"},/area/hallway/primary/starboard) -"aYA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 2; icon_state = "green"},/area/hallway/primary/starboard) -"aYB" = (/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/hallway/primary/starboard) +"aYy" = (/turf/simulated/floor{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay) +"aYz" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{dir = 2; icon_state = "whitebluecorner"},/area/medical/sleeper) +"aYA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/sleeper) +"aYB" = (/obj/structure/table,/obj/structure/bedsheetbin{pixel_x = 2},/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "whitebluecorner"},/area/medical/sleeper) "aYC" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/hallway/primary/starboard) "aYD" = (/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/hallway/primary/starboard) "aYE" = (/turf/simulated/floor{dir = 8; icon_state = "whitecorner"},/area/hallway/primary/starboard) @@ -2690,7 +2690,7 @@ "aZL" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "aZM" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/primary/central) "aZN" = (/turf/simulated/wall,/area/medical/chemistry) -"aZO" = (/obj/structure/sign/greencross,/turf/simulated/wall,/area/medical/medbay) +"aZO" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/medbay) "aZP" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/medbay) "aZQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/medical/medbay) "aZR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/medical/medbay) @@ -2920,10 +2920,10 @@ "beh" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/storage/pill_bottle/inaprovaline{pixel_x = 5; pixel_y = -2},/obj/item/weapon/storage/pill_bottle/inaprovaline{pixel_x = 5; pixel_y = -2},/turf/simulated/floor{dir = 2; icon_state = "whiteyellow"},/area/medical/chemistry) "bei" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/chemistry) "bej" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bek" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitegreencorner"},/area/medical/medbay) -"bel" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/medical/medbay) -"bem" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/medical/medbay) -"ben" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/medical/medbay) +"bek" = (/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/medical/sleeper) +"bel" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/medical/sleeper) +"bem" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/structure/sign/nosmoking_2{pixel_x = -28},/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/medical/sleeper) +"ben" = (/obj/structure/sign/bluecross_2,/turf/simulated/wall,/area/medical/medbay) "beo" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/security/checkpoint/medical) "bep" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/checkpoint/medical) "beq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor,/area/security/checkpoint/medical) @@ -2997,7 +2997,7 @@ "bfG" = (/obj/structure/table,/obj/item/weapon/storage/box/syringes,/obj/item/clothing/glasses/science{pixel_x = 2; pixel_y = 4},/obj/item/clothing/glasses/science,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bfH" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bfI" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Chemistry Desk"; req_access_txt = "33"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/plating,/area/medical/chemistry) -"bfJ" = (/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/medbay) +"bfJ" = (/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/starboard) "bfK" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bfL" = (/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bfM" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) @@ -3149,8 +3149,8 @@ "biC" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "biD" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/device/radio/headset/headset_med,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "biE" = (/turf/simulated/wall,/area/medical/medbay) -"biF" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay) -"biG" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay) +"biF" = (/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/starboard) +"biG" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/starboard) "biH" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/medbay) "biI" = (/obj/machinery/computer/med_data,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "biJ" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_x = 30; pixel_y = 0; pixel_z = 0},/obj/machinery/light,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) @@ -3899,13 +3899,13 @@ "bwY" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/retractor,/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/medical/sleeper) "bwZ" = (/obj/structure/table,/obj/item/weapon/cautery{pixel_x = 4},/turf/simulated/floor,/area/medical/sleeper) "bxa" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/gun/syringe,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bxb" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{dir = 2; icon_state = "whitegreencorner"},/area/medical/sleeper) +"bxb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/starboard) "bxc" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bxd" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bxe" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/camera{c_tag = "Medbay Storage"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bxf" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/rxglasses,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bxg" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bxh" = (/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay) +"bxh" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay) "bxi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/medical/cmo) "bxj" = (/turf/simulated/floor{icon_state = "barber"},/area/medical/cmo) "bxk" = (/obj/structure/stool/bed/chair/office/light,/obj/effect/landmark/start{name = "Chief Medical Officer"},/turf/simulated/floor{icon_state = "barber"},/area/medical/cmo) @@ -3966,12 +3966,12 @@ "byn" = (/obj/structure/disposalpipe/segment,/obj/structure/table,/obj/item/clothing/gloves/latex,/obj/item/clothing/mask/surgical,/obj/item/clothing/suit/apron/surgical,/turf/simulated/floor{dir = 4; icon_state = "whitehall"},/area/medical/sleeper) "byo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "byp" = (/obj/structure/table,/obj/item/weapon/surgical_drapes,/turf/simulated/floor{dir = 8; icon_state = "whitehall"},/area/medical/sleeper) -"byq" = (/obj/structure/table,/obj/structure/bedsheetbin{pixel_x = 2},/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/sleeper) -"byr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/sleeper) +"byq" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/medical/medbay) +"byr" = (/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/medical/medbay) "bys" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "45"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "byt" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "byu" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "45"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"byv" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/medical/medbay) +"byv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay) "byw" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "byx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/cmo) "byy" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/turf/simulated/floor{icon_state = "barber"},/area/medical/cmo) @@ -4040,8 +4040,8 @@ "bzJ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bzK" = (/obj/structure/optable,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bzL" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access_txt = "45"},/turf/simulated/floor,/area/medical/sleeper) -"bzM" = (/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/medical/sleeper) -"bzN" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/medical/sleeper) +"bzM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitebluecorner"},/area/medical/medbay) +"bzN" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay) "bzO" = (/obj/structure/table,/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/clothing/tie/stethoscope,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bzP" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bzQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) @@ -4118,7 +4118,7 @@ "bBj" = (/obj/machinery/computer/operating,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bBk" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bBl" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{dir = 8; icon_state = "whitehall"},/area/medical/sleeper) -"bBm" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/structure/sign/nosmoking_2{pixel_x = -28},/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/medical/sleeper) +"bBm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay) "bBn" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{pixel_x = 28; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/camera{c_tag = "Medbay Recovery Room"; dir = 8; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bBo" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/hand_labeler,/obj/item/weapon/gun/syringe,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bBp" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = -3},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 5; pixel_y = -2},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) @@ -5267,7 +5267,7 @@ "bXo" = (/obj/machinery/computer/telecomms/monitor{network = "tcommsat"},/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/tcommsat/computer) "bXp" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor,/area/tcommsat/computer) "bXq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) -"bXr" = (/obj/machinery/door/airlock/engineering{name = "Telecommunications"; req_access_txt = "61"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) +"bXr" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/gravity_generator) "bXs" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/hallway/primary/aft) "bXt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/hallway/primary/aft) "bXu" = (/turf/simulated/floor,/area/hallway/primary/aft) @@ -5455,7 +5455,7 @@ "caU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar) "caV" = (/obj/machinery/door/airlock/engineering{name = "Aft Port Solar Access"; req_access_txt = "10"},/turf/simulated/floor/plating,/area/maintenance/portsolar) "caW" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft) -"caX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/aft) +"caX" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = -32; pixel_y = 0},/obj/machinery/light/small,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/gravity_generator) "caY" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/aft) "caZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft) "cba" = (/obj/machinery/shieldgen,/turf/simulated/floor/plating,/area/engine/engineering) @@ -5466,7 +5466,7 @@ "cbf" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engine_smes) "cbg" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/engine_smes) "cbh" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering) -"cbi" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering) +"cbi" = (/turf/simulated/wall/r_wall,/area/engine/gravity_generator) "cbj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/engine/engineering) "cbk" = (/obj/machinery/computer/station_alert,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor,/area/engine/engineering) "cbl" = (/obj/machinery/computer/monitor,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor,/area/engine/engineering) @@ -5484,7 +5484,7 @@ "cbx" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{pipe_color = "yellow"; icon_state = "intact-y"; level = 2},/turf/space,/area/space) "cby" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; icon_state = "intact-c"; level = 2},/turf/space,/area/space) "cbz" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/solar/port) -"cbA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) +"cbA" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/engine/gravity_generator) "cbB" = (/obj/machinery/power/solar_control{id = "portsolar"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar) "cbC" = (/turf/simulated/floor/plating,/area/maintenance/portsolar) "cbD" = (/obj/machinery/power/apc{dir = 4; name = "Aft Port Solar APC"; pixel_x = 23; pixel_y = 2},/obj/machinery/camera{c_tag = "Aft Port Solar Control"; dir = 1},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar) @@ -5515,7 +5515,7 @@ "ccc" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/turf/simulated/wall/r_wall,/area/atmos) "ccd" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/simulated/floor/plating/airless,/area/space) "cce" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/port) -"ccf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) +"ccf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/engine/gravity_generator) "ccg" = (/obj/item/stack/rods{amount = 10},/turf/simulated/floor/plating,/area/maintenance/aft) "cch" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Engineering Secure Storage"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/engine/engineering) "cci" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering) @@ -5539,7 +5539,7 @@ "ccA" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "ccB" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "ccC" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) -"ccD" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/aft) +"ccD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/gravity_generator) "ccE" = (/obj/machinery/field/generator,/turf/simulated/floor/plating,/area/engine/engineering) "ccF" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/engine/engineering) "ccG" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering) @@ -5568,7 +5568,7 @@ "cdd" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "cde" = (/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "cdf" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/solar/starboard) -"cdg" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/aft) +"cdg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engine/gravity_generator) "cdh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall,/area/engine/engineering) "cdi" = (/turf/simulated/wall,/area/engine/engineering) "cdj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/engineering) @@ -5606,7 +5606,7 @@ "cdP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/solar/starboard) "cdQ" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/solar/starboard) "cdR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/solar/port) -"cdS" = (/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating,/area/maintenance/aft) +"cdS" = (/obj/machinery/power/apc{dir = 8; name = "Gravity Generator APC"; pixel_x = -25; pixel_y = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engine/gravity_generator) "cdT" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Engineering Delivery"; req_access_txt = "10"},/turf/simulated/floor{icon_state = "delivery"},/area/engine/engineering) "cdU" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Engineering Maintenance"; req_access_txt = "10"},/turf/simulated/floor/plating,/area/engine/engineering) "cdV" = (/obj/machinery/camera{c_tag = "Engineering West"; dir = 4; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering) @@ -5631,8 +5631,8 @@ "ceo" = (/obj/structure/table,/obj/item/device/flashlight{pixel_y = 5},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/weapon/airlock_painter,/turf/simulated/floor,/area/engine/engineering) "cep" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/machinery/camera{c_tag = "Engineering East"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering) "ceq" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space) -"cer" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/engine/engineering) -"ces" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/engine/engineering) +"cer" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Engineering Storage"; dir = 4; network = list("SS13")},/turf/simulated/floor,/area/engine/engineering) +"ces" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/engine/engineering) "cet" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/engine/engineering) "ceu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering) "cev" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor,/area/engine/engineering) @@ -5650,7 +5650,7 @@ "ceH" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape_pod4/station) "ceI" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape_pod4/station) "ceJ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/engine/engineering) -"ceK" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/camera{c_tag = "Engineering Storage"; dir = 4; network = list("SS13")},/turf/simulated/floor,/area/engine/engineering) +"ceK" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/engine/engineering) "ceL" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor,/area/engine/engineering) "ceM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "ceN" = (/obj/structure/table,/obj/item/clothing/gloves/yellow,/obj/item/weapon/storage/toolbox/electrical{pixel_y = 5},/turf/simulated/floor,/area/engine/engineering) @@ -5668,9 +5668,9 @@ "ceZ" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod4/station) "cfa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod4/station) "cfb" = (/obj/structure/cable,/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless,/area/solar/starboard) -"cfc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) -"cfd" = (/obj/item/stack/sheet/plasteel{amount = 10},/obj/structure/table,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) -"cfe" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engine/engineering) +"cfc" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/turf/simulated/floor,/area/engine/engineering) +"cfd" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor,/area/engine/engineering) +"cfe" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/engineering) "cff" = (/obj/structure/table,/obj/item/stack/rods{amount = 50},/turf/simulated/floor,/area/engine/engineering) "cfg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "cfh" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) @@ -5690,7 +5690,7 @@ "cfv" = (/obj/machinery/camera{c_tag = "Engineering Escape Pod"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/engine/engineering) "cfw" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape_pod4/station) "cfx" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape_pod4/station) -"cfy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) +"cfy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/engineering) "cfz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/external{name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/engine/engineering) "cfA" = (/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor/plating,/area/engine/engineering) "cfB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor/plating,/area/engine/engineering) @@ -5699,9 +5699,9 @@ "cfE" = (/obj/structure/particle_accelerator/power_box,/turf/simulated/floor/plating,/area/engine/engineering) "cfF" = (/obj/item/weapon/screwdriver,/turf/simulated/floor,/area/engine/engineering) "cfG" = (/obj/machinery/door/airlock/external{name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/engine/engineering) -"cfH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering) +"cfH" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "Secure Gate"; name = "security blast door"},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/engineering) "cfI" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/turf/simulated/floor,/area/engine/engineering) -"cfJ" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/obj/machinery/light,/turf/simulated/floor,/area/engine/engineering) +"cfJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering) "cfK" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/engine/engineering) "cfL" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/engine/engineering) "cfM" = (/obj/machinery/light/small{dir = 8},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/engine/engineering) @@ -8102,6 +8102,7 @@ "cZP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/turf/simulated/floor,/area/mine/living_quarters) "cZQ" = (/obj/machinery/atmospherics/pipe/manifold{dir = 1},/turf/simulated/floor,/area/mine/living_quarters) "cZR" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/obj/machinery/light,/turf/simulated/floor,/area/mine/living_quarters) +"cZS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) "cZT" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/mine/living_quarters) "cZU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/turf/simulated/floor/plating,/area/mine/living_quarters) "cZV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/turf/simulated/floor/plating,/area/mine/living_quarters) @@ -8233,6 +8234,9 @@ "dcr" = (/obj/structure/barricade/wooden,/obj/item/weapon/paper{anchored = 0; info = "A hastily written note has been scribbled here...

Please use the ore redemption machine in the science wing for smelting. PLEASE!

--The Research Staff"; name = "URGENT!"},/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/mine/production) "dcs" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/structure/plasticflaps,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) "dct" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production) +"dcu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/engine/engineering) +"dcv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) +"dcw" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering) "dcx" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/disposal) "dcy" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "dcz" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) @@ -8267,6 +8271,69 @@ "ddc" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating/airless,/area/AIsattele) "ddd" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating/airless,/area/AIsattele) "dde" = (/obj/structure/closet/crate,/obj/item/device/aicard,/obj/item/device/multitool,/obj/item/weapon/weldingtool,/obj/item/weapon/wrench,/turf/simulated/floor/plating/airless,/area/AIsattele) +"ddf" = (/obj/machinery/light,/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor,/area/engine/gravity_generator) +"ddg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"ddh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/gravity_generator) +"ddi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator) +"ddj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/gravity_generator) +"ddk" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) +"ddl" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/aft) +"ddm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/gravity_generator) +"ddn" = (/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"ddo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/aft) +"ddp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator) +"ddq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"ddr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator) +"dds" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) +"ddt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/gravity_generator) +"ddu" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/aft) +"ddv" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"ddw" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) +"ddx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"ddy" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) +"ddz" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) +"ddA" = (/obj/machinery/camera{c_tag = "Gravity Generator Room"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"ddB" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/gravity_generator) +"ddC" = (/obj/machinery/gravity_generator/main/station,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator) +"ddD" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/gravity_generator) +"ddE" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"ddF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/engine/gravity_generator) +"ddG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/engine/gravity_generator) +"ddH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"ddI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"ddJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"ddK" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "Secure Gate"; name = "security blast door"},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/gravity_generator) +"ddL" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "Secure Gate"; name = "security blast door"},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/engine/gravity_generator) +"ddM" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "Secure Gate"; name = "security blast door"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/engine/gravity_generator) +"ddN" = (/obj/machinery/door/airlock/glass_command{name = "Gravity Generator Area"; req_access_txt = "19; 61"},/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) +"ddO" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "Secure Gate"; name = "security blast door"},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/engine/gravity_generator) +"ddP" = (/obj/machinery/camera{c_tag = "Gravity Generator Foyer"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet/radiation,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/gravity_generator) +"ddQ" = (/obj/structure/closet/radiation,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/gravity_generator) +"ddR" = (/obj/structure/table,/obj/item/weapon/paper/gravity_gen{layer = 3},/obj/item/weapon/pen/blue,/turf/simulated/floor,/area/engine/gravity_generator) +"ddS" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable,/turf/simulated/floor,/area/engine/gravity_generator) +"ddT" = (/obj/effect/landmark{name = "carpspawn"},/obj/structure/lattice,/turf/space,/area/space) +"ddU" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/gravity_generator) +"ddV" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator) +"ddW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator) +"ddX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/engine/gravity_generator) +"ddY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator) +"ddZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/gravity_generator) +"dea" = (/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Room"; req_access_txt = "19;23"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/gravity_generator) +"deb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engine/engineering) +"dec" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"ded" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"dee" = (/obj/machinery/door/airlock/engineering{name = "Telecommunications"; req_access_txt = "61"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/tcommsat/computer) +"def" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/maintenance/aft) +"deg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/tcommsat/server) +"deh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/tcommsat/server) +"dei" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/wall/r_wall,/area/tcommsat/computer) +"dej" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) +"dek" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering) +"del" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/engine/engineering) +"dem" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/engine/engineering) +"den" = (/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Foyer"; req_access_txt = "19;23"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) +"deo" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/gravity_generator) +"dep" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engine/engineering) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8342,9 +8409,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaiaaDaaqaaEaaqaaqaaqaaqaaqaaqaaFaaqaaGaaHaaiaafaaaaaaaaaaaaaaaaafaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaiaaIaaqaaqaaJaaqaaqaaqaaKaaqaaFaaqaaLaaMaaiaafaafaafaaaaafaafaafaafaafaafaafaafaafaafaahaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaiaaNaaOaaNaaPaaNaaQaaNaaRaaNaaSaaNaaNaaTaaUaaUaaUaaUaaUaaUaaUaaUaaUaaUaaVaaWaaXaaYaaVaaVaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaibZUaaqabaaaPajhaaqabcaaRbZXaaFabeaaNabfaaUabgabgabhabiabjabkablabmaaUabnaboabpabqabraaVaafaaaaafabsabtabsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaibZUaaqabaaaPajhaaqabcaaRbZXaaFabeaaNabfaaUabgabgabhabiabjabkablabmaaUabWaboabpabqabUaaVaafaaaaafabsabtabsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiabuaaqabvabwabxaaqabyaaRabzaaFabyaaNabAaaUabgabBabCabCabCabCabCabCaaUabDabEabFabFabGaaVaafaafaafabsabHabsaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaRabIaaNaaPaaRabJaaPaaRaaRabKaaPaaNaaNaaUabLabMabNabOabPabQabRabSaaUabTabUabVabFabWaaVabXabYabsabZabtabsabsabZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaRabIaaNaaPaaRabJaaPaaRaaRabKaaPaaNaaNaaUabLabMabNabOabPabQabRabSaaUabnabrabVabFabTaaVabXabYabsabZabtabsabsabZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbaccacdaceacfacgachaciacfacjackaclacmaaUacnacoacpacpacqabRabRacraaUacsactacuabFacvaaVacwacxacyabsaczacAacBacBacCaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafacDacEacFacGacHacIacJacKacIacIacLacMacNacOaaUacnacnacPacQacRacSacSacTaaUacUacVacWacXacYaaVacZadaadbadcaddadeadfadgadhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiadiadjaaNadkadladmadnadoadoadoaaNadpadqaaUadradradsadtaduadvaaUadwaaUadxaaVadyaaVadzaaVadAadaadBabsadCadDacBacBadEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8396,14 +8463,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPbaPbaPbaPbaPbaPbaPbaPbaPbaPbaPbaPbasbaUHaJHaUIaNLaUJaUJaUJaRWaUKaUJaULaUJaNJaUMaUNaUOaUPaUQaUQaURaUSaUQaUTaTxaUUaJNaTzaTAaTBaLhaJNaUVaTDaTEaUWaUXaUXaUXaUYaTEaUZaVaaVbaVcaTKaTKaTKaTKaDAaDAaVdaVeaVfaVgaVhaViaVjaVkaVlaVmaSKaVnaVoaVpaVpaVqaVpaVpaVoaVpaVraVsaVtaVuaVvaVwaVxaVyaVzaVAaSSaDAaDAaDOaDOaDOaDOaDOaVBaMYaVBaVCaVDaDOaDOaDOaDOaDOaVEaVFaVFaVFaVFaVFaVFaVGaVFaVEaImaVHaVHaVIaThaThaThaThaVEaUtaVJaUuazaazaazaazaazaaVKazaazaazaazaazhaVLaVMaVNaVNaVNaVNaVOazhazhaVPaNAaNAaNAaNAaUGaNCaKRaKRaQvaEraEraEraEraEraEraEraEraEraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaukanjaVRavgaQyanYanYanYanjanjanYaVSaCSaVTaNJaNJaNJaNJaNJaNJaNJaNJaNJaVUaQVaVVaSdaTsaVWaTvaVXaSeaVYaVZaWaaJNaTzaTAaTBaLhaJNaUVaTDaTEaUXaWbaWbaUXaWbaTEaUZaWcaWdaWdaWeaWfaWgaTKaWhaDAaSAaWiaWjaWkaWlaWmaWmaWlaWnaWoaSKaWpaVoaWqaWraWsaWtaWuaVoaWvaVraWwaVzaVzaWxaWyaWzaVzaWAaVAaSSaWBaDAaWCaWDaThaThaThaThaThaThaThaThaWEaThaThaThaThaWFaThaThaThaThaThaThaThaThaWDaThaThaThaThaThaThaThaThaWGaWHaWIaWJaWJaWKaWLaWLaWMaWNaWOaWLaWPaWLaWLaWQaWLaWLaWLaWLaWLaWLaWRaWSaWTaWUaNAaNAaNAaVQaPaaOZaOZaPaaEraEraEraEraEraEraEraEraEraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafanYasdasdaWVaYWaZaaZaaZaaZaaZaaWWaWXaJKaWYaYWaXQaSdaSeaSeaWZaXaaSeaJNaJNaXbaJNaTzaTAaXcaXdaJNaUVaTDaTEaUXaXeaUXaWbaXfaTEaUZaXgaWdaWdaWdaXhaXiaTKaXjaDAaSAaXkaXlaXmaXnaXoaXpaXqaWnaXraSKaVpaVpaXsaXtaXuaXtaXsaVpaVpaVraXvaXwaVzaWxaXxaWzaVzaVzaVAaXyaDAaDAaWCaWDaThaThaThaThaThaThaThaThaXzaThaThaThaThaThaThaXAaWLaWLaWLaWLaWLaWLaXBaWLaWLaWLaWLaWLaWLaWLaXCaXDaXEaXFaThaThaXGaRMaRMaRLaRMaRMaRMaRMaRMaRMaRMaRMaRMaRMaRMaRMaXHaXIaXJaXKaXKaXKaXKaXKaXMaXNaKRaKRaXOaEraEraEraEraEraEraEraEraEraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafanYaVRaQyaXPdcBaXPaXPaXPaXPaXPbbSaJKaJKaJKbbSaScaSdaTsaXRaXSaXTaSeaXUaXVaXWaJNaJNaJNaJKaWVaJKaUVaTDaTEaXXaUXaWbaXYaXZaTEaUZaTKaYaaWdaWdaYbaYcaTKaYdaDAaSAaYeaYfaXmaXnaYgaYhaXqaYiaYjaYkaYlaYmaXsaXtaYnaXtaXsaYmaYoaYpaYqaYraVzaYsaYsaYtaVzaYuaVAaYvaYwaDAaWCaWDaThaThaYxaThaYyaYzaYzaYzaYAaYzaYzaYzaYBaThaThaThaThaThaThaYCaYDaYEaWDaThaThaThaThaThaYFaYGaYHaYIaYJaThaThaThaThaThaYKaYLaThaThaThaThaThaThaThaThaThaThaThaThaThaYMaYNaYOaYPaYRaYRaYSbjaaYUaOZaOZaYUaEraEraEraEraEraEraEraEraEraaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaXPdcxdcydczdcAbdmaXPbeUaZbaZcaZcbgoaZdaZeaZfaZfaZgaZhaZfaZiaZiaZjaZiaZkaPnaPnaPnaPnaZlaZmaZnaZoaZpaZpaZqaZraZnaZsaZtaZuaWdaWdaYbaZvaZwaYdaDAaSAaZxaVjaZyaWlaWlaZzaWlaZAaZBaSKaVpaVpaXsaZCaZDaZEaXsaVpaVpaSKaZFaZGaZHaZIaVzaZJaVzaZKaVAaZLaZMaZMaZNaZNaZNaZNaZNaZNaZNaZOaZPaZQaZRaZSaZSaZOaZTaZTaZTaZTaZTaZUaZUaZUaZVaZUaZUaZUaZUaZWaThaYKaZXaZYaZZbaababaThaThbacbacbadbadbadbadbadbaebafbafbafbafaThbafbagbafbafbahbaibaibaibaibhNbhLbgjbAqbakaKQaKRaQvaEraEraEraEraEraEraEraEraEraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafanYaVRaQyaXPdcBaXPaXPaXPaXPaXPbbSaJKaJKaJKbbSaScaSdaTsaXRaXSaXTaSeaXUaXVaXWaJNaJNaJNaJKaWVaJKaUVaTDaTEaXXaUXaWbaXYaXZaTEaUZaTKaYaaWdaWdaYbaYcaTKaYdaDAaSAaYeaYfaXmaXnaYgaYhaXqaYiaYjaYkaYlaYmaXsaXtaYnaXtaXsaYmaYoaYpaYqaYraVzaYsaYsaYtaVzaYuaVAaYvaYwaDAaWCaWDaThaThaYxaThbiGbiFbiFbiFbxbbiFbiFbiFbfJaThaThaThaThaThaThaYCaYDaYEaWDaThaThaThaThaThaYFaYGaYHaYIaYJaThaThaThaThaThaYKaYLaThaThaThaThaThaThaThaThaThaThaThaThaThaYMaYNaYOaYPaYRaYRaYSbjaaYUaOZaOZaYUaEraEraEraEraEraEraEraEraEraaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaXPdcxdcydczdcAbdmaXPbeUaZbaZcaZcbgoaZdaZeaZfaZfaZgaZhaZfaZiaZiaZjaZiaZkaPnaPnaPnaPnaZlaZmaZnaZoaZpaZpaZqaZraZnaZsaZtaZuaWdaWdaYbaZvaZwaYdaDAaSAaZxaVjaZyaWlaWlaZzaWlaZAaZBaSKaVpaVpaXsaZCaZDaZEaXsaVpaVpaSKaZFaZGaZHaZIaVzaZJaVzaZKaVAaZLaZMaZMaZNaZNaZNaZNaZNaZNaZNbenaZPaZQaZRaZSaZSbenaZTaZTaZTaZTaZTaZUaZUaZUaZVaZUaZUaZUaZUaZWaThaYKaZXaZYaZZbaababaThaThbacbacbadbadbadbadbadbaebafbafbafbafaThbafbagbafbafbahbaibaibaibaibhNbhLbgjbAqbakaKQaKRaQvaEraEraEraEraEraEraEraEraEraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaXPaYVaYXaYXaYXbbRaXPbdibdjaMzaMzbbSbapaSeaTsbaqaTvbaraSebasbatbaubaubavbawbaxbaxbaybaxbazbaAbaBbaCbaBbaBbaDbaEbaFbaGbaHaWdaWdbaIbaJbaKaYdaDAbaLaZxbaMbaNbaOaVjbaPbaQbaRbaSaSKaWpaVobaTaWtbaUaWtbaVaVoaWvaSKbaWbaXbaYbaZaVzbbaaVzbbbaVAaSSaDAbbcaZNbbdbbebbfbbgbbhaZNbbibbjbbjbbkbblbblbblbbmbbnbbobbpaZTbbqbbrbbrbbrbbrbbsbbtbbubbvbbwbbvbbvbbvbbxbbybbzbbAbbzbbBbbBbadbbCbbDbbEbadbbFbbGbbFbadbaeaThbahbaibbHbbIbbHbaibbJbgnbaibgmbgkbgjbdgbakaafaaaaafaEraEraEraEraEraEraEraEraEraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaafaXPbalaXPbbOaYXbambaoaXPaMzaYWaYYaYZbbTaSeaSeaSeaSeaSeaSebbUbbVbbWaMzbbXaTEaTEaTEbbYaTEaTEaTEbbZaTEaTEaTEaTEbcabcbbccbcdaWdaWdaYbbceaZwaYdaDAbcfaZxbcgbaNbchbchbchaVjbcibcjaSKaVpbckaVpbclaYmaVpaVpbckaVpaSKbcmbcnbcobcpaVzaZJbcqaVzbcrbcsbctbcuaZNbcvbcwbcxbcybczbcAbblbcBbblbcCbblbblbcDbcEbcFbcGbcHaZTbcIbbrbcIbbrbcIbcJbbraZUbcKbcKbcLbcMaZYbcNbaabcObcPbcQbcRbcRbadbcSbcTbcUbcVbcWbcXbcYbadbcZbafbdbbaibdcbeQbePbeRbdebdebddbeMbdfbgjbdgbakaaaaaaaaaaEraEraEraEraEraEraEraEraEraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaXPbbNdcIdcGdcHdcHdcKdcJaZaaYZaJKbdnbdobdpbdpbdpbaxbaxbaxbdqbdrbdrbdrbdsaTEbdtbdubdvbdwbdxbdybdzbdAaTEbdBbdCbdDbdEbdFbdGbdHbdIbdJbdKbdKbdLbctbdMbdNbdObOibdQbdRbdSbdTbciaTSaTSaSKbdUaXtaXtbdVaXtaXtbdUaSKbdWbdWbdXaVzbdYaVzbdZbeabebbecaSSaDAaDAaZNbedbeebefbegbehbeibblbejbekbelbembembenbeobepbeqberaZTbcIbbrbcIbbrbcIbcJbesaZUbetbeubevbewaZYbexbeybezbezbezbeAbeBbeCbeDbeEbeEbeEbeFbeEbeGbeHbeIbeJbeKbeLdbNbeNbeOdbydbrdbMdbLdbEdbzbgjbdgbakaaaaaaaafaaaaEraEraEraEraEraEraEraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaXPdcDaXPdcEbbQbbQdcFaXPbeVbeWaJKbeXbeYbeXbeXbeXbeYbeXaJKaJKaTEaTEaTEbeZaTEbdzbdzbfabdzbdzbdzbdzbdzbfbbfcbfdbfebffbfgbfgbfgbfhbfibfjbfkbflbfmbfnbfobfpbfqbfrbNhaTPbftbfuaTSaaabfvbitbfxbfybfxbfzbfxbjGbfvaaabfBbfCbfDbdWbdWbdWbdWbfEaVAbfFaDAaDAaZNbfGbeebfHbcybczbfIbblbcCbfJbfKbfLbfMbfNaZTbfObfPbfQaZTbcIbfRbcIbbrbcIbcJbbraZUaZYaZYaZYaZYaZYbexbaabfSbfTbfUbfVbfWbfXbfYbfZbgabgabgbbcUbgcbadbgdbgebgfbaibggbghbgicvUdbkbglbaibgjdblbgjbdgbakbakbakbakaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaXPbeTdcCbbPbbQbdkbgpaXPaaaaafaafbgqbgqbgqbgqbgqbgqbgqaaaaaabgrbgsbgtbgubgvbdzbdzbdzbdzbdzbdzbdzbdzbgwbcdaWdbgxbgybgzbgAbgBbgCbdEaTKaTKbgDbgEbgFbgGbgHbgMbgMbgJbgIbgKbgLbgMaafbgNbgObfxbgPbfxbgPbfxbgQbgNaafbgRbgSaYsbgTbgUbgVbgWbgXbgYbgZaDAbhabhbbhcbhdbfHbhebhfaZNbhgbcCbfJbfLbhhbblbhiaZTbhjbhkbhlaZTbhmbhnbhobhpbhqbhrbhqbhsbhtbhubhtbhtbhtbhvbaabhwbcPbcPbfVbhxbhybhzbhAbhBbhBbhCbhDbhEbadbhFbgebhGbaibhHbhIbhJcvUbkCbhKbaibjcboXbxCbmYbhMbhMbhObakaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaXPbhPbhQbhRbanaXPaXPaXPaaaaaaaaabgqbgqbgqbgqbgqbgqbgqaaaaaabhSbhTbdzbhUbhVbhVbhVbhVbhVbhVbhVbhVbhVbhWbhXbhYbhZbiabibbicbidaYbbiebifbigbihbiibijbgGbgGbgMbNgbilbimbinbiobgMaaabipbiqbfxbirbisbirbfxbfAbipaaabiubivaYsbiwbixbiybixbizbiAbgZaDAaDAaZNbiBbeebfHbiCbiDaZNbiEbiFbiGbiHbiIbblbiJbiKbiLbiMbiNaZTaZUbiOaZUaZUaZUbiPbiPbiPbiPbiPbiPbiPbiPbexbaabfSbfTbfUbiQbiRbiSbiTbiUbiUbiUbhCbcUbiVbadbiWbgebiXbaibiYbiZbiYbkDbkCbjbbaibjcbjcbjcbjcbjcbjcbdgbakaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaXPbbNdcIdcGdcHdcHdcKdcJaZaaYZaJKbdnbdobdpbdpbdpbaxbaxbaxbdqbdrbdrbdrbdsaTEbdtbdubdvbdwbdxbdybdzbdAaTEbdBbdCbdDbdEbdFbdGbdHbdIbdJbdKbdKbdLbctbdMbdNbdObOibdQbdRbdSbdTbciaTSaTSaSKbdUaXtaXtbdVaXtaXtbdUaSKbdWbdWbdXaVzbdYaVzbdZbeabebbecaSSaDAaDAaZNbedbeebefbegbehbeibblbejbzMbzNbBmbBmbyvbeobepbeqberaZTbcIbbrbcIbbrbcIbcJbesaZUbetbeubevbewaZYbexbeybezbezbezbeAbeBbeCbeDbeEbeEbeEbeFbeEbeGbeHbeIbeJbeKbeLdbNbeNbeOdbydbrdbMdbLdbEdbzbgjbdgbakaaaaaaaafaaaaEraEraEraEraEraEraEraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaXPdcDaXPdcEbbQbbQdcFaXPbeVbeWaJKbeXbeYbeXbeXbeXbeYbeXaJKaJKaTEaTEaTEbeZaTEbdzbdzbfabdzbdzbdzbdzbdzbfbbfcbfdbfebffbfgbfgbfgbfhbfibfjbfkbflbfmbfnbfobfpbfqbfrbNhaTPbftbfuaTSaaabfvbitbfxbfybfxbfzbfxbjGbfvaaabfBbfCbfDbdWbdWbdWbdWbfEaVAbfFaDAaDAaZNbfGbeebfHbcybczbfIbblbcCbyrbfKbfLbfMbfNaZTbfObfPbfQaZTbcIbfRbcIbbrbcIbcJbbraZUaZYaZYaZYaZYaZYbexbaabfSbfTbfUbfVbfWbfXbfYbfZbgabgabgbbcUbgcbadbgdbgebgfbaibggbghbgicvUdbkbglbaibgjdblbgjbdgbakbakbakbakaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaXPbeTdcCbbPbbQbdkbgpaXPaaaaafaafbgqbgqbgqbgqbgqbgqbgqaaaaaabgrbgsbgtbgubgvbdzbdzbdzbdzbdzbdzbdzbdzbgwbcdaWdbgxbgybgzbgAbgBbgCbdEaTKaTKbgDbgEbgFbgGbgHbgMbgMbgJbgIbgKbgLbgMaafbgNbgObfxbgPbfxbgPbfxbgQbgNaafbgRbgSaYsbgTbgUbgVbgWbgXbgYbgZaDAbhabhbbhcbhdbfHbhebhfaZNbhgbcCbyrbfLbhhbblbhiaZTbhjbhkbhlaZTbhmbhnbhobhpbhqbhrbhqbhsbhtbhubhtbhtbhtbhvbaabhwbcPbcPbfVbhxbhybhzbhAbhBbhBbhCbhDbhEbadbhFbgebhGbaibhHbhIbhJcvUbkCbhKbaibjcboXbxCbmYbhMbhMbhObakaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaXPbhPbhQbhRbanaXPaXPaXPaaaaaaaaabgqbgqbgqbgqbgqbgqbgqaaaaaabhSbhTbdzbhUbhVbhVbhVbhVbhVbhVbhVbhVbhVbhWbhXbhYbhZbiabibbicbidaYbbiebifbigbihbiibijbgGbgGbgMbNgbilbimbinbiobgMaaabipbiqbfxbirbisbirbfxbfAbipaaabiubivaYsbiwbixbiybixbizbiAbgZaDAaDAaZNbiBbeebfHbiCbiDaZNbiEbyqbxhbiHbiIbblbiJbiKbiLbiMbiNaZTaZUbiOaZUaZUaZUbiPbiPbiPbiPbiPbiPbiPbiPbexbaabfSbfTbfUbiQbiRbiSbiTbiUbiUbiUbhCbcUbiVbadbiWbgebiXbaibiYbiZbiYbkDbkCbjbbaibjcbjcbjcbjcbjcbjcbdgbakaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgqbgqbgqbgqbgqbgqbgqbjdbjebjfbjgbdzbdzbdzbjhbjhbjhbjhbdzbdzbdzbdzbfbbjiaWdbjjbjkbjlbjmbjnaYbaWdbjobjpbjqbjrbjsbNcbjubNbbjwbjxbjybjzbjAbjBazFbjCbjDbjEbfxbirbfxbjFbfwbjHbjIbjJbjKbjLbjMbixbjNbixbizbiAbjOaDAaDAaZNbjPbeebfHbjQbjRaZNbjSbcCbblbjTbjUbjVbjWbiEbjXbjYbjZbkabkbbkcbblbkdbkebkfbkgbkhbkibkjbkkbklbkmbbxbbybknbkobkpbkqbkrbadbksbiUbiUbktbkubcUbkvbadbkwbkxbkybaibkzbkAbkBbbLbbKbdabaibkEbkFbkFbkFbkFbkFbdgbakaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgqbgqbgqbgqbgqbgqbgqbkGbkHbkGbkIbkJbdzbdzbdzbdzbdzbdzbdzbdzbkKaTEaTEbkLaWdaWdbkMbkNbkObkPaYbaWdaWdbkQbkRbiibkSbkTbkUbMZbkWbNabkYbkZblabgMaaablbblbblcbldblebfxblfblbblbaaablgblhblhblhblhblhblhblibljblkbllbllaZNaZNblmblnbloblpaZNblqbcCbblbblbblbblblrbblblsbltbblbblbblbltbblbblbkeblublvblwblxblyblzblAbiPblBblCblDblDblEblFbcPbadblGbcUbcUblHblIbcUblJblKblLblLblMblNblNblObbHblPbajbaibaiblQbkFblRblSblTbkFbdgbbMaaaaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgqbgqbgqbgqbgqbgqbgqblUblVblUblWbdzbdzbdzbjhbjhbjhbjhbdzbdzblXblYaTEblZaWdaWdbkMbmabicbkPaYbbmbaWdbkQbkRbmcaDAaLKbkUbHFbmebHEbmgbmgbGjbgMaafaafblbblbbmibmjbmiblbblbaafaafbmkbmlbmmbmnbmobmpbmqbmrbmsbmtaDAaDAbmubmvbmwbmxbmybmzbmAbmBbmCbmBbmDbmBbmBbmEbmBbmFbmGbmBbmBbmBbmHbmIbmIbmJblubmKblwbmLbmLbmMbmNbiPbexbaabmObmPbmQbmRbmRbadbmSbmTbmUblKbmVbcUbmWblKbmXaYQbmZbnabnbbncbndbneaYTbngbnhbnibnjblRbnkbnlbkFbdgbdhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8414,10 +8481,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgqbgqbgqbgqbgqbgqbgqaaaaaaaaaaaaaaaaaaaaaaaaaaabrdbslbsmbsnbsobspbsqbsrbssbstbsubsvbswbsxbsybszbsAbpLbsBbsCbsDbsDbsDbNdbsFbsGaWCbsHbsIbsJbsKbsKbsLbsMbsNbsObsPbsQbsRaDAaDAbsSaGQaDAaGAaDAaDAaDAbsTbsUbqcaDAbsVboRbsWbsXbsYbsZbtaboRbtbbrwbtcbrybrzbrAbrAbrBbtdbqobrDbblbtfbnSbmLbtgbthbtibtjbtkbtlbtmbtnbiPbiPaZZbtobrPbtpbtqbtrbtsbttbtubrPbtvbtwbtxbtybtzbtAbrXbrYbrZbtBbtCbtDbtEbtFbtGbtHbtIbkFbkFbkFbkFbkFbkFbqYbakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBjaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgqbgqbgqbgqbgqbgqbgqaaaaaaaaaaaaaaaaaaaaaaaaaaabtJbtKbtLbtMbtNbtObtPbtQbtRbtSbtTbssbtUbtVbtWbszbtXbpLbtYbtZaDAaDAaDAaDAaDAaDAaWCaDAbmcaDAaDAaDAaDAaZMbuabubbucaDAaDAaDAaDAbsSaDAaDAaGAaDAaDAaDAbudbuebqcbufbugbuhbuibujbukbulbumbunbuobupbBlbnOboRboVbusbutbuubuvboRbblbblbnSbnSbnSbnSbnSbiPbiPbiPbiPbiPbiPbuwbuxbuybrPbuzbuAbuBbuCbuDbuEbrPbuFbuGbuHbuIbuJbuKbuLbuMbuNbuObuPbuQbuQbuRbuSbuTbtIbuUbuVbuUbjcbjcbjcbqYbakaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgqbgqbgqbgqbgqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrdbvcbvdbvebvfbvgbvhbsrbssbssbvibssbswbvjbvkbvlbvmbpLbvnbvobvpbvpbvpbvqbvpbvpbvrbvpbvsaDAbvtbvubctbvvbvwbvxbvybvzbvAbvBaRDbvybvCaRDbvDbvEaRDbvFbvGbvHbvIaDAaDAboRbvJbvKbvLbvMboWboRbvNbvObvNboRboRboRboRboRboRboRboRbblbblbblbvPbvQboQbvRbvSbvTbvUbvVbvWbvXbvYbvZbwabrPbwbbwcbwdbwebwfbwgbrPbwhbwibwjbwkbwlbwmbwnbwobwpbqUbwqbwrbwsbwtbwubwvbtIbjcbjcbjcbjcbjcbjcbqYbakbakbakaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrdbrdbwAbwBbwBbwCbrdbrdbwDbwEbwFbwGbpLbpLbwHbpLbpLbpLbwIbwJaOhaOhaOhaOhbwKbwKbwKbwKbwKbwKbwKbwKbwKbwKbwLbwMbwNbwObwObwObwObwPbwQbwObwObwObwObwRbwSbwTaDFaFebwUboRbwVbwWbwXbwYbwZboRbxabrwbxbboSbxcbxcbxdbxebxfbxgboSbxhbblbblbblbblbblblsbxibxjbxkbxlbxmbxnbxobxpbxqbxqbxqbxqbxqbxqbxqbxqbxqbxrbxsbxrbxrbxrbxrbxtbxubxvbpubpubpubpubpubpubpubtIbxwbxwbxwbxwbjcbxxbAubxzbCabxzaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxEaaaaaaaaaaaaaafaaabrhbxFbxGbxHbxIbxIbxJbxKbxLbxMbxNbxObwJaaaaaaaafaaabwKbxPbxQbxRbxSbxTbxUbxVbxWbwKbxXbxYbxZbwObyabybbycbydbyebyfbyfbygbyhbyibyjbykbylbymbwRboRbynbrwbtcbyobypboRbyqbrwbyrbysbrybrybrybrybrybytbyubyvbjZbjZbjZbjZbywblsbyxbyybyzbyAbyBbvSbxobxpbxqbyCbyCbyCbyDbyCbyEbyFbxqbyGbyHbyIbyGbyGbxrbyJbyKbrZbgebyLbyMbyNbyObyPbyQbyRbySbyTbyUbxwbjcbyVbLPbakbDybyLbyLbyLaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyXbyYbyZbyYbzaaaaaaaaafbrhbrhbzbbssbzcbssbzdbrhbzebzebzfbzgbzhbwJaafbzibzjbzkbzlbzmbxWbznbxWbzobzpbzqbzqbzrbzsbztbzubzvbyfbzwbzxbzybzzbzAbzBbwObwObzCbzDbzEbzFbzGbzHbzIbzJbrwbzKbyobrybzLbzMbrwbzNboRbzObzPbrybzQbqkbzRbiEbiEbiEbiEbiEbzSblsblsbzTbxjbzUbzVbzWbzXbzYbxpbxqbzZbyCbAabyCbAbbyCbAcbxqbAdbAebAfbAgbAhbxrbwnbAibAjbAkbAlbAmbAmbAmbAmbAmbAmbAnbAobApbxwbakbAqbakbyLbyLbyLbArbAsaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbuZbAtbuZaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAvbAwbAxbAwbAvbAybAzbAAbrhbABbssbACbADbssbAEbrhbwJbAFbwJbwJbAGbAHaaabAIbAJbAKbALbxWbxWbAMbxWbANbAObAPbxWbwKbAQbARbASbwObATbAUbAVbAWbAXbzAbAYbAZbBabBbbBcbBdbBebBfbBgboRbBhbBibBjbBkbBlboRbBmbrwbBnboRbBobyobrybrwbBpbBqbiEbBrbBsbBtbBubcCblsblsbBvbxjbxjbBwbBxbBybBzbBAbxqbyCbyCbBBbyCbyCbyCbBCbxqbBDbBEbBFbBGbBHbBIbBJbBKbBLbBMbBNbAmbBObBPbBPbBQbBPbBPbBPbBPbBRbBSbBTbBUbBVbBWbBXbBYbBZaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbjtbuZbGibuZbjtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrdbrdbwAbwBbwBbwCbrdbrdbwDbwEbwFbwGbpLbpLbwHbpLbpLbpLbwIbwJaOhaOhaOhaOhbwKbwKbwKbwKbwKbwKbwKbwKbwKbwKbwLbwMbwNbwObwObwObwObwPbwQbwObwObwObwObwRbwSbwTaDFaFebwUboRbwVbwWbwXbwYbwZboRbxabrwaYzboSbxcbxcbxdbxebxfbxgboSaYybblbblbblbblbblblsbxibxjbxkbxlbxmbxnbxobxpbxqbxqbxqbxqbxqbxqbxqbxqbxqbxrbxsbxrbxrbxrbxrbxtbxubxvbpubpubpubpubpubpubpubtIbxwbxwbxwbxwbjcbxxbAubxzbCabxzaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxEaaaaaaaaaaaaaafaaabrhbxFbxGbxHbxIbxIbxJbxKbxLbxMbxNbxObwJaaaaaaaafaaabwKbxPbxQbxRbxSbxTbxUbxVbxWbwKbxXbxYbxZbwObyabybbycbydbyebyfbyfbygbyhbyibyjbykbylbymbwRboRbynbrwbtcbyobypboRaYBbrwaYAbysbrybrybrybrybrybytbyuaZObjZbjZbjZbjZbywblsbyxbyybyzbyAbyBbvSbxobxpbxqbyCbyCbyCbyDbyCbyEbyFbxqbyGbyHbyIbyGbyGbxrbyJbyKbrZbgebyLbyMbyNbyObyPbyQbyRbySbyTbyUbxwbjcbyVbLPbakbDybyLbyLbyLaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyXbyYbyZbyYbzaaaaaaaaafbrhbrhbzbbssbzcbssbzdbrhbzebzebzfbzgbzhbwJaafbzibzjbzkbzlbzmbxWbznbxWbzobzpbzqbzqbzrbzsbztbzubzvbyfbzwbzxbzybzzbzAbzBbwObwObzCbzDbzEbzFbzGbzHbzIbzJbrwbzKbyobrybzLbekbrwbelboRbzObzPbrybzQbqkbzRbiEbiEbiEbiEbiEbzSblsblsbzTbxjbzUbzVbzWbzXbzYbxpbxqbzZbyCbAabyCbAbbyCbAcbxqbAdbAebAfbAgbAhbxrbwnbAibAjbAkbAlbAmbAmbAmbAmbAmbAmbAnbAobApbxwbakbAqbakbyLbyLbyLbArbAsaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbuZbAtbuZaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAvbAwbAxbAwbAvbAybAzbAAbrhbABbssbACbADbssbAEbrhbwJbAFbwJbwJbAGbAHaaabAIbAJbAKbALbxWbxWbAMbxWbANbAObAPbxWbwKbAQbARbASbwObATbAUbAVbAWbAXbzAbAYbAZbBabBbbBcbBdbBebBfbBgboRbBhbBibBjbBkbBlboRbembrwbBnboRbBobyobrybrwbBpbBqbiEbBrbBsbBtbBubcCblsblsbBvbxjbxjbBwbBxbBybBzbBAbxqbyCbyCbBBbyCbyCbyCbBCbxqbBDbBEbBFbBGbBHbBIbBJbBKbBLbBMbBNbAmbBObBPbBPbBQbBPbBPbBPbBPbBRbBSbBTbBUbBVbBWbBXbBYbBZaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbjtbuZbGibuZbjtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaabyZbCbbCcbCbbyZbCdbCebCfbrhbCgbssbChbssbssbAEbrhbCibCjbzebwJbAGbCkaafbAIbClbCmbCnbCobCpbCobCobCqbCrbCobCobCsbCtbCubCvbwObwObwObwObwObwObCwbwObwObCxbCybCzbCAbCBbCCbCDboRbCEbCFbCGbCHbCIboRbCJbCKbCLboRbCMbCNbCObCPbCQbCRbiEbCSbblbcDbCTbcCbCUbCVbCWbCXbxjbxjbCYbvSbCZbxpbxqbxqbDabBBbyCbDbbDabxqbxqbDcbDdbDebDebDfbxrbDgbDhbrZbDibAlbAmbAmbDjbDkbDlbAmbDmbDnbDobDpbDqbDrbDsbDtbDubDvbDwbDxaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbyWbmfbDzbfsbEJbmfbyWaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAvbCbbCbbCbbDAbDBbssbssbDCbCgbssbssbssbssbAEbrhbDDbDEbDFbwJbAGbDGaaabAIbDHbDIbDJbxWbxWbDKbxWbDLbDMbDNbDObwKbDPbDQbDRbDSbDTbDTbDTbDTbDUbDVbDVbDVbDWbDXbDYbDZbEabEbbEcbunbEdbEebunbEfbEdbunbunbEebEfbunbunbEfbunbEgbEhboRbiEbEibiEbjWbiEbEjblsbcDbvSbvSbvSbvSbvSbvSbEkbElbEmbEnbEobEpbEqbErbEsbEnbEtbDcbDdbDebDebEubxrbEvbDhbrZbEwbyLbExbExbEybEzbEAbEBbAmbAmbECbxwbEDbEEbEFbyLbEGbEHbEIbyLaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaafbvbbwybELbwxbwxbwxbGhbvbbwyaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyZbCcbCcbCcbyZbEMbENbEObEPbEQbERbERbssbESbrhbrhbwJbwJbwJbwJbAGbwJaafbETbzjbEUbEVbEWbxWbEXbxWbxWbEYbEZbFabFbbFcbFdbFebFfbFgbFgbFgbFgbFhbFibFjbFkbFlbFmbFnbFobFpbFqbFrbFsbFtbFubFvbFvbFtbFvbFvbFubFvbFvbFvbFvbFvbFwbFxbFybiEbFzbFAbFBbFCbFDbFEbFFbFGbFHbFIbFJbFKbFmbFLbFMbFNbFObFPbFQbFRbFSbFTbFUbEtbEtbEtbEtbEtbEtbFVbFWbDhbFXbFYbyLbxwbxwbxwbxwbFZbxwbGabAmbAmbxwbGbbGcbakbyLbGdbGebGfbGgaagaagaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbuYbvabuYbwxbuXbwxbuWbsEbuZaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8436,28 +8503,28 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbRkbTjbTkbTlbTkbTmbTnbTobTpbTqbTrbOlbTsbQxbTtbTubTvbRubTwbTtbTtbSrbTxbTybTzbTAbTBbTCbTDbTEbTFbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbGJbIVbNvbTQbTRbSFbTSbIVbQNbSGbPMbPNbTTbLiaafbLjbTUbTVbTWbJeaafaaaaaaaaaaaabLmbIdbIebIebTXbTYbIebIibIebIebIebIebIebMzbNQbMHbEtbEtbEtbEtbQbbTZbNTbUabQbbEtbEtbEtbEtbxqbSZbUbbUcbUdbUebUebakaafaaaaaaaaaaaaaaaaaaaafbUfbUgbUfaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbQrbQrbQrbQrbQrbOlbOlbOlbOlbOlbOlbOlbUhbQxbTtbTtbRubRubRubTtbUibUjbUkbUlbUmbUnbQybzebwJbUobUpbUqbUrbUsbUtbUubUvbUwbUxbUybUzbGJbUAbUBbTQbHMbSFbUCbIVbUDbSGbPMbUEbUFbQSbMtbKcbUGbSLbSLbJeaafaaaaaaaaaaaabMvbIdbUHbIebIebUIbIebUJbUKbULbwRbUMbUNbUObNQbMHbMIbMJbMJbUPbMLbHibMMbMNbUQbURbyCbyCbyCbxqbSZbUSbMYbUTbUUbUVbakaafaafaaaaaaaaaaaaaaaaafbUWbTgbUWaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSafSafSafRafRafSafRafRafRagxafRafRafRafSafRaafaafaafbwJbDEbzebzebzebzebzebzebzebUXbwJbQwbQxbUYbUZbVabVbbRubRubVcbVdbVcbVebSubVfbQybzebVgbKQbGBbVhbVibVjbUtbVkbVlbVmbVnbVobVpbVqbJSbVrbHMbHMbHMbVsbIVbVtbVubPMbPNbIVbLiaafbJebJebJebJebJeaafaafaafaafaafbtobPSbGYbGYbVvbVwbwRbVxbVybVzbwRbVAbGYbVBbVCbMHbyCbyCbyCbVDbNSbHibNTbHibNUbVEbyCbyCbyCbxqbSZbUbbakbakbakbakbakaaaaafaafaaaaaaaaaaaaaafaaabVFaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaafRaafaaaaaabwJbVGbVHbwJbwJbVIbVJbwJbwJbVKbGrbQwbQxbVLbTtbRubRubRubTtbUibVMbVNbSubVObVPbTBbTDbTDbVQbVRbVSbVibVibVTbUubVUbVVbVWbVXbVYbGJbIVbIYbVZbWabWbbLbbWcbWdbWebSHbOxbOybOzbKbbKcbWhbWibWibJeaafaaaaaaaaaaaabQUbQVbQVbQVbWjbWkbwRbwRbWlbwRbwRbWkbWmbWnbWobWpbyCbyCbyCbWqbWrbWsbWtbHibONbWubMJbMJbOPbxqbSZbWvaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaafaaabVFaaaaafaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaabWwbWxbWyaaabWwbWxbWyaaabWwbWxbWyaafafRaaaaaaaaabwJbwJbwJbwJaaaaaaaaaaaabwJbVKbWzbQwbQxbTtbWAbWBbRubWCbTtbTtbSrbWDbSubSubWEbQybWFbWGbWHbWIbWJbWKbWLbWMbUubWMbUtbUtbUubWNbGJbWObWPbWQbMkbMkbMmbOsbWRbOwbMnbPNbWSbLiaafbLjbWTbWUbWVbJeaafaaaaaaaaaaaaaafaaaaaabwRbWWbWXbWYbWYbWYbWYbWYbWZbXabtobXbbMHbxqbxqbxqbxqbxqbxqbXcbxqbxqbxqbxqbxqbxqbxqbSZbXdaaaaaaaaaaaaaaaaaabXebXebXebXfaafaafaafaafbVFaafaafaafaafaafagxbXebXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaabWwbXgbWyaaabWwbXgbWyaaabWwbXgbWyaafaafaaaaaaaaaaaaaaaaaaaafaaaaaabwJbwJbwJbXhbXibXjbQxbRubXkbXlbRubXmbXnbRubSrbXobXpbXqbXqbXrbXsbXtbXubXvbXwbXxbXybXzbXAbXBbUtbUtbUubXCbGJbXDbIVbIYbOsbJcbXEbXFbXGbXHbIabXIbXJbQSbMtbKcbXKbWibWibJeaafaaaaaaaaaaaaaafaaaaaabwRbXLbXMbXNbXNbXNbXNbXNbXNbXObGbbXPbXQbXRbXRbXRbXRbXRbXRbXSbXTbXTbXTbXTbXTbXTbXTbXUbUbaaaaaaaaaaaaaaaaaabXeaaaaafaaaaafaaaaaaaaabXVaaaaafaafaaaaaaaaaaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaafRaafbWwbXgbWyaaabWwbXgbWyaafbWwbXgbWyaafaafaaaaaaaaaaaaaaaaaaaafaaaaaabXWbXXbXWbzebzebQwbQxbRubXYbXZbYabYbbYcbRubYdbYebYfbYgbYhbQybYibYjbYkbYlbYmbYnbYobYpbYqbYrbYsbYtbYubYvbGJbYwbLebYxbYybIVbIVbIVbJbbPHbYybPNbRRbLiaafbJebJebJebJebJeaafaafaafaafaafaafaafaafbwRbYzbYAbYAbYBbYCbYDbYAbYAbYEbGbbYFbYGbYHbYIbYJbYJbYGbYGbYGbYGbYKbYGbYGbYLbYMbYNbYObYPaaaaaaaaaaaaaaaaaabXeaaabYQbYQbYQbYQbYQaafbYRaafbYQbYQbYQbYQbYQaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabWwbXgbWyaafbWwbXgbWyaaabWwbXgbWyaaaaafaafaafaafaafaafaaaaafaaaaafbwJbwJbwJbzebzebQwbQxbQxbQxbQxbQxbQxbQxbQxbQybQybQybQybQybQybwJbYSbwJbYTbYUbYUbYUbYVbYWbYXbYUbYYbYZbZabZbbZcbZdbMpbZebZfbZgbZfbZebZhbZebZibOsbZjaafaafaafaafaafaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabZkbUHbZkaaaaaaaafbGbbZlbZmbZnbZnbZobakbZmbZnbZnbZobakbZmbZnbZnbZobakbakbakaaaaaaaaaaaaaaaaaabXeaafbZpbZqbZqbZqbZqbZrbYRbZsbZtbZtbZtbZtbZuaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSafSafRaafaaabWwbXgbWyaafbWwbXgbWyaaabWwbXgbWyaafaafaaaaaaaaaaaaaafaafbZvbZwbZwbZwbZwbZxbzebzebQwbwJbZybZzbZAbZAbZAbZAbZAbZAbZAbZAbZAbZBbZBbZAbZCbZDbYTcbqcbrcbocbpcaycbnbYUbZKbZLbZMbGJbZNbZObZPbSJbZRbZSbZTbWfbIVbZVbZWbSIbIXaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabZYbYCbZYaaaaaaaafbZZcaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaabXeaafcabcabcabcabcabaaabYRaaacabcabcabcabcabaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaaaafaaaaafaafcacaafaafaafcacaafaaaaafcacaafaaaaafaaaaaaaaaaaacadcaecafcagcahcaicajcakcalcalcambwJcancaocapcapcapcapcapcapcapcapcapcapcapcapcaqcarcascatccoccpccqccrccScazcaAcaBcaCcaDcaEcaFcaGcaHcaGcaFcaGcaHcaGcaIcaGcaIcaJaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaKcaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaabXeaaaaafaaaaafaafaafaaabYRaaaaafaaaaafaaaaafaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRaafcaLcaMcaMcaNcaOcaOcaOcaOcaOcaOcaOcaOcaOcaOcaOcaPcaMcaMcaMcaMcaQcaRcaQcaScaTcaUcaVbzebzebzecaWcaXcaYcaZcapcbacbacbbcapcbccbdcbecbfcbgcbhcbicbjcbkcblcbmcbVcbXcbYbZHcbWcbscbtcbucbvcapaafcbwaafcbxaafcbwaafcbxaafcbyaafcbyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXeaaabYQbYQbYQbYQbYQaafbYRaafbYQbYQbYQbYQbYQaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaaaafaaaaafaafcbzaafaaaaafcbzaafaaaaafcbzaafaaaaaaaaaaaaaaaaaacadcaecbAcbBcbCcbDbZwcbEbzebzebzebzebzfcbFcapcbGcbHcbIcbJcbKcbLcbMcbNcbOcbPcbQcbRcbScbTcbUbZIbZFbZEbZHbZGbYUcbZcbZcbZcapbJeccabLjccabJeccabLjccabJeccbbLjcccbJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccdaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXeaafbZpbZqbZqbZqbZqbZrbYRbZsbZtbZtbZtbZtbZuaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSafSafRaafaafbWwccebWyaaabWwccebWyaaabWwccebWyaafaaaaaaaaaaaaaaaaafaafccfbZwbZwbZwbZwbwJbwJbwJbwJbzeccgbNjcapcchcbIcbIcbJcciccjcckcckcckccjccjcclcaBccmccncawcavcavcaubZJbYUccsbZLcctcapbJeccuccvccwbJeccxccycczbJeccAccBccCbJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXeaafcabcabcabcabcabaaabYRaafcabcabcabcabcabaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWwccebWyaafbWwccebWyaaabWwccebWyaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaafaafbwJccDbzebzebzebzebNjcapccEccEccFcapccGccHccIccJccJcaBccKccLccMccNccOccPccQccRcaxccTccUccVccWccXcapbJeccYccZccYbJecdacdbcdabJecdccddcdebJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaabXfaaaaafaaaaafaaaaafaaacdfaaaaafaaaaafaafaafaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBjaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRaafbWwccebWyaaabWwccebWyaaabWwccebWyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwJcdgbzebzebzebzebNjcapccEccEccFcapcdhcdicdjcdkcdlcdmcdncbjcdmcdocdpcdqcdrcdscdtcducdvcdscaBcdwcapbJeccYcdxccYbJecdacdycdabJecdecdzcdebJeaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXeaaabYQbYQbYQbYQbYQaafbVFaafbYQbYQbYQbYQbYQaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRaafbWwccebWyaaabWwccebWyaafbWwccebWyaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaabwJbzebzecapcdAcapcdBcapccEccFccFcapcdCcdDcdEcdFccJcducdGcdHcdGcdIcdJcdKcdLcdLcdMcdLcdLcdLcdNcdOcapbJebJebJebJebJebJebJebJebJebJebJebJebJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaabXeaafbZpbZqbZqbZqbZqcdPcdQcdPbZtbZtbZtbZtbZuaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagxaafbWwcdRbWyaaabWwcdRbWyaaabWwcdRbWyaafafRaafaafaafaafaafaafaafaafaafaafaafbwJbzecdScapcdTcapcdUcapcapcapcapcapcdVcaBcdWcdXcdXcbQcbQcbQcdYcdZcdNcaBcaBcaBcaBceacaBcaBcdtcebcapaafaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXeaafcabcabcabcabcabaaabVFaaacabcabcabcabcabaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaafRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwJbDEbDEcapceccedceecefcegcehceicejcekcaBcelceacaBcemcctcapcencapcencapcctcemcaBcaBceocaBcdtcepcapcapcdicdicdicapaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXeaaaaaaaafaafaafaaaaaabVFaafaaaaaaaafaafaaaaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSafSafRafSafSagxafRafRafRafRafSafRafRafSceqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwJbwJbwJcapcaBcaBcercescetcetceucevcdtcaBcewcexcaBceycapcezceAceBceAceCcapceDcaBcexceEcaBcdtcaBceCcapceFceGceHceHceIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXebXebXebXebXeaaaaaaaaabVFaaaaaaaaabXebXebXebXfbXeaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacapcapceJceKccJcaBceLceMceNcdtceacaBcbKceOceOcePceQceRceScdWceTceUcdYcdYcdNcaBceacdtcaBceVceWcbIceXceYceZcfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXeaafcfbaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfccfdcfecaBcffcfgcfhcdtcficfjcfkcflcfmcapcfncfocfpceacfqcapcfrcfscfscfjcficdtcftcfucapcfvcfwceHceHcfxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXeaaaaafaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafcfycaBcaBcaBcaBcdicdicfzcapcfAcfBcfBcfBcapcfCcfDcfEcfFceVcapcfBcfBcfBcfAcapcfzcdicapcapcfGcdicdicctaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXebXebXebXebXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaafaaaaafaaacfHcfIcfJcfKcfLcdicfMcfNcapcfOcfPcfQcfRcfScfTcfUcfVcfWceVcfXcfPcfPcfPcfYcapcfZcgacapcgbcbIcgccfGaagaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagceJcapcapcapcapcapcapcfzcapcapcdmcgdcgecgfcggcfjcghcfjcgicgjcgecgdcgkcapcapcfzcapcapcdicdicdicdicglaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaafaagaagaafaaaaafaagcapcgmcgncgoaaaaaaaaacgpcgqcgdcgdcgdcgdcgdcgqcgraaaaaaaaacgscgtcgucapaaaaafaafaaaaafaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaafRaafaaaaaabwJbVGbVHbwJbwJbVIbVJbwJbwJbVKbGrbQwbQxbVLbTtbRubRubRubTtbUibVMbVNbSubVObVPdedbTDbTDbVQbVRbVSbVibVibVTbUubVUbVVbVWbVXbVYbGJbIVbIYbVZbWabWbbLbbWcbWdbWebSHbOxbOybOzbKbbKcbWhbWibWibJeaafaaaaaaaaaaaabQUbQVbQVbQVbWjbWkbwRbwRbWlbwRbwRbWkbWmbWnbWobWpbyCbyCbyCbWqbWrbWsbWtbHibONbWubMJbMJbOPbxqbSZbWvaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaafaaabVFaaaaafaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaabWwbWxbWyaaabWwbWxbWyaaabWwbWxbWyaafafRaaaaaaaaabwJbwJbwJbwJaaaaaaaaaaaabwJbVKbWzbQwbQxbTtbWAbWBbRubWCbTtbTtbSrbWDbSubSubWEdecbWFbWGbWHbWIbWJbWKbWLbWMbUubWMbUtbUtbUubWNbGJbWObWPbWQbMkbMkbMmbOsbWRbOwbMnbPNbWSbLiaafbLjbWTbWUbWVbJeaafaaaaaaaaaaaaaafaaaaaabwRbWWbWXbWYbWYbWYbWYbWYbWZbXabtobXbbMHbxqbxqbxqbxqbxqbxqbXcbxqbxqbxqbxqbxqbxqbxqbSZbXdaaaaaaaaaaaaaaaaaabXebXebXebXfaafaafaafaafbVFaafaafaafaafaafagxbXebXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaabWwbXgbWyaaabWwbXgbWyaaabWwbXgbWyaafaafaaaaaaaaaaaaaaaaaaaafaaaaaabwJbwJbwJbXhbXibXjbQxbRubXkbXlbRubXmbXnbRubSrbXobXpbXqbXqdeebXsbXtbXubXvbXwbXxbXybXzbXAbXBbUtbUtbUubXCbGJbXDbIVbIYbOsbJcbXEbXFbXGbXHbIabXIbXJbQSbMtbKcbXKbWibWibJeaafaaaaaaaaaaaaaafaaaaaabwRbXLbXMbXNbXNbXNbXNbXNbXNbXObGbbXPbXQbXRbXRbXRbXRbXRbXRbXSbXTbXTbXTbXTbXTbXTbXTbXUbUbaaaaaaaaaaaaaaaaaabXeaaaaafaaaaafaaaaaaaaabXVaaaaafaafaaaaaaaaaaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaafRaafbWwbXgbWyaaabWwbXgbWyaafbWwbXgbWyaafaafaaaaaaaaaaaaaaaaaaaafaaaaaabXWbXXbXWbzebzebQwbQxbRubXYbXZbYabYbbYcbRubYdbYebYfbYgbYhdecbYibYjbYkbYlbYmbYnbYobYpbYqbYrbYsbYtbYubYvbGJbYwbLebYxbYybIVbIVbIVbJbbPHbYybPNbRRbLiaafbJebJebJebJebJeaafaafaafaafaafaafaafaafbwRbYzbYAbYAbYBbYCbYDbYAbYAbYEbGbbYFbYGbYHbYIbYJbYJbYGbYGbYGbYGbYKbYGbYGbYLbYMbYNbYObYPaaaaaaaaaaaaaaaaaabXeaaabYQbYQbYQbYQbYQaafbYRaafbYQbYQbYQbYQbYQaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabWwbXgbWyaafbWwbXgbWyaaabWwbXgbWyaaaaafaafaafaafaafaafaaaaafaaaaafbwJbwJbwJbzebzebQwdehdegdegdegdegdegdegdegbTBbTBbTBbTBbTBdeibwJbYSbwJbYTbYUbYUbYUbYVbYWbYXbYUbYYbYZbZabZbbZcbZdbMpbZebZfbZgbZfbZebZhbZebZibOsbZjaafaafaafaafaafaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabZkbUHbZkaaaaaaaafbGbbZlbZmbZnbZnbZobakbZmbZnbZnbZobakbZmbZnbZnbZobakbakbakaaaaaaaaaaaaaaaaaabXeaafbZpbZqbZqbZqbZqbZrbYRbZsbZtbZtbZtbZtbZuaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSafSafRaafaaabWwbXgbWyaafbWwbXgbWyaaabWwbXgbWyaafaafaaaaaaaaaaaaaafaafbZvbZwbZwbZwbZwbZxbzebzebQwdefbZybZzbZAbZAbZAbZAbZAbZAbZAbZAbZAbZBbZBbZAbZCbZDbYTcbqcbrcbocbpcaycbnbYUbZKbZLbZMbGJbZNbZObZPbSJbZRbZSbZTbWfbIVbZVbZWbSIbIXaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabZYbYCbZYaaaaaaaafbZZcaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaabXeaafcabcabcabcabcabaaabYRaaacabcabcabcabcabaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaaaafaaaaafaafcacaafaafaafcacaafaaaaafcacaafaaaaafaaaaaaaaaaaacadcaecafcagcahcaicajcakcalcalcamdefcancaodelcarcarcarcarcarcarcarcarcarcardemcaqcarcascatccoccpccqccrccScazcaAcaBcaCcaDcaEcaFcaGcaHcaGcaFcaGcaHcaGcaIcaGcaIcaJaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaKcaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaabXeaaaaafaaaaafaafaafaaabYRaaaaafaaaaafaaaaafaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRaafcaLcaMcaMcaNcaOcaOcaOcaOcaOcaOcaOcaOcaOcaOcaOcaPcaMcaMcaMcaMcaQcaRcaQcaScaTcaUcaVbzebzebzecaWdejcaYcaZdcucbacbacbbcapcbccbdcbecbfcbgcbhdekcbjcbkcblcbmcbVcbXcbYbZHcbWcbscbtcbucbvcapaafcbwaafcbxaafcbwaafcbxaafcbyaafcbyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXeaaabYQbYQbYQbYQbYQaafbYRaafbYQbYQbYQbYQbYQaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSaaaaafaaaaafaafcbzaafaaaaafcbzaafaaaaafcbzaafaaaaaaaaaaaaaaaaaacadcaedcvcbBcbCcbDbZwcbEbzebzebzecZSbzfcbFdcucbGcbHcbIcbJcbKcbLcbMcbNcbOcbPcfJcbRcbScbTcbUbZIbZFbZEbZHbZGbYUcbZcbZcbZcapbJeccabLjccabJeccabLjccabJeccbbLjcccbJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccdaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXeaafbZpbZqbZqbZqbZqbZrbYRbZsbZtbZtbZtbZtbZuaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSafSafRaafaafbWwccebWyaaabWwccebWyaaabWwccebWyaafaaaaaaaaaaaaaaaaafcbicbicbicbicbicbicbibwJbwJbwJcZSccgbNjdcucchcbIcbIcbJcciccjcckcckcckccjdcwcclcaBccmccncawcavcavcaubZJbYUccsbZLcctcapbJeccuccvccwbJeccxccycczbJeccAccBccCbJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXeaafcabcabcabcabcabaaabYRaafcabcabcabcabcabaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWwccebWyaafbWwccebWyaaabWwccebWyaaaaaaaaaaaaaaaaaaaafcbiddnddjddiddhddgddmddlddkbTCddobzebNjdcuccEccEccFcapccGccHccIccJccJcaBccKccLccMccNccOccPccQccRcaxccTccUccVccWccXcapbJeccYccZccYbJecdacdbcdabJecdccddcdebJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaabXfaaaaafaaaaafaaaaafaaacdfaaaaafaaaaafaafaafaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBjaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRaafbWwccebWyaaabWwccebWyaaabWwccebWyaafaaaaaaaaaaaaaaaaaacbiddvddpddnddrddqddtddsddubPxbPxbPxddwcaDccEccEccFcapcdhcdicdjcdkcdlcdmcdncbjcdmcdocdpcdqcdrcdscdtcducdvcdscaBcdwcapbJeccYcdxccYbJecdacdycdabJecdecdzcdebJeaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXeaaabYQbYQbYQbYQbYQaafbVFaafbYQbYQbYQbYQbYQaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRaafbWwccebWyaaabWwccebWyaafbWwccebWyaafaafaafaafaaaaaaaafcbiddxddDddCddBddAcbiddzddycapcdAcapcdBcapccEccFccFcapcdCcdDcdEcdFccJcducdGcdHcdGcdIcdJcdKcdLcdLcdMcdLcdLcdLcdNcdOcapbJebJebJebJebJebJebJebJebJebJebJebJebJeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaabXeaafbZpbZqbZqbZqbZqcdPcdQcdPbZtbZtbZtbZtbZuaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagxaafbWwcdRbWyaaabWwcdRbWyaaabWwcdRbWyaafafRaafaafaafaafaafcbiddEddHddnddJddIcbiddFddGcapcdTcapcdUcapcapcapcapcapcdVcaBcdWcdXcdXcbQcbQcbQcdYcdZcdNcaBcaBcaBcaBceacaBcaBcdtcebcapaafaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXeaafcabcabcabcabcabaaabVFaaacabcabcabcabcabaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaafRaafaaaaaaaaaaafcbiddKddOddNddMddLcbiddQddPccsceccedceecefcegcehceicejcekcaBcelceacaBcemcctcapcencapcencapcctcemcaBcaBceocaBcdtcepcapcapcdicdicdicapaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXeaaaaaaaafaafaafaaaaaabVFaafaaaaaaaafaafaaaaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafSafSafRafSafSagxafRafRafRafRafSafRafRafSceqaaaaaaaaaaaaaafcbiddUddWddVddYddXdeaddZdeodencfTcaBdepdebcetcetceucevcdtcaBcewcexcaBceycapcezceAceBceAceCcapceDcaBcexceEcaBcdtcaBceCcapceFceGceHceHceIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXebXebXebXebXeaaaaaaaaabVFaaaaaaaaabXebXebXebXfbXeaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcbicdScdgccDccfcbAcbicaXbXrccscaBcaBcdtcaBcaBceLceMceNcdtceacaBcbKceOceOcePceQceRceScdWceTceUcdYcdYcdNcaBceacdtcaBceVceWcbIceXceYceZcfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXeaafcfbaafbXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcbiddSddfddRcbicbicbicbicbicapcercaBcdtcaBcaBcffcfgcfhcdtcficfjcfkcflcfmcapcfncfocfpceacfqcapcfrcfscfscfjcficdtcftcfucapcfvcfwceHceHcfxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXeaaaaafaaabXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcbicbicbicbicbiaafaafaafaafcapcescaBcdtcaBcaBceKcdicdicfzcapcfAcfBcfBcfBcapcfCcfDcfEcfFceVcapcfBcfBcfBcfAcapcfzcdicapcapcfGcdicdicctaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXebXebXebXebXeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddTaafaafaafaafaaaaaaaafaafcapcfIcfdcdtcfccfKcfLcdicfMcfNcapcfOcfPcfQcfRcfScfTcfUcfVcfWceVcfXcfPcfPcfPcfYcapcfZcgacapcgbcbIcgccfGaagaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcapceJcfecfycfHceJcapcapcapcfzcapcapcdmcgdcgecgfcggcfjcghcfjcgicgjcgecgdcgkcapcapcfzcapcapcdicdicdicdicglaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaagaagaafaaaaafaagcapcgmcgncgoaaaaaaaaacgpcgqcgdcgdcgdcgdcgdcgqcgraaaaaaaaacgscgtcgucapaaaaafaafaaaaafaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaafaaaaaaaaaaafcapcgvcgwaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaacgxcgvcapaafaafaaaaaaaaaaagaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaacapcgycgzcgAaafaafaafcgBaaaaaaaaaaaacgBaaaaaacgBaafaafaafcgAcgCcgDcapaaaaafaaaaafaafaafaafaafaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacapcgvcgAcgEaaaaaaaafaaaaaaaaaaaaaaacgFaaaaaaaaaaafaaaaaacgAcgAcgvcapaaaaaaaaaaaaaaaaafaaaaacaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/metastation.dm b/_maps/metastation.dm index c8d49a8b6cc..ca76eeeb18f 100644 --- a/_maps/metastation.dm +++ b/_maps/metastation.dm @@ -1,8 +1,8 @@ #if !defined(MAP_FILE) - #include "map_files\MetaStation.v39G.dmm" + #include "map_files\MetaStation.v39I.dmm" - #define MAP_FILE "MetaStation.v39G.dmm" + #define MAP_FILE "MetaStation.v39I.dmm" #define MAP_NAME "MetaStation" #elif !defined(MAP_OVERRIDE) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index bcc5050bc08..4da786ef77b 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -24,6 +24,8 @@ obj/machinery/atmospherics/var/initialize_directions = 0 obj/machinery/atmospherics/var/pipe_color obj/machinery/atmospherics/process() + if(gc_destroyed) //comments on /vg/ imply that GC'd pipes still process + return PROCESS_KILL build_network() obj/machinery/atmospherics/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) @@ -83,7 +85,7 @@ obj/machinery/atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user a for(var/obj/machinery/meter/meter in T) if(meter.target == src) new /obj/item/pipe_meter(T) - del(meter) - del(src) + qdel(meter) + qdel(src) else return ..() diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index bb19ff5f9ab..83affc6a0c3 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -44,7 +44,7 @@ obj/machinery/atmospherics/binary return null - Del() + Destroy() loc = null if(node1) diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 09446b376ef..545163c9cf4 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -64,9 +64,7 @@ return null - Del() - loc = null - + Destroy() if(connected_device) connected_device.disconnect() diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index 73ab0965cf4..79af6de5272 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -52,9 +52,7 @@ obj/machinery/atmospherics/trinary return null - Del() - loc = null - + Destroy() if(node1) node1.disconnect(src) del(network1) diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm index 786cf73d3b2..02ee5c53775 100644 --- a/code/ATMOSPHERICS/components/unary/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary/unary_base.dm @@ -28,9 +28,7 @@ return null - Del() - loc = null - + Destroy() if(node) node.disconnect(src) del(network) @@ -53,6 +51,14 @@ update_icon() + default_change_direction_wrench(mob/user, /obj/item/weapon/wrench/W) + if(..()) + initialize_directions = dir + if(node) + disconnect(node) + initialize() + . = 1 + build_network() if(!network && node) network = new /datum/pipe_network() @@ -84,6 +90,7 @@ disconnect(obj/machinery/atmospherics/reference) if(reference==node) + node.disconnect(src) del(network) node = null diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 33a3cf07994..546e0e5b144 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -314,12 +314,11 @@ stat |= NOPOWER update_icon() -/obj/machinery/atmospherics/unary/vent_pump/Del() +/obj/machinery/atmospherics/unary/vent_pump/Destroy() if(initial_loc) initial_loc.air_vent_info -= id_tag initial_loc.air_vent_names -= id_tag ..() - return /* Alt-click to ventcrawl diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 2ee546a8de3..5ca05a05941 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -252,9 +252,8 @@ return 1 return ..() -/obj/machinery/atmospherics/unary/vent_scrubber/Del() +/obj/machinery/atmospherics/unary/vent_scrubber/Destroy() if(initial_loc) initial_loc.air_scrub_info -= id_tag initial_loc.air_scrub_names -= id_tag ..() - return diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 13fa5eb7e74..c67f47a403a 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -64,9 +64,7 @@ obj/machinery/atmospherics/valve return null - Del() - loc = null - + Destroy() if(node1) node1.disconnect(src) del(network_node1) diff --git a/code/ATMOSPHERICS/he_pipes.dm b/code/ATMOSPHERICS/he_pipes.dm index c6ab586e1d9..556800d1efc 100644 --- a/code/ATMOSPHERICS/he_pipes.dm +++ b/code/ATMOSPHERICS/he_pipes.dm @@ -90,7 +90,7 @@ obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction var/have_node2 = node2?1:0 icon_state = "exposed[have_node1][have_node2]" if(!node1&&!node2) - del(src) + qdel(src) initialize() for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index a1a29627b42..833ff4b93d1 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -51,10 +51,11 @@ obj/machinery/atmospherics/pipe return parent.return_network(reference) - Del() + Destroy() del(parent) if(air_temporary) loc.assume_air(air_temporary) + del(air_temporary) ..() @@ -166,7 +167,7 @@ obj/machinery/atmospherics/pipe var/datum/effect/effect/system/harmless_smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) smoke.start() - del(src) + qdel(src) proc/normalize_dir() if(dir==3) @@ -174,7 +175,7 @@ obj/machinery/atmospherics/pipe else if(dir==12) dir = 4 - Del() + Destroy() if(node1) node1.disconnect(src) if(node2) @@ -204,7 +205,7 @@ obj/machinery/atmospherics/pipe else if(!node1&&!node2) - del(src) //TODO: silent deleting looks weird + qdel(src) //TODO: silent deleting looks weird var/have_node1 = node1?1:0 var/have_node2 = node2?1:0 icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]" @@ -447,7 +448,7 @@ obj/machinery/atmospherics/pipe ..() - Del() + Destroy() if(node1) node1.disconnect(src) @@ -531,7 +532,7 @@ obj/machinery/atmospherics/pipe else if (nodealert) nodealert = 0 */ - Del() + Destroy() if(node1) node1.disconnect(src) @@ -642,7 +643,7 @@ obj/machinery/atmospherics/pipe else if (nodealert) nodealert = 0 */ - Del() + Destroy() if(node1) node1.disconnect(src) if(node2) @@ -701,7 +702,7 @@ obj/machinery/atmospherics/pipe icon_state = "manifold_[connected]_[unconnected]" if(!connected) - del(src) + qdel(src) return diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index 45e059dd505..5089252dc59 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -1,181 +1,181 @@ - -/atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - return null - - - -/turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) - return - - -/turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) - var/datum/gas_mixture/air_contents = return_air() - if(!air_contents) - return 0 - if(active_hotspot) - if(soh) - if(air_contents.toxins > 0.5 && air_contents.oxygen > 0.5) - if(active_hotspot.temperature < exposed_temperature) - active_hotspot.temperature = exposed_temperature - if(active_hotspot.volume < exposed_volume) - active_hotspot.volume = exposed_volume - return 1 - - var/igniting = 0 - - if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && air_contents.toxins > 0.5) - igniting = 1 - - if(igniting) - if(air_contents.oxygen < 0.5 || air_contents.toxins < 0.5) - return 0 - - active_hotspot = new(src) - active_hotspot.temperature = exposed_temperature - active_hotspot.volume = exposed_volume - - active_hotspot.just_spawned = (current_cycle < air_master.current_cycle) - //remove just_spawned protection if no longer processing this cell - air_master.add_to_active(src, 0) - return igniting - -//This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile -/obj/effect/hotspot - anchored = 1 - mouse_opacity = 0 - unacidable = 1//So you can't melt fire with acid. - icon = 'icons/effects/fire.dmi' - icon_state = "1" - layer = TURF_LAYER - luminosity = 3 - - var/volume = 125 - var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - var/just_spawned = 1 - var/bypassing = 0 - -/obj/effect/hotspot/New() - ..() - air_master.hotspots += src - perform_exposure() - -/obj/effect/hotspot/proc/perform_exposure() - var/turf/simulated/floor/location = loc - if(!istype(location)) return 0 - - if(volume > CELL_VOLUME*0.95) bypassing = 1 - else bypassing = 0 - - if(bypassing) - if(!just_spawned) - volume = location.air.fuel_burnt*FIRE_GROWTH_RATE - temperature = location.air.temperature - else - var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume) - affected.temperature = temperature - affected.react() - temperature = affected.temperature - volume = affected.fuel_burnt*FIRE_GROWTH_RATE - location.assume_air(affected) - - for(var/atom/item in loc) - if(item && item != src) // It's possible that the item is deleted in temperature_expose - item.fire_act(null, temperature, volume) - return 0 - - -/obj/effect/hotspot/process() - if(just_spawned) - just_spawned = 0 - return 0 - - var/turf/simulated/floor/location = loc - if(!istype(location)) - Kill() - return - - if(location.excited_group) - location.excited_group.reset_cooldowns() - - if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1)) - Kill() - return - - if(location.air.toxins < 0.5 || location.air.oxygen < 0.5) - Kill() - return - - perform_exposure() - - if(location.wet) location.wet = 0 - - if(bypassing) - icon_state = "3" - location.burn_tile() - - //Possible spread due to radiated heat - if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD) - var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE - for(var/direction in cardinal) - if(!(location.atmos_adjacent_turfs & direction)) - continue - var/turf/simulated/T = get_step(src, direction) - if(istype(T) && T.active_hotspot) - T.hotspot_expose(radiated_temperature, CELL_VOLUME/4) - - else - if(volume > CELL_VOLUME*0.4) - icon_state = "2" - else - icon_state = "1" - - if(temperature > location.max_fire_temperature_sustained) - location.max_fire_temperature_sustained = temperature - - if(location.heat_capacity && temperature > location.heat_capacity) - location.to_be_destroyed = 1 - /*if(prob(25)) - location.ReplaceWithSpace() - return 0*/ - return 1 - -// Garbage collect itself by nulling reference to it - -/obj/effect/hotspot/proc/Kill() - air_master.hotspots -= src - DestroyTurf() - garbage_collect() - -/obj/effect/hotspot/proc/garbage_collect() - if(istype(loc, /turf/simulated)) - var/turf/simulated/T = loc - if(T.active_hotspot == src) - T.active_hotspot = null - loc = null - -/obj/effect/hotspot/proc/DestroyTurf() - - if(istype(loc, /turf/simulated)) - var/turf/simulated/T = loc - if(T.to_be_destroyed) - 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 - else - chance_of_deletion = 100 - if(prob(chance_of_deletion)) - T.ChangeTurf(/turf/space) - else - T.to_be_destroyed = 0 - T.max_fire_temperature_sustained = 0 - -/obj/effect/hotspot/New() - ..() - dir = pick(cardinal) - air_update_turf() - return - -/obj/effect/hotspot/Crossed(mob/living/L) - ..() - if(isliving(L)) - L.fire_act() + +/atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + return null + + + +/turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) + return + + +/turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) + var/datum/gas_mixture/air_contents = return_air() + if(!air_contents) + return 0 + if(active_hotspot) + if(soh) + if(air_contents.toxins > 0.5 && air_contents.oxygen > 0.5) + if(active_hotspot.temperature < exposed_temperature) + active_hotspot.temperature = exposed_temperature + if(active_hotspot.volume < exposed_volume) + active_hotspot.volume = exposed_volume + return 1 + + var/igniting = 0 + + if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && air_contents.toxins > 0.5) + igniting = 1 + + if(igniting) + if(air_contents.oxygen < 0.5 || air_contents.toxins < 0.5) + return 0 + + active_hotspot = new(src) + active_hotspot.temperature = exposed_temperature + active_hotspot.volume = exposed_volume + + active_hotspot.just_spawned = (current_cycle < air_master.current_cycle) + //remove just_spawned protection if no longer processing this cell + air_master.add_to_active(src, 0) + return igniting + +//This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile +/obj/effect/hotspot + anchored = 1 + mouse_opacity = 0 + unacidable = 1//So you can't melt fire with acid. + icon = 'icons/effects/fire.dmi' + icon_state = "1" + layer = TURF_LAYER + luminosity = 3 + + var/volume = 125 + var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + var/just_spawned = 1 + var/bypassing = 0 + +/obj/effect/hotspot/New() + ..() + air_master.hotspots += src + perform_exposure() + +/obj/effect/hotspot/proc/perform_exposure() + var/turf/simulated/floor/location = loc + if(!istype(location)) return 0 + + if(volume > CELL_VOLUME*0.95) bypassing = 1 + else bypassing = 0 + + if(bypassing) + if(!just_spawned) + volume = location.air.fuel_burnt*FIRE_GROWTH_RATE + temperature = location.air.temperature + else + var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume) + affected.temperature = temperature + affected.react() + temperature = affected.temperature + volume = affected.fuel_burnt*FIRE_GROWTH_RATE + location.assume_air(affected) + + for(var/atom/item in loc) + if(item && item != src) // It's possible that the item is deleted in temperature_expose + item.fire_act(null, temperature, volume) + return 0 + + +/obj/effect/hotspot/process() + if(just_spawned) + just_spawned = 0 + return 0 + + var/turf/simulated/floor/location = loc + if(!istype(location)) + Kill() + return + + if(location.excited_group) + location.excited_group.reset_cooldowns() + + if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1)) + Kill() + return + + if(location.air.toxins < 0.5 || location.air.oxygen < 0.5) + Kill() + return + + perform_exposure() + + if(location.wet) location.wet = 0 + + if(bypassing) + icon_state = "3" + location.burn_tile() + + //Possible spread due to radiated heat + if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD) + var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE + for(var/direction in cardinal) + if(!(location.atmos_adjacent_turfs & direction)) + continue + var/turf/simulated/T = get_step(src, direction) + if(istype(T) && T.active_hotspot) + T.hotspot_expose(radiated_temperature, CELL_VOLUME/4) + + else + if(volume > CELL_VOLUME*0.4) + icon_state = "2" + else + icon_state = "1" + + if(temperature > location.max_fire_temperature_sustained) + location.max_fire_temperature_sustained = temperature + + if(location.heat_capacity && temperature > location.heat_capacity) + location.to_be_destroyed = 1 + /*if(prob(25)) + location.ReplaceWithSpace() + return 0*/ + return 1 + +// Garbage collect itself by nulling reference to it + +/obj/effect/hotspot/proc/Kill() + air_master.hotspots -= src + DestroyTurf() + garbage_collect() + +/obj/effect/hotspot/proc/garbage_collect() + if(istype(loc, /turf/simulated)) + var/turf/simulated/T = loc + if(T.active_hotspot == src) + T.active_hotspot = null + loc = null + +/obj/effect/hotspot/proc/DestroyTurf() + + if(istype(loc, /turf/simulated)) + var/turf/simulated/T = loc + if(T.to_be_destroyed) + 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 + else + chance_of_deletion = 100 + if(prob(chance_of_deletion)) + T.ChangeTurf(/turf/space) + else + T.to_be_destroyed = 0 + T.max_fire_temperature_sustained = 0 + +/obj/effect/hotspot/New() + ..() + dir = pick(cardinal) + air_update_turf() + return + +/obj/effect/hotspot/Crossed(mob/living/L) + ..() + if(isliving(L)) + L.fire_act() diff --git a/code/LINDA/LINDA_system.dm b/code/LINDA/LINDA_system.dm index 3a67701487f..0458a459d81 100644 --- a/code/LINDA/LINDA_system.dm +++ b/code/LINDA/LINDA_system.dm @@ -1,263 +1,263 @@ -var/kill_air = 0 - -var/global/datum/controller/air_system/air_master - -datum/controller/air_system - var/list/excited_groups = list() - var/list/active_turfs = list() - var/list/hotspots = list() - var/speed = 1 - - //Special functions lists - var/list/turf/simulated/active_super_conductivity = list() - var/list/turf/simulated/high_pressure_delta = list() - - var/current_cycle = 0 - - -/datum/controller/air_system/proc/setup() - set background = BACKGROUND_ENABLED - world << "\red \b Processing Geometry..." - sleep(1) - - var/start_time = world.timeofday - - setup_allturfs() - - global_activeturfs = active_turfs.len - - world << "\red \b Geometry processed in [(world.timeofday-start_time)/10] seconds!" - -/datum/controller/air_system/proc/process() - if(kill_air) - return 1 - - if(speed > 1) - for(var/i=0,i 20) - EG.dismantle() - -/turf/proc/CanAtmosPass(var/turf/T) - if(!istype(T)) return 0 - var/R - if(blocks_air || T.blocks_air) - R = 1 - - for(var/obj/O in contents) - if(!O.CanAtmosPass(T)) - R = 1 - if(O.BlockSuperconductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments - var/D = get_dir(src, T) - atmos_supeconductivity |= D - D = get_dir(T, src) - T.atmos_supeconductivity |= D - return 0 //no need to keep going, we got all we asked - - for(var/obj/O in T.contents) - if(!O.CanAtmosPass(src)) - R = 1 - if(O.BlockSuperconductivity()) - var/D = get_dir(src, T) - atmos_supeconductivity |= D - D = get_dir(T, src) - T.atmos_supeconductivity |= D - return 0 - - var/D = get_dir(src, T) - atmos_supeconductivity &= ~D - D = get_dir(T, src) - T.atmos_supeconductivity &= ~D - - if(!R) - return 1 - -atom/movable/proc/CanAtmosPass() - return 1 - -atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0) - return (!density || !height || air_group) - -turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0) - if(!target) return 0 - - if(istype(mover)) // turf/Enter(...) will perform more advanced checks - return !density - - else // Now, doing more detailed checks for air movement and air group formation - if(target.blocks_air||blocks_air) - return 0 - - for(var/obj/obstacle in src) - if(!obstacle.CanPass(mover, target, height, air_group)) - return 0 - for(var/obj/obstacle in target) - if(!obstacle.CanPass(mover, src, height, air_group)) - return 0 - - return 1 - -/atom/movable/proc/BlockSuperconductivity() // objects that block air and don't let superconductivity act. Only firelocks atm. - return 0 - -/turf/proc/CalculateAdjacentTurfs() - atmos_adjacent_turfs_amount = 0 - for(var/direction in cardinal) - var/turf/T = get_step(src, direction) - if(!istype(T)) - continue - var/counterdir = get_dir(T, src) - if(CanAtmosPass(T)) - atmos_adjacent_turfs_amount += 1 - atmos_adjacent_turfs |= direction - if(!(T.atmos_adjacent_turfs & counterdir)) - T.atmos_adjacent_turfs_amount += 1 - T.atmos_adjacent_turfs |= counterdir - else - atmos_adjacent_turfs &= ~direction - if(T.atmos_adjacent_turfs & counterdir) - T.atmos_adjacent_turfs_amount -= 1 - T.atmos_adjacent_turfs &= ~counterdir - -/atom/movable/proc/air_update_turf(var/command = 0) - if(!istype(loc,/turf) && command) - return - for(var/turf/T in locs) // used by double wide doors and other nonexistant multitile structures - T.air_update_turf(command) - -/turf/proc/air_update_turf(var/command = 0) - if(command) - CalculateAdjacentTurfs() - if(air_master) - air_master.add_to_active(src,command) - -/atom/movable/proc/move_update_air(var/turf/T) - if(istype(T,/turf)) - T.air_update_turf(1) - air_update_turf(1) - -/atom/movable/proc/atmos_spawn_air(var/text, var/amount) //because a lot of people loves to copy paste awful code lets just make a easy proc to spawn your plasma fires - var/turf/simulated/T = get_turf(src) - if(!istype(T)) - return - T.atmos_spawn_air(text, amount) - -var/const/SPAWN_HEAT = 1 - -var/const/SPAWN_TOXINS = 4 -var/const/SPAWN_OXYGEN = 8 -var/const/SPAWN_CO2 = 16 -var/const/SPAWN_NITROGEN = 32 - -var/const/SPAWN_N2O = 64 - -var/const/SPAWN_AIR = 256 - -/turf/simulated/proc/atmos_spawn_air(var/flag, var/amount) - if(!text || !amount || !air) - return - - var/datum/gas_mixture/G = new - - if(flag & SPAWN_HEAT) - G.temperature += 1000 - - if(flag & SPAWN_TOXINS) - G.toxins += amount - if(flag & SPAWN_OXYGEN) - G.oxygen += amount - if(flag & SPAWN_CO2) - G.carbon_dioxide += amount - if(flag & SPAWN_NITROGEN) - G.nitrogen += amount - - if(flag & SPAWN_N2O) - var/datum/gas/sleeping_agent/T = new - T.moles += amount - G.trace_gases += T - - if(flag & SPAWN_AIR) - G.oxygen += MOLES_O2STANDARD * amount - G.nitrogen += MOLES_N2STANDARD * amount - - air.merge(G) +var/kill_air = 0 + +var/global/datum/controller/air_system/air_master + +datum/controller/air_system + var/list/excited_groups = list() + var/list/active_turfs = list() + var/list/hotspots = list() + var/speed = 1 + + //Special functions lists + var/list/turf/simulated/active_super_conductivity = list() + var/list/turf/simulated/high_pressure_delta = list() + + var/current_cycle = 0 + + +/datum/controller/air_system/proc/setup() + set background = BACKGROUND_ENABLED + world << "\red \b Processing Geometry..." + sleep(1) + + var/start_time = world.timeofday + + setup_allturfs() + + global_activeturfs = active_turfs.len + + world << "\red \b Geometry processed in [(world.timeofday-start_time)/10] seconds!" + +/datum/controller/air_system/proc/process() + if(kill_air) + return 1 + + if(speed > 1) + for(var/i=0,i 20) + EG.dismantle() + +/turf/proc/CanAtmosPass(var/turf/T) + if(!istype(T)) return 0 + var/R + if(blocks_air || T.blocks_air) + R = 1 + + for(var/obj/O in contents) + if(!O.CanAtmosPass(T)) + R = 1 + if(O.BlockSuperconductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments + var/D = get_dir(src, T) + atmos_supeconductivity |= D + D = get_dir(T, src) + T.atmos_supeconductivity |= D + return 0 //no need to keep going, we got all we asked + + for(var/obj/O in T.contents) + if(!O.CanAtmosPass(src)) + R = 1 + if(O.BlockSuperconductivity()) + var/D = get_dir(src, T) + atmos_supeconductivity |= D + D = get_dir(T, src) + T.atmos_supeconductivity |= D + return 0 + + var/D = get_dir(src, T) + atmos_supeconductivity &= ~D + D = get_dir(T, src) + T.atmos_supeconductivity &= ~D + + if(!R) + return 1 + +atom/movable/proc/CanAtmosPass() + return 1 + +atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0) + return (!density || !height || air_group) + +turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0) + if(!target) return 0 + + if(istype(mover)) // turf/Enter(...) will perform more advanced checks + return !density + + else // Now, doing more detailed checks for air movement and air group formation + if(target.blocks_air||blocks_air) + return 0 + + for(var/obj/obstacle in src) + if(!obstacle.CanPass(mover, target, height, air_group)) + return 0 + for(var/obj/obstacle in target) + if(!obstacle.CanPass(mover, src, height, air_group)) + return 0 + + return 1 + +/atom/movable/proc/BlockSuperconductivity() // objects that block air and don't let superconductivity act. Only firelocks atm. + return 0 + +/turf/proc/CalculateAdjacentTurfs() + atmos_adjacent_turfs_amount = 0 + for(var/direction in cardinal) + var/turf/T = get_step(src, direction) + if(!istype(T)) + continue + var/counterdir = get_dir(T, src) + if(CanAtmosPass(T)) + atmos_adjacent_turfs_amount += 1 + atmos_adjacent_turfs |= direction + if(!(T.atmos_adjacent_turfs & counterdir)) + T.atmos_adjacent_turfs_amount += 1 + T.atmos_adjacent_turfs |= counterdir + else + atmos_adjacent_turfs &= ~direction + if(T.atmos_adjacent_turfs & counterdir) + T.atmos_adjacent_turfs_amount -= 1 + T.atmos_adjacent_turfs &= ~counterdir + +/atom/movable/proc/air_update_turf(var/command = 0) + if(!istype(loc,/turf) && command) + return + for(var/turf/T in locs) // used by double wide doors and other nonexistant multitile structures + T.air_update_turf(command) + +/turf/proc/air_update_turf(var/command = 0) + if(command) + CalculateAdjacentTurfs() + if(air_master) + air_master.add_to_active(src,command) + +/atom/movable/proc/move_update_air(var/turf/T) + if(istype(T,/turf)) + T.air_update_turf(1) + air_update_turf(1) + +/atom/movable/proc/atmos_spawn_air(var/text, var/amount) //because a lot of people loves to copy paste awful code lets just make a easy proc to spawn your plasma fires + var/turf/simulated/T = get_turf(src) + if(!istype(T)) + return + T.atmos_spawn_air(text, amount) + +var/const/SPAWN_HEAT = 1 + +var/const/SPAWN_TOXINS = 4 +var/const/SPAWN_OXYGEN = 8 +var/const/SPAWN_CO2 = 16 +var/const/SPAWN_NITROGEN = 32 + +var/const/SPAWN_N2O = 64 + +var/const/SPAWN_AIR = 256 + +/turf/simulated/proc/atmos_spawn_air(var/flag, var/amount) + if(!text || !amount || !air) + return + + var/datum/gas_mixture/G = new + + if(flag & SPAWN_HEAT) + G.temperature += 1000 + + if(flag & SPAWN_TOXINS) + G.toxins += amount + if(flag & SPAWN_OXYGEN) + G.oxygen += amount + if(flag & SPAWN_CO2) + G.carbon_dioxide += amount + if(flag & SPAWN_NITROGEN) + G.nitrogen += amount + + if(flag & SPAWN_N2O) + var/datum/gas/sleeping_agent/T = new + T.moles += amount + G.trace_gases += T + + if(flag & SPAWN_AIR) + G.oxygen += MOLES_O2STANDARD * amount + G.nitrogen += MOLES_N2STANDARD * amount + + air.merge(G) air_master.add_to_active(src, 0) \ No newline at end of file diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index 6ef7d790470..5b63966de76 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -1,464 +1,464 @@ - - -turf - var/pressure_difference = 0 - var/pressure_direction = 0 - var/atmos_adjacent_turfs = 0 - var/atmos_adjacent_turfs_amount = 0 - var/atmos_supeconductivity = 0 - -turf/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air - del(giver) - return 0 - -turf/return_air() - //Create gas mixture to hold data for passing - var/datum/gas_mixture/GM = new - - GM.oxygen = oxygen - GM.carbon_dioxide = carbon_dioxide - GM.nitrogen = nitrogen - GM.toxins = toxins - - GM.temperature = temperature - - return GM - -turf/remove_air(amount as num) - 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 - - GM.temperature = temperature - - return GM - - -turf/simulated - var/datum/excited_group/excited_group - var/excited = 0 - var/recently_active = 0 - var/datum/gas_mixture/air - var/archived_cycle = 0 - var/current_cycle = 0 - - var/obj/effect/hotspot/active_hotspot - - var/temperature_archived //USED ONLY FOR SOLIDS - -turf/simulated/New() - ..() - - if(!blocks_air) - air = new - - air.oxygen = oxygen - air.carbon_dioxide = carbon_dioxide - air.nitrogen = nitrogen - air.toxins = toxins - - air.temperature = temperature - -turf/simulated/Del() - if(active_hotspot) - active_hotspot.garbage_collect() - ..() - -turf/simulated/assume_air(datum/gas_mixture/giver) - if(!giver) return 0 - var/datum/gas_mixture/receiver = air - if(istype(receiver)) - - air.merge(giver) - - if(air.check_tile_graphic()) - update_visuals(air) - - return 1 - - else return ..() - -turf/simulated/proc/copy_air_with_tile(turf/simulated/T) - if(istype(T) && T.air && air) - air.copy_from(T.air) - -turf/simulated/proc/copy_air(datum/gas_mixture/copy) - if(air && copy) - air.copy_from(copy) - -turf/simulated/return_air() - if(air) - return air - - else - return ..() - -turf/simulated/remove_air(amount as num) - if(air) - var/datum/gas_mixture/removed = null - - removed = air.remove(amount) - - if(air.check_tile_graphic()) - update_visuals(air) - - return removed - - else - return ..() - -turf/simulated/proc/mimic_temperature_solid(turf/model, conduction_coefficient) - var/delta_temperature = (temperature_archived - model.temperature) - if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)) - - var/heat = conduction_coefficient*delta_temperature* \ - (heat_capacity*model.heat_capacity/(heat_capacity+model.heat_capacity)) - temperature -= heat/heat_capacity - -turf/simulated/proc/share_temperature_mutual_solid(turf/simulated/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER && heat_capacity && sharer.heat_capacity) - - var/heat = conduction_coefficient*delta_temperature* \ - (heat_capacity*sharer.heat_capacity/(heat_capacity+sharer.heat_capacity)) - - temperature -= heat/heat_capacity - sharer.temperature += heat/sharer.heat_capacity - - - - - - - - -/turf/simulated/proc/process_cell() - - if(archived_cycle < air_master.current_cycle) //archive self if not already done - archive() - current_cycle = air_master.current_cycle - - var/remove = 1 //set by non simulated turfs who are sharing with this turf - - for(var/direction in cardinal) - if(!(atmos_adjacent_turfs & direction)) - continue - - var/turf/enemy_tile = get_step(src, direction) - - if(istype(enemy_tile,/turf/simulated)) - var/turf/simulated/enemy_simulated = enemy_tile - - if(current_cycle > enemy_simulated.current_cycle) - enemy_simulated.archive() - - /******************* GROUP HANDLING START *****************************************************************/ - - if(enemy_simulated.excited) - if(excited_group) - if(enemy_simulated.excited_group) - if(excited_group != enemy_simulated.excited_group) - excited_group.merge_groups(enemy_simulated.excited_group) //combine groups - share_air(enemy_simulated) //share - else - if((recently_active == 1 && enemy_simulated.recently_active == 1) || !air.compare(enemy_simulated.air)) - excited_group.add_turf(enemy_simulated) //add enemy to our group - share_air(enemy_simulated) //share - else - if(enemy_simulated.excited_group) - if((recently_active == 1 && enemy_simulated.recently_active == 1) || !air.compare(enemy_simulated.air)) - enemy_simulated.excited_group.add_turf(src) //join self to enemy group - share_air(enemy_simulated) //share - else - if((recently_active == 1 && enemy_simulated.recently_active == 1) || !air.compare(enemy_simulated.air)) - var/datum/excited_group/EG = new //generate new group - EG.add_turf(src) - EG.add_turf(enemy_simulated) - share_air(enemy_simulated) //share - else - if(!air.compare(enemy_simulated.air)) //compare if - air_master.add_to_active(enemy_simulated) //excite enemy - if(excited_group) - excited_group.add_turf(enemy_simulated) //add enemy to group - else - var/datum/excited_group/EG = new //generate new group - EG.add_turf(src) - EG.add_turf(enemy_simulated) - share_air(enemy_simulated) //share - - /******************* GROUP HANDLING FINISH *********************************************************************/ - - else - if(!air.check_turf(enemy_tile)) - var/difference = air.mimic(enemy_tile,,atmos_adjacent_turfs_amount) - if(difference) - if(difference > 0) - consider_pressure_difference(enemy_tile, difference) - else - enemy_tile.consider_pressure_difference(src, difference) - remove = 0 - if(excited_group) - last_share_check() - - air.react() - - if(air.check_tile_graphic()) - update_visuals(air) - - if(air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - hotspot_expose(air.temperature, CELL_VOLUME) - for(var/atom/movable/item in src) - item.temperature_expose(air, air.temperature, CELL_VOLUME) - temperature_expose(air, air.temperature, CELL_VOLUME) - - if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION) - if(consider_superconductivity(starting = 1)) - remove = 0 - - if(!excited_group && remove == 1) - air_master.remove_from_active(src) - - - -/turf/simulated/proc/archive() - if(air) //For open space like floors - air.archive() - temperature_archived = temperature - archived_cycle = air_master.current_cycle - -/turf/simulated/proc/update_visuals(datum/gas_mixture/model) - overlays.Cut() - var/siding_icon_state = return_siding_icon_state() - if(siding_icon_state) - overlays += image('icons/turf/floors.dmi',siding_icon_state) - switch(model.graphic) - if("plasma") - overlays.Add(plmaster) - if("sleeping_agent") - overlays.Add(slmaster) - -/turf/simulated/proc/share_air(var/turf/simulated/T) - if(T.current_cycle < current_cycle) - var/difference - difference = air.share(T.air, atmos_adjacent_turfs_amount) - if(difference) - if(difference > 0) - consider_pressure_difference(T, difference) - else - T.consider_pressure_difference(src, difference) - last_share_check() - -/turf/proc/consider_pressure_difference(var/turf/simulated/T, var/difference) - air_master.high_pressure_delta |= src - if(difference > pressure_difference) - pressure_direction = get_dir(src, T) - pressure_difference = difference - -/turf/simulated/proc/last_share_check() - if(air.last_share > MINIMUM_AIR_TO_SUSPEND) - excited_group.reset_cooldowns() - -/turf/proc/high_pressure_movements() - for(var/atom/movable/M in src) - M.experience_pressure_difference(pressure_difference, pressure_direction) - - - - -atom/movable/var/pressure_resistance = 5 -atom/movable/var/last_forced_movement = 0 - -atom/movable/proc/experience_pressure_difference(pressure_difference, direction) - if(last_forced_movement >= air_master.current_cycle) - return 0 - else if(!anchored) - if(pressure_difference > pressure_resistance) - last_forced_movement = air_master.current_cycle - spawn step(src, direction) - return 1 - - - - -/datum/excited_group - var/list/turf_list = list() - var/breakdown_cooldown = 0 - -/datum/excited_group/New() - if(air_master) - air_master.excited_groups += src - -/datum/excited_group/proc/add_turf(var/turf/simulated/T) - turf_list += T - T.excited_group = src - T.recently_active = 1 - reset_cooldowns() - -/datum/excited_group/proc/merge_groups(var/datum/excited_group/E) - if(turf_list.len > E.turf_list.len) - air_master.excited_groups -= E - for(var/turf/simulated/T in E.turf_list) - T.excited_group = src - turf_list += T - reset_cooldowns() - else - air_master.excited_groups -= src - for(var/turf/simulated/T in turf_list) - T.excited_group = E - E.turf_list += T - E.reset_cooldowns() - -/datum/excited_group/proc/reset_cooldowns() - breakdown_cooldown = 0 - -/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 - - 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 - - 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 - - if(T.air.check_tile_graphic()) - T.update_visuals(T.air) - - -/datum/excited_group/proc/dismantle() - for(var/turf/simulated/T in turf_list) - T.excited = 0 - T.recently_active = 0 - T.excited_group = null - air_master.active_turfs -= T - garbage_collect() - -/datum/excited_group/proc/garbage_collect() - for(var/turf/simulated/T in turf_list) - T.excited_group = null - turf_list.Cut() - air_master.excited_groups -= src - - - - - - - - - - -turf/simulated/proc/super_conduct() - var/conductivity_directions = 0 - if(blocks_air) - //Does not participate in air exchange, so will conduct heat across all four borders at this time - conductivity_directions = NORTH|SOUTH|EAST|WEST - - if(archived_cycle < air_master.current_cycle) - archive() - else - //Does particate in air exchange so only consider directions not considered during process_cell() - for(var/direction in 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) - if(conductivity_directions&direction) - var/turf/neighbor = get_step(src,direction) - - if(!neighbor.thermal_conductivity) - continue - - if(istype(neighbor, /turf/simulated)) //anything under this subtype will share in the exchange - var/turf/simulated/T = neighbor - - if(T.archived_cycle < air_master.current_cycle) - T.archive() - - if(T.air) - if(air) //Both tiles are open - air.temperature_share(T.air, WINDOW_HEAT_TRANSFER_COEFFICIENT) - else //Solid but neighbor is open - T.air.temperature_turf_share(src, T.thermal_conductivity) - air_master.add_to_active(T, 0) - else - if(air) //Open but neighbor is solid - air.temperature_turf_share(T, T.thermal_conductivity) - else //Both tiles are solid - share_temperature_mutual_solid(T, T.thermal_conductivity) - T.temperature_expose(null, T.temperature, null) - - T.consider_superconductivity() - - else - if(air) //Open - air.temperature_mimic(neighbor, neighbor.thermal_conductivity) - else - mimic_temperature_solid(neighbor, neighbor.thermal_conductivity) - - radiate_to_spess() - - //Conduct with air on my tile if I have it - if(air) - air.temperature_turf_share(src, thermal_conductivity) - - //Make sure still hot enough to continue conducting heat - if(air.temperature < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION) - air_master.active_super_conductivity -= src - return 0 - - else - if(temperature < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION) - air_master.active_super_conductivity -= src - return 0 - -turf/simulated/proc/consider_superconductivity(starting) - if(!thermal_conductivity) - return 0 - - if(air) - if(air.temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) - return 0 - if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant. - return 0 - else - if(temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) - return 0 - - air_master.active_super_conductivity |= src - return 1 - -turf/simulated/proc/radiate_to_spess() //Radiate excess tile heat to space - if(temperature > T0C) //Considering 0 degC as te break even point for radiation in and out - var/delta_temperature = (temperature_archived - 2.7) //hardcoded space temperature - if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)) - - var/heat = thermal_conductivity*delta_temperature* \ - (heat_capacity*700000/(heat_capacity+700000)) //700000 is the heat_capacity from a space turf, hardcoded here + + +turf + var/pressure_difference = 0 + var/pressure_direction = 0 + var/atmos_adjacent_turfs = 0 + var/atmos_adjacent_turfs_amount = 0 + var/atmos_supeconductivity = 0 + +turf/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air + del(giver) + return 0 + +turf/return_air() + //Create gas mixture to hold data for passing + var/datum/gas_mixture/GM = new + + GM.oxygen = oxygen + GM.carbon_dioxide = carbon_dioxide + GM.nitrogen = nitrogen + GM.toxins = toxins + + GM.temperature = temperature + + return GM + +turf/remove_air(amount as num) + 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 + + GM.temperature = temperature + + return GM + + +turf/simulated + var/datum/excited_group/excited_group + var/excited = 0 + var/recently_active = 0 + var/datum/gas_mixture/air + var/archived_cycle = 0 + var/current_cycle = 0 + + var/obj/effect/hotspot/active_hotspot + + var/temperature_archived //USED ONLY FOR SOLIDS + +turf/simulated/New() + ..() + + if(!blocks_air) + air = new + + air.oxygen = oxygen + air.carbon_dioxide = carbon_dioxide + air.nitrogen = nitrogen + air.toxins = toxins + + air.temperature = temperature + +turf/simulated/Del() + if(active_hotspot) + active_hotspot.garbage_collect() + ..() + +turf/simulated/assume_air(datum/gas_mixture/giver) + if(!giver) return 0 + var/datum/gas_mixture/receiver = air + if(istype(receiver)) + + air.merge(giver) + + if(air.check_tile_graphic()) + update_visuals(air) + + return 1 + + else return ..() + +turf/simulated/proc/copy_air_with_tile(turf/simulated/T) + if(istype(T) && T.air && air) + air.copy_from(T.air) + +turf/simulated/proc/copy_air(datum/gas_mixture/copy) + if(air && copy) + air.copy_from(copy) + +turf/simulated/return_air() + if(air) + return air + + else + return ..() + +turf/simulated/remove_air(amount as num) + if(air) + var/datum/gas_mixture/removed = null + + removed = air.remove(amount) + + if(air.check_tile_graphic()) + update_visuals(air) + + return removed + + else + return ..() + +turf/simulated/proc/mimic_temperature_solid(turf/model, conduction_coefficient) + var/delta_temperature = (temperature_archived - model.temperature) + if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)) + + var/heat = conduction_coefficient*delta_temperature* \ + (heat_capacity*model.heat_capacity/(heat_capacity+model.heat_capacity)) + temperature -= heat/heat_capacity + +turf/simulated/proc/share_temperature_mutual_solid(turf/simulated/sharer, conduction_coefficient) + var/delta_temperature = (temperature_archived - sharer.temperature_archived) + if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER && heat_capacity && sharer.heat_capacity) + + var/heat = conduction_coefficient*delta_temperature* \ + (heat_capacity*sharer.heat_capacity/(heat_capacity+sharer.heat_capacity)) + + temperature -= heat/heat_capacity + sharer.temperature += heat/sharer.heat_capacity + + + + + + + + +/turf/simulated/proc/process_cell() + + if(archived_cycle < air_master.current_cycle) //archive self if not already done + archive() + current_cycle = air_master.current_cycle + + var/remove = 1 //set by non simulated turfs who are sharing with this turf + + for(var/direction in cardinal) + if(!(atmos_adjacent_turfs & direction)) + continue + + var/turf/enemy_tile = get_step(src, direction) + + if(istype(enemy_tile,/turf/simulated)) + var/turf/simulated/enemy_simulated = enemy_tile + + if(current_cycle > enemy_simulated.current_cycle) + enemy_simulated.archive() + + /******************* GROUP HANDLING START *****************************************************************/ + + if(enemy_simulated.excited) + if(excited_group) + if(enemy_simulated.excited_group) + if(excited_group != enemy_simulated.excited_group) + excited_group.merge_groups(enemy_simulated.excited_group) //combine groups + share_air(enemy_simulated) //share + else + if((recently_active == 1 && enemy_simulated.recently_active == 1) || !air.compare(enemy_simulated.air)) + excited_group.add_turf(enemy_simulated) //add enemy to our group + share_air(enemy_simulated) //share + else + if(enemy_simulated.excited_group) + if((recently_active == 1 && enemy_simulated.recently_active == 1) || !air.compare(enemy_simulated.air)) + enemy_simulated.excited_group.add_turf(src) //join self to enemy group + share_air(enemy_simulated) //share + else + if((recently_active == 1 && enemy_simulated.recently_active == 1) || !air.compare(enemy_simulated.air)) + var/datum/excited_group/EG = new //generate new group + EG.add_turf(src) + EG.add_turf(enemy_simulated) + share_air(enemy_simulated) //share + else + if(!air.compare(enemy_simulated.air)) //compare if + air_master.add_to_active(enemy_simulated) //excite enemy + if(excited_group) + excited_group.add_turf(enemy_simulated) //add enemy to group + else + var/datum/excited_group/EG = new //generate new group + EG.add_turf(src) + EG.add_turf(enemy_simulated) + share_air(enemy_simulated) //share + + /******************* GROUP HANDLING FINISH *********************************************************************/ + + else + if(!air.check_turf(enemy_tile)) + var/difference = air.mimic(enemy_tile,,atmos_adjacent_turfs_amount) + if(difference) + if(difference > 0) + consider_pressure_difference(enemy_tile, difference) + else + enemy_tile.consider_pressure_difference(src, difference) + remove = 0 + if(excited_group) + last_share_check() + + air.react() + + if(air.check_tile_graphic()) + update_visuals(air) + + if(air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + hotspot_expose(air.temperature, CELL_VOLUME) + for(var/atom/movable/item in src) + item.temperature_expose(air, air.temperature, CELL_VOLUME) + temperature_expose(air, air.temperature, CELL_VOLUME) + + if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION) + if(consider_superconductivity(starting = 1)) + remove = 0 + + if(!excited_group && remove == 1) + air_master.remove_from_active(src) + + + +/turf/simulated/proc/archive() + if(air) //For open space like floors + air.archive() + temperature_archived = temperature + archived_cycle = air_master.current_cycle + +/turf/simulated/proc/update_visuals(datum/gas_mixture/model) + overlays.Cut() + var/siding_icon_state = return_siding_icon_state() + if(siding_icon_state) + overlays += image('icons/turf/floors.dmi',siding_icon_state) + switch(model.graphic) + if("plasma") + overlays.Add(plmaster) + if("sleeping_agent") + overlays.Add(slmaster) + +/turf/simulated/proc/share_air(var/turf/simulated/T) + if(T.current_cycle < current_cycle) + var/difference + difference = air.share(T.air, atmos_adjacent_turfs_amount) + if(difference) + if(difference > 0) + consider_pressure_difference(T, difference) + else + T.consider_pressure_difference(src, difference) + last_share_check() + +/turf/proc/consider_pressure_difference(var/turf/simulated/T, var/difference) + air_master.high_pressure_delta |= src + if(difference > pressure_difference) + pressure_direction = get_dir(src, T) + pressure_difference = difference + +/turf/simulated/proc/last_share_check() + if(air.last_share > MINIMUM_AIR_TO_SUSPEND) + excited_group.reset_cooldowns() + +/turf/proc/high_pressure_movements() + for(var/atom/movable/M in src) + M.experience_pressure_difference(pressure_difference, pressure_direction) + + + + +atom/movable/var/pressure_resistance = 5 +atom/movable/var/last_forced_movement = 0 + +atom/movable/proc/experience_pressure_difference(pressure_difference, direction) + if(last_forced_movement >= air_master.current_cycle) + return 0 + else if(!anchored) + if(pressure_difference > pressure_resistance) + last_forced_movement = air_master.current_cycle + spawn step(src, direction) + return 1 + + + + +/datum/excited_group + var/list/turf_list = list() + var/breakdown_cooldown = 0 + +/datum/excited_group/New() + if(air_master) + air_master.excited_groups += src + +/datum/excited_group/proc/add_turf(var/turf/simulated/T) + turf_list += T + T.excited_group = src + T.recently_active = 1 + reset_cooldowns() + +/datum/excited_group/proc/merge_groups(var/datum/excited_group/E) + if(turf_list.len > E.turf_list.len) + air_master.excited_groups -= E + for(var/turf/simulated/T in E.turf_list) + T.excited_group = src + turf_list += T + reset_cooldowns() + else + air_master.excited_groups -= src + for(var/turf/simulated/T in turf_list) + T.excited_group = E + E.turf_list += T + E.reset_cooldowns() + +/datum/excited_group/proc/reset_cooldowns() + breakdown_cooldown = 0 + +/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 + + 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 + + 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 + + if(T.air.check_tile_graphic()) + T.update_visuals(T.air) + + +/datum/excited_group/proc/dismantle() + for(var/turf/simulated/T in turf_list) + T.excited = 0 + T.recently_active = 0 + T.excited_group = null + air_master.active_turfs -= T + garbage_collect() + +/datum/excited_group/proc/garbage_collect() + for(var/turf/simulated/T in turf_list) + T.excited_group = null + turf_list.Cut() + air_master.excited_groups -= src + + + + + + + + + + +turf/simulated/proc/super_conduct() + var/conductivity_directions = 0 + if(blocks_air) + //Does not participate in air exchange, so will conduct heat across all four borders at this time + conductivity_directions = NORTH|SOUTH|EAST|WEST + + if(archived_cycle < air_master.current_cycle) + archive() + else + //Does particate in air exchange so only consider directions not considered during process_cell() + for(var/direction in 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) + if(conductivity_directions&direction) + var/turf/neighbor = get_step(src,direction) + + if(!neighbor.thermal_conductivity) + continue + + if(istype(neighbor, /turf/simulated)) //anything under this subtype will share in the exchange + var/turf/simulated/T = neighbor + + if(T.archived_cycle < air_master.current_cycle) + T.archive() + + if(T.air) + if(air) //Both tiles are open + air.temperature_share(T.air, WINDOW_HEAT_TRANSFER_COEFFICIENT) + else //Solid but neighbor is open + T.air.temperature_turf_share(src, T.thermal_conductivity) + air_master.add_to_active(T, 0) + else + if(air) //Open but neighbor is solid + air.temperature_turf_share(T, T.thermal_conductivity) + else //Both tiles are solid + share_temperature_mutual_solid(T, T.thermal_conductivity) + T.temperature_expose(null, T.temperature, null) + + T.consider_superconductivity() + + else + if(air) //Open + air.temperature_mimic(neighbor, neighbor.thermal_conductivity) + else + mimic_temperature_solid(neighbor, neighbor.thermal_conductivity) + + radiate_to_spess() + + //Conduct with air on my tile if I have it + if(air) + air.temperature_turf_share(src, thermal_conductivity) + + //Make sure still hot enough to continue conducting heat + if(air.temperature < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION) + air_master.active_super_conductivity -= src + return 0 + + else + if(temperature < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION) + air_master.active_super_conductivity -= src + return 0 + +turf/simulated/proc/consider_superconductivity(starting) + if(!thermal_conductivity) + return 0 + + if(air) + if(air.temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) + return 0 + if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant. + return 0 + else + if(temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) + return 0 + + air_master.active_super_conductivity |= src + return 1 + +turf/simulated/proc/radiate_to_spess() //Radiate excess tile heat to space + if(temperature > T0C) //Considering 0 degC as te break even point for radiation in and out + var/delta_temperature = (temperature_archived - 2.7) //hardcoded space temperature + if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)) + + var/heat = thermal_conductivity*delta_temperature* \ + (heat_capacity*700000/(heat_capacity+700000)) //700000 is the heat_capacity from a space turf, hardcoded here temperature -= heat/heat_capacity \ No newline at end of file diff --git a/code/WorkInProgress/Sigyn/Department Sec/__README.dm b/code/WorkInProgress/Sigyn/Department Sec/__README.dm deleted file mode 100644 index e6b3f7967fd..00000000000 --- a/code/WorkInProgress/Sigyn/Department Sec/__README.dm +++ /dev/null @@ -1,8 +0,0 @@ -/* - -Hey you! -You only need to untick maps/tgstation.2.0.9.dmm for this if you download the modified map from: -http://tgstation13.googlecode.com/files/tgstation.2.1.0_deptsec.zip - -Everything else can just be ticked on top of the original stuff. -*/ \ No newline at end of file diff --git a/code/WorkInProgress/Sigyn/Department Sec/jobs.dm b/code/WorkInProgress/Sigyn/Department Sec/jobs.dm deleted file mode 100644 index f348360c2b8..00000000000 --- a/code/WorkInProgress/Sigyn/Department Sec/jobs.dm +++ /dev/null @@ -1,122 +0,0 @@ -var/list/sec_departments = list("engineering", "supply", "medical", "science") - -/datum/job/officer/proc/assign_sec_to_department(var/mob/living/carbon/human/H) - if(!H) return 0 - if(!sec_departments.len) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears) - else - var/department = pick(sec_departments) - sec_departments -= department - var/dep_access = null - var/destination = null - switch(department) - if("supply") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/cargo(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/supply(H), slot_ears) - dep_access = list(access_mailsorting, access_mining) - destination = /area/security/checkpoint/supply - if("engineering") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/engine(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/engi(H), slot_ears) - dep_access = list(access_construction, access_engine) - destination = /area/security/checkpoint/engineering - if("medical") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/med(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/med(H), slot_ears) - dep_access = list(access_medical) - destination = /area/security/checkpoint/medical - if("science") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/science(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/sci(H), slot_ears) - dep_access = list(access_research) - destination = /area/security/checkpoint/science - var/teleport = 0 - if(!config.sec_start_brig) - if(destination) - if(!ticker || ticker.current_state <= GAME_STATE_SETTING_UP) - teleport = 1 - if(teleport) - var/turf/T - var/safety = 0 - while(safety < 25) - T = safepick(get_area_turfs(destination)) - if(T && !H.Move(T)) - safety += 1 - continue - else - break - H << "You have been assigned to [department]!" - access += dep_access - - - -/datum/job/officer - title = "Security Officer" - flag = OFFICER - department_flag = ENGSEC - faction = "Station" - total_positions = 5 - spawn_positions = 5 - supervisors = "the head of security, and the head of your assigned department (if applicable)" - selection_color = "#ffeeee" - - - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back) - if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back) - assign_sec_to_department(H) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_s_store) - H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/melee/baton/loaded(H), slot_in_backpack) - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) - L.imp_in = H - L.implanted = 1 - return 1 - -/obj/item/device/radio/headset/headset_sec/department/New() - wires = new(src) - secure_radio_connections = new - - if(radio_controller) - initialize() - recalculateChannels() - -/obj/item/device/radio/headset/headset_sec/department/engi - keyslot1 = new /obj/item/device/encryptionkey/headset_sec - keyslot2 = new /obj/item/device/encryptionkey/headset_eng - -/obj/item/device/radio/headset/headset_sec/department/supply - keyslot1 = new /obj/item/device/encryptionkey/headset_sec - keyslot2 = new /obj/item/device/encryptionkey/headset_cargo - -/obj/item/device/radio/headset/headset_sec/department/med - keyslot1 = new /obj/item/device/encryptionkey/headset_sec - keyslot2 = new /obj/item/device/encryptionkey/headset_med - -/obj/item/device/radio/headset/headset_sec/department/sci - keyslot1 = new /obj/item/device/encryptionkey/headset_sec - keyslot2 = new /obj/item/device/encryptionkey/headset_sci - -/obj/item/clothing/under/rank/security/cargo/New() - attachTie(new /obj/item/clothing/tie/armband/cargo) - -/obj/item/clothing/under/rank/security/engine/New() - attachTie(new /obj/item/clothing/tie/armband/engine) - -/obj/item/clothing/under/rank/security/science/New() - attachTie(new /obj/item/clothing/tie/armband/science) - -/obj/item/clothing/under/rank/security/med/New() - attachTie(new /obj/item/clothing/tie/armband/medgreen) \ No newline at end of file diff --git a/code/WorkInProgress/buildmode.dm b/code/WorkInProgress/buildmode.dm index 63f7c32c3f0..e03279555dd 100644 --- a/code/WorkInProgress/buildmode.dm +++ b/code/WorkInProgress/buildmode.dm @@ -8,7 +8,7 @@ M.client.show_popup_menus = 1 for(var/obj/effect/bmode/buildholder/H) if(H.cl == M.client) - del(H) + qdel(H) else log_admin("[key_name(usr)] has entered build mode.") M.client.buildmode = 1 @@ -212,7 +212,7 @@ T.ChangeTurf(/turf/simulated/wall) return else if(istype(object,/obj)) - del(object) + qdel(object) return else if(istype(object,/turf) && pa.Find("alt") && pa.Find("left")) new/obj/machinery/door/airlock(get_turf(object)) @@ -242,7 +242,7 @@ var/obj/A = new holder.buildmode.objholder (get_turf(object)) A.dir = holder.builddir.dir else if(pa.Find("right")) - if(isobj(object)) del(object) + if(isobj(object)) qdel(object) if(3) if(pa.Find("left")) //I cant believe this shit actually compiles. diff --git a/code/WorkInProgress/carn/debug_pipenets.dm b/code/WorkInProgress/carn/debug_pipenets.dm new file mode 100644 index 00000000000..d617dfec1de --- /dev/null +++ b/code/WorkInProgress/carn/debug_pipenets.dm @@ -0,0 +1,59 @@ +/client/verb/pipenets_debug() + if(!holder) return + for(var/i=1,i<=pipe_networks.len,i++) +// src << "[copytext("\ref[powernets[i]]",8,12)]" + src << "[copytext("\ref[pipe_networks[i]]",8,12)]" + src << "[pipe_networks.len] total pipenets" + + +/client/verb/pipenet_overlays() + var/list/L = list() + for(var/obj/machinery/atmospherics/AT in view(mob)) + AT.maptext = null + L |= AT + for(var/datum/pipe_network/Network in pipe_networks) + for(var/obj/machinery/atmospherics/AT in Network.normal_members) + if(!(AT in L)) + continue + if(!AT.maptext) + AT.maptext = "[copytext("\ref[Network]",8,12)]" + else + world << "DUPLICATE: [AT.name] net#[copytext("\ref[Network]",8,12)])" + for(var/datum/pipeline/PL in Network.line_members) + for(var/obj/machinery/atmospherics/AT in PL.members) + if(!(AT in L)) + continue + if(!AT.maptext) + AT.maptext = "[copytext("\ref[Network]",8,12)]" + else + world << "DUPLICATE: [AT.name] net#[copytext("\ref[Network]",8,12)])" + for(var/obj/machinery/atmospherics/ATE in PL.edges) + if(!(ATE in L)) + continue + if(!ATE.maptext) + ATE.maptext = "[copytext("\ref[Network]",8,12)]" + else + world << "DUPLICATE: [ATE.name] net#[copytext("\ref[Network]",8,12)])" + +/client/verb/follow_pipenet(var/netref as null|anything in get_refs(pipe_networks)) + var/datum/pipe_network/Network = locate(netref) + if(!Network) + src << "Unable to locate [netref]" + return + for(var/obj/machinery/atmospherics/AT in world) + if(AT) + animate(AT, alpha = 255, time = 0) + for(var/obj/machinery/atmospherics/AT in Network.normal_members) + if(AT) + animate(AT, alpha = 0, time = 1, loop = -1) + animate(alpha = 255, time = 1) + for(var/datum/pipeline/PL in Network.line_members) + for(var/obj/machinery/atmospherics/AT in PL.members) + if(AT) + animate(AT, alpha = 0, time = 1, loop = -1) + animate(alpha = 255, time = 1) + +/proc/get_refs(var/list/L) + . = list() + for(var/everything in L) + . += "\ref[everything]" \ No newline at end of file diff --git a/code/WorkInProgress/carn/debug_powernets.dm b/code/WorkInProgress/carn/debug_powernets.dm index 04d2fc929ec..ceb96e01af4 100644 --- a/code/WorkInProgress/carn/debug_powernets.dm +++ b/code/WorkInProgress/carn/debug_powernets.dm @@ -1,14 +1,13 @@ -/* -client/verb/powernets_debug() +/client/verb/powernets_debug() if(!holder) return - var/ref_holder = "\ref[holder]" for(var/i=1,i<=powernets.len,i++) - src << "[copytext("\ref[powernets[i]]",8,12)]" +// src << "[copytext("\ref[powernets[i]]",8,12)]" + src << "[copytext("\ref[powernets[i]]",8,12)]" -client/verb/powernet_overlays() +/client/verb/powernet_overlays() for(var/obj/structure/cable/C in cable_list) C.maptext = "[copytext("\ref[C.powernet]",8,12)]" for(var/obj/machinery/power/M in machines) M.maptext = "[copytext("\ref[M.powernet]",8,12)]" -*/ + diff --git a/code/WorkInProgress/explosion_particles.dm b/code/WorkInProgress/explosion_particles.dm index 9cf81b27aee..3163f8aab4c 100644 --- a/code/WorkInProgress/explosion_particles.dm +++ b/code/WorkInProgress/explosion_particles.dm @@ -9,7 +9,7 @@ /obj/effect/expl_particles/New() ..() spawn (15) - del(src) + qdel(src) return /obj/effect/expl_particles/Move() @@ -49,7 +49,7 @@ /obj/effect/explosion/New() ..() spawn (10) - del(src) + qdel(src) return /datum/effect/system/explosion diff --git a/code/__DEFINES/_readme.dm b/code/__DEFINES/_readme.dm index 42ad52286fe..85a5dfe7e7c 100644 --- a/code/__DEFINES/_readme.dm +++ b/code/__DEFINES/_readme.dm @@ -1,14 +1,14 @@ -/* - This folder is full of #define statements. They are similar to constants, - but must come before any code that references them, and they do not take up - memory the way constants do. - - The values in this folder are NOT options. They are not for hosts to play with. - Some of the values are arbitrary and only need to be different from similar constants; - for example, the genetic mutation numbers in genetics.dm mean nothing, but MUST be distinct. - - It is wise not to touch them unless you understand what they do, where they're used, - and most importantly, - how to undo your changes if you screw it up. - - Sayu +/* + This folder is full of #define statements. They are similar to constants, + but must come before any code that references them, and they do not take up + memory the way constants do. + + The values in this folder are NOT options. They are not for hosts to play with. + Some of the values are arbitrary and only need to be different from similar constants; + for example, the genetic mutation numbers in genetics.dm mean nothing, but MUST be distinct. + + It is wise not to touch them unless you understand what they do, where they're used, + and most importantly, + how to undo your changes if you screw it up. + - Sayu */ \ No newline at end of file diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index c43a558444e..65017becff3 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -1,37 +1,37 @@ -//A set of constants used to determine which type of mute an admin wishes to apply: -//Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO etc = (MUTE_IC << 1) -//Therefore there needs to be a gap between the flags for the automute flags -#define MUTE_IC 1 -#define MUTE_OOC 2 -#define MUTE_PRAY 4 -#define MUTE_ADMINHELP 8 -#define MUTE_DEADCHAT 16 -#define MUTE_ALL 31 - -//Some constants for DB_Ban -#define BANTYPE_PERMA 1 -#define BANTYPE_TEMP 2 -#define BANTYPE_JOB_PERMA 3 -#define BANTYPE_JOB_TEMP 4 -#define BANTYPE_ANY_FULLBAN 5 //used to locate stuff to unban. -#define BANTYPE_APPEARANCE 6 -#define BANTYPE_ADMIN_PERMA 7 -#define BANTYPE_ADMIN_TEMP 8 - -//Please don't edit these values without speaking to Errorage first ~Carn -//Admin Permissions -#define R_BUILDMODE 1 -#define R_ADMIN 2 -#define R_BAN 4 -#define R_FUN 8 -#define R_SERVER 16 -#define R_DEBUG 32 -#define R_POSSESS 64 -#define R_PERMISSIONS 128 -#define R_STEALTH 256 -#define R_REJUVINATE 512 -#define R_VAREDIT 1024 -#define R_SOUNDS 2048 -#define R_SPAWN 4096 - -#define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated. +//A set of constants used to determine which type of mute an admin wishes to apply: +//Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO etc = (MUTE_IC << 1) +//Therefore there needs to be a gap between the flags for the automute flags +#define MUTE_IC 1 +#define MUTE_OOC 2 +#define MUTE_PRAY 4 +#define MUTE_ADMINHELP 8 +#define MUTE_DEADCHAT 16 +#define MUTE_ALL 31 + +//Some constants for DB_Ban +#define BANTYPE_PERMA 1 +#define BANTYPE_TEMP 2 +#define BANTYPE_JOB_PERMA 3 +#define BANTYPE_JOB_TEMP 4 +#define BANTYPE_ANY_FULLBAN 5 //used to locate stuff to unban. +#define BANTYPE_APPEARANCE 6 +#define BANTYPE_ADMIN_PERMA 7 +#define BANTYPE_ADMIN_TEMP 8 + +//Please don't edit these values without speaking to Errorage first ~Carn +//Admin Permissions +#define R_BUILDMODE 1 +#define R_ADMIN 2 +#define R_BAN 4 +#define R_FUN 8 +#define R_SERVER 16 +#define R_DEBUG 32 +#define R_POSSESS 64 +#define R_PERMISSIONS 128 +#define R_STEALTH 256 +#define R_REJUVINATE 512 +#define R_VAREDIT 1024 +#define R_SOUNDS 2048 +#define R_SPAWN 4096 + +#define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated. diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 2f8b588ec2a..818f0ccc1a9 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -1,109 +1,109 @@ -#define FIRE_DAMAGE_MODIFIER 0.0215 //Higher values result in more external fire damage to the skin (default 0.0215) -#define AIR_DAMAGE_MODIFIER 2.025 //More means less damage from hot air scalding lungs, less = more damage. (default 2.025) - -#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) //moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC -#define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005) -#define O2STANDARD 0.21 -#define N2STANDARD 0.79 -#define MOLES_O2STANDARD (MOLES_CELLSTANDARD*O2STANDARD) // O2 standard value (21%) -#define MOLES_N2STANDARD (MOLES_CELLSTANDARD*N2STANDARD) // N2 standard value (79%) - -#define GAS_O2 (1 << 0) -#define GAS_N2 (1 << 1) -#define GAS_PL (1 << 2) -#define GAS_CO2 (1 << 3) -#define GAS_N2O (1 << 4) - -//stuff you should probably leave well alone! -//ATMOS -#define CELL_VOLUME 2500 //liters in a cell -#define BREATH_VOLUME 0.5 //liters in a normal breath -#define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) //Amount of air to take a from a tile -#define HUMAN_NEEDED_OXYGEN (MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16) //Amount of air needed before pass out/suffocation commences -#define NORMPIPERATE 30 //pipe-insulation rate divisor -#define HEATPIPERATE 8 //heat-exch pipe insulation -#define FLOWFRAC 0.99 //fraction of gas transfered per process -#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) //Tank starts leaking -#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) //Tank spills all contents into atmosphere -#define TANK_FRAGMENT_PRESSURE (50.*ONE_ATMOSPHERE) //Boom 3x3 base explosion -#define TANK_FRAGMENT_SCALE (10.*ONE_ATMOSPHERE) //+1 for each SCALE kPa aboe threshold -#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.05 //Minimum ratio of air that must move to/from a tile to suspend group processing -#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Minimum amount of air that has to move before a group processing can be suspended -#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Either this must be active -#define MINIMUM_TEMPERATURE_TO_MOVE (T20C+100) //or this (or both, obviously) -#define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012 -#define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 //Minimum temperature difference before group processing is suspended -#define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 //Minimum temperature difference before the gas temperatures are just set to be equal -#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION T20C+10 -#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION T20C+200 -#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4 -#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 -#define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0 -#define SPACE_HEAT_TRANSFER_COEFFICIENT 0.2 //a hack to partly simulate radiative heat -#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4 -#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 //a hack for now - //Must be between 0 and 1. Values closer to 1 equalize temperature faster - //Should not exceed 0.4 else strange heat flow occur -#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD 150+T0C -#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST 100+T0C -#define FIRE_SPREAD_RADIOSITY_SCALE 0.85 -#define FIRE_CARBON_ENERGY_RELEASED 500000 //Amount of heat released per mole of burnt carbon into the tile -#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile -#define FIRE_GROWTH_RATE 40000 //For small fires -#define CARBON_LIFEFORM_FIRE_RESISTANCE 200+T0C //Resistance to fire damage -#define CARBON_LIFEFORM_FIRE_DAMAGE 4 //Fire damage - //Plasma fire properties -#define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C -#define PLASMA_UPPER_TEMPERATURE 1370+T0C -#define PLASMA_MINIMUM_OXYGEN_NEEDED 2 -#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30 -#define PLASMA_OXYGEN_FULLBURN 10 -#define MIN_PLASMA_DAMAGE 1 -#define MAX_PLASMA_DAMAGE 10 -#define MOLES_PLASMA_VISIBLE 0.7 //Moles in a standard cell after which plasma is visible - -// Pressure limits. -#define HAZARD_HIGH_PRESSURE 550 //This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant) -#define WARNING_HIGH_PRESSURE 325 //This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE) -#define WARNING_LOW_PRESSURE 50 //This is when the gray low pressure icon is displayed. (it is 2.5 * HAZARD_LOW_PRESSURE) -#define HAZARD_LOW_PRESSURE 20 //This is when the black ultra-low pressure icon is displayed. (This one is set as a constant) - -#define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 //This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount. -#define BODYTEMP_AUTORECOVERY_DIVISOR 12 //This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive. -#define BODYTEMP_AUTORECOVERY_MINIMUM 10 //Minimum amount of kelvin moved toward 310.15K per tick. So long as abs(310.15 - bodytemp) is more than 50. -#define BODYTEMP_COLD_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster. -#define BODYTEMP_HEAT_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster. -#define BODYTEMP_COOLING_MAX 30 //The maximum number of degrees that your body can cool in 1 tick, when in a cold area. -#define BODYTEMP_HEATING_MAX 30 //The maximum number of degrees that your body can heat up in 1 tick, when in a hot area. - -#define BODYTEMP_HEAT_DAMAGE_LIMIT 360.15 // The limit the human body can take before it starts taking damage from heat. -#define BODYTEMP_COLD_DAMAGE_LIMIT 260.15 // The limit the human body can take before it starts taking damage from coldness. - -#define SPACE_HELM_MIN_TEMP_PROTECT 2.0 //what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0. -#define SPACE_HELM_MAX_TEMP_PROTECT 1500 //Thermal insulation works both ways /Malkevin -#define SPACE_SUIT_MIN_TEMP_PROTECT 2.0 //what min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0. -#define SPACE_SUIT_MAX_TEMP_PROTECT 1500 - -#define FIRE_SUIT_MIN_TEMP_PROTECT 60 //Cold protection for firesuits -#define FIRE_SUIT_MAX_TEMP_PROTECT 30000 //what max_heat_protection_temperature is set to for firesuit quality suits. MUST NOT BE 0. -#define FIRE_HELM_MIN_TEMP_PROTECT 60 //Cold protection for fire helmets -#define FIRE_HELM_MAX_TEMP_PROTECT 30000 //for fire helmet quality items (red and white hardhats) - -#define HELMET_MIN_TEMP_PROTECT 160 //For normal helmets -#define HELMET_MAX_TEMP_PROTECT 600 //For normal helmets -#define ARMOR_MIN_TEMP_PROTECT 160 //For armor -#define ARMOR_MAX_TEMP_PROTECT 600 //For armor - -#define GLOVES_MIN_TEMP_PROTECT 2.0 //For some gloves (black and) -#define GLOVES_MAX_TEMP_PROTECT 1500 //For some gloves -#define SHOES_MIN_TEMP_PROTECT 2.0 //For gloves -#define SHOES_MAX_TEMP_PROTECT 1500 //For gloves - - -#define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE -#define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( -#define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). - -#define PRESSURE_SUIT_REDUCTION_COEFFICIENT 0.8 //This is how much (percentual) a suit with the flag STOPSPRESSUREDMAGE reduces pressure. -#define PRESSURE_HEAD_REDUCTION_COEFFICIENT 0.4 //This is how much (percentual) a helmet/hat with the flag STOPSPRESSUREDMAGE reduces pressure. - +#define FIRE_DAMAGE_MODIFIER 0.0215 //Higher values result in more external fire damage to the skin (default 0.0215) +#define AIR_DAMAGE_MODIFIER 2.025 //More means less damage from hot air scalding lungs, less = more damage. (default 2.025) + +#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) //moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC +#define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005) +#define O2STANDARD 0.21 +#define N2STANDARD 0.79 +#define MOLES_O2STANDARD (MOLES_CELLSTANDARD*O2STANDARD) // O2 standard value (21%) +#define MOLES_N2STANDARD (MOLES_CELLSTANDARD*N2STANDARD) // N2 standard value (79%) + +#define GAS_O2 (1 << 0) +#define GAS_N2 (1 << 1) +#define GAS_PL (1 << 2) +#define GAS_CO2 (1 << 3) +#define GAS_N2O (1 << 4) + +//stuff you should probably leave well alone! +//ATMOS +#define CELL_VOLUME 2500 //liters in a cell +#define BREATH_VOLUME 0.5 //liters in a normal breath +#define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) //Amount of air to take a from a tile +#define HUMAN_NEEDED_OXYGEN (MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16) //Amount of air needed before pass out/suffocation commences +#define NORMPIPERATE 30 //pipe-insulation rate divisor +#define HEATPIPERATE 8 //heat-exch pipe insulation +#define FLOWFRAC 0.99 //fraction of gas transfered per process +#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) //Tank starts leaking +#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) //Tank spills all contents into atmosphere +#define TANK_FRAGMENT_PRESSURE (50.*ONE_ATMOSPHERE) //Boom 3x3 base explosion +#define TANK_FRAGMENT_SCALE (10.*ONE_ATMOSPHERE) //+1 for each SCALE kPa aboe threshold +#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.05 //Minimum ratio of air that must move to/from a tile to suspend group processing +#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Minimum amount of air that has to move before a group processing can be suspended +#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD*MINIMUM_AIR_RATIO_TO_SUSPEND) //Either this must be active +#define MINIMUM_TEMPERATURE_TO_MOVE (T20C+100) //or this (or both, obviously) +#define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012 +#define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 //Minimum temperature difference before group processing is suspended +#define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 //Minimum temperature difference before the gas temperatures are just set to be equal +#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION T20C+10 +#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION T20C+200 +#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4 +#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 +#define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0 +#define SPACE_HEAT_TRANSFER_COEFFICIENT 0.2 //a hack to partly simulate radiative heat +#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4 +#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 //a hack for now + //Must be between 0 and 1. Values closer to 1 equalize temperature faster + //Should not exceed 0.4 else strange heat flow occur +#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD 150+T0C +#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST 100+T0C +#define FIRE_SPREAD_RADIOSITY_SCALE 0.85 +#define FIRE_CARBON_ENERGY_RELEASED 500000 //Amount of heat released per mole of burnt carbon into the tile +#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile +#define FIRE_GROWTH_RATE 40000 //For small fires +#define CARBON_LIFEFORM_FIRE_RESISTANCE 200+T0C //Resistance to fire damage +#define CARBON_LIFEFORM_FIRE_DAMAGE 4 //Fire damage + //Plasma fire properties +#define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C +#define PLASMA_UPPER_TEMPERATURE 1370+T0C +#define PLASMA_MINIMUM_OXYGEN_NEEDED 2 +#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30 +#define PLASMA_OXYGEN_FULLBURN 10 +#define MIN_PLASMA_DAMAGE 1 +#define MAX_PLASMA_DAMAGE 10 +#define MOLES_PLASMA_VISIBLE 0.7 //Moles in a standard cell after which plasma is visible + +// Pressure limits. +#define HAZARD_HIGH_PRESSURE 550 //This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant) +#define WARNING_HIGH_PRESSURE 325 //This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE) +#define WARNING_LOW_PRESSURE 50 //This is when the gray low pressure icon is displayed. (it is 2.5 * HAZARD_LOW_PRESSURE) +#define HAZARD_LOW_PRESSURE 20 //This is when the black ultra-low pressure icon is displayed. (This one is set as a constant) + +#define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 //This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount. +#define BODYTEMP_AUTORECOVERY_DIVISOR 12 //This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive. +#define BODYTEMP_AUTORECOVERY_MINIMUM 10 //Minimum amount of kelvin moved toward 310.15K per tick. So long as abs(310.15 - bodytemp) is more than 50. +#define BODYTEMP_COLD_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster. +#define BODYTEMP_HEAT_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster. +#define BODYTEMP_COOLING_MAX 30 //The maximum number of degrees that your body can cool in 1 tick, when in a cold area. +#define BODYTEMP_HEATING_MAX 30 //The maximum number of degrees that your body can heat up in 1 tick, when in a hot area. + +#define BODYTEMP_HEAT_DAMAGE_LIMIT 360.15 // The limit the human body can take before it starts taking damage from heat. +#define BODYTEMP_COLD_DAMAGE_LIMIT 260.15 // The limit the human body can take before it starts taking damage from coldness. + +#define SPACE_HELM_MIN_TEMP_PROTECT 2.0 //what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0. +#define SPACE_HELM_MAX_TEMP_PROTECT 1500 //Thermal insulation works both ways /Malkevin +#define SPACE_SUIT_MIN_TEMP_PROTECT 2.0 //what min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0. +#define SPACE_SUIT_MAX_TEMP_PROTECT 1500 + +#define FIRE_SUIT_MIN_TEMP_PROTECT 60 //Cold protection for firesuits +#define FIRE_SUIT_MAX_TEMP_PROTECT 30000 //what max_heat_protection_temperature is set to for firesuit quality suits. MUST NOT BE 0. +#define FIRE_HELM_MIN_TEMP_PROTECT 60 //Cold protection for fire helmets +#define FIRE_HELM_MAX_TEMP_PROTECT 30000 //for fire helmet quality items (red and white hardhats) + +#define HELMET_MIN_TEMP_PROTECT 160 //For normal helmets +#define HELMET_MAX_TEMP_PROTECT 600 //For normal helmets +#define ARMOR_MIN_TEMP_PROTECT 160 //For armor +#define ARMOR_MAX_TEMP_PROTECT 600 //For armor + +#define GLOVES_MIN_TEMP_PROTECT 2.0 //For some gloves (black and) +#define GLOVES_MAX_TEMP_PROTECT 1500 //For some gloves +#define SHOES_MIN_TEMP_PROTECT 2.0 //For gloves +#define SHOES_MAX_TEMP_PROTECT 1500 //For gloves + + +#define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE +#define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( +#define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). + +#define PRESSURE_SUIT_REDUCTION_COEFFICIENT 0.8 //This is how much (percentual) a suit with the flag STOPSPRESSUREDMAGE reduces pressure. +#define PRESSURE_HEAD_REDUCTION_COEFFICIENT 0.4 //This is how much (percentual) a helmet/hat with the flag STOPSPRESSUREDMAGE reduces pressure. + diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm index 726cfa90873..c11a9acb068 100644 --- a/code/__DEFINES/clothing.dm +++ b/code/__DEFINES/clothing.dm @@ -1,82 +1,82 @@ -//ITEM INVENTORY SLOT BITMASKS -#define SLOT_OCLOTHING 1 -#define SLOT_ICLOTHING 2 -#define SLOT_GLOVES 4 -#define SLOT_EYES 8 -#define SLOT_EARS 16 -#define SLOT_MASK 32 -#define SLOT_HEAD 64 -#define SLOT_FEET 128 -#define SLOT_ID 256 -#define SLOT_BELT 512 -#define SLOT_BACK 1024 -#define SLOT_POCKET 2048 //this is to allow items with a w_class of 3 or 4 to fit in pockets. -#define SLOT_DENYPOCKET 4096 //this is to deny items with a w_class of 2 or 1 to fit in pockets. - -//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. -#define HIDEGLOVES 1 //APPLIES ONLY TO THE EXTERIOR SUIT!! -#define HIDESUITSTORAGE 2 //APPLIES ONLY TO THE EXTERIOR SUIT!! -#define HIDEJUMPSUIT 4 //APPLIES ONLY TO THE EXTERIOR SUIT!! -#define HIDESHOES 8 //APPLIES ONLY TO THE EXTERIOR SUIT!! - -#define HIDEMASK 1 //APPLIES ONLY TO HELMETS/MASKS!! -#define HIDEEARS 2 //APPLIES ONLY TO HELMETS/MASKS!! (ears means headsets and such) -#define HIDEEYES 4 //APPLIES ONLY TO HELMETS/MASKS!! (eyes means glasses) -#define HIDEFACE 8 //APPLIES ONLY TO HELMETS/MASKS!! Dictates whether we appear as unknown. - -//slots -#define slot_back 1 -#define slot_wear_mask 2 -#define slot_handcuffed 3 -#define slot_l_hand 4 -#define slot_r_hand 5 -#define slot_belt 6 -#define slot_wear_id 7 -#define slot_ears 8 -#define slot_glasses 9 -#define slot_gloves 10 -#define slot_head 11 -#define slot_shoes 12 -#define slot_wear_suit 13 -#define slot_w_uniform 14 -#define slot_l_store 15 -#define slot_r_store 16 -#define slot_s_store 17 -#define slot_in_backpack 18 -#define slot_legcuffed 19 - -//Cant seem to find a mob bitflags area other than the powers one - -// bitflags for clothing parts - also used for limbs -#define HEAD 1 -#define CHEST 2 -#define GROIN 4 -#define LEG_LEFT 8 -#define LEG_RIGHT 16 -#define LEGS 24 -#define FOOT_LEFT 32 -#define FOOT_RIGHT 64 -#define FEET 96 -#define ARM_LEFT 128 -#define ARM_RIGHT 256 -#define ARMS 384 -#define HAND_LEFT 512 -#define HAND_RIGHT 1024 -#define HANDS 1536 -#define FULL_BODY 2047 - -// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers. -// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection() -// The values here should add up to 1. -// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30% -#define THERMAL_PROTECTION_HEAD 0.3 -#define THERMAL_PROTECTION_CHEST 0.15 -#define THERMAL_PROTECTION_GROIN 0.15 -#define THERMAL_PROTECTION_LEG_LEFT 0.075 -#define THERMAL_PROTECTION_LEG_RIGHT 0.075 -#define THERMAL_PROTECTION_FOOT_LEFT 0.025 -#define THERMAL_PROTECTION_FOOT_RIGHT 0.025 -#define THERMAL_PROTECTION_ARM_LEFT 0.075 -#define THERMAL_PROTECTION_ARM_RIGHT 0.075 -#define THERMAL_PROTECTION_HAND_LEFT 0.025 -#define THERMAL_PROTECTION_HAND_RIGHT 0.025 +//ITEM INVENTORY SLOT BITMASKS +#define SLOT_OCLOTHING 1 +#define SLOT_ICLOTHING 2 +#define SLOT_GLOVES 4 +#define SLOT_EYES 8 +#define SLOT_EARS 16 +#define SLOT_MASK 32 +#define SLOT_HEAD 64 +#define SLOT_FEET 128 +#define SLOT_ID 256 +#define SLOT_BELT 512 +#define SLOT_BACK 1024 +#define SLOT_POCKET 2048 //this is to allow items with a w_class of 3 or 4 to fit in pockets. +#define SLOT_DENYPOCKET 4096 //this is to deny items with a w_class of 2 or 1 to fit in pockets. + +//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. +#define HIDEGLOVES 1 //APPLIES ONLY TO THE EXTERIOR SUIT!! +#define HIDESUITSTORAGE 2 //APPLIES ONLY TO THE EXTERIOR SUIT!! +#define HIDEJUMPSUIT 4 //APPLIES ONLY TO THE EXTERIOR SUIT!! +#define HIDESHOES 8 //APPLIES ONLY TO THE EXTERIOR SUIT!! + +#define HIDEMASK 1 //APPLIES ONLY TO HELMETS/MASKS!! +#define HIDEEARS 2 //APPLIES ONLY TO HELMETS/MASKS!! (ears means headsets and such) +#define HIDEEYES 4 //APPLIES ONLY TO HELMETS/MASKS!! (eyes means glasses) +#define HIDEFACE 8 //APPLIES ONLY TO HELMETS/MASKS!! Dictates whether we appear as unknown. + +//slots +#define slot_back 1 +#define slot_wear_mask 2 +#define slot_handcuffed 3 +#define slot_l_hand 4 +#define slot_r_hand 5 +#define slot_belt 6 +#define slot_wear_id 7 +#define slot_ears 8 +#define slot_glasses 9 +#define slot_gloves 10 +#define slot_head 11 +#define slot_shoes 12 +#define slot_wear_suit 13 +#define slot_w_uniform 14 +#define slot_l_store 15 +#define slot_r_store 16 +#define slot_s_store 17 +#define slot_in_backpack 18 +#define slot_legcuffed 19 + +//Cant seem to find a mob bitflags area other than the powers one + +// bitflags for clothing parts - also used for limbs +#define HEAD 1 +#define CHEST 2 +#define GROIN 4 +#define LEG_LEFT 8 +#define LEG_RIGHT 16 +#define LEGS 24 +#define FOOT_LEFT 32 +#define FOOT_RIGHT 64 +#define FEET 96 +#define ARM_LEFT 128 +#define ARM_RIGHT 256 +#define ARMS 384 +#define HAND_LEFT 512 +#define HAND_RIGHT 1024 +#define HANDS 1536 +#define FULL_BODY 2047 + +// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers. +// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection() +// The values here should add up to 1. +// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30% +#define THERMAL_PROTECTION_HEAD 0.3 +#define THERMAL_PROTECTION_CHEST 0.15 +#define THERMAL_PROTECTION_GROIN 0.15 +#define THERMAL_PROTECTION_LEG_LEFT 0.075 +#define THERMAL_PROTECTION_LEG_RIGHT 0.075 +#define THERMAL_PROTECTION_FOOT_LEFT 0.025 +#define THERMAL_PROTECTION_FOOT_RIGHT 0.025 +#define THERMAL_PROTECTION_ARM_LEFT 0.075 +#define THERMAL_PROTECTION_ARM_RIGHT 0.075 +#define THERMAL_PROTECTION_HAND_LEFT 0.025 +#define THERMAL_PROTECTION_HAND_RIGHT 0.025 diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 0ed277b791d..02a09faf559 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -1,47 +1,47 @@ -//Damage things //TODO: merge these down to reduce on defines -//Way to waste perfectly good damagetype names (BRUTE) on this... If you were really worried about case sensitivity, you could have just used lowertext(damagetype) in the proc... -#define BRUTE "brute" -#define BURN "fire" -#define TOX "tox" -#define OXY "oxy" -#define CLONE "clone" -#define STAMINA "stamina" - -#define STUN "stun" -#define WEAKEN "weaken" -#define PARALYZE "paralize" -#define IRRADIATE "irradiate" -#define STUTTER "stutter" -#define EYE_BLUR "eye_blur" -#define DROWSY "drowsy" - -//I hate adding defines like this but I'd much rather deal with bitflags than lists and string searches -#define BRUTELOSS 1 -#define FIRELOSS 2 -#define TOXLOSS 4 -#define OXYLOSS 8 - -//Bitflags defining which status effects could be or are inflicted on a mob -#define CANSTUN 1 -#define CANWEAKEN 2 -#define CANPARALYSE 4 -#define CANPUSH 8 -#define GODMODE 4096 -#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath -#define DISFIGURED 16384 //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system -#define XENO_HOST 32768 //Tracks whether we're gonna be a baby alien's mummy. - - -//Grab levels -#define GRAB_PASSIVE 1 -#define GRAB_AGGRESSIVE 2 -#define GRAB_NECK 3 -#define GRAB_UPGRADING 4 -#define GRAB_KILL 5 - -#define HOSTILE_STANCE_IDLE 1 -//#define HOSTILE_STANCE_ALERT 2 //Was only used by bears -#define HOSTILE_STANCE_ATTACK 3 -#define HOSTILE_STANCE_ATTACKING 4 -//#define HOSTILE_STANCE_TIRED 5 //Was also only used by bears - +//Damage things //TODO: merge these down to reduce on defines +//Way to waste perfectly good damagetype names (BRUTE) on this... If you were really worried about case sensitivity, you could have just used lowertext(damagetype) in the proc... +#define BRUTE "brute" +#define BURN "fire" +#define TOX "tox" +#define OXY "oxy" +#define CLONE "clone" +#define STAMINA "stamina" + +#define STUN "stun" +#define WEAKEN "weaken" +#define PARALYZE "paralize" +#define IRRADIATE "irradiate" +#define STUTTER "stutter" +#define EYE_BLUR "eye_blur" +#define DROWSY "drowsy" + +//I hate adding defines like this but I'd much rather deal with bitflags than lists and string searches +#define BRUTELOSS 1 +#define FIRELOSS 2 +#define TOXLOSS 4 +#define OXYLOSS 8 + +//Bitflags defining which status effects could be or are inflicted on a mob +#define CANSTUN 1 +#define CANWEAKEN 2 +#define CANPARALYSE 4 +#define CANPUSH 8 +#define GODMODE 4096 +#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath +#define DISFIGURED 16384 //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system +#define XENO_HOST 32768 //Tracks whether we're gonna be a baby alien's mummy. + + +//Grab levels +#define GRAB_PASSIVE 1 +#define GRAB_AGGRESSIVE 2 +#define GRAB_NECK 3 +#define GRAB_UPGRADING 4 +#define GRAB_KILL 5 + +#define HOSTILE_STANCE_IDLE 1 +//#define HOSTILE_STANCE_ALERT 2 //Was only used by bears +#define HOSTILE_STANCE_ATTACK 3 +#define HOSTILE_STANCE_ATTACKING 4 +//#define HOSTILE_STANCE_TIRED 5 //Was also only used by bears + diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 2a0c0a8c003..528caa875aa 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -1,49 +1,49 @@ -/* - These defines are specific to the atom/flags bitmask -*/ -//FLAGS BITMASK -#define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere -//To successfully stop you taking all pressure damage you must have both a suit and head item with this flag. - -#define NODROP 2 // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted. -#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() -#define MASKINTERNALS 8 // mask allows internals -//#define SUITSPACE 8 // suit protects against space -#define USEDELAY 16 // For adding extra delay to heavy items, not currently used -#define NOSHIELD 32 // weapon not affected by shield -#define CONDUCT 64 // conducts electricity (metal etc.) -#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way -#define FPRINT 256 // takes a fingerprint -#define ON_BORDER 512 // item has priority to check when entering or leaving - - -#define GLASSESCOVERSEYES 1024 -#define MASKCOVERSEYES 1024 // get rid of some of the other retardation in these flags -#define HEADCOVERSEYES 1024 // feel free to realloc these numbers for other purposes -#define MASKCOVERSMOUTH 2048 // on other items, these are just for mask/head -#define HEADCOVERSMOUTH 2048 - -#define NOSLIP 1024 //prevents from slipping on wet floors, in space etc (NOTE: flag shared with THICKMATERIAL for external suits and helmet) - -#define OPENCONTAINER 4096 // is an open container for chemistry purposes - -// BLOCK_GAS_SMOKE_EFFECT only used in masks at the moment. -#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! (NOTE: flag shared with THICKMATERIAL) -#define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT) - -#define NOREACT 16384 //Reagents dont' react inside this container. - -#define BLOCKHAIR 32768 // temporarily removes the user's hair icon - -//turf-only flags -#define NOJAUNT 1 - -/* - These defines are used specifically with the atom/pass_flags bitmask - the atom/checkpass() proc uses them (tables will call movable atom checkpass(PASSTABLE) for example) -*/ -//flags for pass_flags -#define PASSTABLE 1 -#define PASSGLASS 2 -#define PASSGRILLE 4 +/* + These defines are specific to the atom/flags bitmask +*/ +//FLAGS BITMASK +#define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere +//To successfully stop you taking all pressure damage you must have both a suit and head item with this flag. + +#define NODROP 2 // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted. +#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() +#define MASKINTERNALS 8 // mask allows internals +//#define SUITSPACE 8 // suit protects against space +#define USEDELAY 16 // For adding extra delay to heavy items, not currently used +#define NOSHIELD 32 // weapon not affected by shield +#define CONDUCT 64 // conducts electricity (metal etc.) +#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way +#define FPRINT 256 // takes a fingerprint +#define ON_BORDER 512 // item has priority to check when entering or leaving + + +#define GLASSESCOVERSEYES 1024 +#define MASKCOVERSEYES 1024 // get rid of some of the other retardation in these flags +#define HEADCOVERSEYES 1024 // feel free to realloc these numbers for other purposes +#define MASKCOVERSMOUTH 2048 // on other items, these are just for mask/head +#define HEADCOVERSMOUTH 2048 + +#define NOSLIP 1024 //prevents from slipping on wet floors, in space etc (NOTE: flag shared with THICKMATERIAL for external suits and helmet) + +#define OPENCONTAINER 4096 // is an open container for chemistry purposes + +// BLOCK_GAS_SMOKE_EFFECT only used in masks at the moment. +#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! (NOTE: flag shared with THICKMATERIAL) +#define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT) + +#define NOREACT 16384 //Reagents dont' react inside this container. + +#define BLOCKHAIR 32768 // temporarily removes the user's hair icon + +//turf-only flags +#define NOJAUNT 1 + +/* + These defines are used specifically with the atom/pass_flags bitmask + the atom/checkpass() proc uses them (tables will call movable atom checkpass(PASSTABLE) for example) +*/ +//flags for pass_flags +#define PASSTABLE 1 +#define PASSGLASS 2 +#define PASSGRILLE 4 #define PASSBLOB 8 \ No newline at end of file diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index cee214b576f..64458a74709 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -1,83 +1,83 @@ - -//bitflags for mutations - // Extra powers: -#define SHADOW (1<<10) // shadow teleportation (create in/out portals anywhere) (25%) -#define SCREAM (1<<11) // supersonic screaming (25%) -#define EXPLOSIVE (1<<12) // exploding on-demand (15%) -#define REGENERATION (1<<13) // superhuman regeneration (30%) -#define REPROCESSOR (1<<14) // eat anything (50%) -#define SHAPESHIFTING (1<<15) // take on the appearance of anything (40%) -#define PHASING (1<<16) // ability to phase through walls (40%) -#define SHIELD (1<<17) // shielding from all projectile attacks (30%) -#define SHOCKWAVE (1<<18) // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%) -#define ELECTRICITY (1<<19) // ability to shoot electric attacks (15%) - - -// String identifiers for associative list lookup -// mob/var/list/mutations - - // Generic mutations: -#define TK 1 -#define COLD_RESISTANCE 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 -#define HEAL 10 // healing people with hands -#define SHADOW 11 // shadow teleportation (create in/out portals anywhere) (25%) -#define SCREAM 12 // supersonic screaming (25%) -#define EXPLOSIVE 13 // exploding on-demand (15%) -#define REGENERATION 14 // superhuman regeneration (30%) -#define REPROCESSOR 15 // eat anything (50%) -#define SHAPESHIFTING 16 // take on the appearance of anything (40%) -#define PHASING 17 // ability to phase through walls (40%) -#define SHIELD 18 // shielding from all projectile attacks (30%) -#define SHOCKWAVE 19 // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%) -#define ELECTRICITY 20 // ability to shoot electric attacks (15%) - -//disabilities -#define NEARSIGHTED 1 -#define EPILEPSY 2 -#define COUGHING 4 -#define TOURETTES 8 -#define NERVOUS 16 - -//sdisabilities -#define BLIND 1 -#define MUTE 2 -#define DEAF 4 - -//DNA - Because fuck you and your magic numbers being all over the codebase. -#define DNA_BLOCK_SIZE 3 - -#define DNA_UNI_IDENTITY_BLOCKS 7 -#define DNA_HAIR_COLOR_BLOCK 1 -#define DNA_FACIAL_HAIR_COLOR_BLOCK 2 -#define DNA_SKIN_TONE_BLOCK 3 -#define DNA_EYE_COLOR_BLOCK 4 -#define DNA_GENDER_BLOCK 5 -#define DNA_FACIAL_HAIR_STYLE_BLOCK 6 -#define DNA_HAIR_STYLE_BLOCK 7 - -#define DNA_STRUC_ENZYMES_BLOCKS 14 -#define DNA_UNIQUE_ENZYMES_LEN 32 - -//Transformation proc stuff -#define TR_KEEPITEMS 1 -#define TR_KEEPVIRUS 2 -#define TR_KEEPDAMAGE 4 -#define TR_HASHNAME 8 // hashing names (e.g. monkey(e34f)) (only in monkeyize) -#define TR_KEEPIMPLANTS 16 -#define TR_KEEPSE 32 // changelings shouldn't edit the DNA's SE when turning into a monkey -#define TR_DEFAULTMSG 64 -#define TR_KEEPSRC 128 - -//Organ stuff, It's here because "Genetics" is the most relevant file for organs -#define ORGAN_ORGANIC 1 + +//bitflags for mutations + // Extra powers: +#define SHADOW (1<<10) // shadow teleportation (create in/out portals anywhere) (25%) +#define SCREAM (1<<11) // supersonic screaming (25%) +#define EXPLOSIVE (1<<12) // exploding on-demand (15%) +#define REGENERATION (1<<13) // superhuman regeneration (30%) +#define REPROCESSOR (1<<14) // eat anything (50%) +#define SHAPESHIFTING (1<<15) // take on the appearance of anything (40%) +#define PHASING (1<<16) // ability to phase through walls (40%) +#define SHIELD (1<<17) // shielding from all projectile attacks (30%) +#define SHOCKWAVE (1<<18) // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%) +#define ELECTRICITY (1<<19) // ability to shoot electric attacks (15%) + + +// String identifiers for associative list lookup +// mob/var/list/mutations + + // Generic mutations: +#define TK 1 +#define COLD_RESISTANCE 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 +#define HEAL 10 // healing people with hands +#define SHADOW 11 // shadow teleportation (create in/out portals anywhere) (25%) +#define SCREAM 12 // supersonic screaming (25%) +#define EXPLOSIVE 13 // exploding on-demand (15%) +#define REGENERATION 14 // superhuman regeneration (30%) +#define REPROCESSOR 15 // eat anything (50%) +#define SHAPESHIFTING 16 // take on the appearance of anything (40%) +#define PHASING 17 // ability to phase through walls (40%) +#define SHIELD 18 // shielding from all projectile attacks (30%) +#define SHOCKWAVE 19 // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%) +#define ELECTRICITY 20 // ability to shoot electric attacks (15%) + +//disabilities +#define NEARSIGHTED 1 +#define EPILEPSY 2 +#define COUGHING 4 +#define TOURETTES 8 +#define NERVOUS 16 + +//sdisabilities +#define BLIND 1 +#define MUTE 2 +#define DEAF 4 + +//DNA - Because fuck you and your magic numbers being all over the codebase. +#define DNA_BLOCK_SIZE 3 + +#define DNA_UNI_IDENTITY_BLOCKS 7 +#define DNA_HAIR_COLOR_BLOCK 1 +#define DNA_FACIAL_HAIR_COLOR_BLOCK 2 +#define DNA_SKIN_TONE_BLOCK 3 +#define DNA_EYE_COLOR_BLOCK 4 +#define DNA_GENDER_BLOCK 5 +#define DNA_FACIAL_HAIR_STYLE_BLOCK 6 +#define DNA_HAIR_STYLE_BLOCK 7 + +#define DNA_STRUC_ENZYMES_BLOCKS 14 +#define DNA_UNIQUE_ENZYMES_LEN 32 + +//Transformation proc stuff +#define TR_KEEPITEMS 1 +#define TR_KEEPVIRUS 2 +#define TR_KEEPDAMAGE 4 +#define TR_HASHNAME 8 // hashing names (e.g. monkey(e34f)) (only in monkeyize) +#define TR_KEEPIMPLANTS 16 +#define TR_KEEPSE 32 // changelings shouldn't edit the DNA's SE when turning into a monkey +#define TR_DEFAULTMSG 64 +#define TR_KEEPSRC 128 + +//Organ stuff, It's here because "Genetics" is the most relevant file for organs +#define ORGAN_ORGANIC 1 #define ORGAN_ROBOTIC 2 \ No newline at end of file diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index f66a8d7d7c9..939e1e6e3ee 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -1,13 +1,13 @@ -// channel numbers for power -#define EQUIP 1 -#define LIGHT 2 -#define ENVIRON 3 -#define TOTAL 4 //for total power used only - - -//bitflags for door switches. -#define OPEN 1 -#define IDSCAN 2 -#define BOLTS 4 -#define SHOCK 8 -#define SAFE 16 +// channel numbers for power +#define EQUIP 1 +#define LIGHT 2 +#define ENVIRON 3 +#define TOTAL 4 //for total power used only + + +//bitflags for door switches. +#define OPEN 1 +#define IDSCAN 2 +#define BOLTS 4 +#define SHOCK 8 +#define SAFE 16 diff --git a/code/__DEFINES/math.dm b/code/__DEFINES/math.dm index aec3029ab10..0f11b3d9eea 100644 --- a/code/__DEFINES/math.dm +++ b/code/__DEFINES/math.dm @@ -1,11 +1,11 @@ -#define PI 3.1415 -#define SPEED_OF_LIGHT 3e8 //not exact but hey! -#define SPEED_OF_LIGHT_SQ 9e+16 -#define INFINITY 1e31 //closer then enough - -//atmos -#define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol) -#define ONE_ATMOSPHERE 101.325 //kPa -#define T0C 273.15 // 0degC -#define T20C 293.15 // 20degC -#define TCMB 2.7 // -270.3degC +#define PI 3.1415 +#define SPEED_OF_LIGHT 3e8 //not exact but hey! +#define SPEED_OF_LIGHT_SQ 9e+16 +#define INFINITY 1e31 //closer then enough + +//atmos +#define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol) +#define ONE_ATMOSPHERE 101.325 //kPa +#define T0C 273.15 // 0degC +#define T20C 293.15 // 20degC +#define TCMB 2.7 // -270.3degC diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 455dfebc30c..d1ae438525c 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -1,27 +1,27 @@ - -//Preference toggles -#define SOUND_ADMINHELP 1 -#define SOUND_MIDI 2 -#define SOUND_AMBIENCE 4 -#define SOUND_LOBBY 8 -#define CHAT_OOC 16 -#define CHAT_DEAD 32 -#define CHAT_GHOSTEARS 64 -#define CHAT_GHOSTSIGHT 128 -#define CHAT_PRAYER 256 -#define CHAT_RADIO 512 -#define MEMBER_PUBLIC 1024 - -#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|MEMBER_PUBLIC) - -#define BE_TRAITOR 1 -#define BE_OPERATIVE 2 -#define BE_CHANGELING 4 -#define BE_WIZARD 8 -#define BE_MALF 16 -#define BE_REV 32 -#define BE_ALIEN 64 -#define BE_PAI 128 -#define BE_CULTIST 256 -#define BE_BLOB 512 -#define BE_NINJA 1024 + +//Preference toggles +#define SOUND_ADMINHELP 1 +#define SOUND_MIDI 2 +#define SOUND_AMBIENCE 4 +#define SOUND_LOBBY 8 +#define CHAT_OOC 16 +#define CHAT_DEAD 32 +#define CHAT_GHOSTEARS 64 +#define CHAT_GHOSTSIGHT 128 +#define CHAT_PRAYER 256 +#define CHAT_RADIO 512 +#define MEMBER_PUBLIC 1024 + +#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|MEMBER_PUBLIC) + +#define BE_TRAITOR 1 +#define BE_OPERATIVE 2 +#define BE_CHANGELING 4 +#define BE_WIZARD 8 +#define BE_MALF 16 +#define BE_REV 32 +#define BE_ALIEN 64 +#define BE_PAI 128 +#define BE_CULTIST 256 +#define BE_BLOB 512 +#define BE_NINJA 1024 diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm index 902a49b422c..6d8865816df 100644 --- a/code/__DEFINES/sight.dm +++ b/code/__DEFINES/sight.dm @@ -1,32 +1,32 @@ - -#define SEE_INVISIBLE_MINIMUM 5 - -#define SEE_INVISIBLE_OBSERVER_NOLIGHTING 15 - -#define INVISIBILITY_LIGHTING 20 - -#define SEE_INVISIBLE_LIVING 25 - -#define SEE_INVISIBLE_LEVEL_ONE 35 //Used by some stuff in code. It's really poorly organized. -#define INVISIBILITY_LEVEL_ONE 35 //Used by some stuff in code. It's really poorly organized. - -#define SEE_INVISIBLE_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized. -#define INVISIBILITY_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized. - -#define INVISIBILITY_OBSERVER 60 -#define SEE_INVISIBLE_OBSERVER 60 - -#define INVISIBILITY_MAXIMUM 100 - -#define BORGMESON 1 -#define BORGTHERM 2 -#define BORGXRAY 4 - -// for secHUDs and medHUDs and variants. The number is the location of the image on the list hud_list of humans. -#define HEALTH_HUD 1 // dead, alive, sick, health status -#define STATUS_HUD 2 // a simple line rounding the mob's number health -#define ID_HUD 3 // the job asigned to your ID -#define WANTED_HUD 4 // wanted, released, parroled, security status -#define IMPLOYAL_HUD 5 // loyality implant -#define IMPCHEM_HUD 6 // chemical implant -#define IMPTRACK_HUD 7 // tracking implant + +#define SEE_INVISIBLE_MINIMUM 5 + +#define SEE_INVISIBLE_OBSERVER_NOLIGHTING 15 + +#define INVISIBILITY_LIGHTING 20 + +#define SEE_INVISIBLE_LIVING 25 + +#define SEE_INVISIBLE_LEVEL_ONE 35 //Used by some stuff in code. It's really poorly organized. +#define INVISIBILITY_LEVEL_ONE 35 //Used by some stuff in code. It's really poorly organized. + +#define SEE_INVISIBLE_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized. +#define INVISIBILITY_LEVEL_TWO 45 //Used by some other stuff in code. It's really poorly organized. + +#define INVISIBILITY_OBSERVER 60 +#define SEE_INVISIBLE_OBSERVER 60 + +#define INVISIBILITY_MAXIMUM 100 + +#define BORGMESON 1 +#define BORGTHERM 2 +#define BORGXRAY 4 + +// for secHUDs and medHUDs and variants. The number is the location of the image on the list hud_list of humans. +#define HEALTH_HUD 1 // dead, alive, sick, health status +#define STATUS_HUD 2 // a simple line rounding the mob's number health +#define ID_HUD 3 // the job asigned to your ID +#define WANTED_HUD 4 // wanted, released, parroled, security status +#define IMPLOYAL_HUD 5 // loyality implant +#define IMPCHEM_HUD 6 // chemical implant +#define IMPTRACK_HUD 7 // tracking implant diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index f3114a18245..816da605d36 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -1,15 +1,15 @@ -/* - Used with the various stat variables (mob, machines) -*/ - -//mob/var/stat things -#define CONSCIOUS 0 -#define UNCONSCIOUS 1 -#define DEAD 2 - -// bitflags for machine stat variable -#define BROKEN 1 -#define NOPOWER 2 -#define POWEROFF 4 // tbd -#define MAINT 8 // under maintaince -#define EMPED 16 // temporary broken by EMP pulse +/* + Used with the various stat variables (mob, machines) +*/ + +//mob/var/stat things +#define CONSCIOUS 0 +#define UNCONSCIOUS 1 +#define DEAD 2 + +// bitflags for machine stat variable +#define BROKEN 1 +#define NOPOWER 2 +#define POWEROFF 4 // tbd +#define MAINT 8 // under maintaince +#define EMPED 16 // temporary broken by EMP pulse diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 4914323883c..04e05b29ff1 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -1,389 +1,389 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/proc/get_area(O) - var/atom/location = O - var/i - for(i=1, i<=20, i++) - if(isarea(location)) - return location - else if (istype(location)) - location = location.loc - else - return null - return 0 - -/proc/get_area_master(O) - var/area/A = get_area(O) - if(A && A.master) - A = A.master - return A - -/proc/get_area_name(N) //get area by its name - for(var/area/A in world) - if(A.name == N) - return A - return 0 - -/proc/in_range(source, user) - if(get_dist(source, user) <= 1) - return 1 - - return 0 //not in range and not telekinetic - -// Like view but bypasses luminosity check - -/proc/hear(var/range, var/atom/source) - - var/lum = source.luminosity - source.luminosity = 6 - - var/list/heard = view(range, source) - source.luminosity = lum - - return heard - -/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_master(the_area) - for(var/C in living_mob_list) - if(!istype(C, check_type)) - continue - if(C == must_be_alone) - continue - if(our_area == get_area_master(C)) - return 0 - return 1 - - -//Magic constants obtained by using linear regression on right-angled triangles of sides 0=dy) return (k1*dx) + (k2*dy) //No sqrt or powers :) - else return (k2*dx) + (k1*dy) -#undef k1 -#undef k2 - -/proc/circlerange(center=usr,radius=3) - - var/turf/centerturf = get_turf(center) - var/list/turfs = new/list() - var/rsq = radius * (radius+0.5) - - for(var/atom/T in range(radius, centerturf)) - var/dx = T.x - centerturf.x - var/dy = T.y - centerturf.y - if(dx*dx + dy*dy <= rsq) - turfs += T - - //turfs += centerturf - return turfs - -/proc/circleview(center=usr,radius=3) - - var/turf/centerturf = get_turf(center) - var/list/atoms = new/list() - var/rsq = radius * (radius+0.5) - - for(var/atom/A in view(radius, centerturf)) - var/dx = A.x - centerturf.x - var/dy = A.y - centerturf.y - if(dx*dx + dy*dy <= rsq) - atoms += A - - //turfs += centerturf - return atoms - -/proc/get_dist_euclidian(atom/Loc1 as turf|mob|obj,atom/Loc2 as turf|mob|obj) - var/dx = Loc1.x - Loc2.x - var/dy = Loc1.y - Loc2.y - - var/dist = sqrt(dx**2 + dy**2) - - return dist - -/proc/circlerangeturfs(center=usr,radius=3) - - var/turf/centerturf = get_turf(center) - var/list/turfs = new/list() - var/rsq = radius * (radius+0.5) - - for(var/turf/T in range(radius, centerturf)) - var/dx = T.x - centerturf.x - var/dy = T.y - centerturf.y - if(dx*dx + dy*dy <= rsq) - turfs += T - return turfs - -/proc/circleviewturfs(center=usr,radius=3) //Is there even a diffrence between this proc and circlerangeturfs()? - - var/turf/centerturf = get_turf(center) - var/list/turfs = new/list() - var/rsq = radius * (radius+0.5) - - for(var/turf/T in view(radius, centerturf)) - var/dx = T.x - centerturf.x - var/dy = T.y - centerturf.y - if(dx*dx + dy*dy <= rsq) - turfs += T - return turfs - - - -//var/debug_mob = 0 - -// Better recursive loop, technically sort of not actually recursive cause that shit is retarded, enjoy. -//No need for a recursive limit either - - -proc/recursive_mob_check(var/atom/O,var/client_check=1,var/sight_check=1,var/include_radio=1) - - var/list/processing_list = list(O) - var/list/processed_list = list() - var/list/found_mobs = list() - - while(processing_list.len) - - var/atom/A = processing_list[1] - var/passed = 0 - - if(ismob(A)) - var/mob/A_tmp = A - passed=1 - - if(client_check && !A_tmp.client) - passed=0 - - if(sight_check && !isInSight(A_tmp, O)) - passed=0 - - else if(include_radio && istype(A, /obj/item/device/radio)) - passed=1 - - if(sight_check && !isInSight(A, O)) - passed=0 - - if(passed) - found_mobs |= A - - for(var/atom/B in A) - if(!(B in processed_list)) - processing_list |= B - - processing_list -= A - processed_list |= A - - return found_mobs - - -proc/get_mobs_in_view(var/R, var/atom/source) - // Returns a list of mobs in range of R from source. Used in radio and say code. - - var/turf/T = get_turf(source) - var/list/hear = list() - - if(!T) - return hear - - var/list/range = hear(R, T) - - for(var/atom/movable/A in range) - hear |= recursive_mob_check(A, 1, 0, 1) - - return hear - - - -/proc/get_mobs_in_radio_ranges(var/list/obj/item/device/radio/radios) - - set background = BACKGROUND_ENABLED - - . = list() - // Returns a list of mobs who can hear any of the radios given in @radios - var/list/speaker_coverage = list() - for(var/i = 1; i <= radios.len; i++) - var/obj/item/device/radio/R = radios[i] - if(R) - var/turf/speaker = get_turf(R) - if(speaker) - for(var/turf/T in hear(R.canhear_range,speaker)) - speaker_coverage[T] = T - - - // Try to find all the players who can hear the message - for(var/i = 1; i <= player_list.len; i++) - var/mob/M = player_list[i] - if(M) - var/turf/ear = get_turf(M) - if(ear) - if(speaker_coverage[ear]) - . |= M - return . - -#define SIGN(X) ((X<0)?-1:1) - -proc - inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5) - var/turf/T - if(X1==X2) - if(Y1==Y2) - return 1 //Light cannot be blocked on same tile - else - var/s = SIGN(Y2-Y1) - Y1+=s - while(Y1!=Y2) - T=locate(X1,Y1,Z) - if(T.opacity) - return 0 - Y1+=s - else - var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1)) - var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles - var/signX = SIGN(X2-X1) - var/signY = SIGN(Y2-Y1) - if(X1 abs (dx)) //slope is above 1:1 (move horizontally in a tie) - if(dy > 0) - return get_step(start, SOUTH) - else - return get_step(start, NORTH) - else - if(dx > 0) - return get_step(start, WEST) - else - return get_step(start, EAST) - -/proc/try_move_adjacent(atom/movable/AM) - var/turf/T = get_turf(AM) - for(var/direction in cardinal) - if(AM.Move(get_step(T, direction))) - break - -/proc/get_mob_by_key(var/key) - for(var/mob/M in mob_list) - if(M.ckey == lowertext(key)) - return M - return null - -// Will return a list of active candidates. It increases the buffer 5 times until it finds a candidate which is active within the buffer. - -/proc/get_candidates(be_special_flag=0, afk_bracket=3000) - var/list/candidates = list() - // Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000)) - while(!candidates.len && afk_bracket < 6000) - for(var/mob/dead/observer/G in player_list) - if(G.client != null) - if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) - if(!G.client.is_afk(afk_bracket) && (G.client.prefs.be_special & be_special_flag)) - candidates += G.client - afk_bracket += 600 // Add a minute to the bracket, for every attempt - return candidates - -/proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480) - if(!isobj(O)) O = new /obj/screen/text() - O.maptext = maptext - O.maptext_height = maptext_height - O.maptext_width = maptext_width - O.screen_loc = screen_loc - return O - -/proc/Show2Group4Delay(obj/O, list/group, delay=0) - if(!isobj(O)) return - if(!group) group = clients - for(var/client/C in group) - C.screen += O - if(delay) - spawn(delay) - for(var/client/C in group) - C.screen -= O - -/proc/flick_overlay(image/I, list/show_to, duration) - for(var/client/C in show_to) - C.images += I - sleep(duration) - for(var/client/C in show_to) - C.images -= I - -/proc/get_active_player_count() - // Get active players who are playing in the round - var/active_players = 0 - for(var/i = 1; i <= player_list.len; i++) - var/mob/M = player_list[i] - if(M && M.client) - if(istype(M, /mob/new_player)) // 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 - if(O.started_as_observer) // Exclude people who started as observers - continue - active_players++ - return active_players - -/datum/projectile_data - var/src_x - var/src_y - var/time - var/distance - var/power_x - var/power_y - var/dest_x - var/dest_y - -/datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \ - var/power_x, var/power_y, var/dest_x, var/dest_y) - src.src_x = src_x - src.src_y = src_y - src.time = time - src.distance = distance - src.power_x = power_x - src.power_y = power_y - src.dest_x = dest_x - src.dest_y = dest_y - -/proc/projectile_trajectory(var/src_x, var/src_y, var/rotation, var/angle, var/power) - - // returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle], - // rotated at [rotation] and with the power of [power] - // Thanks to VistaPOWA for this function - - var/power_x = power * cos(angle) - var/power_y = power * sin(angle) - var/time = 2* power_y / 10 //10 = g - - var/distance = time * power_x - - var/dest_x = src_x + distance*sin(rotation); - var/dest_y = src_y + distance*cos(rotation); - - return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y) +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 + +/proc/get_area(O) + var/atom/location = O + var/i + for(i=1, i<=20, i++) + if(isarea(location)) + return location + else if (istype(location)) + location = location.loc + else + return null + return 0 + +/proc/get_area_master(O) + var/area/A = get_area(O) + if(A && A.master) + A = A.master + return A + +/proc/get_area_name(N) //get area by its name + for(var/area/A in world) + if(A.name == N) + return A + return 0 + +/proc/in_range(source, user) + if(get_dist(source, user) <= 1) + return 1 + + return 0 //not in range and not telekinetic + +// Like view but bypasses luminosity check + +/proc/hear(var/range, var/atom/source) + + var/lum = source.luminosity + source.luminosity = 6 + + var/list/heard = view(range, source) + source.luminosity = lum + + return heard + +/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_master(the_area) + for(var/C in living_mob_list) + if(!istype(C, check_type)) + continue + if(C == must_be_alone) + continue + if(our_area == get_area_master(C)) + return 0 + return 1 + + +//Magic constants obtained by using linear regression on right-angled triangles of sides 0=dy) return (k1*dx) + (k2*dy) //No sqrt or powers :) + else return (k2*dx) + (k1*dy) +#undef k1 +#undef k2 + +/proc/circlerange(center=usr,radius=3) + + var/turf/centerturf = get_turf(center) + var/list/turfs = new/list() + var/rsq = radius * (radius+0.5) + + for(var/atom/T in range(radius, centerturf)) + var/dx = T.x - centerturf.x + var/dy = T.y - centerturf.y + if(dx*dx + dy*dy <= rsq) + turfs += T + + //turfs += centerturf + return turfs + +/proc/circleview(center=usr,radius=3) + + var/turf/centerturf = get_turf(center) + var/list/atoms = new/list() + var/rsq = radius * (radius+0.5) + + for(var/atom/A in view(radius, centerturf)) + var/dx = A.x - centerturf.x + var/dy = A.y - centerturf.y + if(dx*dx + dy*dy <= rsq) + atoms += A + + //turfs += centerturf + return atoms + +/proc/get_dist_euclidian(atom/Loc1 as turf|mob|obj,atom/Loc2 as turf|mob|obj) + var/dx = Loc1.x - Loc2.x + var/dy = Loc1.y - Loc2.y + + var/dist = sqrt(dx**2 + dy**2) + + return dist + +/proc/circlerangeturfs(center=usr,radius=3) + + var/turf/centerturf = get_turf(center) + var/list/turfs = new/list() + var/rsq = radius * (radius+0.5) + + for(var/turf/T in range(radius, centerturf)) + var/dx = T.x - centerturf.x + var/dy = T.y - centerturf.y + if(dx*dx + dy*dy <= rsq) + turfs += T + return turfs + +/proc/circleviewturfs(center=usr,radius=3) //Is there even a diffrence between this proc and circlerangeturfs()? + + var/turf/centerturf = get_turf(center) + var/list/turfs = new/list() + var/rsq = radius * (radius+0.5) + + for(var/turf/T in view(radius, centerturf)) + var/dx = T.x - centerturf.x + var/dy = T.y - centerturf.y + if(dx*dx + dy*dy <= rsq) + turfs += T + return turfs + + + +//var/debug_mob = 0 + +// Better recursive loop, technically sort of not actually recursive cause that shit is retarded, enjoy. +//No need for a recursive limit either + + +proc/recursive_mob_check(var/atom/O,var/client_check=1,var/sight_check=1,var/include_radio=1) + + var/list/processing_list = list(O) + var/list/processed_list = list() + var/list/found_mobs = list() + + while(processing_list.len) + + var/atom/A = processing_list[1] + var/passed = 0 + + if(ismob(A)) + var/mob/A_tmp = A + passed=1 + + if(client_check && !A_tmp.client) + passed=0 + + if(sight_check && !isInSight(A_tmp, O)) + passed=0 + + else if(include_radio && istype(A, /obj/item/device/radio)) + passed=1 + + if(sight_check && !isInSight(A, O)) + passed=0 + + if(passed) + found_mobs |= A + + for(var/atom/B in A) + if(!(B in processed_list)) + processing_list |= B + + processing_list -= A + processed_list |= A + + return found_mobs + + +proc/get_mobs_in_view(var/R, var/atom/source) + // Returns a list of mobs in range of R from source. Used in radio and say code. + + var/turf/T = get_turf(source) + var/list/hear = list() + + if(!T) + return hear + + var/list/range = hear(R, T) + + for(var/atom/movable/A in range) + hear |= recursive_mob_check(A, 1, 0, 1) + + return hear + + + +/proc/get_mobs_in_radio_ranges(var/list/obj/item/device/radio/radios) + + set background = BACKGROUND_ENABLED + + . = list() + // Returns a list of mobs who can hear any of the radios given in @radios + var/list/speaker_coverage = list() + for(var/i = 1; i <= radios.len; i++) + var/obj/item/device/radio/R = radios[i] + if(R) + var/turf/speaker = get_turf(R) + if(speaker) + for(var/turf/T in hear(R.canhear_range,speaker)) + speaker_coverage[T] = T + + + // Try to find all the players who can hear the message + for(var/i = 1; i <= player_list.len; i++) + var/mob/M = player_list[i] + if(M) + var/turf/ear = get_turf(M) + if(ear) + if(speaker_coverage[ear]) + . |= M + return . + +#define SIGN(X) ((X<0)?-1:1) + +proc + inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5) + var/turf/T + if(X1==X2) + if(Y1==Y2) + return 1 //Light cannot be blocked on same tile + else + var/s = SIGN(Y2-Y1) + Y1+=s + while(Y1!=Y2) + T=locate(X1,Y1,Z) + if(T.opacity) + return 0 + Y1+=s + else + var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1)) + var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles + var/signX = SIGN(X2-X1) + var/signY = SIGN(Y2-Y1) + if(X1 abs (dx)) //slope is above 1:1 (move horizontally in a tie) + if(dy > 0) + return get_step(start, SOUTH) + else + return get_step(start, NORTH) + else + if(dx > 0) + return get_step(start, WEST) + else + return get_step(start, EAST) + +/proc/try_move_adjacent(atom/movable/AM) + var/turf/T = get_turf(AM) + for(var/direction in cardinal) + if(AM.Move(get_step(T, direction))) + break + +/proc/get_mob_by_key(var/key) + for(var/mob/M in mob_list) + if(M.ckey == lowertext(key)) + return M + return null + +// Will return a list of active candidates. It increases the buffer 5 times until it finds a candidate which is active within the buffer. + +/proc/get_candidates(be_special_flag=0, afk_bracket=3000) + var/list/candidates = list() + // Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000)) + while(!candidates.len && afk_bracket < 6000) + for(var/mob/dead/observer/G in player_list) + if(G.client != null) + if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) + if(!G.client.is_afk(afk_bracket) && (G.client.prefs.be_special & be_special_flag)) + candidates += G.client + afk_bracket += 600 // Add a minute to the bracket, for every attempt + return candidates + +/proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480) + if(!isobj(O)) O = new /obj/screen/text() + O.maptext = maptext + O.maptext_height = maptext_height + O.maptext_width = maptext_width + O.screen_loc = screen_loc + return O + +/proc/Show2Group4Delay(obj/O, list/group, delay=0) + if(!isobj(O)) return + if(!group) group = clients + for(var/client/C in group) + C.screen += O + if(delay) + spawn(delay) + for(var/client/C in group) + C.screen -= O + +/proc/flick_overlay(image/I, list/show_to, duration) + for(var/client/C in show_to) + C.images += I + sleep(duration) + for(var/client/C in show_to) + C.images -= I + +/proc/get_active_player_count() + // Get active players who are playing in the round + var/active_players = 0 + for(var/i = 1; i <= player_list.len; i++) + var/mob/M = player_list[i] + if(M && M.client) + if(istype(M, /mob/new_player)) // 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 + if(O.started_as_observer) // Exclude people who started as observers + continue + active_players++ + return active_players + +/datum/projectile_data + var/src_x + var/src_y + var/time + var/distance + var/power_x + var/power_y + var/dest_x + var/dest_y + +/datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \ + var/power_x, var/power_y, var/dest_x, var/dest_y) + src.src_x = src_x + src.src_y = src_y + src.time = time + src.distance = distance + src.power_x = power_x + src.power_y = power_y + src.dest_x = dest_x + src.dest_y = dest_y + +/proc/projectile_trajectory(var/src_x, var/src_y, var/rotation, var/angle, var/power) + + // returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle], + // rotated at [rotation] and with the power of [power] + // Thanks to VistaPOWA for this function + + var/power_x = power * cos(angle) + var/power_y = power * sin(angle) + var/time = 2* power_y / 10 //10 = g + + var/distance = time * power_x + + var/dest_x = src_x + distance*sin(rotation); + var/dest_y = src_y + distance*cos(rotation); + + return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y) diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm index 5f8cf47bec5..9a308d3f9c7 100644 --- a/code/__HELPERS/matrices.dm +++ b/code/__HELPERS/matrices.dm @@ -1,3 +1,3 @@ -/matrix/proc/TurnTo(old_angle, new_angle) - . = new_angle - old_angle - Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT +/matrix/proc/TurnTo(old_angle, new_angle) + . = new_angle - old_angle + Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c29a796a39a..65565da4d7e 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -330,6 +330,10 @@ Turf and target are seperate in case you want to teleport some distance from a t A.aiPDA.owner = newname A.aiPDA.name = newname + " (" + A.aiPDA.ownjob + ")" + if(cmptext("cyborg",role)) + if(isrobot(src)) + var/mob/living/silicon/robot/A = src + A.custom_name = newname fully_replace_character_name(oldname,newname) @@ -591,7 +595,7 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl animation.master = target flick(flick_anim, animation) sleep(max(sleeptime, 15)) - del(animation) + qdel(animation) atom/proc/GetAllContents() @@ -880,7 +884,7 @@ atom/proc/GetTypeInAllContents(typepath) X.icon = 'icons/turf/shuttle.dmi' X.icon_state = replacetext(O.icon_state, "_f", "_s") // revert the turf to the old icon_state X.name = "wall" - del(O) // prevents multiple shuttle corners from stacking + qdel(O) // prevents multiple shuttle corners from stacking continue if(!istype(O,/obj)) continue O.loc = X @@ -1286,4 +1290,4 @@ proc/check_target_facings(mob/living/initator, mob/living/target) if(initator.dir + 4 == target.dir || initator.dir - 4 == target.dir) //mobs are facing each other return 2 if(initator.dir + 2 == target.dir || initator.dir - 2 == target.dir || initator.dir + 6 == target.dir || initator.dir - 6 == target.dir) //Initating mob is looking at the target, while the target mob is looking in a direction perpendicular to the 1st - return 3 \ No newline at end of file + return 3 diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index ce5c939ffa6..58c6dd7913c 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -1,44 +1,44 @@ -var/datum/configuration/config = null - -var/host = null -var/join_motd = null -var/station_name = null -var/game_version = "/tg/ Station 13" -var/changelog_hash = "" - -var/ooc_allowed = 1 // used with admin verbs to disable ooc - not a config option apparently -var/dooc_allowed = 1 -var/abandon_allowed = 1 -var/enter_allowed = 1 -var/guests_allowed = 1 -var/shuttle_frozen = 0 -var/shuttle_left = 0 -var/tinted_weldhelh = 1 - - -// 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 = 0 - - -//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_DEVESTATION_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 - -var/list/be_special_flags = list( - "Traitor" = BE_TRAITOR, - "Operative" = BE_OPERATIVE, - "Changeling" = BE_CHANGELING, - "Wizard" = BE_WIZARD, - "Malf AI" = BE_MALF, - "Revolutionary" = BE_REV, - "Alien Lifeform" = BE_ALIEN, - "pAI" = BE_PAI, - "Cultist" = BE_CULTIST, - "Blob" = BE_BLOB, - "Ninja" = BE_NINJA - ) +var/datum/configuration/config = null + +var/host = null +var/join_motd = null +var/station_name = null +var/game_version = "/tg/ Station 13" +var/changelog_hash = "" + +var/ooc_allowed = 1 // used with admin verbs to disable ooc - not a config option apparently +var/dooc_allowed = 1 +var/abandon_allowed = 1 +var/enter_allowed = 1 +var/guests_allowed = 1 +var/shuttle_frozen = 0 +var/shuttle_left = 0 +var/tinted_weldhelh = 1 + + +// 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 = 0 + + +//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_DEVESTATION_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 + +var/list/be_special_flags = list( + "Traitor" = BE_TRAITOR, + "Operative" = BE_OPERATIVE, + "Changeling" = BE_CHANGELING, + "Wizard" = BE_WIZARD, + "Malf AI" = BE_MALF, + "Revolutionary" = BE_REV, + "Alien Lifeform" = BE_ALIEN, + "pAI" = BE_PAI, + "Cultist" = BE_CULTIST, + "Blob" = BE_BLOB, + "Ninja" = BE_NINJA + ) diff --git a/code/_globalvars/database.dm b/code/_globalvars/database.dm index 5d3427534f2..30fcdd5b135 100644 --- a/code/_globalvars/database.dm +++ b/code/_globalvars/database.dm @@ -1,11 +1,11 @@ - // MySQL configuration - -var/sqladdress = "localhost" -var/sqlport = "3306" -var/sqlfdbkdb = "test" -var/sqlfdbklogin = "root" -var/sqlfdbkpass = "" - -//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) + // MySQL configuration + +var/sqladdress = "localhost" +var/sqlport = "3306" +var/sqlfdbkdb = "test" +var/sqlfdbklogin = "root" +var/sqlfdbkpass = "" + +//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 a6b94dc92b4..519987d8880 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -1,6 +1,6 @@ -var/going = 1.0 // ticker pregame countdown -var/master_mode = "traitor"//"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 blob mode +var/going = 1.0 // ticker pregame countdown +var/master_mode = "traitor"//"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 blob mode diff --git a/code/_globalvars/genetics.dm b/code/_globalvars/genetics.dm index 7aa5c2f54f7..7ff714de5f9 100644 --- a/code/_globalvars/genetics.dm +++ b/code/_globalvars/genetics.dm @@ -1,25 +1,25 @@ - ////////////// -var/NEARSIGHTEDBLOCK = 0 -var/EPILEPSYBLOCK = 0 -var/COUGHBLOCK = 0 -var/TOURETTESBLOCK = 0 -var/NERVOUSBLOCK = 0 -var/BLINDBLOCK = 0 -var/DEAFBLOCK = 0 -var/HULKBLOCK = 0 -var/TELEBLOCK = 0 -var/FIREBLOCK = 0 -var/XRAYBLOCK = 0 -var/CLUMSYBLOCK = 0 -var/STRANGEBLOCK = 0 -var/RACEBLOCK = 0 - -var/list/bad_se_blocks -var/list/good_se_blocks -var/list/op_se_blocks - -var/NULLED_SE -var/NULLED_UI - -var/list/global_mutations = list() // list of hidden mutation things - + ////////////// +var/NEARSIGHTEDBLOCK = 0 +var/EPILEPSYBLOCK = 0 +var/COUGHBLOCK = 0 +var/TOURETTESBLOCK = 0 +var/NERVOUSBLOCK = 0 +var/BLINDBLOCK = 0 +var/DEAFBLOCK = 0 +var/HULKBLOCK = 0 +var/TELEBLOCK = 0 +var/FIREBLOCK = 0 +var/XRAYBLOCK = 0 +var/CLUMSYBLOCK = 0 +var/STRANGEBLOCK = 0 +var/RACEBLOCK = 0 + +var/list/bad_se_blocks +var/list/good_se_blocks +var/list/op_se_blocks + +var/NULLED_SE +var/NULLED_UI + +var/list/global_mutations = list() // list of hidden mutation things + diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 268f3279ed2..1002d954bcf 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -1,32 +1,32 @@ -//Preferences stuff - //Hairstyles -var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name -var/global/list/hair_styles_male_list = list() //stores only hair names -var/global/list/hair_styles_female_list = list() //stores only hair names -var/global/list/facial_hair_styles_list = list() //stores /datum/sprite_accessory/facial_hair indexed by name -var/global/list/facial_hair_styles_male_list = list() //stores only hair names -var/global/list/facial_hair_styles_female_list = list() //stores only hair names - //Underwear -var/global/list/underwear_all = list() //stores /datum/sprite_accessory/underwear indexed by name -var/global/list/underwear_m = list() //stores only underwear name -var/global/list/underwear_f = list() //stores only underwear name - //Backpacks -var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel") - //Female Uniforms -var/global/list/female_uniform_icons = list() - - //radical shit -var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF") - -var/list/scarySounds = list('sound/weapons/thudswoosh.ogg','sound/weapons/Taser.ogg','sound/weapons/armbomb.ogg','sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg','sound/voice/hiss5.ogg','sound/voice/hiss6.ogg','sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg','sound/items/Welder.ogg','sound/items/Welder2.ogg','sound/machines/airlock.ogg','sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg') - - -// Reference list for disposal sort junctions. Set the sortType variable on disposal sort junctions to -// the index of the sort department that you want. For example, sortType set to 2 will reroute all packages -// tagged for the Cargo Bay. -var/list/TAGGERLOCATIONS = list("Disposals", - "Cargo Bay", "QM Office", "Engineering", "CE Office", - "Atmospherics", "Security", "HoS Office", "Medbay", - "CMO Office", "Chemistry", "Research", "RD Office", - "Robotics", "HoP Office", "Library", "Chapel", "Theatre", - "Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics") +//Preferences stuff + //Hairstyles +var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name +var/global/list/hair_styles_male_list = list() //stores only hair names +var/global/list/hair_styles_female_list = list() //stores only hair names +var/global/list/facial_hair_styles_list = list() //stores /datum/sprite_accessory/facial_hair indexed by name +var/global/list/facial_hair_styles_male_list = list() //stores only hair names +var/global/list/facial_hair_styles_female_list = list() //stores only hair names + //Underwear +var/global/list/underwear_all = list() //stores /datum/sprite_accessory/underwear indexed by name +var/global/list/underwear_m = list() //stores only underwear name +var/global/list/underwear_f = list() //stores only underwear name + //Backpacks +var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel") + //Female Uniforms +var/global/list/female_uniform_icons = list() + + //radical shit +var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF") + +var/list/scarySounds = list('sound/weapons/thudswoosh.ogg','sound/weapons/Taser.ogg','sound/weapons/armbomb.ogg','sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg','sound/voice/hiss5.ogg','sound/voice/hiss6.ogg','sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg','sound/items/Welder.ogg','sound/items/Welder2.ogg','sound/machines/airlock.ogg','sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg') + + +// Reference list for disposal sort junctions. Set the sortType variable on disposal sort junctions to +// the index of the sort department that you want. For example, sortType set to 2 will reroute all packages +// tagged for the Cargo Bay. +var/list/TAGGERLOCATIONS = list("Disposals", + "Cargo Bay", "QM Office", "Engineering", "CE Office", + "Atmospherics", "Security", "HoS Office", "Medbay", + "CMO Office", "Chemistry", "Research", "RD Office", + "Robotics", "HoP Office", "Library", "Chapel", "Theatre", + "Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics") diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 9c3cc3b2877..9a746a952f6 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -1,43 +1,43 @@ - -var/list/cardinal = list( NORTH, SOUTH, EAST, WEST ) -var/list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) - - -//This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there. -//(Exceptions: extended, sandbox and nuke) -Errorage -//Was list("3" = 30, "4" = 70). -//Spacing should be a reliable method of getting rid of a body -- Urist. -//Go away Urist, I'm restoring this to the longer list. ~Errorage -var/list/accessable_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = 60) - -var/global/list/global_map = null - //list/global_map = list(list(1,5),list(4,3))//an array of map Z levels. - //Resulting sector map looks like - //|_1_|_4_| - //|_5_|_3_| - // - //1 - SS13 - //4 - Derelict - //3 - AI satellite - //5 - empty space - -var/list/landmarks_list = list() //list of all landmarks created - -var/list/monkeystart = list() -var/list/wizardstart = list() -var/list/newplayer_start = list() -var/list/latejoin = list() -var/list/prisonwarp = list() //prisoners go to these -var/list/holdingfacility = list() //captured people go here -var/list/xeno_spawn = list()//Aliens spawn at these. -var/list/tdome1 = list() -var/list/tdome2 = list() -var/list/tdomeobserve = list() -var/list/tdomeadmin = 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/global_activeturfs - - //away missions -var/list/awaydestinations = list() //a list of landmarks that the warpgate can take you to + +var/list/cardinal = list( NORTH, SOUTH, EAST, WEST ) +var/list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) + + +//This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there. +//(Exceptions: extended, sandbox and nuke) -Errorage +//Was list("3" = 30, "4" = 70). +//Spacing should be a reliable method of getting rid of a body -- Urist. +//Go away Urist, I'm restoring this to the longer list. ~Errorage +var/list/accessable_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = 60) + +var/global/list/global_map = null + //list/global_map = list(list(1,5),list(4,3))//an array of map Z levels. + //Resulting sector map looks like + //|_1_|_4_| + //|_5_|_3_| + // + //1 - SS13 + //4 - Derelict + //3 - AI satellite + //5 - empty space + +var/list/landmarks_list = list() //list of all landmarks created + +var/list/monkeystart = list() +var/list/wizardstart = list() +var/list/newplayer_start = list() +var/list/latejoin = list() +var/list/prisonwarp = list() //prisoners go to these +var/list/holdingfacility = list() //captured people go here +var/list/xeno_spawn = list()//Aliens spawn at these. +var/list/tdome1 = list() +var/list/tdome2 = list() +var/list/tdomeobserve = list() +var/list/tdomeadmin = 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/global_activeturfs + + //away missions +var/list/awaydestinations = list() //a list of landmarks that the warpgate can take you to diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 85db25af125..59d9d14950d 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -1,12 +1,12 @@ -var/list/clients = list() //list of all clients -var/list/admins = list() //list of all clients whom are admins -var/list/directory = list() //list of all ckeys with associated client - -//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 - -var/global/list/player_list = list() //List of all mobs **with clients attached**. Excludes /mob/new_player -var/global/list/mob_list = list() //List of all mobs, including clientless -var/global/list/living_mob_list = list() //List of all alive mobs, including clientless. Excludes /mob/new_player -var/global/list/dead_mob_list = list() //List of all dead mobs, including clientless. Excludes /mob/new_player -var/global/list/joined_player_list = list() //List of all clients that have joined the game at round-start or as a latejoin. +var/list/clients = list() //list of all clients +var/list/admins = list() //list of all clients whom are admins +var/list/directory = list() //list of all ckeys with associated client + +//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 + +var/global/list/player_list = list() //List of all mobs **with clients attached**. Excludes /mob/new_player +var/global/list/mob_list = list() //List of all mobs, including clientless +var/global/list/living_mob_list = list() //List of all alive mobs, including clientless. Excludes /mob/new_player +var/global/list/dead_mob_list = list() //List of all dead mobs, including clientless. Excludes /mob/new_player +var/global/list/joined_player_list = list() //List of all clients that have joined the game at round-start or as a latejoin. diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index ab35dbb0e78..ab101d76c6e 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -1,16 +1,16 @@ -var/list/ai_names = file2list("config/names/ai.txt") -var/list/wizard_first = file2list("config/names/wizardfirst.txt") -var/list/wizard_second = file2list("config/names/wizardsecond.txt") -var/list/ninja_titles = file2list("config/names/ninjatitle.txt") -var/list/ninja_names = file2list("config/names/ninjaname.txt") -var/list/commando_names = file2list("config/names/death_commando.txt") -var/list/first_names_male = file2list("config/names/first_male.txt") -var/list/first_names_female = file2list("config/names/first_female.txt") -var/list/last_names = file2list("config/names/last.txt") -var/list/clown_names = file2list("config/names/clown.txt") - - -var/list/verbs = file2list("config/names/verbs.txt") -var/list/adjectives = file2list("config/names/adjectives.txt") -//loaded on startup because of " +var/list/ai_names = file2list("config/names/ai.txt") +var/list/wizard_first = file2list("config/names/wizardfirst.txt") +var/list/wizard_second = file2list("config/names/wizardsecond.txt") +var/list/ninja_titles = file2list("config/names/ninjatitle.txt") +var/list/ninja_names = file2list("config/names/ninjaname.txt") +var/list/commando_names = file2list("config/names/death_commando.txt") +var/list/first_names_male = file2list("config/names/first_male.txt") +var/list/first_names_female = file2list("config/names/first_female.txt") +var/list/last_names = file2list("config/names/last.txt") +var/list/clown_names = file2list("config/names/clown.txt") + + +var/list/verbs = file2list("config/names/verbs.txt") +var/list/adjectives = file2list("config/names/adjectives.txt") +//loaded on startup because of " //would include in rsc if ' was used \ No newline at end of file diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 70dd5089d56..32866b771ce 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -1,14 +1,14 @@ -var/global/list/cable_list = list() //Index for all cables, so that powernets don't have to look through the entire world all the time -var/global/list/portals = list() //for use by portals -var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking. -var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none. - -//items that ask to be called every cycle -var/global/list/machines = list() -var/global/list/processing_objects = list() -var/global/list/active_diseases = list() - -var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions -var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff -var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path. +var/global/list/cable_list = list() //Index for all cables, so that powernets don't have to look through the entire world all the time +var/global/list/portals = list() //for use by portals +var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking. +var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none. + +//items that ask to be called every cycle +var/global/list/machines = list() +var/global/list/processing_objects = list() +var/global/list/active_diseases = list() + +var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions +var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff +var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path. var/global/list/table_recipes = list() //list of all table craft recipes \ No newline at end of file diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index 1d275045b48..81617cdc417 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -1,13 +1,13 @@ -var/diary = null -var/diaryofmeanpeople = null -var/href_logfile = null - -var/list/bombers = 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 - -var/list/combatlog = list() -var/list/IClog = list() -var/list/OOClog = list() -var/list/adminlog = list() +var/diary = null +var/diaryofmeanpeople = null +var/href_logfile = null + +var/list/bombers = 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 + +var/list/combatlog = list() +var/list/IClog = list() +var/list/OOClog = list() +var/list/adminlog = list() diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 0f13c6f4f7c..6a6de9d49e0 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -1,14 +1,14 @@ -var/global/obj/effect/overlay/plmaster = null // atmospheric overlay for plasma -var/global/obj/effect/overlay/slmaster = null // atmospheric overlay for sleeping gas -var/admin_notice = "" // Admin notice that all clients see when joining the server - - -// nanomanager, the manager for Nano UIs -var/datum/nanomanager/nanomanager = new() - -var/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 - +var/global/obj/effect/overlay/plmaster = null // atmospheric overlay for plasma +var/global/obj/effect/overlay/slmaster = null // atmospheric overlay for sleeping gas +var/admin_notice = "" // Admin notice that all clients see when joining the server + + +// nanomanager, the manager for Nano UIs +var/datum/nanomanager/nanomanager = new() + +var/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 + diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm index c6b4658d446..9be8b3a3518 100644 --- a/code/_globalvars/station.dm +++ b/code/_globalvars/station.dm @@ -1,13 +1,14 @@ -var/global/obj/effect/datacore/data_core = null -var/global/defer_powernet_rebuild = 0 // true if net rebuild will be called manually after an event - -var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) -var/CHARGELEVEL = 0.001 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) -var/datum/sun/sun = null -var/list/powernets = list() - -// this is not strictly unused although the whole modules datum thing is unused -// To remove this you need to remove that -var/datum/moduletypes/mods = new() - +var/global/obj/effect/datacore/data_core = null +//var/global/defer_powernet_rebuild = 0 // true if net rebuild will be called manually after an event +//Noble idea, but doing this made GC fail. The gains from waiting on deffering are lost by using del() + +var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) +var/CHARGELEVEL = 0.001 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) +var/datum/sun/sun = null +var/list/powernets = list() + +// this is not strictly unused although the whole modules datum thing is unused +// To remove this you need to remove that +var/datum/moduletypes/mods = new() + var/map_name = "Unknown" //The name of the map that is loaded. Assigned in world/New() \ No newline at end of file diff --git a/code/_globalvars/unused.dm b/code/_globalvars/unused.dm index 0a316c97f7a..69d78b82785 100644 --- a/code/_globalvars/unused.dm +++ b/code/_globalvars/unused.dm @@ -1,37 +1,37 @@ -var/dna_ident = 1 // unused global variable -var/shuttle_z = 2 //unused, was written to by a shuttle landmark -var/list/reg_dna = list( ) // unused, was written to when making unique DNA - - /////////////// old events system global variables -var/eventchance = 3 //% per 5 mins -var/event = 0 -var/hadevent = 0 -var/blobevent = 0 - /////////////// -var/skipupdate = 0 -var/list/jobMax = list() -var/forceblob = 0 -var/shuttlecoming = 0 -var/datum/debug/debugobj - -var/list/liftable_structures = list( - /obj/machinery/autolathe, - /obj/machinery/constructable_frame, - /obj/machinery/hydroponics, - /obj/machinery/computer, - /obj/structure/optable, - /obj/structure/dispenser, - /obj/machinery/gibber, - /obj/machinery/microwave, - /obj/machinery/vending, - /obj/machinery/seed_extractor, - /obj/machinery/space_heater, - /obj/machinery/recharge_station, - /obj/machinery/flasher, - /obj/structure/stool, - /obj/structure/closet, - /obj/machinery/photocopier, - /obj/structure/filingcabinet, - /obj/structure/reagent_dispensers, - /obj/machinery/portable_atmospherics/canister +var/dna_ident = 1 // unused global variable +var/shuttle_z = 2 //unused, was written to by a shuttle landmark +var/list/reg_dna = list( ) // unused, was written to when making unique DNA + + /////////////// old events system global variables +var/eventchance = 3 //% per 5 mins +var/event = 0 +var/hadevent = 0 +var/blobevent = 0 + /////////////// +var/skipupdate = 0 +var/list/jobMax = list() +var/forceblob = 0 +var/shuttlecoming = 0 +var/datum/debug/debugobj + +var/list/liftable_structures = list( + /obj/machinery/autolathe, + /obj/machinery/constructable_frame, + /obj/machinery/hydroponics, + /obj/machinery/computer, + /obj/structure/optable, + /obj/structure/dispenser, + /obj/machinery/gibber, + /obj/machinery/microwave, + /obj/machinery/vending, + /obj/machinery/seed_extractor, + /obj/machinery/space_heater, + /obj/machinery/recharge_station, + /obj/machinery/flasher, + /obj/structure/stool, + /obj/structure/closet, + /obj/machinery/photocopier, + /obj/structure/filingcabinet, + /obj/structure/reagent_dispensers, + /obj/machinery/portable_atmospherics/canister ) \ No newline at end of file diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index c02737400ba..773dd61be8b 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -1,124 +1,124 @@ -/* - Adjacency proc for determining touch range - - This is mostly to determine if a user can enter a square for the purposes of touching something. - Examples include reaching a square diagonally or reaching something on the other side of a glass window. - - This is calculated by looking for border items, or in the case of clicking diagonally from yourself, dense items. - This proc will NOT notice if you are trying to attack a window on the other side of a dense object in its turf. There is a window helper for that. - - Note that in all cases the neighbor is handled simply; this is usually the user's mob, in which case it is up to you - to check that the mob is not inside of something -*/ -/atom/proc/Adjacent(var/atom/neighbor) // basic inheritance, unused - return 0 - -// Not a sane use of the function and (for now) indicative of an error elsewhere -/area/Adjacent(var/atom/neighbor) - CRASH("Call to /area/Adjacent(), unimplemented proc") - - -/* - Adjacency (to turf): - * If you are in the same turf, always true - * If you are vertically/horizontally adjacent, ensure there are no border objects - * If you are diagonally adjacent, ensure you can pass through at least one of the mutually adjacent square. - * Passing through in this case ignores anything with the throwpass flag, such as tables, racks, and morgue trays. -*/ -/turf/Adjacent(var/atom/neighbor, var/atom/target = null) - var/turf/T0 = get_turf(neighbor) - if(T0 == src) - return 1 - if(get_dist(src,T0) > 1) - return 0 - - if(T0.x == x || T0.y == y) - // Check for border blockages - return T0.ClickCross(get_dir(T0,src), border_only = 1) && src.ClickCross(get_dir(src,T0), border_only = 1, target_atom = target) - - // Not orthagonal - var/in_dir = get_dir(neighbor,src) // eg. northwest (1+8) - var/d1 = in_dir&(in_dir-1) // eg west (1+8)&(8) = 8 - var/d2 = in_dir - d1 // eg north (1+8) - 8 = 1 - - for(var/d in list(d1,d2)) - if(!T0.ClickCross(d, border_only = 1)) - continue // could not leave T0 in that direction - - var/turf/T1 = get_step(T0,d) - if(!T1 || T1.density || !T1.ClickCross(get_dir(T1,T0) & get_dir(T1,src), border_only = 0)) - continue // couldn't enter or couldn't leave T1 - - if(!src.ClickCross(get_dir(src,T1), border_only = 1, target_atom = target)) - continue // could not enter src - - return 1 // we don't care about our own density - return 0 - -/* - Adjacency (to anything else): - * Must be on a turf - * In the case of a multiple-tile object, all valid locations are checked for adjacency. - - Note: Multiple-tile objects are created when the bound_width and bound_height are creater than the tile size. - This is not used in stock /tg/station currently. -*/ -/atom/movable/Adjacent(var/atom/neighbor) - if(neighbor == loc) return 1 - if(!isturf(loc)) return 0 - for(var/turf/T in locs) - if(isnull(T)) continue - if(T.Adjacent(neighbor,src)) return 1 - return 0 - -// This is necessary for storage items not on your person. -/obj/item/Adjacent(var/atom/neighbor, var/recurse = 1) - if(neighbor == loc) return 1 - if(istype(loc,/obj/item)) - if(recurse > 0) - return loc.Adjacent(neighbor,recurse - 1) - return 0 - return ..() -/* - Special case: This allows you to reach a door when it is visally on top of, - but technically behind, a fire door - - You could try to rewrite this to be faster, but I'm not sure anything would be. - This can be safely removed if border firedoors are ever moved to be on top of doors - so they can be interacted with without opening the door. -*/ -/obj/machinery/door/Adjacent(var/atom/neighbor) - var/obj/machinery/door/firedoor/border_only/BOD = locate() in loc - if(BOD) - BOD.throwpass = 1 // allow click to pass - . = ..() - BOD.throwpass = 0 - return . - return ..() - - -/* - This checks if you there is uninterrupted airspace between that turf and this one. - This is defined as any dense ON_BORDER object, or any dense object without throwpass. - The border_only flag allows you to not objects (for source and destination squares) -*/ -/turf/proc/ClickCross(var/target_dir, var/border_only, var/target_atom = null) - for(var/obj/O in src) - if( !O.density || O == target_atom || O.throwpass) continue // throwpass is used for anything you can click through - - if( O.flags&ON_BORDER) // windows have throwpass but are on border, check them first - if( O.dir & target_dir || O.dir&(O.dir-1) ) // full tile windows are just diagonals mechanically - return 0 - - else if( !border_only ) // dense, not on border, cannot pass over - return 0 - return 1 -/* - Aside: throwpass does not do what I thought it did originally, and is only used for checking whether or not - a thrown object should stop after already successfully entering a square. Currently the throw code involved - only seems to affect hitting mobs, because the checks performed against objects are already performed when - entering or leaving the square. Since throwpass isn't used on mobs, but only on objects, it is effectively - useless. Throwpass may later need to be removed and replaced with a passcheck (bitfield on movable atom passflags). - - Since I don't want to complicate the click code rework by messing with unrelated systems it won't be changed here. +/* + Adjacency proc for determining touch range + + This is mostly to determine if a user can enter a square for the purposes of touching something. + Examples include reaching a square diagonally or reaching something on the other side of a glass window. + + This is calculated by looking for border items, or in the case of clicking diagonally from yourself, dense items. + This proc will NOT notice if you are trying to attack a window on the other side of a dense object in its turf. There is a window helper for that. + + Note that in all cases the neighbor is handled simply; this is usually the user's mob, in which case it is up to you + to check that the mob is not inside of something +*/ +/atom/proc/Adjacent(var/atom/neighbor) // basic inheritance, unused + return 0 + +// Not a sane use of the function and (for now) indicative of an error elsewhere +/area/Adjacent(var/atom/neighbor) + CRASH("Call to /area/Adjacent(), unimplemented proc") + + +/* + Adjacency (to turf): + * If you are in the same turf, always true + * If you are vertically/horizontally adjacent, ensure there are no border objects + * If you are diagonally adjacent, ensure you can pass through at least one of the mutually adjacent square. + * Passing through in this case ignores anything with the throwpass flag, such as tables, racks, and morgue trays. +*/ +/turf/Adjacent(var/atom/neighbor, var/atom/target = null) + var/turf/T0 = get_turf(neighbor) + if(T0 == src) + return 1 + if(get_dist(src,T0) > 1) + return 0 + + if(T0.x == x || T0.y == y) + // Check for border blockages + return T0.ClickCross(get_dir(T0,src), border_only = 1) && src.ClickCross(get_dir(src,T0), border_only = 1, target_atom = target) + + // Not orthagonal + var/in_dir = get_dir(neighbor,src) // eg. northwest (1+8) + var/d1 = in_dir&(in_dir-1) // eg west (1+8)&(8) = 8 + var/d2 = in_dir - d1 // eg north (1+8) - 8 = 1 + + for(var/d in list(d1,d2)) + if(!T0.ClickCross(d, border_only = 1)) + continue // could not leave T0 in that direction + + var/turf/T1 = get_step(T0,d) + if(!T1 || T1.density || !T1.ClickCross(get_dir(T1,T0) & get_dir(T1,src), border_only = 0)) + continue // couldn't enter or couldn't leave T1 + + if(!src.ClickCross(get_dir(src,T1), border_only = 1, target_atom = target)) + continue // could not enter src + + return 1 // we don't care about our own density + return 0 + +/* + Adjacency (to anything else): + * Must be on a turf + * In the case of a multiple-tile object, all valid locations are checked for adjacency. + + Note: Multiple-tile objects are created when the bound_width and bound_height are creater than the tile size. + This is not used in stock /tg/station currently. +*/ +/atom/movable/Adjacent(var/atom/neighbor) + if(neighbor == loc) return 1 + if(!isturf(loc)) return 0 + for(var/turf/T in locs) + if(isnull(T)) continue + if(T.Adjacent(neighbor,src)) return 1 + return 0 + +// This is necessary for storage items not on your person. +/obj/item/Adjacent(var/atom/neighbor, var/recurse = 1) + if(neighbor == loc) return 1 + if(istype(loc,/obj/item)) + if(recurse > 0) + return loc.Adjacent(neighbor,recurse - 1) + return 0 + return ..() +/* + Special case: This allows you to reach a door when it is visally on top of, + but technically behind, a fire door + + You could try to rewrite this to be faster, but I'm not sure anything would be. + This can be safely removed if border firedoors are ever moved to be on top of doors + so they can be interacted with without opening the door. +*/ +/obj/machinery/door/Adjacent(var/atom/neighbor) + var/obj/machinery/door/firedoor/border_only/BOD = locate() in loc + if(BOD) + BOD.throwpass = 1 // allow click to pass + . = ..() + BOD.throwpass = 0 + return . + return ..() + + +/* + This checks if you there is uninterrupted airspace between that turf and this one. + This is defined as any dense ON_BORDER object, or any dense object without throwpass. + The border_only flag allows you to not objects (for source and destination squares) +*/ +/turf/proc/ClickCross(var/target_dir, var/border_only, var/target_atom = null) + for(var/obj/O in src) + if( !O.density || O == target_atom || O.throwpass) continue // throwpass is used for anything you can click through + + if( O.flags&ON_BORDER) // windows have throwpass but are on border, check them first + if( O.dir & target_dir || O.dir&(O.dir-1) ) // full tile windows are just diagonals mechanically + return 0 + + else if( !border_only ) // dense, not on border, cannot pass over + return 0 + return 1 +/* + Aside: throwpass does not do what I thought it did originally, and is only used for checking whether or not + a thrown object should stop after already successfully entering a square. Currently the throw code involved + only seems to affect hitting mobs, because the checks performed against objects are already performed when + entering or leaving the square. Since throwpass isn't used on mobs, but only on objects, it is effectively + useless. Throwpass may later need to be removed and replaced with a passcheck (bitfield on movable atom passflags). + + Since I don't want to complicate the click code rework by messing with unrelated systems it won't be changed here. */ \ No newline at end of file diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 7667b7fcd3d..8e1d42c1926 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -101,6 +101,8 @@ return /obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors! + if(emagged) + return if(density) Topic("aiEnable=7", list("aiEnable"="7"), 1) // 1 meaning no window (consistency!) else @@ -112,6 +114,8 @@ return /obj/machinery/door/airlock/AICtrlClick() // Bolts doors + if(emagged) + return if(locked) Topic("aiEnable=4", list("aiEnable"="4"), 1)// 1 meaning no window (consistency!) else @@ -126,6 +130,8 @@ return /obj/machinery/door/airlock/AIAltClick() // Eletrifies doors. + if(emagged) + return if(!secondsElectrified) // permenant shock Topic("aiEnable=6", list("aiEnable"="6"), 1) // 1 meaning no window (consistency!) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 9ba8c35dc34..8dedc4bbcd5 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -1,315 +1,315 @@ -/* - Click code cleanup - ~Sayu -*/ - -// 1 decisecond click delay (above and beyond mob/next_move) -/mob/var/next_click = 0 - -/* - Before anything else, defer these calls to a per-mobtype handler. This allows us to - remove istype() spaghetti code, but requires the addition of other handler procs to simplify it. - - Alternately, you could hardcode every mob's variation in a flat ClickOn() proc; however, - that's a lot of code duplication and is hard to maintain. - - Note that this proc can be overridden, and is in the case of screen objects. -*/ -/atom/Click(location,control,params) - usr.ClickOn(src, params) -/atom/DblClick(location,control,params) - usr.DblClickOn(src,params) - -/* - Standard mob ClickOn() - Handles exceptions: Buildmode, middle click, modified clicks, mech actions - - After that, mostly just check your state, check whether you're holding an item, - check whether you're adjacent to the target, then pass off the click to whoever - is recieving it. - The most common are: - * mob/UnarmedAttack(atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves - * atom/attackby(item,user) - used only when adjacent - * item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent - * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed -*/ -/mob/proc/ClickOn( var/atom/A, var/params ) - if(world.time <= next_click) - return - next_click = world.time + 1 - - if(client.buildmode) - build_click(src, client.buildmode, params, A) - return - - var/list/modifiers = params2list(params) - if(modifiers["middle"]) - MiddleClickOn(A) - return - if(modifiers["shift"]) - ShiftClickOn(A) - return - if(modifiers["alt"]) // alt and alt-gr (rightalt) - AltClickOn(A) - return - if(modifiers["ctrl"]) - CtrlClickOn(A) - return - - if(stat || paralysis || stunned || weakened) - return - - face_atom(A) - - if(next_move > world.time) // in the year 2000... - return - - if(istype(loc,/obj/mecha)) - if(!locate(/turf) in list(A,A.loc)) // Prevents inventory from being drilled - return - var/obj/mecha/M = loc - return M.click_action(A,src) - - if(restrained()) - next_move = world.time + 10 //Doing shit in cuffs shall be vey slow - RestrainedClickOn(A) - return - - if(in_throw_mode) - throw_item(A) - return - - var/obj/item/W = get_active_hand() - - - if(W == A) - next_move = world.time + 6 - if(W.flags&USEDELAY) - next_move += 5 - W.attack_self(src) - if(hand) - update_inv_l_hand(0) - else - update_inv_r_hand(0) - - return - - // operate two levels deep here (item in backpack in src; NOT item in box in backpack in src) - if(!isturf(A) && A == loc || (A in contents) || (A.loc in contents)) - // faster access to objects already on you - if(A in contents) - next_move = world.time + 6 // on your person - else - next_move = world.time + 8 // in a box/bag or in your square - - // No adjacency needed - if(W) - if(W.flags&USEDELAY) - next_move += 5 - - var/resolved = A.attackby(W,src) - if(!resolved && A && W) - W.afterattack(A,src,1,params) // 1 indicates adjacency - else - UnarmedAttack(A) - return - - if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that - return - - // Allows you to click on a box's contents, if that box is on the ground, but no deeper than that - if(isturf(A) || isturf(A.loc) || (A.loc && isturf(A.loc.loc))) - next_move = world.time + 10 - if(A.Adjacent(src)) // see adjacent.dm - if(W) - if(W.flags&USEDELAY) - next_move += 5 - if(W.preattack(A,src,1,params)) //Weapon attack override,return 1 to exit - return - // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) - var/resolved = A.attackby(W,src) - if(!resolved && A && W) - W.afterattack(A,src,1,params) // 1: clicking something Adjacent - else - UnarmedAttack(A, 1) - return - else // non-adjacent click - if(W) - if(W.preattack(A,src,0,params)) //Weapon attack override,return 1 to exit - return - W.afterattack(A,src,0,params) // 0: not Adjacent - else - RangedAttack(A, params) - - return - -// Default behavior: ignore double clicks, consider them normal clicks instead -/mob/proc/DblClickOn(var/atom/A, var/params) - ClickOn(A,params) - - -/* - Translates into attack_hand, etc. - - Note: proximity_flag here is used to distinguish between normal usage (flag=1), - and usage when clicking on things telekinetically (flag=0). This proc will - not be called at ranged except with telekinesis. - - proximity_flag is not currently passed to attack_hand, and is instead used - in human click code to allow glove touches only at melee range. -*/ -/mob/proc/UnarmedAttack(var/atom/A, var/proximity_flag) - return - -/* - Ranged unarmed attack: - - This currently is just a default for all mobs, involving - laser eyes and telekinesis. You could easily add exceptions - for things like ranged glove touches, spitting alien acid/neurotoxin, - animals lunging, etc. -*/ -/mob/proc/RangedAttack(var/atom/A, var/params) - if(!mutations.len) return - if((LASER in mutations) && a_intent == "harm") - LaserEyes(A) // moved into a proc below - else if(TK in mutations) - switch(get_dist(src,A)) - if(0) - ; - if(1 to 5) // not adjacent may mean blocked by window - next_move += 2 - if(5 to 7) - next_move += 5 - if(8 to tk_maxrange) - next_move += 10 - else - return - A.attack_tk(src) -/* - Restrained ClickOn - - Used when you are handcuffed and click things. - Not currently used by anything but could easily be. -*/ -/mob/proc/RestrainedClickOn(var/atom/A) - return - -/* - Middle click - Only used for swapping hands -*/ -/mob/proc/MiddleClickOn(var/atom/A) - return -/mob/living/carbon/MiddleClickOn(var/atom/A) - swap_hand() - -// In case of use break glass -/* -/atom/proc/MiddleClick(var/mob/M as mob) - return -*/ - -/* - Shift click - For most mobs, examine. - This is overridden in ai.dm -*/ -/mob/proc/ShiftClickOn(var/atom/A) - A.ShiftClick(src) - return -/atom/proc/ShiftClick(var/mob/user) - if(user.client && user.client.eye == user) - examine() - user.face_atom(src) - return - -/* - Ctrl click - For most objects, pull -*/ -/mob/proc/CtrlClickOn(var/atom/A) - A.CtrlClick(src) - return -/atom/proc/CtrlClick(var/mob/user) - return - -/atom/movable/CtrlClick(var/mob/user) - if(Adjacent(user)) - user.start_pulling(src) - -/* - Alt click - Unused except for AI -*/ -/mob/proc/AltClickOn(var/atom/A) - A.AltClick(src) - return - -/atom/proc/AltClick(var/mob/user) - var/turf/T = get_turf(src) - if(T && user.TurfAdjacent(T)) - if(user.listed_turf == T) - user.listed_turf = null - else - user.listed_turf = T - user.client.statpanel = T.name - return - -/mob/proc/TurfAdjacent(var/turf/T) - return T.Adjacent(src) - -/* - Misc helpers - - Laser Eyes: as the name implies, handles this since nothing else does currently - face_atom: turns the mob towards what you clicked on -*/ -/mob/proc/LaserEyes(atom/A) - return - -/mob/living/LaserEyes(atom/A) - next_move = world.time + 6 - var/turf/T = get_turf(src) - var/turf/U = get_turf(A) - - var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam( loc ) - LE.icon = 'icons/effects/genetics.dmi' - LE.icon_state = "eyelasers" - playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) - - LE.firer = src - LE.def_zone = get_organ_target() - LE.original = A - LE.current = T - LE.yo = U.y - T.y - LE.xo = U.x - T.x - spawn( 1 ) - LE.process() - -/mob/living/carbon/human/LaserEyes() - if(nutrition>0) - ..() - nutrition = max(nutrition - rand(1,5),0) - handle_regular_hud_updates() - else - src << "\red You're out of energy! You need food!" - -// Simple helper to face what you clicked on, in case it should be needed in more than one place -/mob/proc/face_atom(var/atom/A) - if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) return - var/dx = A.x - x - var/dy = A.y - y - if(!dx && !dy) // Wall items are graphically shifted but on the floor - if(A.pixel_y > 16) dir = NORTH - else if(A.pixel_y < -16)dir = SOUTH - else if(A.pixel_x > 16) dir = EAST - else if(A.pixel_x < -16)dir = WEST - return - - if(abs(dx) < abs(dy)) - if(dy > 0) dir = NORTH - else dir = SOUTH - else - if(dx > 0) dir = EAST - else dir = WEST +/* + Click code cleanup + ~Sayu +*/ + +// 1 decisecond click delay (above and beyond mob/next_move) +/mob/var/next_click = 0 + +/* + Before anything else, defer these calls to a per-mobtype handler. This allows us to + remove istype() spaghetti code, but requires the addition of other handler procs to simplify it. + + Alternately, you could hardcode every mob's variation in a flat ClickOn() proc; however, + that's a lot of code duplication and is hard to maintain. + + Note that this proc can be overridden, and is in the case of screen objects. +*/ +/atom/Click(location,control,params) + usr.ClickOn(src, params) +/atom/DblClick(location,control,params) + usr.DblClickOn(src,params) + +/* + Standard mob ClickOn() + Handles exceptions: Buildmode, middle click, modified clicks, mech actions + + After that, mostly just check your state, check whether you're holding an item, + check whether you're adjacent to the target, then pass off the click to whoever + is recieving it. + The most common are: + * mob/UnarmedAttack(atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves + * atom/attackby(item,user) - used only when adjacent + * item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent + * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed +*/ +/mob/proc/ClickOn( var/atom/A, var/params ) + if(world.time <= next_click) + return + next_click = world.time + 1 + + if(client.buildmode) + build_click(src, client.buildmode, params, A) + return + + var/list/modifiers = params2list(params) + if(modifiers["middle"]) + MiddleClickOn(A) + return + if(modifiers["shift"]) + ShiftClickOn(A) + return + if(modifiers["alt"]) // alt and alt-gr (rightalt) + AltClickOn(A) + return + if(modifiers["ctrl"]) + CtrlClickOn(A) + return + + if(stat || paralysis || stunned || weakened) + return + + face_atom(A) + + if(next_move > world.time) // in the year 2000... + return + + if(istype(loc,/obj/mecha)) + if(!locate(/turf) in list(A,A.loc)) // Prevents inventory from being drilled + return + var/obj/mecha/M = loc + return M.click_action(A,src) + + if(restrained()) + next_move = world.time + 10 //Doing shit in cuffs shall be vey slow + RestrainedClickOn(A) + return + + if(in_throw_mode) + throw_item(A) + return + + var/obj/item/W = get_active_hand() + + + if(W == A) + next_move = world.time + 6 + if(W.flags&USEDELAY) + next_move += 5 + W.attack_self(src) + if(hand) + update_inv_l_hand(0) + else + update_inv_r_hand(0) + + return + + // operate two levels deep here (item in backpack in src; NOT item in box in backpack in src) + if(!isturf(A) && A == loc || (A in contents) || (A.loc in contents)) + // faster access to objects already on you + if(A in contents) + next_move = world.time + 6 // on your person + else + next_move = world.time + 8 // in a box/bag or in your square + + // No adjacency needed + if(W) + if(W.flags&USEDELAY) + next_move += 5 + + var/resolved = A.attackby(W,src) + if(!resolved && A && W) + W.afterattack(A,src,1,params) // 1 indicates adjacency + else + UnarmedAttack(A) + return + + if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that + return + + // Allows you to click on a box's contents, if that box is on the ground, but no deeper than that + if(isturf(A) || isturf(A.loc) || (A.loc && isturf(A.loc.loc))) + next_move = world.time + 10 + if(A.Adjacent(src)) // see adjacent.dm + if(W) + if(W.flags&USEDELAY) + next_move += 5 + if(W.preattack(A,src,1,params)) //Weapon attack override,return 1 to exit + return + // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) + var/resolved = A.attackby(W,src) + if(!resolved && A && W) + W.afterattack(A,src,1,params) // 1: clicking something Adjacent + else + UnarmedAttack(A, 1) + return + else // non-adjacent click + if(W) + if(W.preattack(A,src,0,params)) //Weapon attack override,return 1 to exit + return + W.afterattack(A,src,0,params) // 0: not Adjacent + else + RangedAttack(A, params) + + return + +// Default behavior: ignore double clicks, consider them normal clicks instead +/mob/proc/DblClickOn(var/atom/A, var/params) + ClickOn(A,params) + + +/* + Translates into attack_hand, etc. + + Note: proximity_flag here is used to distinguish between normal usage (flag=1), + and usage when clicking on things telekinetically (flag=0). This proc will + not be called at ranged except with telekinesis. + + proximity_flag is not currently passed to attack_hand, and is instead used + in human click code to allow glove touches only at melee range. +*/ +/mob/proc/UnarmedAttack(var/atom/A, var/proximity_flag) + return + +/* + Ranged unarmed attack: + + This currently is just a default for all mobs, involving + laser eyes and telekinesis. You could easily add exceptions + for things like ranged glove touches, spitting alien acid/neurotoxin, + animals lunging, etc. +*/ +/mob/proc/RangedAttack(var/atom/A, var/params) + if(!mutations.len) return + if((LASER in mutations) && a_intent == "harm") + LaserEyes(A) // moved into a proc below + else if(TK in mutations) + switch(get_dist(src,A)) + if(0) + ; + if(1 to 5) // not adjacent may mean blocked by window + next_move += 2 + if(5 to 7) + next_move += 5 + if(8 to tk_maxrange) + next_move += 10 + else + return + A.attack_tk(src) +/* + Restrained ClickOn + + Used when you are handcuffed and click things. + Not currently used by anything but could easily be. +*/ +/mob/proc/RestrainedClickOn(var/atom/A) + return + +/* + Middle click + Only used for swapping hands +*/ +/mob/proc/MiddleClickOn(var/atom/A) + return +/mob/living/carbon/MiddleClickOn(var/atom/A) + swap_hand() + +// In case of use break glass +/* +/atom/proc/MiddleClick(var/mob/M as mob) + return +*/ + +/* + Shift click + For most mobs, examine. + This is overridden in ai.dm +*/ +/mob/proc/ShiftClickOn(var/atom/A) + A.ShiftClick(src) + return +/atom/proc/ShiftClick(var/mob/user) + if(user.client && user.client.eye == user) + examine() + user.face_atom(src) + return + +/* + Ctrl click + For most objects, pull +*/ +/mob/proc/CtrlClickOn(var/atom/A) + A.CtrlClick(src) + return +/atom/proc/CtrlClick(var/mob/user) + return + +/atom/movable/CtrlClick(var/mob/user) + if(Adjacent(user)) + user.start_pulling(src) + +/* + Alt click + Unused except for AI +*/ +/mob/proc/AltClickOn(var/atom/A) + A.AltClick(src) + return + +/atom/proc/AltClick(var/mob/user) + var/turf/T = get_turf(src) + if(T && user.TurfAdjacent(T)) + if(user.listed_turf == T) + user.listed_turf = null + else + user.listed_turf = T + user.client.statpanel = T.name + return + +/mob/proc/TurfAdjacent(var/turf/T) + return T.Adjacent(src) + +/* + Misc helpers + + Laser Eyes: as the name implies, handles this since nothing else does currently + face_atom: turns the mob towards what you clicked on +*/ +/mob/proc/LaserEyes(atom/A) + return + +/mob/living/LaserEyes(atom/A) + next_move = world.time + 6 + var/turf/T = get_turf(src) + var/turf/U = get_turf(A) + + var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam( loc ) + LE.icon = 'icons/effects/genetics.dmi' + LE.icon_state = "eyelasers" + playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) + + LE.firer = src + LE.def_zone = get_organ_target() + LE.original = A + LE.current = T + LE.yo = U.y - T.y + LE.xo = U.x - T.x + spawn( 1 ) + LE.process() + +/mob/living/carbon/human/LaserEyes() + if(nutrition>0) + ..() + nutrition = max(nutrition - rand(1,5),0) + handle_regular_hud_updates() + else + src << "\red You're out of energy! You need food!" + +// Simple helper to face what you clicked on, in case it should be needed in more than one place +/mob/proc/face_atom(var/atom/A) + if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) return + var/dx = A.x - x + var/dy = A.y - y + if(!dx && !dy) // Wall items are graphically shifted but on the floor + if(A.pixel_y > 16) dir = NORTH + else if(A.pixel_y < -16)dir = SOUTH + else if(A.pixel_x > 16) dir = EAST + else if(A.pixel_x < -16)dir = WEST + return + + if(abs(dx) < abs(dy)) + if(dy > 0) dir = NORTH + else dir = SOUTH + else + if(dx > 0) dir = EAST + else dir = WEST diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index fa1e49a860c..14291469c77 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -1,118 +1,118 @@ -/* - Cyborg ClickOn() - - Cyborgs have no range restriction on attack_robot(), because it is basically an AI click. - However, they do have a range restriction on item use, so they cannot do without the - adjacency code. -*/ - -/mob/living/silicon/robot/ClickOn(var/atom/A, var/params) - if(world.time <= next_click) - return - next_click = world.time + 1 - - if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked - build_click(src, client.buildmode, params, A) - return - - if(stat || lockcharge || weakened || stunned || paralysis) - return - - var/list/modifiers = params2list(params) - if(modifiers["middle"]) - MiddleClickOn(A) - return - if(modifiers["shift"]) - ShiftClickOn(A) - return - if(modifiers["alt"]) // alt and alt-gr (rightalt) - AltClickOn(A) - return - if(modifiers["ctrl"]) - CtrlClickOn(A) - return - - if(next_move >= world.time) - return - - face_atom(A) // change direction to face what you clicked on - - /* - cyborg restrained() currently does nothing - if(restrained()) - RestrainedClickOn(A) - return - */ - - var/obj/item/W = get_active_hand() - - // Cyborgs have no range-checking unless there is item use - if(!W) - A.attack_robot(src) - return - - // buckled cannot prevent machine interlinking but stops arm movement - if( buckled ) - return - - if(W == A) - next_move = world.time + 8 - if(W.flags&USEDELAY) - next_move += 5 - - W.attack_self(src) - return - - // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents) - if(A == loc || (A in loc) || (A in contents)) - // No adjacency checks - next_move = world.time + 8 - if(W.flags&USEDELAY) - next_move += 5 - - var/resolved = A.attackby(W,src) - if(!resolved && A && W) - W.afterattack(A,src,1,params) - return - - if(!isturf(loc)) - return - - // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc)) - if(isturf(A) || isturf(A.loc)) - if(A.Adjacent(src)) // see adjacent.dm - next_move = world.time + 10 - if(W.flags&USEDELAY) - next_move += 5 - - var/resolved = A.attackby(W, src) - if(!resolved && A && W) - W.afterattack(A, src, 1, params) - return - else - next_move = world.time + 10 - W.afterattack(A, src, 0, params) - return - return - -//Middle click cycles through selected modules. -/mob/living/silicon/robot/MiddleClickOn(var/atom/A) - cycle_modules() - return - -/* - As with AI, these are not used in click code, - because the code for robots is specific, not generic. - - If you would like to add advanced features to robot - clicks, you can do so here, but you will have to - change attack_robot() above to the proper function -*/ -/mob/living/silicon/robot/UnarmedAttack(atom/A) - A.attack_robot(src) -/mob/living/silicon/robot/RangedAttack(atom/A) - A.attack_robot(src) - -/atom/proc/attack_robot(mob/user as mob) - attack_ai(user) - return +/* + Cyborg ClickOn() + + Cyborgs have no range restriction on attack_robot(), because it is basically an AI click. + However, they do have a range restriction on item use, so they cannot do without the + adjacency code. +*/ + +/mob/living/silicon/robot/ClickOn(var/atom/A, var/params) + if(world.time <= next_click) + return + next_click = world.time + 1 + + if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked + build_click(src, client.buildmode, params, A) + return + + if(stat || lockcharge || weakened || stunned || paralysis) + return + + var/list/modifiers = params2list(params) + if(modifiers["middle"]) + MiddleClickOn(A) + return + if(modifiers["shift"]) + ShiftClickOn(A) + return + if(modifiers["alt"]) // alt and alt-gr (rightalt) + AltClickOn(A) + return + if(modifiers["ctrl"]) + CtrlClickOn(A) + return + + if(next_move >= world.time) + return + + face_atom(A) // change direction to face what you clicked on + + /* + cyborg restrained() currently does nothing + if(restrained()) + RestrainedClickOn(A) + return + */ + + var/obj/item/W = get_active_hand() + + // Cyborgs have no range-checking unless there is item use + if(!W) + A.attack_robot(src) + return + + // buckled cannot prevent machine interlinking but stops arm movement + if( buckled ) + return + + if(W == A) + next_move = world.time + 8 + if(W.flags&USEDELAY) + next_move += 5 + + W.attack_self(src) + return + + // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents) + if(A == loc || (A in loc) || (A in contents)) + // No adjacency checks + next_move = world.time + 8 + if(W.flags&USEDELAY) + next_move += 5 + + var/resolved = A.attackby(W,src) + if(!resolved && A && W) + W.afterattack(A,src,1,params) + return + + if(!isturf(loc)) + return + + // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc)) + if(isturf(A) || isturf(A.loc)) + if(A.Adjacent(src)) // see adjacent.dm + next_move = world.time + 10 + if(W.flags&USEDELAY) + next_move += 5 + + var/resolved = A.attackby(W, src) + if(!resolved && A && W) + W.afterattack(A, src, 1, params) + return + else + next_move = world.time + 10 + W.afterattack(A, src, 0, params) + return + return + +//Middle click cycles through selected modules. +/mob/living/silicon/robot/MiddleClickOn(var/atom/A) + cycle_modules() + return + +/* + As with AI, these are not used in click code, + because the code for robots is specific, not generic. + + If you would like to add advanced features to robot + clicks, you can do so here, but you will have to + change attack_robot() above to the proper function +*/ +/mob/living/silicon/robot/UnarmedAttack(atom/A) + A.attack_robot(src) +/mob/living/silicon/robot/RangedAttack(atom/A) + A.attack_robot(src) + +/atom/proc/attack_robot(mob/user as mob) + attack_ai(user) + return diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 0743127371e..ccd6ccaf7f2 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -1,17 +1,17 @@ -/* - MouseDrop: - - Called on the atom you're dragging. In a lot of circumstances we want to use the - recieving object instead, so that's the default action. This allows you to drag - almost anything into a trash can. -*/ -/atom/MouseDrop(atom/over) - if(!usr || !over) return - if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows - - over.MouseDrop_T(src,usr) - return - -// recieve a mousedrop -/atom/proc/MouseDrop_T(atom/dropping, mob/user) - return +/* + MouseDrop: + + Called on the atom you're dragging. In a lot of circumstances we want to use the + recieving object instead, so that's the default action. This allows you to drag + almost anything into a trash can. +*/ +/atom/MouseDrop(atom/over) + if(!usr || !over) return + if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows + + over.MouseDrop_T(src,usr) + return + +// recieve a mousedrop +/atom/proc/MouseDrop_T(atom/dropping, mob/user) + return diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index e0948d46eb1..342eeba8d36 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -1,105 +1,105 @@ -/* - These defines specificy screen locations. For more information, see the byond documentation on the screen_loc var. - - The short version: - - Everything is encoded as strings because apparently that's how Byond rolls. - - "1,1" is the bottom left square of the user's screen. This aligns perfectly with the turf grid. - "1:2,3:4" is the square (1,3) with pixel offsets (+2, +4); slightly right and slightly above the turf grid. - Pixel offsets are used so you don't perfectly hide the turf under them, that would be crappy. - - In addition, the keywords NORTH, SOUTH, EAST, WEST and CENTER can be used to represent their respective - screen borders. NORTH-1, for example, is the row just below the upper edge. Useful if you want your - UI to scale with screen size. - - The size of the user's screen is defined by client.view (indirectly by world.view), in our case "15x15". - Therefore, the top right corner (except during admin shenanigans) is at "15,15" -*/ - -//Upper left action buttons, displayed when you pick up an item that has this enabled. -#define ui_action_slot1 "WEST :6, NORTH-1:26" -#define ui_action_slot2 "WEST+1:8, NORTH-1:26" -#define ui_action_slot3 "WEST+2:10,NORTH-1:26" -#define ui_action_slot4 "WEST+3:12,NORTH-1:26" -#define ui_action_slot5 "WEST+4:14,NORTH-1:26" - -//Lower left, persistant menu -#define ui_inventory "WEST:6,SOUTH:5" - -//Middle left indicators -#define ui_lingchemdisplay "WEST:6,CENTER-1:15" -#define ui_lingstingdisplay "WEST:6,CENTER-3:11" - -//Lower center, persistant menu -#define ui_sstore1 "CENTER-5:10,SOUTH:5" -#define ui_id "CENTER-4:12,SOUTH:5" -#define ui_belt "CENTER-3:14,SOUTH:5" -#define ui_back "CENTER-2:14,SOUTH:5" -#define ui_rhand "CENTER:-16,SOUTH:5" -#define ui_lhand "CENTER: 16,SOUTH:5" -#define ui_equip "CENTER:-16,SOUTH+1:5" -#define ui_swaphand1 "CENTER:-16,SOUTH+1:5" -#define ui_swaphand2 "CENTER: 16,SOUTH+1:5" -#define ui_storage1 "CENTER+1:18,SOUTH:5" -#define ui_storage2 "CENTER+2:20,SOUTH:5" - -#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs -#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs -#define ui_inv3 "CENTER :16,SOUTH:5" //borgs -#define ui_borg_module "CENTER+1:16,SOUTH:5" -#define ui_borg_store "CENTER+2:16,SOUTH:5" //borgs - -#define ui_monkey_mask "CENTER-3:14,SOUTH:5" //monkey -#define ui_monkey_back "CENTER-2:15,SOUTH:5" //monkey - -#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien -#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien - -//Lower right, persistant menu -#define ui_drop_throw "EAST-1:28,SOUTH+1:7" -#define ui_pull_resist "EAST-2:26,SOUTH+1:7" -#define ui_movi "EAST-2:26,SOUTH:5" -#define ui_acti "EAST-3:24,SOUTH:5" -#define ui_zonesel "EAST-1:28,SOUTH:5" -#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12) - -#define ui_borg_pull "EAST-2:26,SOUTH+1:7" -#define ui_borg_radio "EAST-1:28,SOUTH+1:7" -#define ui_borg_intents "EAST-2:26,SOUTH:5" - -//Upper-middle right (damage indicators) -#define ui_toxin "EAST-1:28,CENTER+5:27" -#define ui_fire "EAST-1:28,CENTER+4:25" -#define ui_oxygen "EAST-1:28,CENTER+3:23" -#define ui_pressure "EAST-1:28,CENTER+2:21" - -#define ui_alien_toxin "EAST-1:28,CENTER+5:25" -#define ui_alien_fire "EAST-1:28,CENTER+4:25" -#define ui_alien_oxygen "EAST-1:28,CENTER+3:25" - -//Middle right (status indicators) -#define ui_nutrition "EAST-1:28,CENTER-3:11" -#define ui_temp "EAST-1:28,CENTER-2:13" -#define ui_health "EAST-1:28,CENTER-1:15" -#define ui_internal "EAST-1:28,CENTER:17" - -//borgs and aliens -#define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. -#define ui_alien_health "EAST-1:28,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. -#define ui_alienplasmadisplay "EAST-1:28,CENTER-2:15" - -//Pop-up inventory -#define ui_shoes "WEST+1:8,SOUTH:5" - -#define ui_iclothing "WEST:6,SOUTH+1:7" -#define ui_oclothing "WEST+1:8,SOUTH+1:7" -#define ui_gloves "WEST+2:10,SOUTH+1:7" - -#define ui_glasses "WEST:6,SOUTH+2:9" -#define ui_mask "WEST+1:8,SOUTH+2:9" -#define ui_ears "WEST+2:10,SOUTH+2:9" - -#define ui_head "WEST+1:8,SOUTH+3:11" - - +/* + These defines specificy screen locations. For more information, see the byond documentation on the screen_loc var. + + The short version: + + Everything is encoded as strings because apparently that's how Byond rolls. + + "1,1" is the bottom left square of the user's screen. This aligns perfectly with the turf grid. + "1:2,3:4" is the square (1,3) with pixel offsets (+2, +4); slightly right and slightly above the turf grid. + Pixel offsets are used so you don't perfectly hide the turf under them, that would be crappy. + + In addition, the keywords NORTH, SOUTH, EAST, WEST and CENTER can be used to represent their respective + screen borders. NORTH-1, for example, is the row just below the upper edge. Useful if you want your + UI to scale with screen size. + + The size of the user's screen is defined by client.view (indirectly by world.view), in our case "15x15". + Therefore, the top right corner (except during admin shenanigans) is at "15,15" +*/ + +//Upper left action buttons, displayed when you pick up an item that has this enabled. +#define ui_action_slot1 "WEST :6, NORTH-1:26" +#define ui_action_slot2 "WEST+1:8, NORTH-1:26" +#define ui_action_slot3 "WEST+2:10,NORTH-1:26" +#define ui_action_slot4 "WEST+3:12,NORTH-1:26" +#define ui_action_slot5 "WEST+4:14,NORTH-1:26" + +//Lower left, persistant menu +#define ui_inventory "WEST:6,SOUTH:5" + +//Middle left indicators +#define ui_lingchemdisplay "WEST:6,CENTER-1:15" +#define ui_lingstingdisplay "WEST:6,CENTER-3:11" + +//Lower center, persistant menu +#define ui_sstore1 "CENTER-5:10,SOUTH:5" +#define ui_id "CENTER-4:12,SOUTH:5" +#define ui_belt "CENTER-3:14,SOUTH:5" +#define ui_back "CENTER-2:14,SOUTH:5" +#define ui_rhand "CENTER:-16,SOUTH:5" +#define ui_lhand "CENTER: 16,SOUTH:5" +#define ui_equip "CENTER:-16,SOUTH+1:5" +#define ui_swaphand1 "CENTER:-16,SOUTH+1:5" +#define ui_swaphand2 "CENTER: 16,SOUTH+1:5" +#define ui_storage1 "CENTER+1:18,SOUTH:5" +#define ui_storage2 "CENTER+2:20,SOUTH:5" + +#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs +#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs +#define ui_inv3 "CENTER :16,SOUTH:5" //borgs +#define ui_borg_module "CENTER+1:16,SOUTH:5" +#define ui_borg_store "CENTER+2:16,SOUTH:5" //borgs + +#define ui_monkey_mask "CENTER-3:14,SOUTH:5" //monkey +#define ui_monkey_back "CENTER-2:15,SOUTH:5" //monkey + +#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien +#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien + +//Lower right, persistant menu +#define ui_drop_throw "EAST-1:28,SOUTH+1:7" +#define ui_pull_resist "EAST-2:26,SOUTH+1:7" +#define ui_movi "EAST-2:26,SOUTH:5" +#define ui_acti "EAST-3:24,SOUTH:5" +#define ui_zonesel "EAST-1:28,SOUTH:5" +#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12) + +#define ui_borg_pull "EAST-2:26,SOUTH+1:7" +#define ui_borg_radio "EAST-1:28,SOUTH+1:7" +#define ui_borg_intents "EAST-2:26,SOUTH:5" + +//Upper-middle right (damage indicators) +#define ui_toxin "EAST-1:28,CENTER+5:27" +#define ui_fire "EAST-1:28,CENTER+4:25" +#define ui_oxygen "EAST-1:28,CENTER+3:23" +#define ui_pressure "EAST-1:28,CENTER+2:21" + +#define ui_alien_toxin "EAST-1:28,CENTER+5:25" +#define ui_alien_fire "EAST-1:28,CENTER+4:25" +#define ui_alien_oxygen "EAST-1:28,CENTER+3:25" + +//Middle right (status indicators) +#define ui_nutrition "EAST-1:28,CENTER-3:11" +#define ui_temp "EAST-1:28,CENTER-2:13" +#define ui_health "EAST-1:28,CENTER-1:15" +#define ui_internal "EAST-1:28,CENTER:17" + +//borgs and aliens +#define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. +#define ui_alien_health "EAST-1:28,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. +#define ui_alienplasmadisplay "EAST-1:28,CENTER-2:15" + +//Pop-up inventory +#define ui_shoes "WEST+1:8,SOUTH:5" + +#define ui_iclothing "WEST:6,SOUTH+1:7" +#define ui_oclothing "WEST+1:8,SOUTH+1:7" +#define ui_gloves "WEST+2:10,SOUTH+1:7" + +#define ui_glasses "WEST:6,SOUTH+2:9" +#define ui_mask "WEST+1:8,SOUTH+2:9" +#define ui_ears "WEST+2:10,SOUTH+2:9" + +#define ui_head "WEST+1:8,SOUTH+3:11" + + diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 73868ade062..9b34f7bcc6e 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -1,172 +1,172 @@ -/datum/hud/proc/alien_hud() - adding = list() - other = list() - - var/obj/screen/using - var/obj/screen/inventory/inv_box - -//equippable shit - -//hands - inv_box = new /obj/screen/inventory() - inv_box.name = "r_hand" - inv_box.icon = 'icons/mob/screen_alien.dmi' - inv_box.icon_state = "hand_r_inactive" - if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use - inv_box.icon_state = "hand_r_active" - inv_box.screen_loc = ui_rhand - inv_box.layer = 19 - r_hand_hud_object = inv_box - inv_box.slot_id = slot_r_hand - adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "l_hand" - inv_box.icon = 'icons/mob/screen_alien.dmi' - inv_box.icon_state = "hand_l_inactive" - if(mymob && mymob.hand) //This being 1 means the left hand is in use - inv_box.icon_state = "hand_l_active" - inv_box.screen_loc = ui_lhand - inv_box.layer = 19 - inv_box.slot_id = slot_l_hand - l_hand_hud_object = inv_box - adding += inv_box - -//pocket 1 - inv_box = new /obj/screen/inventory() - inv_box.name = "storage1" - inv_box.icon = 'icons/mob/screen_alien.dmi' - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_alien_storage_l - inv_box.slot_id = slot_l_store - inv_box.layer = 19 - adding += inv_box - -//pocket 2 - inv_box = new /obj/screen/inventory() - inv_box.name = "storage2" - inv_box.icon = 'icons/mob/screen_alien.dmi' - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_alien_storage_r - inv_box.slot_id = slot_r_store - inv_box.layer = 19 - adding += inv_box - -//begin buttons - - using = new /obj/screen/inventory() - using.name = "hand" - using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = "swap_1" - using.screen_loc = ui_swaphand1 - using.layer = 19 - adding += using - - using = new /obj/screen/inventory() - using.name = "hand" - using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = "swap_2" - using.screen_loc = ui_swaphand2 - using.layer = 19 - adding += using - - using = new /obj/screen() - using.name = "act_intent" - using.icon_state = mymob.a_intent - using.screen_loc = ui_acti - using.layer = 20 - adding += using - action_intent = using - - using = new /obj/screen() - using.name = "mov_intent" - using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - adding += using - move_intent = using - - using = new /obj/screen() - using.name = "drop" - using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.layer = 19 - adding += using - - using = new /obj/screen() - using.name = "resist" - using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = "act_resist" - using.screen_loc = ui_pull_resist - using.layer = 19 - adding += using - - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = 'icons/mob/screen_alien.dmi' - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw/catch" - mymob.throw_icon.screen_loc = ui_drop_throw - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = 'icons/mob/screen_alien.dmi' - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull_resist - -//begin indicators - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen_alien.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_alien_oxygen - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = 'icons/mob/screen_alien.dmi' - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_alien_toxin - - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen_alien.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_alien_fire - - mymob.healths = new /obj/screen() - mymob.healths.icon = 'icons/mob/screen_alien.dmi' - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_alien_health - - alien_plasma_display = new /obj/screen() - alien_plasma_display.icon = 'icons/mob/screen_gen.dmi' - alien_plasma_display.icon_state = "power_display2" - alien_plasma_display.name = "plasma stored" - alien_plasma_display.screen_loc = ui_alienplasmadisplay - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "CENTER-7,CENTER-7" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen_alien.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel/alien() - mymob.zone_sel.icon = 'icons/mob/screen_alien.dmi' - mymob.zone_sel.update_icon() - - mymob.client.screen = null - - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, alien_plasma_display, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) - mymob.client.screen += adding + other - +/datum/hud/proc/alien_hud() + adding = list() + other = list() + + var/obj/screen/using + var/obj/screen/inventory/inv_box + +//equippable shit + +//hands + inv_box = new /obj/screen/inventory() + inv_box.name = "r_hand" + inv_box.icon = 'icons/mob/screen_alien.dmi' + inv_box.icon_state = "hand_r_inactive" + if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use + inv_box.icon_state = "hand_r_active" + inv_box.screen_loc = ui_rhand + inv_box.layer = 19 + r_hand_hud_object = inv_box + inv_box.slot_id = slot_r_hand + adding += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "l_hand" + inv_box.icon = 'icons/mob/screen_alien.dmi' + inv_box.icon_state = "hand_l_inactive" + if(mymob && mymob.hand) //This being 1 means the left hand is in use + inv_box.icon_state = "hand_l_active" + inv_box.screen_loc = ui_lhand + inv_box.layer = 19 + inv_box.slot_id = slot_l_hand + l_hand_hud_object = inv_box + adding += inv_box + +//pocket 1 + inv_box = new /obj/screen/inventory() + inv_box.name = "storage1" + inv_box.icon = 'icons/mob/screen_alien.dmi' + inv_box.icon_state = "pocket" + inv_box.screen_loc = ui_alien_storage_l + inv_box.slot_id = slot_l_store + inv_box.layer = 19 + adding += inv_box + +//pocket 2 + inv_box = new /obj/screen/inventory() + inv_box.name = "storage2" + inv_box.icon = 'icons/mob/screen_alien.dmi' + inv_box.icon_state = "pocket" + inv_box.screen_loc = ui_alien_storage_r + inv_box.slot_id = slot_r_store + inv_box.layer = 19 + adding += inv_box + +//begin buttons + + using = new /obj/screen/inventory() + using.name = "hand" + using.icon = 'icons/mob/screen_alien.dmi' + using.icon_state = "swap_1" + using.screen_loc = ui_swaphand1 + using.layer = 19 + adding += using + + using = new /obj/screen/inventory() + using.name = "hand" + using.icon = 'icons/mob/screen_alien.dmi' + using.icon_state = "swap_2" + using.screen_loc = ui_swaphand2 + using.layer = 19 + adding += using + + using = new /obj/screen() + using.name = "act_intent" + using.icon_state = mymob.a_intent + using.screen_loc = ui_acti + using.layer = 20 + adding += using + action_intent = using + + using = new /obj/screen() + using.name = "mov_intent" + using.icon = 'icons/mob/screen_alien.dmi' + using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") + using.screen_loc = ui_movi + using.layer = 20 + adding += using + move_intent = using + + using = new /obj/screen() + using.name = "drop" + using.icon = 'icons/mob/screen_alien.dmi' + using.icon_state = "act_drop" + using.screen_loc = ui_drop_throw + using.layer = 19 + adding += using + + using = new /obj/screen() + using.name = "resist" + using.icon = 'icons/mob/screen_alien.dmi' + using.icon_state = "act_resist" + using.screen_loc = ui_pull_resist + using.layer = 19 + adding += using + + mymob.throw_icon = new /obj/screen() + mymob.throw_icon.icon = 'icons/mob/screen_alien.dmi' + mymob.throw_icon.icon_state = "act_throw_off" + mymob.throw_icon.name = "throw/catch" + mymob.throw_icon.screen_loc = ui_drop_throw + + mymob.pullin = new /obj/screen() + mymob.pullin.icon = 'icons/mob/screen_alien.dmi' + mymob.pullin.icon_state = "pull0" + mymob.pullin.name = "pull" + mymob.pullin.screen_loc = ui_pull_resist + +//begin indicators + + mymob.oxygen = new /obj/screen() + mymob.oxygen.icon = 'icons/mob/screen_alien.dmi' + mymob.oxygen.icon_state = "oxy0" + mymob.oxygen.name = "oxygen" + mymob.oxygen.screen_loc = ui_alien_oxygen + + mymob.toxin = new /obj/screen() + mymob.toxin.icon = 'icons/mob/screen_alien.dmi' + mymob.toxin.icon_state = "tox0" + mymob.toxin.name = "toxin" + mymob.toxin.screen_loc = ui_alien_toxin + + mymob.fire = new /obj/screen() + mymob.fire.icon = 'icons/mob/screen_alien.dmi' + mymob.fire.icon_state = "fire0" + mymob.fire.name = "fire" + mymob.fire.screen_loc = ui_alien_fire + + mymob.healths = new /obj/screen() + mymob.healths.icon = 'icons/mob/screen_alien.dmi' + mymob.healths.icon_state = "health0" + mymob.healths.name = "health" + mymob.healths.screen_loc = ui_alien_health + + alien_plasma_display = new /obj/screen() + alien_plasma_display.icon = 'icons/mob/screen_gen.dmi' + alien_plasma_display.icon_state = "power_display2" + alien_plasma_display.name = "plasma stored" + alien_plasma_display.screen_loc = ui_alienplasmadisplay + + mymob.blind = new /obj/screen() + mymob.blind.icon = 'icons/mob/screen_full.dmi' + mymob.blind.icon_state = "blackimageoverlay" + mymob.blind.name = " " + mymob.blind.screen_loc = "CENTER-7,CENTER-7" + mymob.blind.layer = 0 + + mymob.flash = new /obj/screen() + mymob.flash.icon = 'icons/mob/screen_alien.dmi' + mymob.flash.icon_state = "blank" + mymob.flash.name = "flash" + mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" + mymob.flash.layer = 17 + + mymob.zone_sel = new /obj/screen/zone_sel/alien() + mymob.zone_sel.icon = 'icons/mob/screen_alien.dmi' + mymob.zone_sel.update_icon() + + mymob.client.screen = null + + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, alien_plasma_display, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += adding + other + diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 608b041717d..cf9df80ad3b 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -1,77 +1,77 @@ -/datum/hud/proc/larva_hud() - adding = list() - other = list() - - var/obj/screen/using - - using = new /obj/screen() - using.name = "act_intent" - using.icon_state = mymob.a_intent - using.screen_loc = ui_acti - using.layer = 20 - adding += using - action_intent = using - - using = new /obj/screen() - using.name = "mov_intent" - using.icon = 'icons/mob/screen_alien.dmi' - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - adding += using - move_intent = using - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen_alien.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_alien_oxygen - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = 'icons/mob/screen_alien.dmi' - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_alien_toxin - - - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen_alien.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_alien_fire - - - mymob.healths = new /obj/screen() - mymob.healths.icon = 'icons/mob/screen_alien.dmi' - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_alien_health - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = 'icons/mob/screen_alien.dmi' - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull_resist - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "CENTER-7,CENTER-7" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen_alien.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel/alien() - mymob.zone_sel.icon = 'icons/mob/screen_alien.dmi' - mymob.zone_sel.update_icon() - - mymob.client.screen = null - - mymob.client.screen += list( mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) +/datum/hud/proc/larva_hud() + adding = list() + other = list() + + var/obj/screen/using + + using = new /obj/screen() + using.name = "act_intent" + using.icon_state = mymob.a_intent + using.screen_loc = ui_acti + using.layer = 20 + adding += using + action_intent = using + + using = new /obj/screen() + using.name = "mov_intent" + using.icon = 'icons/mob/screen_alien.dmi' + using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") + using.screen_loc = ui_movi + using.layer = 20 + adding += using + move_intent = using + + mymob.oxygen = new /obj/screen() + mymob.oxygen.icon = 'icons/mob/screen_alien.dmi' + mymob.oxygen.icon_state = "oxy0" + mymob.oxygen.name = "oxygen" + mymob.oxygen.screen_loc = ui_alien_oxygen + + mymob.toxin = new /obj/screen() + mymob.toxin.icon = 'icons/mob/screen_alien.dmi' + mymob.toxin.icon_state = "tox0" + mymob.toxin.name = "toxin" + mymob.toxin.screen_loc = ui_alien_toxin + + + mymob.fire = new /obj/screen() + mymob.fire.icon = 'icons/mob/screen_alien.dmi' + mymob.fire.icon_state = "fire0" + mymob.fire.name = "fire" + mymob.fire.screen_loc = ui_alien_fire + + + mymob.healths = new /obj/screen() + mymob.healths.icon = 'icons/mob/screen_alien.dmi' + mymob.healths.icon_state = "health0" + mymob.healths.name = "health" + mymob.healths.screen_loc = ui_alien_health + + mymob.pullin = new /obj/screen() + mymob.pullin.icon = 'icons/mob/screen_alien.dmi' + mymob.pullin.icon_state = "pull0" + mymob.pullin.name = "pull" + mymob.pullin.screen_loc = ui_pull_resist + + mymob.blind = new /obj/screen() + mymob.blind.icon = 'icons/mob/screen_full.dmi' + mymob.blind.icon_state = "blackimageoverlay" + mymob.blind.name = " " + mymob.blind.screen_loc = "CENTER-7,CENTER-7" + mymob.blind.layer = 0 + + mymob.flash = new /obj/screen() + mymob.flash.icon = 'icons/mob/screen_alien.dmi' + mymob.flash.icon_state = "blank" + mymob.flash.name = "flash" + mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" + mymob.flash.layer = 17 + + mymob.zone_sel = new /obj/screen/zone_sel/alien() + mymob.zone_sel.icon = 'icons/mob/screen_alien.dmi' + mymob.zone_sel.update_icon() + + mymob.client.screen = null + + mymob.client.screen += list( mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += adding + other \ No newline at end of file diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index d76b92553c6..ba74450b504 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -1,305 +1,305 @@ -/* - The global hud: - Uses the same visual objects for all players. -*/ - -var/datum/global_hud/global_hud = new() - -/datum/global_hud - var/obj/screen/druggy - var/obj/screen/blurry - var/list/vimpaired - var/list/darkMask - -/datum/global_hud/New() - //420erryday psychedellic colours screen overlay for when you are high - druggy = new /obj/screen() - druggy.screen_loc = "WEST,SOUTH to EAST,NORTH" - druggy.icon_state = "druggy" - druggy.blend_mode = BLEND_MULTIPLY - druggy.layer = 17 - druggy.mouse_opacity = 0 - - //that white blurry effect you get when you eyes are damaged - blurry = new /obj/screen() - blurry.screen_loc = "WEST,SOUTH to EAST,NORTH" - blurry.icon_state = "blurry" - blurry.layer = 17 - blurry.mouse_opacity = 0 - - var/obj/screen/O - var/i - //that nasty looking dither you get when you're short-sighted - vimpaired = newlist(/obj/screen,/obj/screen,/obj/screen,/obj/screen) - O = vimpaired[1] - O.screen_loc = "WEST,SOUTH to CENTER-3,NORTH" //West dither - O = vimpaired[2] - O.screen_loc = "WEST,SOUTH to EAST,CENTER-3" //South dither - O = vimpaired[3] - O.screen_loc = "CENTER+3,SOUTH to EAST,NORTH" //East dither - O = vimpaired[4] - O.screen_loc = "WEST,CENTER+3 to EAST,NORTH" //North dither - - //welding mask overlay black/dither - darkMask = newlist(/obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen) - O = darkMask[1] - O.screen_loc = "CENTER-5,CENTER-5 to CENTER-3,CENTER+5" //West dither - O = darkMask[2] - O.screen_loc = "CENTER-5,CENTER-5 to CENTER+5,CENTER-3" //South dither - O = darkMask[3] - O.screen_loc = "CENTER+3,CENTER-5 to CENTER+5,CENTER+5" //East dither - O = darkMask[4] - O.screen_loc = "CENTER-5,CENTER+3 to CENTER+5,CENTER+5" //North dither - O = darkMask[5] - O.screen_loc = "WEST,SOUTH to CENTER-5,NORTH" //West black - O = darkMask[6] - O.screen_loc = "WEST,SOUTH to EAST,CENTER-5" //South black - O = darkMask[7] - O.screen_loc = "CENTER+5,SOUTH to EAST,NORTH" //East black - O = darkMask[8] - O.screen_loc = "WEST,CENTER+5 to EAST,NORTH" //North black - - - for(i = 1, i <= 4, i++) - O = vimpaired[i] - O.icon_state = "dither50" - O.blend_mode = BLEND_MULTIPLY - O.layer = 17 - O.mouse_opacity = 0 - - O = darkMask[i] - O.icon_state = "dither50" - O.blend_mode = BLEND_MULTIPLY - O.layer = 17 - O.mouse_opacity = 0 - - for(i = 5, i <= 8, i++) - O = darkMask[i] - O.icon_state = "black" - O.blend_mode = BLEND_MULTIPLY - O.layer = 17 - O.mouse_opacity = 0 - -/* - The hud datum - Used to show and hide huds for all the different mob types, - including inventories and item quick actions. -*/ - -/datum/hud - var/mob/mymob - - var/hud_shown = 1 //Used for the HUD toggle (F12) - var/hud_version = 1 //Current displayed version of the HUD - var/inventory_shown = 1 //the inventory - var/show_intent_icons = 0 - var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) - - var/obj/screen/lingchemdisplay - var/obj/screen/lingstingdisplay - var/obj/screen/blobpwrdisplay - var/obj/screen/blobhealthdisplay - var/obj/screen/alien_plasma_display - var/obj/screen/r_hand_hud_object - var/obj/screen/l_hand_hud_object - var/obj/screen/action_intent - var/obj/screen/move_intent - - var/list/adding - var/list/other - var/list/obj/screen/hotkeybuttons - - var/list/obj/screen/item_action/item_action_list = list() //Used for the item action ui buttons. - - -datum/hud/New(mob/owner) - mymob = owner - instantiate() - ..() - - -/datum/hud/proc/hidden_inventory_update() - if(!mymob) - return - - if(ishuman(mymob)) - var/mob/living/carbon/human/H = mymob - if(H.handcuffed) - H.handcuffed.screen_loc = null //no handcuffs in my UI! - if(inventory_shown && hud_shown) - if(H.shoes) H.shoes.screen_loc = ui_shoes - if(H.gloves) H.gloves.screen_loc = ui_gloves - if(H.ears) H.ears.screen_loc = ui_ears - if(H.glasses) H.glasses.screen_loc = ui_glasses - if(H.w_uniform) H.w_uniform.screen_loc = ui_iclothing - if(H.wear_suit) H.wear_suit.screen_loc = ui_oclothing - if(H.wear_mask) H.wear_mask.screen_loc = ui_mask - if(H.head) H.head.screen_loc = ui_head - else - if(H.shoes) H.shoes.screen_loc = null - if(H.gloves) H.gloves.screen_loc = null - if(H.ears) H.ears.screen_loc = null - if(H.glasses) H.glasses.screen_loc = null - if(H.w_uniform) H.w_uniform.screen_loc = null - if(H.wear_suit) H.wear_suit.screen_loc = null - if(H.wear_mask) H.wear_mask.screen_loc = null - if(H.head) H.head.screen_loc = null - - -/datum/hud/proc/persistant_inventory_update() - if(!mymob) - return - - if(ishuman(mymob)) - var/mob/living/carbon/human/H = mymob - if(hud_shown) - if(H.s_store) H.s_store.screen_loc = ui_sstore1 - if(H.wear_id) H.wear_id.screen_loc = ui_id - if(H.belt) H.belt.screen_loc = ui_belt - if(H.back) H.back.screen_loc = ui_back - if(H.l_store) H.l_store.screen_loc = ui_storage1 - if(H.r_store) H.r_store.screen_loc = ui_storage2 - else - if(H.s_store) H.s_store.screen_loc = null - if(H.wear_id) H.wear_id.screen_loc = null - if(H.belt) H.belt.screen_loc = null - if(H.back) H.back.screen_loc = null - if(H.l_store) H.l_store.screen_loc = null - if(H.r_store) H.r_store.screen_loc = null - - -/datum/hud/proc/instantiate() - if(!ismob(mymob)) - return 0 - if(!mymob.client) - return 0 - - var/ui_style = ui_style2icon(mymob.client.prefs.UI_style) - - if(ishuman(mymob)) - human_hud(ui_style) // Pass the player the UI style chosen in preferences - else if(ismonkey(mymob)) - monkey_hud(ui_style) - else if(isbrain(mymob)) - brain_hud(ui_style) - else if(islarva(mymob)) - larva_hud() - else if(isalien(mymob)) - alien_hud() - else if(isAI(mymob)) - ai_hud() - else if(isrobot(mymob)) - robot_hud() - else if(isobserver(mymob)) - ghost_hud() - else if(isovermind(mymob)) - blob_hud() - - if(istype(mymob.loc,/obj/mecha)) - show_hud(HUD_STYLE_REDUCED) - -//Version denotes which style should be displayed. blank or 0 means "next version" -/datum/hud/proc/show_hud(var/version = 0) - if(!ismob(mymob)) - return 0 - if(!mymob.client) - return 0 - var/display_hud_version = version - if(!display_hud_version) //If 0 or blank, display the next hud version - display_hud_version = hud_version + 1 - if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version - display_hud_version = 1 - - switch(display_hud_version) - if(HUD_STYLE_STANDARD) //Default HUD - hud_shown = 1 //Governs behavior of other procs - if(adding) - mymob.client.screen += adding - if(other && inventory_shown) - mymob.client.screen += other - if(hotkeybuttons && !hotkey_ui_hidden) - mymob.client.screen += hotkeybuttons - - action_intent.screen_loc = ui_acti //Restore intent selection to the original position - mymob.client.screen += mymob.zone_sel //This one is a special snowflake - mymob.client.screen += mymob.bodytemp //As are the rest of these... - mymob.client.screen += mymob.fire - mymob.client.screen += mymob.healths - mymob.client.screen += mymob.internals - mymob.client.screen += mymob.nutrition_icon - mymob.client.screen += mymob.oxygen - mymob.client.screen += mymob.pressure - mymob.client.screen += mymob.toxin - mymob.client.screen += lingstingdisplay - mymob.client.screen += lingchemdisplay - - hidden_inventory_update() - persistant_inventory_update() - mymob.update_action_buttons() - if(HUD_STYLE_REDUCED) //Reduced HUD - hud_shown = 0 //Governs behavior of other procs - if(adding) - mymob.client.screen -= adding - if(other) - mymob.client.screen -= other - if(hotkeybuttons) - mymob.client.screen -= hotkeybuttons - if(item_action_list) - mymob.client.screen -= item_action_list - - //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. - mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason. - mymob.client.screen -= lingstingdisplay - mymob.client.screen -= lingchemdisplay - - //These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay - mymob.client.screen += l_hand_hud_object //we want the hands to be visible - mymob.client.screen += r_hand_hud_object //we want the hands to be visible - mymob.client.screen += action_intent //we want the intent swticher visible - action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is. - - hidden_inventory_update() - persistant_inventory_update() - mymob.update_action_buttons() - if(HUD_STYLE_NOHUD) //No HUD - hud_shown = 0 //Governs behavior of other procs - if(adding) - mymob.client.screen -= adding - if(other) - mymob.client.screen -= other - if(hotkeybuttons) - mymob.client.screen -= hotkeybuttons - if(item_action_list) - mymob.client.screen -= item_action_list - - //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. - mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason. - mymob.client.screen -= mymob.bodytemp - mymob.client.screen -= mymob.fire - mymob.client.screen -= mymob.healths - mymob.client.screen -= mymob.internals - mymob.client.screen -= mymob.nutrition_icon - mymob.client.screen -= mymob.oxygen - mymob.client.screen -= mymob.pressure - mymob.client.screen -= mymob.toxin - mymob.client.screen -= lingstingdisplay - mymob.client.screen -= lingchemdisplay - - hidden_inventory_update() - persistant_inventory_update() - mymob.update_action_buttons() - hud_version = display_hud_version - -//Triggered when F12 is pressed (Unless someone changed something in the DMF) -/mob/verb/button_pressed_F12() - set name = "F12" - set hidden = 1 - - if(hud_used && client) - if(ishuman(src)) - hud_used.show_hud() //Shows the next hud preset - usr << "Switched HUD mode." - else - usr << "Inventory hiding is currently only supported for human mobs, sorry." - else - usr << "This mob type does not use a HUD." +/* + The global hud: + Uses the same visual objects for all players. +*/ + +var/datum/global_hud/global_hud = new() + +/datum/global_hud + var/obj/screen/druggy + var/obj/screen/blurry + var/list/vimpaired + var/list/darkMask + +/datum/global_hud/New() + //420erryday psychedellic colours screen overlay for when you are high + druggy = new /obj/screen() + druggy.screen_loc = "WEST,SOUTH to EAST,NORTH" + druggy.icon_state = "druggy" + druggy.blend_mode = BLEND_MULTIPLY + druggy.layer = 17 + druggy.mouse_opacity = 0 + + //that white blurry effect you get when you eyes are damaged + blurry = new /obj/screen() + blurry.screen_loc = "WEST,SOUTH to EAST,NORTH" + blurry.icon_state = "blurry" + blurry.layer = 17 + blurry.mouse_opacity = 0 + + var/obj/screen/O + var/i + //that nasty looking dither you get when you're short-sighted + vimpaired = newlist(/obj/screen,/obj/screen,/obj/screen,/obj/screen) + O = vimpaired[1] + O.screen_loc = "WEST,SOUTH to CENTER-3,NORTH" //West dither + O = vimpaired[2] + O.screen_loc = "WEST,SOUTH to EAST,CENTER-3" //South dither + O = vimpaired[3] + O.screen_loc = "CENTER+3,SOUTH to EAST,NORTH" //East dither + O = vimpaired[4] + O.screen_loc = "WEST,CENTER+3 to EAST,NORTH" //North dither + + //welding mask overlay black/dither + darkMask = newlist(/obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen) + O = darkMask[1] + O.screen_loc = "CENTER-5,CENTER-5 to CENTER-3,CENTER+5" //West dither + O = darkMask[2] + O.screen_loc = "CENTER-5,CENTER-5 to CENTER+5,CENTER-3" //South dither + O = darkMask[3] + O.screen_loc = "CENTER+3,CENTER-5 to CENTER+5,CENTER+5" //East dither + O = darkMask[4] + O.screen_loc = "CENTER-5,CENTER+3 to CENTER+5,CENTER+5" //North dither + O = darkMask[5] + O.screen_loc = "WEST,SOUTH to CENTER-5,NORTH" //West black + O = darkMask[6] + O.screen_loc = "WEST,SOUTH to EAST,CENTER-5" //South black + O = darkMask[7] + O.screen_loc = "CENTER+5,SOUTH to EAST,NORTH" //East black + O = darkMask[8] + O.screen_loc = "WEST,CENTER+5 to EAST,NORTH" //North black + + + for(i = 1, i <= 4, i++) + O = vimpaired[i] + O.icon_state = "dither50" + O.blend_mode = BLEND_MULTIPLY + O.layer = 17 + O.mouse_opacity = 0 + + O = darkMask[i] + O.icon_state = "dither50" + O.blend_mode = BLEND_MULTIPLY + O.layer = 17 + O.mouse_opacity = 0 + + for(i = 5, i <= 8, i++) + O = darkMask[i] + O.icon_state = "black" + O.blend_mode = BLEND_MULTIPLY + O.layer = 17 + O.mouse_opacity = 0 + +/* + The hud datum + Used to show and hide huds for all the different mob types, + including inventories and item quick actions. +*/ + +/datum/hud + var/mob/mymob + + var/hud_shown = 1 //Used for the HUD toggle (F12) + var/hud_version = 1 //Current displayed version of the HUD + var/inventory_shown = 1 //the inventory + var/show_intent_icons = 0 + var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) + + var/obj/screen/lingchemdisplay + var/obj/screen/lingstingdisplay + var/obj/screen/blobpwrdisplay + var/obj/screen/blobhealthdisplay + var/obj/screen/alien_plasma_display + var/obj/screen/r_hand_hud_object + var/obj/screen/l_hand_hud_object + var/obj/screen/action_intent + var/obj/screen/move_intent + + var/list/adding + var/list/other + var/list/obj/screen/hotkeybuttons + + var/list/obj/screen/item_action/item_action_list = list() //Used for the item action ui buttons. + + +datum/hud/New(mob/owner) + mymob = owner + instantiate() + ..() + + +/datum/hud/proc/hidden_inventory_update() + if(!mymob) + return + + if(ishuman(mymob)) + var/mob/living/carbon/human/H = mymob + if(H.handcuffed) + H.handcuffed.screen_loc = null //no handcuffs in my UI! + if(inventory_shown && hud_shown) + if(H.shoes) H.shoes.screen_loc = ui_shoes + if(H.gloves) H.gloves.screen_loc = ui_gloves + if(H.ears) H.ears.screen_loc = ui_ears + if(H.glasses) H.glasses.screen_loc = ui_glasses + if(H.w_uniform) H.w_uniform.screen_loc = ui_iclothing + if(H.wear_suit) H.wear_suit.screen_loc = ui_oclothing + if(H.wear_mask) H.wear_mask.screen_loc = ui_mask + if(H.head) H.head.screen_loc = ui_head + else + if(H.shoes) H.shoes.screen_loc = null + if(H.gloves) H.gloves.screen_loc = null + if(H.ears) H.ears.screen_loc = null + if(H.glasses) H.glasses.screen_loc = null + if(H.w_uniform) H.w_uniform.screen_loc = null + if(H.wear_suit) H.wear_suit.screen_loc = null + if(H.wear_mask) H.wear_mask.screen_loc = null + if(H.head) H.head.screen_loc = null + + +/datum/hud/proc/persistant_inventory_update() + if(!mymob) + return + + if(ishuman(mymob)) + var/mob/living/carbon/human/H = mymob + if(hud_shown) + if(H.s_store) H.s_store.screen_loc = ui_sstore1 + if(H.wear_id) H.wear_id.screen_loc = ui_id + if(H.belt) H.belt.screen_loc = ui_belt + if(H.back) H.back.screen_loc = ui_back + if(H.l_store) H.l_store.screen_loc = ui_storage1 + if(H.r_store) H.r_store.screen_loc = ui_storage2 + else + if(H.s_store) H.s_store.screen_loc = null + if(H.wear_id) H.wear_id.screen_loc = null + if(H.belt) H.belt.screen_loc = null + if(H.back) H.back.screen_loc = null + if(H.l_store) H.l_store.screen_loc = null + if(H.r_store) H.r_store.screen_loc = null + + +/datum/hud/proc/instantiate() + if(!ismob(mymob)) + return 0 + if(!mymob.client) + return 0 + + var/ui_style = ui_style2icon(mymob.client.prefs.UI_style) + + if(ishuman(mymob)) + human_hud(ui_style) // Pass the player the UI style chosen in preferences + else if(ismonkey(mymob)) + monkey_hud(ui_style) + else if(isbrain(mymob)) + brain_hud(ui_style) + else if(islarva(mymob)) + larva_hud() + else if(isalien(mymob)) + alien_hud() + else if(isAI(mymob)) + ai_hud() + else if(isrobot(mymob)) + robot_hud() + else if(isobserver(mymob)) + ghost_hud() + else if(isovermind(mymob)) + blob_hud() + + if(istype(mymob.loc,/obj/mecha)) + show_hud(HUD_STYLE_REDUCED) + +//Version denotes which style should be displayed. blank or 0 means "next version" +/datum/hud/proc/show_hud(var/version = 0) + if(!ismob(mymob)) + return 0 + if(!mymob.client) + return 0 + var/display_hud_version = version + if(!display_hud_version) //If 0 or blank, display the next hud version + display_hud_version = hud_version + 1 + if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version + display_hud_version = 1 + + switch(display_hud_version) + if(HUD_STYLE_STANDARD) //Default HUD + hud_shown = 1 //Governs behavior of other procs + if(adding) + mymob.client.screen += adding + if(other && inventory_shown) + mymob.client.screen += other + if(hotkeybuttons && !hotkey_ui_hidden) + mymob.client.screen += hotkeybuttons + + action_intent.screen_loc = ui_acti //Restore intent selection to the original position + mymob.client.screen += mymob.zone_sel //This one is a special snowflake + mymob.client.screen += mymob.bodytemp //As are the rest of these... + mymob.client.screen += mymob.fire + mymob.client.screen += mymob.healths + mymob.client.screen += mymob.internals + mymob.client.screen += mymob.nutrition_icon + mymob.client.screen += mymob.oxygen + mymob.client.screen += mymob.pressure + mymob.client.screen += mymob.toxin + mymob.client.screen += lingstingdisplay + mymob.client.screen += lingchemdisplay + + hidden_inventory_update() + persistant_inventory_update() + mymob.update_action_buttons() + if(HUD_STYLE_REDUCED) //Reduced HUD + hud_shown = 0 //Governs behavior of other procs + if(adding) + mymob.client.screen -= adding + if(other) + mymob.client.screen -= other + if(hotkeybuttons) + mymob.client.screen -= hotkeybuttons + if(item_action_list) + mymob.client.screen -= item_action_list + + //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. + mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason. + mymob.client.screen -= lingstingdisplay + mymob.client.screen -= lingchemdisplay + + //These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay + mymob.client.screen += l_hand_hud_object //we want the hands to be visible + mymob.client.screen += r_hand_hud_object //we want the hands to be visible + mymob.client.screen += action_intent //we want the intent swticher visible + action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is. + + hidden_inventory_update() + persistant_inventory_update() + mymob.update_action_buttons() + if(HUD_STYLE_NOHUD) //No HUD + hud_shown = 0 //Governs behavior of other procs + if(adding) + mymob.client.screen -= adding + if(other) + mymob.client.screen -= other + if(hotkeybuttons) + mymob.client.screen -= hotkeybuttons + if(item_action_list) + mymob.client.screen -= item_action_list + + //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. + mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason. + mymob.client.screen -= mymob.bodytemp + mymob.client.screen -= mymob.fire + mymob.client.screen -= mymob.healths + mymob.client.screen -= mymob.internals + mymob.client.screen -= mymob.nutrition_icon + mymob.client.screen -= mymob.oxygen + mymob.client.screen -= mymob.pressure + mymob.client.screen -= mymob.toxin + mymob.client.screen -= lingstingdisplay + mymob.client.screen -= lingchemdisplay + + hidden_inventory_update() + persistant_inventory_update() + mymob.update_action_buttons() + hud_version = display_hud_version + +//Triggered when F12 is pressed (Unless someone changed something in the DMF) +/mob/verb/button_pressed_F12() + set name = "F12" + set hidden = 1 + + if(hud_used && client) + if(ishuman(src)) + hud_used.show_hud() //Shows the next hud preset + usr << "Switched HUD mode." + else + usr << "Inventory hiding is currently only supported for human mobs, sorry." + else + usr << "This mob type does not use a HUD." diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index e4f97df7408..87b3aaa984a 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -1,383 +1,383 @@ -/datum/hud/proc/human_hud(ui_style = 'icons/mob/screen_midnight.dmi') - adding = list() - other = list() - hotkeybuttons = list() //These can be disabled for hotkey users - - var/obj/screen/using - var/obj/screen/inventory/inv_box - - using = new /obj/screen() - using.name = "act_intent" - using.icon_state = mymob.a_intent - using.screen_loc = ui_acti - using.layer = 20 - adding += using - action_intent = using - - using = new /obj/screen() - using.name = "mov_intent" - using.icon = ui_style - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - adding += using - move_intent = using - - using = new /obj/screen() - using.name = "drop" - using.icon = ui_style - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.layer = 19 - hotkeybuttons += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "i_clothing" - inv_box.icon = ui_style - inv_box.slot_id = slot_w_uniform - inv_box.icon_state = "uniform" - inv_box.screen_loc = ui_iclothing - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "o_clothing" - inv_box.icon = ui_style - inv_box.slot_id = slot_wear_suit - inv_box.icon_state = "suit" - inv_box.screen_loc = ui_oclothing - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "r_hand" - inv_box.icon = ui_style - inv_box.icon_state = "hand_r_inactive" - if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use - inv_box.icon_state = "hand_r_active" - inv_box.screen_loc = ui_rhand - inv_box.slot_id = slot_r_hand - inv_box.layer = 19 - r_hand_hud_object = inv_box - adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "l_hand" - inv_box.icon = ui_style - inv_box.icon_state = "hand_l_inactive" - if(mymob && mymob.hand) //This being 1 means the left hand is in use - inv_box.icon_state = "hand_l_active" - inv_box.screen_loc = ui_lhand - inv_box.slot_id = slot_l_hand - inv_box.layer = 19 - l_hand_hud_object = inv_box - adding += inv_box - - using = new /obj/screen/inventory() - using.name = "hand" - using.icon = ui_style - using.icon_state = "swap_1" - using.screen_loc = ui_swaphand1 - using.layer = 19 - adding += using - - using = new /obj/screen/inventory() - using.name = "hand" - using.icon = ui_style - using.icon_state = "swap_2" - using.screen_loc = ui_swaphand2 - using.layer = 19 - adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "id" - inv_box.icon = ui_style - inv_box.icon_state = "id" - inv_box.screen_loc = ui_id - inv_box.slot_id = slot_wear_id - inv_box.layer = 19 - adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "mask" - inv_box.icon = ui_style - inv_box.icon_state = "mask" - inv_box.screen_loc = ui_mask - inv_box.slot_id = slot_wear_mask - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "back" - inv_box.icon = ui_style - inv_box.icon_state = "back" - inv_box.screen_loc = ui_back - inv_box.slot_id = slot_back - inv_box.layer = 19 - adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "storage1" - inv_box.icon = ui_style - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_storage1 - inv_box.slot_id = slot_l_store - inv_box.layer = 19 - adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "storage2" - inv_box.icon = ui_style - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_storage2 - inv_box.slot_id = slot_r_store - inv_box.layer = 19 - adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "suit storage" - inv_box.icon = ui_style - inv_box.icon_state = "suit_storage" - inv_box.screen_loc = ui_sstore1 - inv_box.slot_id = slot_s_store - inv_box.layer = 19 - adding += inv_box - - using = new /obj/screen() - using.name = "resist" - using.icon = ui_style - using.icon_state = "act_resist" - using.screen_loc = ui_pull_resist - using.layer = 19 - hotkeybuttons += using - - using = new /obj/screen() - using.name = "toggle" - using.icon = ui_style - using.icon_state = "toggle" - using.screen_loc = ui_inventory - using.layer = 20 - adding += using - - using = new /obj/screen() - using.name = "equip" - using.icon = ui_style - using.icon_state = "act_equip" - using.screen_loc = ui_equip - using.layer = 20 - adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "gloves" - inv_box.icon = ui_style - inv_box.icon_state = "gloves" - inv_box.screen_loc = ui_gloves - inv_box.slot_id = slot_gloves - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "eyes" - inv_box.icon = ui_style - inv_box.icon_state = "glasses" - inv_box.screen_loc = ui_glasses - inv_box.slot_id = slot_glasses - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "ears" - inv_box.icon = ui_style - inv_box.icon_state = "ears" - inv_box.screen_loc = ui_ears - inv_box.slot_id = slot_ears - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "head" - inv_box.icon = ui_style - inv_box.icon_state = "head" - inv_box.screen_loc = ui_head - inv_box.slot_id = slot_head - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "shoes" - inv_box.icon = ui_style - inv_box.icon_state = "shoes" - inv_box.screen_loc = ui_shoes - inv_box.slot_id = slot_shoes - inv_box.layer = 19 - other += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "belt" - inv_box.icon = ui_style - inv_box.icon_state = "belt" - inv_box.screen_loc = ui_belt - inv_box.slot_id = slot_belt - inv_box.layer = 19 - adding += inv_box - - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = ui_style - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw/catch" - mymob.throw_icon.screen_loc = ui_drop_throw - hotkeybuttons += mymob.throw_icon - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.pressure = new /obj/screen() - mymob.pressure.icon_state = "pressure0" - mymob.pressure.name = "pressure" - mymob.pressure.screen_loc = ui_pressure - - mymob.toxin = new /obj/screen() - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin - - mymob.internals = new /obj/screen() - mymob.internals.icon_state = "internal0" - mymob.internals.name = "internal" - mymob.internals.screen_loc = ui_internal - - mymob.fire = new /obj/screen() - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - - mymob.healths = new /obj/screen() - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_health - - mymob.nutrition_icon = new /obj/screen() - mymob.nutrition_icon.icon_state = "nutrition0" - mymob.nutrition_icon.name = "nutrition" - mymob.nutrition_icon.screen_loc = ui_nutrition - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = ui_style - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull_resist - hotkeybuttons += mymob.pullin - - lingchemdisplay = new /obj/screen() - lingchemdisplay.name = "chemical storage" - lingchemdisplay.icon_state = "power_display" - lingchemdisplay.screen_loc = ui_lingchemdisplay - lingchemdisplay.layer = 20 - lingchemdisplay.invisibility = 101 - - lingstingdisplay = new /obj/screen() - lingstingdisplay.name = "current sting" - lingstingdisplay.screen_loc = ui_lingstingdisplay - lingstingdisplay.layer = 20 - lingstingdisplay.invisibility = 101 - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "CENTER-7,CENTER-7" - mymob.blind.mouse_opacity = 0 - mymob.blind.layer = 0 - - mymob.damageoverlay = new /obj/screen() - mymob.damageoverlay.icon = 'icons/mob/screen_full.dmi' - mymob.damageoverlay.icon_state = "oxydamageoverlay0" - mymob.damageoverlay.name = "dmg" - mymob.damageoverlay.blend_mode = BLEND_MULTIPLY - mymob.damageoverlay.screen_loc = "CENTER-7,CENTER-7" - mymob.damageoverlay.mouse_opacity = 0 - mymob.damageoverlay.layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top. - - mymob.flash = new /obj/screen() - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.blend_mode = BLEND_ADD - mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel() - mymob.zone_sel.icon = ui_style - mymob.zone_sel.update_icon() - - mymob.client.screen = null - - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) - mymob.client.screen += adding + hotkeybuttons - inventory_shown = 0; - - -/mob/living/carbon/human/verb/toggle_hotkey_verbs() - set category = "OOC" - set name = "Toggle hotkey buttons" - set desc = "This disables or enables the user interface buttons which can be used with hotkeys." - - if(hud_used.hotkey_ui_hidden) - client.screen += hud_used.hotkeybuttons - hud_used.hotkey_ui_hidden = 0 - else - client.screen -= hud_used.hotkeybuttons - hud_used.hotkey_ui_hidden = 1 - - -/mob/living/carbon/human/update_action_buttons() - var/num = 1 - if(!hud_used) return - if(!client) return - - if(hud_used.hud_shown != 1) //Hud toggled to minimal - return - - client.screen -= hud_used.item_action_list - - for(var/obj/item/I in src) - if(I.action_button_name) - if(hud_used.item_action_list.len < num) - var/obj/screen/item_action/N = new(hud_used) - hud_used.item_action_list += N - - var/obj/screen/item_action/A = hud_used.item_action_list[num] - - A.icon = ui_style2icon(client.prefs.UI_style) - A.icon_state = "template" - - A.overlays = list() - var/image/img = image(I.icon, A, I.icon_state) - img.pixel_x = 0 - img.pixel_y = 0 - A.overlays += img - - A.name = I.action_button_name - A.owner = I - - client.screen += hud_used.item_action_list[num] - - switch(num) - if(1) - A.screen_loc = ui_action_slot1 - if(2) - A.screen_loc = ui_action_slot2 - if(3) - A.screen_loc = ui_action_slot3 - if(4) - A.screen_loc = ui_action_slot4 - if(5) - A.screen_loc = ui_action_slot5 - break //5 slots available, so no more can be added. - num++ +/datum/hud/proc/human_hud(ui_style = 'icons/mob/screen_midnight.dmi') + adding = list() + other = list() + hotkeybuttons = list() //These can be disabled for hotkey users + + var/obj/screen/using + var/obj/screen/inventory/inv_box + + using = new /obj/screen() + using.name = "act_intent" + using.icon_state = mymob.a_intent + using.screen_loc = ui_acti + using.layer = 20 + adding += using + action_intent = using + + using = new /obj/screen() + using.name = "mov_intent" + using.icon = ui_style + using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") + using.screen_loc = ui_movi + using.layer = 20 + adding += using + move_intent = using + + using = new /obj/screen() + using.name = "drop" + using.icon = ui_style + using.icon_state = "act_drop" + using.screen_loc = ui_drop_throw + using.layer = 19 + hotkeybuttons += using + + inv_box = new /obj/screen/inventory() + inv_box.name = "i_clothing" + inv_box.icon = ui_style + inv_box.slot_id = slot_w_uniform + inv_box.icon_state = "uniform" + inv_box.screen_loc = ui_iclothing + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "o_clothing" + inv_box.icon = ui_style + inv_box.slot_id = slot_wear_suit + inv_box.icon_state = "suit" + inv_box.screen_loc = ui_oclothing + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "r_hand" + inv_box.icon = ui_style + inv_box.icon_state = "hand_r_inactive" + if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use + inv_box.icon_state = "hand_r_active" + inv_box.screen_loc = ui_rhand + inv_box.slot_id = slot_r_hand + inv_box.layer = 19 + r_hand_hud_object = inv_box + adding += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "l_hand" + inv_box.icon = ui_style + inv_box.icon_state = "hand_l_inactive" + if(mymob && mymob.hand) //This being 1 means the left hand is in use + inv_box.icon_state = "hand_l_active" + inv_box.screen_loc = ui_lhand + inv_box.slot_id = slot_l_hand + inv_box.layer = 19 + l_hand_hud_object = inv_box + adding += inv_box + + using = new /obj/screen/inventory() + using.name = "hand" + using.icon = ui_style + using.icon_state = "swap_1" + using.screen_loc = ui_swaphand1 + using.layer = 19 + adding += using + + using = new /obj/screen/inventory() + using.name = "hand" + using.icon = ui_style + using.icon_state = "swap_2" + using.screen_loc = ui_swaphand2 + using.layer = 19 + adding += using + + inv_box = new /obj/screen/inventory() + inv_box.name = "id" + inv_box.icon = ui_style + inv_box.icon_state = "id" + inv_box.screen_loc = ui_id + inv_box.slot_id = slot_wear_id + inv_box.layer = 19 + adding += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "mask" + inv_box.icon = ui_style + inv_box.icon_state = "mask" + inv_box.screen_loc = ui_mask + inv_box.slot_id = slot_wear_mask + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "back" + inv_box.icon = ui_style + inv_box.icon_state = "back" + inv_box.screen_loc = ui_back + inv_box.slot_id = slot_back + inv_box.layer = 19 + adding += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "storage1" + inv_box.icon = ui_style + inv_box.icon_state = "pocket" + inv_box.screen_loc = ui_storage1 + inv_box.slot_id = slot_l_store + inv_box.layer = 19 + adding += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "storage2" + inv_box.icon = ui_style + inv_box.icon_state = "pocket" + inv_box.screen_loc = ui_storage2 + inv_box.slot_id = slot_r_store + inv_box.layer = 19 + adding += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "suit storage" + inv_box.icon = ui_style + inv_box.icon_state = "suit_storage" + inv_box.screen_loc = ui_sstore1 + inv_box.slot_id = slot_s_store + inv_box.layer = 19 + adding += inv_box + + using = new /obj/screen() + using.name = "resist" + using.icon = ui_style + using.icon_state = "act_resist" + using.screen_loc = ui_pull_resist + using.layer = 19 + hotkeybuttons += using + + using = new /obj/screen() + using.name = "toggle" + using.icon = ui_style + using.icon_state = "toggle" + using.screen_loc = ui_inventory + using.layer = 20 + adding += using + + using = new /obj/screen() + using.name = "equip" + using.icon = ui_style + using.icon_state = "act_equip" + using.screen_loc = ui_equip + using.layer = 20 + adding += using + + inv_box = new /obj/screen/inventory() + inv_box.name = "gloves" + inv_box.icon = ui_style + inv_box.icon_state = "gloves" + inv_box.screen_loc = ui_gloves + inv_box.slot_id = slot_gloves + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "eyes" + inv_box.icon = ui_style + inv_box.icon_state = "glasses" + inv_box.screen_loc = ui_glasses + inv_box.slot_id = slot_glasses + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "ears" + inv_box.icon = ui_style + inv_box.icon_state = "ears" + inv_box.screen_loc = ui_ears + inv_box.slot_id = slot_ears + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "head" + inv_box.icon = ui_style + inv_box.icon_state = "head" + inv_box.screen_loc = ui_head + inv_box.slot_id = slot_head + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "shoes" + inv_box.icon = ui_style + inv_box.icon_state = "shoes" + inv_box.screen_loc = ui_shoes + inv_box.slot_id = slot_shoes + inv_box.layer = 19 + other += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "belt" + inv_box.icon = ui_style + inv_box.icon_state = "belt" + inv_box.screen_loc = ui_belt + inv_box.slot_id = slot_belt + inv_box.layer = 19 + adding += inv_box + + mymob.throw_icon = new /obj/screen() + mymob.throw_icon.icon = ui_style + mymob.throw_icon.icon_state = "act_throw_off" + mymob.throw_icon.name = "throw/catch" + mymob.throw_icon.screen_loc = ui_drop_throw + hotkeybuttons += mymob.throw_icon + + mymob.oxygen = new /obj/screen() + mymob.oxygen.icon_state = "oxy0" + mymob.oxygen.name = "oxygen" + mymob.oxygen.screen_loc = ui_oxygen + + mymob.pressure = new /obj/screen() + mymob.pressure.icon_state = "pressure0" + mymob.pressure.name = "pressure" + mymob.pressure.screen_loc = ui_pressure + + mymob.toxin = new /obj/screen() + mymob.toxin.icon_state = "tox0" + mymob.toxin.name = "toxin" + mymob.toxin.screen_loc = ui_toxin + + mymob.internals = new /obj/screen() + mymob.internals.icon_state = "internal0" + mymob.internals.name = "internal" + mymob.internals.screen_loc = ui_internal + + mymob.fire = new /obj/screen() + mymob.fire.icon_state = "fire0" + mymob.fire.name = "fire" + mymob.fire.screen_loc = ui_fire + + mymob.bodytemp = new /obj/screen() + mymob.bodytemp.icon_state = "temp1" + mymob.bodytemp.name = "body temperature" + mymob.bodytemp.screen_loc = ui_temp + + mymob.healths = new /obj/screen() + mymob.healths.icon_state = "health0" + mymob.healths.name = "health" + mymob.healths.screen_loc = ui_health + + mymob.nutrition_icon = new /obj/screen() + mymob.nutrition_icon.icon_state = "nutrition0" + mymob.nutrition_icon.name = "nutrition" + mymob.nutrition_icon.screen_loc = ui_nutrition + + mymob.pullin = new /obj/screen() + mymob.pullin.icon = ui_style + mymob.pullin.icon_state = "pull0" + mymob.pullin.name = "pull" + mymob.pullin.screen_loc = ui_pull_resist + hotkeybuttons += mymob.pullin + + lingchemdisplay = new /obj/screen() + lingchemdisplay.name = "chemical storage" + lingchemdisplay.icon_state = "power_display" + lingchemdisplay.screen_loc = ui_lingchemdisplay + lingchemdisplay.layer = 20 + lingchemdisplay.invisibility = 101 + + lingstingdisplay = new /obj/screen() + lingstingdisplay.name = "current sting" + lingstingdisplay.screen_loc = ui_lingstingdisplay + lingstingdisplay.layer = 20 + lingstingdisplay.invisibility = 101 + + mymob.blind = new /obj/screen() + mymob.blind.icon = 'icons/mob/screen_full.dmi' + mymob.blind.icon_state = "blackimageoverlay" + mymob.blind.name = " " + mymob.blind.screen_loc = "CENTER-7,CENTER-7" + mymob.blind.mouse_opacity = 0 + mymob.blind.layer = 0 + + mymob.damageoverlay = new /obj/screen() + mymob.damageoverlay.icon = 'icons/mob/screen_full.dmi' + mymob.damageoverlay.icon_state = "oxydamageoverlay0" + mymob.damageoverlay.name = "dmg" + mymob.damageoverlay.blend_mode = BLEND_MULTIPLY + mymob.damageoverlay.screen_loc = "CENTER-7,CENTER-7" + mymob.damageoverlay.mouse_opacity = 0 + mymob.damageoverlay.layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top. + + mymob.flash = new /obj/screen() + mymob.flash.icon_state = "blank" + mymob.flash.name = "flash" + mymob.flash.blend_mode = BLEND_ADD + mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" + mymob.flash.layer = 17 + + mymob.zone_sel = new /obj/screen/zone_sel() + mymob.zone_sel.icon = ui_style + mymob.zone_sel.update_icon() + + mymob.client.screen = null + + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) + mymob.client.screen += adding + hotkeybuttons + inventory_shown = 0; + + +/mob/living/carbon/human/verb/toggle_hotkey_verbs() + set category = "OOC" + set name = "Toggle hotkey buttons" + set desc = "This disables or enables the user interface buttons which can be used with hotkeys." + + if(hud_used.hotkey_ui_hidden) + client.screen += hud_used.hotkeybuttons + hud_used.hotkey_ui_hidden = 0 + else + client.screen -= hud_used.hotkeybuttons + hud_used.hotkey_ui_hidden = 1 + + +/mob/living/carbon/human/update_action_buttons() + var/num = 1 + if(!hud_used) return + if(!client) return + + if(hud_used.hud_shown != 1) //Hud toggled to minimal + return + + client.screen -= hud_used.item_action_list + + for(var/obj/item/I in src) + if(I.action_button_name) + if(hud_used.item_action_list.len < num) + var/obj/screen/item_action/N = new(hud_used) + hud_used.item_action_list += N + + var/obj/screen/item_action/A = hud_used.item_action_list[num] + + A.icon = ui_style2icon(client.prefs.UI_style) + A.icon_state = "template" + + A.overlays = list() + var/image/img = image(I.icon, A, I.icon_state) + img.pixel_x = 0 + img.pixel_y = 0 + A.overlays += img + + A.name = I.action_button_name + A.owner = I + + client.screen += hud_used.item_action_list[num] + + switch(num) + if(1) + A.screen_loc = ui_action_slot1 + if(2) + A.screen_loc = ui_action_slot2 + if(3) + A.screen_loc = ui_action_slot3 + if(4) + A.screen_loc = ui_action_slot4 + if(5) + A.screen_loc = ui_action_slot5 + break //5 slots available, so no more can be added. + num++ diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index 2cb47a2e57e..e1ccf1732a6 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -1,35 +1,35 @@ - -/datum/hud/proc/unplayer_hud() - return - -/datum/hud/proc/ghost_hud() - return - -/datum/hud/proc/brain_hud(ui_style = 'icons/mob/screen_midnight.dmi') - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "CENTER-7,CENTER-7" - mymob.blind.layer = 0 - -/datum/hud/proc/ai_hud() - return - -/datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen_midnight.dmi') - - blobpwrdisplay = new /obj/screen() - blobpwrdisplay.name = "blob power" - blobpwrdisplay.icon_state = "block" - blobpwrdisplay.screen_loc = ui_health - blobpwrdisplay.layer = 20 - - blobhealthdisplay = new /obj/screen() - blobhealthdisplay.name = "blob health" - blobhealthdisplay.icon_state = "block" - blobhealthdisplay.screen_loc = ui_internal - blobhealthdisplay.layer = 20 - - mymob.client.screen = null - - mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay) + +/datum/hud/proc/unplayer_hud() + return + +/datum/hud/proc/ghost_hud() + return + +/datum/hud/proc/brain_hud(ui_style = 'icons/mob/screen_midnight.dmi') + mymob.blind = new /obj/screen() + mymob.blind.icon = 'icons/mob/screen_full.dmi' + mymob.blind.icon_state = "blackimageoverlay" + mymob.blind.name = " " + mymob.blind.screen_loc = "CENTER-7,CENTER-7" + mymob.blind.layer = 0 + +/datum/hud/proc/ai_hud() + return + +/datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen_midnight.dmi') + + blobpwrdisplay = new /obj/screen() + blobpwrdisplay.name = "blob power" + blobpwrdisplay.icon_state = "block" + blobpwrdisplay.screen_loc = ui_health + blobpwrdisplay.layer = 20 + + blobhealthdisplay = new /obj/screen() + blobhealthdisplay.name = "blob health" + blobhealthdisplay.icon_state = "block" + blobhealthdisplay.screen_loc = ui_internal + blobhealthdisplay.layer = 20 + + mymob.client.screen = null + + mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay) diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 2b9e8eab76b..813d44dfdf9 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,195 +1,195 @@ -/datum/hud/proc/robot_hud() - adding = list() - other = list() - - var/obj/screen/using - - -//Radio - using = new /obj/screen() - using.name = "radio" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "radio" - using.screen_loc = ui_borg_radio - using.layer = 20 - adding += using - -//Module select - - using = new /obj/screen() - using.name = "module1" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "inv1" - using.screen_loc = ui_inv1 - using.layer = 20 - adding += using - mymob:inv1 = using - - using = new /obj/screen() - using.name = "module2" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "inv2" - using.screen_loc = ui_inv2 - using.layer = 20 - adding += using - mymob:inv2 = using - - using = new /obj/screen() - using.name = "module3" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = "inv3" - using.screen_loc = ui_inv3 - using.layer = 20 - adding += using - mymob:inv3 = using - -//End of module select - -//Intent - using = new /obj/screen() - using.name = "act_intent" - using.icon = 'icons/mob/screen_cyborg.dmi' - using.icon_state = mymob.a_intent - using.screen_loc = ui_borg_intents - using.layer = 20 - adding += using - action_intent = using - -//Cell - mymob:cells = new /obj/screen() - mymob:cells.icon = 'icons/mob/screen_cyborg.dmi' - mymob:cells.icon_state = "charge-empty" - mymob:cells.name = "cell" - mymob:cells.screen_loc = ui_toxin - -//Health - mymob.healths = new /obj/screen() - mymob.healths.icon = 'icons/mob/screen_cyborg.dmi' - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_borg_health - -//Installed Module - mymob.hands = new /obj/screen() - mymob.hands.icon = 'icons/mob/screen_cyborg.dmi' - mymob.hands.icon_state = "nomod" - mymob.hands.name = "module" - mymob.hands.screen_loc = ui_borg_module - -//Store - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = 'icons/mob/screen_cyborg.dmi' - mymob.throw_icon.icon_state = "store" - mymob.throw_icon.name = "store" - mymob.throw_icon.screen_loc = ui_borg_store - -//Temp - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon_state = "temp0" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen_cyborg.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen_cyborg.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = 'icons/mob/screen_cyborg.dmi' - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_borg_pull - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "CENTER-7,CENTER-7" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen_cyborg.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel() - mymob.zone_sel.icon = 'icons/mob/screen_cyborg.dmi' - mymob.zone_sel.update_icon() - - mymob.client.screen = null - - mymob.client.screen += list(mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) - mymob.client.screen += adding + other - - return - - -/datum/hud/proc/toggle_show_robot_modules() - if(!isrobot(mymob)) return - - var/mob/living/silicon/robot/r = mymob - - r.shown_robot_modules = !r.shown_robot_modules - update_robot_modules_display() - -/datum/hud/proc/update_robot_modules_display() - if(!isrobot(mymob)) return - - var/mob/living/silicon/robot/r = mymob - - if(r.client) - if(r.shown_robot_modules) - //Modules display is shown - r.client.screen += r.throw_icon //"store" icon - - if(!r.module) - usr << "No module selected" - return - - if(!r.module.modules) - usr << "Selected module has no modules to select" - return - - if(!r.robot_modules_background) - return - - var/display_rows = Ceiling(length(r.module.get_inactive_modules()) / 8) - 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 - - var/x = -4 //Start at CENTER-4,SOUTH+1 - var/y = 1 - - for(var/atom/movable/A in r.module.get_inactive_modules()) - //Module is not currently active - r.client.screen += A - if(x < 0) - A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" - else - A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" - A.layer = 20 - - x++ - if(x == 4) - x = -4 - y++ - - else - //Modules display is hidden - r.client.screen -= r.throw_icon //"store" icon - - for(var/atom/A in r.module.get_inactive_modules()) - //Module is not currently active - r.client.screen -= A - r.shown_robot_modules = 0 +/datum/hud/proc/robot_hud() + adding = list() + other = list() + + var/obj/screen/using + + +//Radio + using = new /obj/screen() + using.name = "radio" + using.icon = 'icons/mob/screen_cyborg.dmi' + using.icon_state = "radio" + using.screen_loc = ui_borg_radio + using.layer = 20 + adding += using + +//Module select + + using = new /obj/screen() + using.name = "module1" + using.icon = 'icons/mob/screen_cyborg.dmi' + using.icon_state = "inv1" + using.screen_loc = ui_inv1 + using.layer = 20 + adding += using + mymob:inv1 = using + + using = new /obj/screen() + using.name = "module2" + using.icon = 'icons/mob/screen_cyborg.dmi' + using.icon_state = "inv2" + using.screen_loc = ui_inv2 + using.layer = 20 + adding += using + mymob:inv2 = using + + using = new /obj/screen() + using.name = "module3" + using.icon = 'icons/mob/screen_cyborg.dmi' + using.icon_state = "inv3" + using.screen_loc = ui_inv3 + using.layer = 20 + adding += using + mymob:inv3 = using + +//End of module select + +//Intent + using = new /obj/screen() + using.name = "act_intent" + using.icon = 'icons/mob/screen_cyborg.dmi' + using.icon_state = mymob.a_intent + using.screen_loc = ui_borg_intents + using.layer = 20 + adding += using + action_intent = using + +//Cell + mymob:cells = new /obj/screen() + mymob:cells.icon = 'icons/mob/screen_cyborg.dmi' + mymob:cells.icon_state = "charge-empty" + mymob:cells.name = "cell" + mymob:cells.screen_loc = ui_toxin + +//Health + mymob.healths = new /obj/screen() + mymob.healths.icon = 'icons/mob/screen_cyborg.dmi' + mymob.healths.icon_state = "health0" + mymob.healths.name = "health" + mymob.healths.screen_loc = ui_borg_health + +//Installed Module + mymob.hands = new /obj/screen() + mymob.hands.icon = 'icons/mob/screen_cyborg.dmi' + mymob.hands.icon_state = "nomod" + mymob.hands.name = "module" + mymob.hands.screen_loc = ui_borg_module + +//Store + mymob.throw_icon = new /obj/screen() + mymob.throw_icon.icon = 'icons/mob/screen_cyborg.dmi' + mymob.throw_icon.icon_state = "store" + mymob.throw_icon.name = "store" + mymob.throw_icon.screen_loc = ui_borg_store + +//Temp + mymob.bodytemp = new /obj/screen() + mymob.bodytemp.icon_state = "temp0" + mymob.bodytemp.name = "body temperature" + mymob.bodytemp.screen_loc = ui_temp + + + mymob.oxygen = new /obj/screen() + mymob.oxygen.icon = 'icons/mob/screen_cyborg.dmi' + mymob.oxygen.icon_state = "oxy0" + mymob.oxygen.name = "oxygen" + mymob.oxygen.screen_loc = ui_oxygen + + mymob.fire = new /obj/screen() + mymob.fire.icon = 'icons/mob/screen_cyborg.dmi' + mymob.fire.icon_state = "fire0" + mymob.fire.name = "fire" + mymob.fire.screen_loc = ui_fire + + mymob.pullin = new /obj/screen() + mymob.pullin.icon = 'icons/mob/screen_cyborg.dmi' + mymob.pullin.icon_state = "pull0" + mymob.pullin.name = "pull" + mymob.pullin.screen_loc = ui_borg_pull + + mymob.blind = new /obj/screen() + mymob.blind.icon = 'icons/mob/screen_full.dmi' + mymob.blind.icon_state = "blackimageoverlay" + mymob.blind.name = " " + mymob.blind.screen_loc = "CENTER-7,CENTER-7" + mymob.blind.layer = 0 + + mymob.flash = new /obj/screen() + mymob.flash.icon = 'icons/mob/screen_cyborg.dmi' + mymob.flash.icon_state = "blank" + mymob.flash.name = "flash" + mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" + mymob.flash.layer = 17 + + mymob.zone_sel = new /obj/screen/zone_sel() + mymob.zone_sel.icon = 'icons/mob/screen_cyborg.dmi' + mymob.zone_sel.update_icon() + + mymob.client.screen = null + + mymob.client.screen += list(mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += adding + other + + return + + +/datum/hud/proc/toggle_show_robot_modules() + if(!isrobot(mymob)) return + + var/mob/living/silicon/robot/r = mymob + + r.shown_robot_modules = !r.shown_robot_modules + update_robot_modules_display() + +/datum/hud/proc/update_robot_modules_display() + if(!isrobot(mymob)) return + + var/mob/living/silicon/robot/r = mymob + + if(r.client) + if(r.shown_robot_modules) + //Modules display is shown + r.client.screen += r.throw_icon //"store" icon + + if(!r.module) + usr << "No module selected" + return + + if(!r.module.modules) + usr << "Selected module has no modules to select" + return + + if(!r.robot_modules_background) + return + + var/display_rows = Ceiling(length(r.module.get_inactive_modules()) / 8) + 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 + + var/x = -4 //Start at CENTER-4,SOUTH+1 + var/y = 1 + + for(var/atom/movable/A in r.module.get_inactive_modules()) + //Module is not currently active + r.client.screen += A + if(x < 0) + A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" + else + A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" + A.layer = 20 + + x++ + if(x == 4) + x = -4 + y++ + + else + //Modules display is hidden + r.client.screen -= r.throw_icon //"store" icon + + for(var/atom/A in r.module.get_inactive_modules()) + //Module is not currently active + r.client.screen -= A + r.shown_robot_modules = 0 r.client.screen -= r.robot_modules_background \ No newline at end of file diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 4b1a3e225ea..0b43b498a37 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -1,324 +1,324 @@ -/* - Screen objects - Todo: improve/re-implement - - Screen objects are only used for the hud and should not appear anywhere "in-game". - They are used with the client/screen list and the screen_loc var. - For more information, see the byond documentation on the screen_loc and screen vars. -*/ -/obj/screen - name = "" - icon = 'icons/mob/screen_gen.dmi' - layer = 20.0 - unacidable = 1 - var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. - - -/obj/screen/text - icon = null - icon_state = null - mouse_opacity = 0 - screen_loc = "CENTER-7,CENTER-7" - maptext_height = 480 - maptext_width = 480 - - -/obj/screen/inventory - var/slot_id //The indentifier for the slot. It has nothing to do with ID cards. - - -/obj/screen/close - name = "close" - -/obj/screen/close/Click() - if(master) - if(istype(master, /obj/item/weapon/storage)) - var/obj/item/weapon/storage/S = master - S.close(usr) - return 1 - - -/obj/screen/item_action - var/obj/item/owner - -/obj/screen/item_action/Click() - if(!usr || !owner) - return 1 - if(usr.next_move >= world.time) - return - usr.next_move = world.time + 6 - - if(usr.stat || usr.restrained() || usr.stunned || usr.lying) - return 1 - - if(!(owner in usr)) - return 1 - - owner.ui_action_click() - return 1 - -//This is the proc used to update all the action buttons. It just returns for all mob types except humans. -/mob/proc/update_action_buttons() - return - - -/obj/screen/grab - name = "grab" - -/obj/screen/grab/Click() - var/obj/item/weapon/grab/G = master - G.s_click(src) - return 1 - -/obj/screen/grab/attack_hand() - return - -/obj/screen/grab/attackby() - return - - -/obj/screen/storage - name = "storage" - -/obj/screen/storage/Click() - if(world.time <= usr.next_move) - return 1 - if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) - return 1 - if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech - return 1 - if(master) - var/obj/item/I = usr.get_active_hand() - if(I) - master.attackby(I, usr) - usr.next_move = world.time+2 - return 1 - -/obj/screen/zone_sel - name = "damage zone" - icon_state = "zone_sel" - screen_loc = ui_zonesel - var/selecting = "chest" - -/obj/screen/zone_sel/Click(location, control,params) - var/list/PL = params2list(params) - var/icon_x = text2num(PL["icon-x"]) - var/icon_y = text2num(PL["icon-y"]) - var/old_selecting = selecting //We're only going to update_icon() if there's been a change - - switch(icon_y) - if(1 to 9) //Legs - switch(icon_x) - if(10 to 15) - selecting = "r_leg" - if(17 to 22) - selecting = "l_leg" - else - return 1 - if(10 to 13) //Hands and groin - switch(icon_x) - if(8 to 11) - selecting = "r_arm" - if(12 to 20) - selecting = "groin" - if(21 to 24) - selecting = "l_arm" - else - return 1 - if(14 to 22) //Chest and arms to shoulders - switch(icon_x) - if(8 to 11) - selecting = "r_arm" - if(12 to 20) - selecting = "chest" - if(21 to 24) - selecting = "l_arm" - else - return 1 - if(23 to 30) //Head, but we need to check for eye or mouth - if(icon_x in 12 to 20) - selecting = "head" - switch(icon_y) - if(23 to 24) - if(icon_x in 15 to 17) - selecting = "mouth" - if(26) //Eyeline, eyes are on 15 and 17 - if(icon_x in 14 to 18) - selecting = "eyes" - if(25 to 27) - if(icon_x in 15 to 17) - selecting = "eyes" - - if(old_selecting != selecting) - update_icon() - return 1 - -/obj/screen/zone_sel/update_icon() - overlays.Cut() - overlays += image('icons/mob/screen_gen.dmi', "[selecting]") - - -/obj/screen/Click(location, control, params) - if(!usr) return 1 - - switch(name) - if("toggle") - if(usr.hud_used.inventory_shown) - usr.hud_used.inventory_shown = 0 - usr.client.screen -= usr.hud_used.other - else - usr.hud_used.inventory_shown = 1 - usr.client.screen += usr.hud_used.other - - usr.hud_used.hidden_inventory_update() - - if("equip") - if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech - return 1 - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - H.quick_equip() - - if("current sting") - var/mob/living/carbon/U = usr - U.unset_sting() - - if("resist") - if(isliving(usr)) - var/mob/living/L = usr - L.resist() - - if("mov_intent") - switch(usr.m_intent) - if("run") - usr.m_intent = "walk" - usr.hud_used.move_intent.icon_state = "walking" - if("walk") - usr.m_intent = "run" - usr.hud_used.move_intent.icon_state = "running" - if(istype(usr,/mob/living/carbon/alien/humanoid)) - usr.update_icons() - if("Reset Machine") - usr.unset_machine() - if("internal") - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(!C.stat && !C.stunned && !C.paralysis && !C.restrained()) - if(C.internal) - C.internal = null - C << "No longer running on internals." - if(C.internals) - C.internals.icon_state = "internal0" - else - if(!istype(C.wear_mask, /obj/item/clothing/mask)) - C << "You are not wearing a mask." - return 1 - else - if(istype(C.l_hand, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.l_hand] on your left hand." - C.internal = C.l_hand - else if(istype(C.r_hand, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.r_hand] on your right hand." - C.internal = C.r_hand - else if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(istype(H.s_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]." - H.internal = H.s_store - else if(istype(H.belt, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.belt] on your belt." - H.internal = H.belt - else if(istype(H.l_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.l_store] in your left pocket." - H.internal = H.l_store - else if(istype(H.r_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.r_store] in your right pocket." - H.internal = H.r_store - - //Seperate so CO2 jetpacks are a little less cumbersome. - if(!C.internal && istype(C.back, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.back] on your back." - C.internal = C.back - - if(C.internal) - if(C.internals) - C.internals.icon_state = "internal1" - else - C << "You don't have an oxygen tank." - if("act_intent") - usr.a_intent_change("right") - if("pull") - usr.stop_pulling() - if("throw/catch") - if(!usr.stat && isturf(usr.loc) && !usr.restrained()) - usr:toggle_throw_mode() - if("drop") - usr.drop_item_v() - - if("module") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - if(R.module) - R.hud_used.toggle_show_robot_modules() - return 1 - R.pick_module() - - if("radio") - if(issilicon(usr)) - usr:radio_menu() - if("panel") - if(issilicon(usr)) - usr:installed_modules() - - if("store") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.uneq_active() - R.hud_used.update_robot_modules_display() - - if("module1") - if(istype(usr, /mob/living/silicon/robot)) - usr:toggle_module(1) - - if("module2") - if(istype(usr, /mob/living/silicon/robot)) - usr:toggle_module(2) - - if("module3") - if(istype(usr, /mob/living/silicon/robot)) - usr:toggle_module(3) - - else - return 0 - return 1 - -/obj/screen/inventory/Click() - // At this point in client Click() code we have passed the 1/10 sec check and little else - // We don't even know if it's a middle click - if(world.time <= usr.next_move) - return 1 - if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) - return 1 - if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech - return 1 - switch(name) - if("r_hand") - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.activate_hand("r") - usr.next_move = world.time+2 - if("l_hand") - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.activate_hand("l") - usr.next_move = world.time+2 - if("swap") - usr:swap_hand() - if("hand") - usr:swap_hand() - else - if(usr.attack_ui(slot_id)) - usr.update_inv_l_hand(0) - usr.update_inv_r_hand(0) - usr.next_move = world.time+6 - return 1 +/* + Screen objects + Todo: improve/re-implement + + Screen objects are only used for the hud and should not appear anywhere "in-game". + They are used with the client/screen list and the screen_loc var. + For more information, see the byond documentation on the screen_loc and screen vars. +*/ +/obj/screen + name = "" + icon = 'icons/mob/screen_gen.dmi' + layer = 20.0 + unacidable = 1 + var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. + + +/obj/screen/text + icon = null + icon_state = null + mouse_opacity = 0 + screen_loc = "CENTER-7,CENTER-7" + maptext_height = 480 + maptext_width = 480 + + +/obj/screen/inventory + var/slot_id //The indentifier for the slot. It has nothing to do with ID cards. + + +/obj/screen/close + name = "close" + +/obj/screen/close/Click() + if(master) + if(istype(master, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = master + S.close(usr) + return 1 + + +/obj/screen/item_action + var/obj/item/owner + +/obj/screen/item_action/Click() + if(!usr || !owner) + return 1 + if(usr.next_move >= world.time) + return + usr.next_move = world.time + 6 + + if(usr.stat || usr.restrained() || usr.stunned || usr.lying) + return 1 + + if(!(owner in usr)) + return 1 + + owner.ui_action_click() + return 1 + +//This is the proc used to update all the action buttons. It just returns for all mob types except humans. +/mob/proc/update_action_buttons() + return + + +/obj/screen/grab + name = "grab" + +/obj/screen/grab/Click() + var/obj/item/weapon/grab/G = master + G.s_click(src) + return 1 + +/obj/screen/grab/attack_hand() + return + +/obj/screen/grab/attackby() + return + + +/obj/screen/storage + name = "storage" + +/obj/screen/storage/Click() + if(world.time <= usr.next_move) + return 1 + if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) + return 1 + if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech + return 1 + if(master) + var/obj/item/I = usr.get_active_hand() + if(I) + master.attackby(I, usr) + usr.next_move = world.time+2 + return 1 + +/obj/screen/zone_sel + name = "damage zone" + icon_state = "zone_sel" + screen_loc = ui_zonesel + var/selecting = "chest" + +/obj/screen/zone_sel/Click(location, control,params) + var/list/PL = params2list(params) + var/icon_x = text2num(PL["icon-x"]) + var/icon_y = text2num(PL["icon-y"]) + var/old_selecting = selecting //We're only going to update_icon() if there's been a change + + switch(icon_y) + if(1 to 9) //Legs + switch(icon_x) + if(10 to 15) + selecting = "r_leg" + if(17 to 22) + selecting = "l_leg" + else + return 1 + if(10 to 13) //Hands and groin + switch(icon_x) + if(8 to 11) + selecting = "r_arm" + if(12 to 20) + selecting = "groin" + if(21 to 24) + selecting = "l_arm" + else + return 1 + if(14 to 22) //Chest and arms to shoulders + switch(icon_x) + if(8 to 11) + selecting = "r_arm" + if(12 to 20) + selecting = "chest" + if(21 to 24) + selecting = "l_arm" + else + return 1 + if(23 to 30) //Head, but we need to check for eye or mouth + if(icon_x in 12 to 20) + selecting = "head" + switch(icon_y) + if(23 to 24) + if(icon_x in 15 to 17) + selecting = "mouth" + if(26) //Eyeline, eyes are on 15 and 17 + if(icon_x in 14 to 18) + selecting = "eyes" + if(25 to 27) + if(icon_x in 15 to 17) + selecting = "eyes" + + if(old_selecting != selecting) + update_icon() + return 1 + +/obj/screen/zone_sel/update_icon() + overlays.Cut() + overlays += image('icons/mob/screen_gen.dmi', "[selecting]") + + +/obj/screen/Click(location, control, params) + if(!usr) return 1 + + switch(name) + if("toggle") + if(usr.hud_used.inventory_shown) + usr.hud_used.inventory_shown = 0 + usr.client.screen -= usr.hud_used.other + else + usr.hud_used.inventory_shown = 1 + usr.client.screen += usr.hud_used.other + + usr.hud_used.hidden_inventory_update() + + if("equip") + if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech + return 1 + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + H.quick_equip() + + if("current sting") + var/mob/living/carbon/U = usr + U.unset_sting() + + if("resist") + if(isliving(usr)) + var/mob/living/L = usr + L.resist() + + if("mov_intent") + switch(usr.m_intent) + if("run") + usr.m_intent = "walk" + usr.hud_used.move_intent.icon_state = "walking" + if("walk") + usr.m_intent = "run" + usr.hud_used.move_intent.icon_state = "running" + if(istype(usr,/mob/living/carbon/alien/humanoid)) + usr.update_icons() + if("Reset Machine") + usr.unset_machine() + if("internal") + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + if(!C.stat && !C.stunned && !C.paralysis && !C.restrained()) + if(C.internal) + C.internal = null + C << "No longer running on internals." + if(C.internals) + C.internals.icon_state = "internal0" + else + if(!istype(C.wear_mask, /obj/item/clothing/mask)) + C << "You are not wearing a mask." + return 1 + else + if(istype(C.l_hand, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.l_hand] on your left hand." + C.internal = C.l_hand + else if(istype(C.r_hand, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.r_hand] on your right hand." + C.internal = C.r_hand + else if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(istype(H.s_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]." + H.internal = H.s_store + else if(istype(H.belt, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.belt] on your belt." + H.internal = H.belt + else if(istype(H.l_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.l_store] in your left pocket." + H.internal = H.l_store + else if(istype(H.r_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.r_store] in your right pocket." + H.internal = H.r_store + + //Seperate so CO2 jetpacks are a little less cumbersome. + if(!C.internal && istype(C.back, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.back] on your back." + C.internal = C.back + + if(C.internal) + if(C.internals) + C.internals.icon_state = "internal1" + else + C << "You don't have an oxygen tank." + if("act_intent") + usr.a_intent_change("right") + if("pull") + usr.stop_pulling() + if("throw/catch") + if(!usr.stat && isturf(usr.loc) && !usr.restrained()) + usr:toggle_throw_mode() + if("drop") + usr.drop_item_v() + + if("module") + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + if(R.module) + R.hud_used.toggle_show_robot_modules() + return 1 + R.pick_module() + + if("radio") + if(issilicon(usr)) + usr:radio_menu() + if("panel") + if(issilicon(usr)) + usr:installed_modules() + + if("store") + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + R.uneq_active() + R.hud_used.update_robot_modules_display() + + if("module1") + if(istype(usr, /mob/living/silicon/robot)) + usr:toggle_module(1) + + if("module2") + if(istype(usr, /mob/living/silicon/robot)) + usr:toggle_module(2) + + if("module3") + if(istype(usr, /mob/living/silicon/robot)) + usr:toggle_module(3) + + else + return 0 + return 1 + +/obj/screen/inventory/Click() + // At this point in client Click() code we have passed the 1/10 sec check and little else + // We don't even know if it's a middle click + if(world.time <= usr.next_move) + return 1 + if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) + return 1 + if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech + return 1 + switch(name) + if("r_hand") + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + C.activate_hand("r") + usr.next_move = world.time+2 + if("l_hand") + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + C.activate_hand("l") + usr.next_move = world.time+2 + if("swap") + usr:swap_hand() + if("hand") + usr:swap_hand() + else + if(usr.attack_ui(slot_id)) + usr.update_inv_l_hand(0) + usr.update_inv_r_hand(0) + usr.next_move = world.time+6 + return 1 diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index e7ba209258d..c7d5dd24352 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -1,77 +1,77 @@ - -// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. -/obj/item/proc/attack_self(mob/user) - return - -// No comment -/atom/proc/attackby(obj/item/W, mob/user) - return -/atom/movable/attackby(obj/item/W, mob/user) - if(W && !(W.flags&NOBLUDGEON)) - visible_message("[src] has been hit by [user] with [W].") - -/mob/living/attackby(obj/item/I, mob/user) - I.attack(src, user) - -/mob/living/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) - apply_damage(I.force, I.damtype) - if(I.damtype == "brute") - if(prob(33) && I.force) - var/turf/location = src.loc - if(istype(location, /turf/simulated)) - location.add_blood_floor(src) - - var/showname = "." - if(user) - showname = " by [user]!" - if(!(user in viewers(I, null))) - showname = "." - - if(I.attack_verb && I.attack_verb.len) - src.visible_message("[src] has been [pick(I.attack_verb)] with [I][showname]", - "[src] has been [pick(I.attack_verb)] with [I][showname]") - else if(I.force) - src.visible_message("[src] has been attacked with [I][showname]", - "[src] has been attacked with [I][showname]") - if(!showname && user) - if(user.client) - user << "\red You attack [src] with [I]. " - -// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person. -// Click parameters is the params string from byond Click() code, see that documentation. -/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - return - -// Overrides the weapon attack so it can attack any atoms like when we want to have an effect on an object independent of attackby -// It is a powerfull proc but it should be used wisely, if there is other alternatives instead use those -// If it returns 1 it exits click code. Always . = 1 at start of the function if you delete src. -/obj/item/proc/preattack(atom/target, mob/user, proximity_flag, click_parameters) - return - -obj/item/proc/get_clamped_volume() - if(src.force && src.w_class) - return Clamp((src.force + src.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 if(!src.force && src.w_class) - return Clamp(src.w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 - -/obj/item/proc/attack(mob/living/M as mob, mob/living/user as mob, def_zone) - - if (!istype(M)) // not sure if this is the right thing... - return - - if (hitsound && force > 0) //If an item's hitsound is defined and the item's force is greater than zero... - playsound(loc, hitsound, get_clamped_volume(), 1, -1) //...play the item's hitsound at get_clamped_volume() with varying frequency and -1 extra range. - else if (force == 0)//Otherwise, if the item's force is zero... - playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), 1, -1)//...play tap.ogg at get_clamped_volume() - ///////////////////////// - user.lastattacked = M - M.lastattacker = user - - add_logs(user, M, "attacked", object=src.name, addition="(INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])") - - //spawn(1800) // this wont work right - // M.lastattacker = null - ///////////////////////// - M.attacked_by(src, user, def_zone) - add_fingerprint(user) + +// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. +/obj/item/proc/attack_self(mob/user) + return + +// No comment +/atom/proc/attackby(obj/item/W, mob/user) + return +/atom/movable/attackby(obj/item/W, mob/user) + if(W && !(W.flags&NOBLUDGEON)) + visible_message("[src] has been hit by [user] with [W].") + +/mob/living/attackby(obj/item/I, mob/user) + I.attack(src, user) + +/mob/living/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) + apply_damage(I.force, I.damtype) + if(I.damtype == "brute") + if(prob(33) && I.force) + var/turf/location = src.loc + if(istype(location, /turf/simulated)) + location.add_blood_floor(src) + + var/showname = "." + if(user) + showname = " by [user]!" + if(!(user in viewers(I, null))) + showname = "." + + if(I.attack_verb && I.attack_verb.len) + src.visible_message("[src] has been [pick(I.attack_verb)] with [I][showname]", + "[src] has been [pick(I.attack_verb)] with [I][showname]") + else if(I.force) + src.visible_message("[src] has been attacked with [I][showname]", + "[src] has been attacked with [I][showname]") + if(!showname && user) + if(user.client) + user << "\red You attack [src] with [I]. " + +// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person. +// Click parameters is the params string from byond Click() code, see that documentation. +/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + return + +// Overrides the weapon attack so it can attack any atoms like when we want to have an effect on an object independent of attackby +// It is a powerfull proc but it should be used wisely, if there is other alternatives instead use those +// If it returns 1 it exits click code. Always . = 1 at start of the function if you delete src. +/obj/item/proc/preattack(atom/target, mob/user, proximity_flag, click_parameters) + return + +obj/item/proc/get_clamped_volume() + if(src.force && src.w_class) + return Clamp((src.force + src.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 if(!src.force && src.w_class) + return Clamp(src.w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 + +/obj/item/proc/attack(mob/living/M as mob, mob/living/user as mob, def_zone) + + if (!istype(M)) // not sure if this is the right thing... + return + + if (hitsound && force > 0) //If an item's hitsound is defined and the item's force is greater than zero... + playsound(loc, hitsound, get_clamped_volume(), 1, -1) //...play the item's hitsound at get_clamped_volume() with varying frequency and -1 extra range. + else if (force == 0)//Otherwise, if the item's force is zero... + playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), 1, -1)//...play tap.ogg at get_clamped_volume() + ///////////////////////// + user.lastattacked = M + M.lastattacker = user + + add_logs(user, M, "attacked", object=src.name, addition="(INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])") + + //spawn(1800) // this wont work right + // M.lastattacker = null + ///////////////////////// + M.attacked_by(src, user, def_zone) + add_fingerprint(user) return 1 \ No newline at end of file diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index d077778e760..44e9c5bca21 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -1,98 +1,98 @@ -/client/var/inquisitive_ghost = 1 -/mob/dead/observer/verb/toggle_inquisition() // warning: unexpected inquisition - set name = "Toggle Inquisitiveness" - set desc = "Sets whether your ghost examines everything on click by default" - set category = "Ghost" - if(!client) return - client.inquisitive_ghost = !client.inquisitive_ghost - if(client.inquisitive_ghost) - src << "\blue You will now examine everything you click on." - else - src << "\blue You will no longer examine things you click on." - -/mob/dead/observer/DblClickOn(var/atom/A, var/params) - if(client.buildmode) - build_click(src, client.buildmode, params, A) - return - if(can_reenter_corpse && mind && mind.current) - if(A == mind.current || (mind.current in A)) // double click your corpse or whatever holds it - reenter_corpse() // (cloning scanner, body bag, closet, mech, etc) - return // seems legit. - - // Things you might plausibly want to follow - if((ismob(A) && A != src) || istype(A,/obj/machinery/bot) || istype(A,/obj/machinery/singularity)) - ManualFollow(A) - - // Otherwise jump - else - loc = get_turf(A) - -/mob/dead/observer/ClickOn(var/atom/A, var/params) - if(client.buildmode) - build_click(src, client.buildmode, params, A) - return - - var/list/modifiers = params2list(params) - if(modifiers["middle"]) - MiddleClickOn(A) - return - if(modifiers["shift"]) - ShiftClickOn(A) - return - if(modifiers["alt"]) - AltClickOn(A) - return - if(modifiers["ctrl"]) - CtrlClickOn(A) - return - - if(world.time <= next_move) return - next_move = world.time + 8 - // You are responsible for checking config.ghost_interaction when you override this function - // Not all of them require checking, see below - A.attack_ghost(src) - -// Oh by the way this didn't work with old click code which is why clicking shit didn't spam you -/atom/proc/attack_ghost(mob/dead/observer/user as mob) - if(user.client && user.client.inquisitive_ghost) - examine() - return - -// --------------------------------------- -// And here are some good things for free: -// Now you can click through portals, wormholes, gateways, and teleporters while observing. -Sayu - -/obj/machinery/teleport/hub/attack_ghost(mob/user as mob) - var/atom/l = loc - var/obj/machinery/computer/teleporter/com = locate(/obj/machinery/computer/teleporter, locate(l.x - 2, l.y, l.z)) - if(com && com.locked) - user.loc = get_turf(com.locked) - -/obj/effect/portal/attack_ghost(mob/user as mob) - if(target) - user.loc = get_turf(target) - -/obj/machinery/gateway/centerstation/attack_ghost(mob/user as mob) - if(awaygate) - user.loc = awaygate.loc - else - user << "[src] has no destination." - -/obj/machinery/gateway/centeraway/attack_ghost(mob/user as mob) - if(stationgate) - user.loc = stationgate.loc - else - user << "[src] has no destination." - -// ------------------------------------------- -// This was supposed to be used by adminghosts -// I think it is a *terrible* idea -// but I'm leaving it here anyway -// commented out, of course. -/* -/atom/proc/attack_admin(mob/user as mob) - if(!user || !user.client || !user.client.holder) - return - attack_hand(user) - -*/ +/client/var/inquisitive_ghost = 1 +/mob/dead/observer/verb/toggle_inquisition() // warning: unexpected inquisition + set name = "Toggle Inquisitiveness" + set desc = "Sets whether your ghost examines everything on click by default" + set category = "Ghost" + if(!client) return + client.inquisitive_ghost = !client.inquisitive_ghost + if(client.inquisitive_ghost) + src << "\blue You will now examine everything you click on." + else + src << "\blue You will no longer examine things you click on." + +/mob/dead/observer/DblClickOn(var/atom/A, var/params) + if(client.buildmode) + build_click(src, client.buildmode, params, A) + return + if(can_reenter_corpse && mind && mind.current) + if(A == mind.current || (mind.current in A)) // double click your corpse or whatever holds it + reenter_corpse() // (cloning scanner, body bag, closet, mech, etc) + return // seems legit. + + // Things you might plausibly want to follow + if((ismob(A) && A != src) || istype(A,/obj/machinery/bot) || istype(A,/obj/machinery/singularity)) + ManualFollow(A) + + // Otherwise jump + else + loc = get_turf(A) + +/mob/dead/observer/ClickOn(var/atom/A, var/params) + if(client.buildmode) + build_click(src, client.buildmode, params, A) + return + + var/list/modifiers = params2list(params) + if(modifiers["middle"]) + MiddleClickOn(A) + return + if(modifiers["shift"]) + ShiftClickOn(A) + return + if(modifiers["alt"]) + AltClickOn(A) + return + if(modifiers["ctrl"]) + CtrlClickOn(A) + return + + if(world.time <= next_move) return + next_move = world.time + 8 + // You are responsible for checking config.ghost_interaction when you override this function + // Not all of them require checking, see below + A.attack_ghost(src) + +// Oh by the way this didn't work with old click code which is why clicking shit didn't spam you +/atom/proc/attack_ghost(mob/dead/observer/user as mob) + if(user.client && user.client.inquisitive_ghost) + examine() + return + +// --------------------------------------- +// And here are some good things for free: +// Now you can click through portals, wormholes, gateways, and teleporters while observing. -Sayu + +/obj/machinery/teleport/hub/attack_ghost(mob/user as mob) + var/atom/l = loc + var/obj/machinery/computer/teleporter/com = locate(/obj/machinery/computer/teleporter, locate(l.x - 2, l.y, l.z)) + if(com && com.locked) + user.loc = get_turf(com.locked) + +/obj/effect/portal/attack_ghost(mob/user as mob) + if(target) + user.loc = get_turf(target) + +/obj/machinery/gateway/centerstation/attack_ghost(mob/user as mob) + if(awaygate) + user.loc = awaygate.loc + else + user << "[src] has no destination." + +/obj/machinery/gateway/centeraway/attack_ghost(mob/user as mob) + if(stationgate) + user.loc = stationgate.loc + else + user << "[src] has no destination." + +// ------------------------------------------- +// This was supposed to be used by adminghosts +// I think it is a *terrible* idea +// but I'm leaving it here anyway +// commented out, of course. +/* +/atom/proc/attack_admin(mob/user as mob) + if(!user || !user.client || !user.client.holder) + return + attack_hand(user) + +*/ diff --git a/code/_onclick/oldcode.dm b/code/_onclick/oldcode.dm index 2d52a26390a..024e223f839 100644 --- a/code/_onclick/oldcode.dm +++ b/code/_onclick/oldcode.dm @@ -1,376 +1,376 @@ -/atom/DblClick(location, control, params) //TODO: DEFERRED: REWRITE - if(!usr) return - - // ------- TIME SINCE LAST CLICK ------- - if (world.time <= usr:lastDblClick+1) - return - else - usr:lastDblClick = world.time - - //Putting it here for now. It diverts stuff to the mech clicking procs. Putting it here stops us drilling items in our inventory Carn - if(istype(usr.loc,/obj/mecha)) - if(usr.client && (src in usr.client.screen)) - return - var/obj/mecha/Mech = usr.loc - Mech.click_action(src,usr) - return - - // ------- DIR CHANGING WHEN CLICKING ------ - if( iscarbon(usr) && !usr.buckled ) - if( src.x && src.y && usr.x && usr.y ) - var/dx = src.x - usr.x - var/dy = src.y - usr.y - - if(dy || dx) - if(abs(dx) < abs(dy)) - if(dy > 0) usr.dir = NORTH - else usr.dir = SOUTH - else - if(dx > 0) usr.dir = EAST - else usr.dir = WEST - else - if(pixel_y > 16) usr.dir = NORTH - else if(pixel_y < -16) usr.dir = SOUTH - else if(pixel_x > 16) usr.dir = EAST - else if(pixel_x < -16) usr.dir = WEST - - - - - // ------- AI ------- - else if (istype(usr, /mob/living/silicon/ai)) - var/mob/living/silicon/ai/ai = usr - if (ai.control_disabled) - return - - // ------- CYBORG ------- - else if (istype(usr, /mob/living/silicon/robot)) - var/mob/living/silicon/robot/bot = usr - if (bot.lockcharge) return - ..() - - - // ------- SHIFT-CLICK ------- - - if(params) - var/parameters = params2list(params) - - if(parameters["shift"]){ - if(!isAI(usr)) - ShiftClick(usr) - else - AIShiftClick(usr) - return - } - - // ------- ALT-CLICK ------- - - if(parameters["alt"]){ - if(!isAI(usr)) - AltClick(usr) - else - AIAltClick(usr) - return - } - - // ------- CTRL-CLICK ------- - - if(parameters["ctrl"]){ - if(!isAI(usr)) - CtrlClick(usr) - else - AICtrlClick(usr) - return - } - - // ------- MIDDLE-CLICK ------- - - if(parameters["middle"]){ - if(!isAI(usr)) - MiddleClick(usr) - return - } - - // ------- THROW ------- - if(usr.in_throw_mode) - return usr:throw_item(src) - - // ------- ITEM IN HAND DEFINED ------- - var/obj/item/W = usr.get_active_hand() -/* Now handled by get_active_hand() - // ------- ROBOT ------- - if(istype(usr, /mob/living/silicon/robot)) - if(!isnull(usr:module_active)) - W = usr:module_active - else - W = null -*/ - // ------- ATTACK SELF ------- - if (W == src && usr.stat == 0) - W.attack_self(usr) - if(usr.hand) - usr.update_inv_l_hand(0) //update in-hand overlays - else - usr.update_inv_r_hand(0) - return - - // ------- PARALYSIS, STUN, WEAKENED, DEAD, (And not AI) ------- - if (((usr.paralysis || usr.stunned || usr.weakened) && !istype(usr, /mob/living/silicon/ai)) || usr.stat != 0) - return - - // ------- CLICKING STUFF IN CONTAINERS ------- - if ((!( src in usr.contents ) && (((!( isturf(src) ) && (!( isturf(src.loc) ) && (src.loc && !( isturf(src.loc.loc) )))) || !( isturf(usr.loc) )) && (src.loc != usr.loc && (!( istype(src, /obj/screen) ) && !( usr.contents.Find(src.loc) )))))) - if (istype(usr, /mob/living/silicon/ai)) - var/mob/living/silicon/ai/ai = usr - if (ai.control_disabled || ai.malfhacking) - return - else - return - - // ------- 1 TILE AWAY ------- - var/t5 - // ------- AI CAN CLICK ANYTHING ------- - if(istype(usr, /mob/living/silicon/ai)) - t5 = 1 - // ------- CYBORG CAN CLICK ANYTHING WHEN NOT HOLDING STUFF ------- - else if(istype(usr, /mob/living/silicon/robot) && !W) - t5 = 1 - else - t5 = in_range(src, usr) || src.loc == usr - -// world << "according to dblclick(), t5 is [t5]" - - // ------- ACTUALLY DETERMINING STUFF ------- - if (((t5 || (W && (W.flags & USEDELAY))) && !( istype(src, /obj/screen) ))) - - // ------- ( CAN USE ITEM OR HAS 1 SECOND USE DELAY ) AND NOT CLICKING ON SCREEN ------- - - if (usr.next_move < world.time) - usr.prev_move = usr.next_move - usr.next_move = world.time + 10 - else - // ------- ALREADY USED ONE ITEM WITH USE DELAY IN THE PREVIOUS SECOND ------- - return - - // ------- DELAY CHECK PASSED ------- - - if ((src.loc && (get_dist(src, usr) < 2 || src.loc == usr.loc))) - - // ------- CLICKED OBJECT EXISTS IN GAME WORLD, DISTANCE FROM PERSON TO OBJECT IS 1 SQUARE OR THEY'RE ON THE SAME SQUARE ------- - - var/direct = get_dir(usr, src) - var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( usr.loc ) - var/ok = 0 - if ( (direct - 1) & direct) - - // ------- CLICKED OBJECT IS LOCATED IN A DIAGONAL POSITION FROM THE PERSON ------- - - var/turf/Step_1 - var/turf/Step_2 - switch(direct) - if(5.0) - Step_1 = get_step(usr, NORTH) - Step_2 = get_step(usr, EAST) - - if(6.0) - Step_1 = get_step(usr, SOUTH) - Step_2 = get_step(usr, EAST) - - if(9.0) - Step_1 = get_step(usr, NORTH) - Step_2 = get_step(usr, WEST) - - if(10.0) - Step_1 = get_step(usr, SOUTH) - Step_2 = get_step(usr, WEST) - - else - if(Step_1 && Step_2) - - // ------- BOTH CARDINAL DIRECTIONS OF THE DIAGONAL EXIST IN THE GAME WORLD ------- - - var/check_1 = 0 - var/check_2 = 0 - if(step_to(D, Step_1)) - check_1 = 1 - for(var/obj/border_obstacle in Step_1) - if(border_obstacle.flags & ON_BORDER) - if(!border_obstacle.CheckExit(D, src)) - check_1 = 0 - // ------- YOU TRIED TO CLICK ON AN ITEM THROUGH A WINDOW (OR SIMILAR THING THAT LIMITS ON BORDERS) ON ONE OF THE DIRECITON TILES ------- - for(var/obj/border_obstacle in get_turf(src)) - if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) - if(!border_obstacle.CanPass(D, D.loc, 1, 0)) - // ------- YOU TRIED TO CLICK ON AN ITEM THROUGH A WINDOW (OR SIMILAR THING THAT LIMITS ON BORDERS) ON THE TILE YOU'RE ON ------- - check_1 = 0 - - D.loc = usr.loc - if(step_to(D, Step_2)) - check_2 = 1 - - for(var/obj/border_obstacle in Step_2) - if(border_obstacle.flags & ON_BORDER) - if(!border_obstacle.CheckExit(D, src)) - check_2 = 0 - for(var/obj/border_obstacle in get_turf(src)) - if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) - if(!border_obstacle.CanPass(D, D.loc, 1, 0)) - check_2 = 0 - - - if(check_1 || check_2) - ok = 1 - // ------- YOU CAN REACH THE ITEM THROUGH AT LEAST ONE OF THE TWO DIRECTIONS. GOOD. ------- - - /* - More info: - If you're trying to click an item in the north-east of your mob, the above section of code will first check if tehre's a tile to the north or you and to the east of you - These two tiles are Step_1 and Step_2. After this, a new dummy object is created on your location. It then tries to move to Step_1, If it succeeds, objects on the turf you're on and - the turf that Step_1 is are checked for items which have the ON_BORDER flag set. These are itmes which limit you on only one tile border. Windows, for the most part. - CheckExit() and CanPass() are use to determine this. The dummy object is then moved back to your location and it tries to move to Step_2. Same checks are performed here. - If at least one of the two checks succeeds, it means you can reach the item and ok is set to 1. - */ - else - // ------- OBJECT IS ON A CARDINAL TILE (NORTH, SOUTH, EAST OR WEST OR THE TILE YOU'RE ON) ------- - if(loc == usr.loc) - ok = 1 - // ------- OBJECT IS ON THE SAME TILE AS YOU ------- - else - ok = 1 - - //Now, check objects to block exit that are on the border - for(var/obj/border_obstacle in usr.loc) - if(border_obstacle.flags & ON_BORDER) - if(!border_obstacle.CheckExit(D, src)) - ok = 0 - - //Next, check objects to block entry that are on the border - for(var/obj/border_obstacle in get_turf(src)) - if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) - if(!border_obstacle.CanPass(D, D.loc, 1, 0)) - ok = 0 - /* - See the previous More info, for... more info... - */ - - //del(D) - // Garbage Collect Dummy - D.loc = null - D = null - - // ------- DUMMY OBJECT'S SERVED IT'S PURPOSE, IT'S REWARDED WITH A SWIFT DELETE ------- - if (!( ok )) - // ------- TESTS ABOVE DETERMINED YOU CANNOT REACH THE TILE ------- - return 0 - - if (!( usr.restrained() || (usr.lying && usr.buckled!=src) )) - // ------- YOU ARE NOT REASTRAINED ------- - - if (W) - // ------- YOU HAVE AN ITEM IN YOUR HAND - HANDLE ATTACKBY AND AFTERATTACK ------- - var/ignoreAA = 0 //Ignore afterattack(). Surgery uses this. - if (t5) - ignoreAA = src.attackby(W, usr) - if (W && !ignoreAA) - W.afterattack(src, usr, (t5 ? 1 : 0), params) - - else - // ------- YOU DO NOT HAVE AN ITEM IN YOUR HAND ------- - if (istype(usr, /mob/living/carbon/human)) - // ------- YOU ARE HUMAN ------- - src.attack_hand(usr, usr.hand) - else - // ------- YOU ARE NOT HUMAN. WHAT ARE YOU - DETERMINED HERE AND PROPER ATTACK_MOBTYPE CALLED ------- - if (istype(usr, /mob/living/carbon/monkey)) - src.attack_paw(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/humanoid)) - if(usr.m_intent == "walk" && istype(usr, /mob/living/carbon/alien/humanoid/hunter)) - usr.m_intent = "run" - usr.hud_used.move_intent.icon_state = "running" - usr.update_icons() - src.attack_alien(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/larva)) - src.attack_larva(usr) - else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) - src.attack_ai(usr, usr.hand) - else if(istype(usr, /mob/living/carbon/slime)) - src.attack_slime(usr) - else if(istype(usr, /mob/living/simple_animal)) - src.attack_animal(usr) - else - // ------- YOU ARE RESTRAINED. DETERMINE WHAT YOU ARE AND ATTACK WITH THE PROPER HAND_X PROC ------- - if (istype(usr, /mob/living/carbon/human)) - src.hand_h(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/monkey)) - src.hand_p(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/humanoid)) - src.hand_al(usr, usr.hand) - else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) - src.hand_a(usr, usr.hand) - - else - // ------- ITEM INACESSIBLE OR CLICKING ON SCREEN ------- - if (istype(src, /obj/screen)) - // ------- IT'S THE HUD YOU'RE CLICKING ON ------- - usr.prev_move = usr.next_move - usr:lastDblClick = world.time + 2 - if (usr.next_move < world.time) - usr.next_move = world.time + 2 - else - return - - // ------- 2 DECISECOND DELAY FOR CLICKING PASSED ------- - - if (!( usr.restrained() )) - - // ------- YOU ARE NOT RESTRAINED ------- - if ((W && !( istype(src, /obj/screen) ))) - // ------- IT SHOULD NEVER GET TO HERE, DUE TO THE ISTYPE(SRC, /OBJ/SCREEN) FROM PREVIOUS IF-S - I TESTED IT WITH A DEBUG OUTPUT AND I COULDN'T GET THIST TO SHOW UP. ------- - src.attackby(W, usr) - if (W) - W.afterattack(src, usr,, params) - else - // ------- YOU ARE NOT RESTRAINED, AND ARE CLICKING A HUD OBJECT ------- - if (istype(usr, /mob/living/carbon/human)) - src.attack_hand(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/monkey)) - src.attack_paw(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/humanoid)) - src.attack_alien(usr, usr.hand) - else - // ------- YOU ARE RESTRAINED CLICKING ON A HUD OBJECT ------- - if (istype(usr, /mob/living/carbon/human)) - src.hand_h(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/monkey)) - src.hand_p(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/humanoid)) - src.hand_al(usr, usr.hand) - else - // ------- YOU ARE CLICKING ON AN OBJECT THAT'S INACCESSIBLE TO YOU AND IS NOT YOUR HUD ------- - if((LASER in usr:mutations) && usr:a_intent == "harm" && world.time >= usr.next_move) - // ------- YOU HAVE THE LASER MUTATION, YOUR INTENT SET TO HURT AND IT'S BEEN MORE THAN A DECISECOND SINCE YOU LAS TATTACKED ------- - - var/turf/T = get_turf(usr) - var/turf/U = get_turf(src) - - - if(istype(usr, /mob/living/carbon/human)) - usr:nutrition -= rand(1,5) - usr:handle_regular_hud_updates() - - var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( usr.loc ) - A.icon = 'icons/effects/genetics.dmi' - A.icon_state = "eyelasers" - playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) - - A.firer = usr - A.def_zone = usr:get_organ_target() - A.original = src - A.current = T - A.yo = U.y - T.y - A.xo = U.x - T.x - spawn( 1 ) - A.process() - - usr.next_move = world.time + 6 - return +/atom/DblClick(location, control, params) //TODO: DEFERRED: REWRITE + if(!usr) return + + // ------- TIME SINCE LAST CLICK ------- + if (world.time <= usr:lastDblClick+1) + return + else + usr:lastDblClick = world.time + + //Putting it here for now. It diverts stuff to the mech clicking procs. Putting it here stops us drilling items in our inventory Carn + if(istype(usr.loc,/obj/mecha)) + if(usr.client && (src in usr.client.screen)) + return + var/obj/mecha/Mech = usr.loc + Mech.click_action(src,usr) + return + + // ------- DIR CHANGING WHEN CLICKING ------ + if( iscarbon(usr) && !usr.buckled ) + if( src.x && src.y && usr.x && usr.y ) + var/dx = src.x - usr.x + var/dy = src.y - usr.y + + if(dy || dx) + if(abs(dx) < abs(dy)) + if(dy > 0) usr.dir = NORTH + else usr.dir = SOUTH + else + if(dx > 0) usr.dir = EAST + else usr.dir = WEST + else + if(pixel_y > 16) usr.dir = NORTH + else if(pixel_y < -16) usr.dir = SOUTH + else if(pixel_x > 16) usr.dir = EAST + else if(pixel_x < -16) usr.dir = WEST + + + + + // ------- AI ------- + else if (istype(usr, /mob/living/silicon/ai)) + var/mob/living/silicon/ai/ai = usr + if (ai.control_disabled) + return + + // ------- CYBORG ------- + else if (istype(usr, /mob/living/silicon/robot)) + var/mob/living/silicon/robot/bot = usr + if (bot.lockcharge) return + ..() + + + // ------- SHIFT-CLICK ------- + + if(params) + var/parameters = params2list(params) + + if(parameters["shift"]){ + if(!isAI(usr)) + ShiftClick(usr) + else + AIShiftClick(usr) + return + } + + // ------- ALT-CLICK ------- + + if(parameters["alt"]){ + if(!isAI(usr)) + AltClick(usr) + else + AIAltClick(usr) + return + } + + // ------- CTRL-CLICK ------- + + if(parameters["ctrl"]){ + if(!isAI(usr)) + CtrlClick(usr) + else + AICtrlClick(usr) + return + } + + // ------- MIDDLE-CLICK ------- + + if(parameters["middle"]){ + if(!isAI(usr)) + MiddleClick(usr) + return + } + + // ------- THROW ------- + if(usr.in_throw_mode) + return usr:throw_item(src) + + // ------- ITEM IN HAND DEFINED ------- + var/obj/item/W = usr.get_active_hand() +/* Now handled by get_active_hand() + // ------- ROBOT ------- + if(istype(usr, /mob/living/silicon/robot)) + if(!isnull(usr:module_active)) + W = usr:module_active + else + W = null +*/ + // ------- ATTACK SELF ------- + if (W == src && usr.stat == 0) + W.attack_self(usr) + if(usr.hand) + usr.update_inv_l_hand(0) //update in-hand overlays + else + usr.update_inv_r_hand(0) + return + + // ------- PARALYSIS, STUN, WEAKENED, DEAD, (And not AI) ------- + if (((usr.paralysis || usr.stunned || usr.weakened) && !istype(usr, /mob/living/silicon/ai)) || usr.stat != 0) + return + + // ------- CLICKING STUFF IN CONTAINERS ------- + if ((!( src in usr.contents ) && (((!( isturf(src) ) && (!( isturf(src.loc) ) && (src.loc && !( isturf(src.loc.loc) )))) || !( isturf(usr.loc) )) && (src.loc != usr.loc && (!( istype(src, /obj/screen) ) && !( usr.contents.Find(src.loc) )))))) + if (istype(usr, /mob/living/silicon/ai)) + var/mob/living/silicon/ai/ai = usr + if (ai.control_disabled || ai.malfhacking) + return + else + return + + // ------- 1 TILE AWAY ------- + var/t5 + // ------- AI CAN CLICK ANYTHING ------- + if(istype(usr, /mob/living/silicon/ai)) + t5 = 1 + // ------- CYBORG CAN CLICK ANYTHING WHEN NOT HOLDING STUFF ------- + else if(istype(usr, /mob/living/silicon/robot) && !W) + t5 = 1 + else + t5 = in_range(src, usr) || src.loc == usr + +// world << "according to dblclick(), t5 is [t5]" + + // ------- ACTUALLY DETERMINING STUFF ------- + if (((t5 || (W && (W.flags & USEDELAY))) && !( istype(src, /obj/screen) ))) + + // ------- ( CAN USE ITEM OR HAS 1 SECOND USE DELAY ) AND NOT CLICKING ON SCREEN ------- + + if (usr.next_move < world.time) + usr.prev_move = usr.next_move + usr.next_move = world.time + 10 + else + // ------- ALREADY USED ONE ITEM WITH USE DELAY IN THE PREVIOUS SECOND ------- + return + + // ------- DELAY CHECK PASSED ------- + + if ((src.loc && (get_dist(src, usr) < 2 || src.loc == usr.loc))) + + // ------- CLICKED OBJECT EXISTS IN GAME WORLD, DISTANCE FROM PERSON TO OBJECT IS 1 SQUARE OR THEY'RE ON THE SAME SQUARE ------- + + var/direct = get_dir(usr, src) + var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( usr.loc ) + var/ok = 0 + if ( (direct - 1) & direct) + + // ------- CLICKED OBJECT IS LOCATED IN A DIAGONAL POSITION FROM THE PERSON ------- + + var/turf/Step_1 + var/turf/Step_2 + switch(direct) + if(5.0) + Step_1 = get_step(usr, NORTH) + Step_2 = get_step(usr, EAST) + + if(6.0) + Step_1 = get_step(usr, SOUTH) + Step_2 = get_step(usr, EAST) + + if(9.0) + Step_1 = get_step(usr, NORTH) + Step_2 = get_step(usr, WEST) + + if(10.0) + Step_1 = get_step(usr, SOUTH) + Step_2 = get_step(usr, WEST) + + else + if(Step_1 && Step_2) + + // ------- BOTH CARDINAL DIRECTIONS OF THE DIAGONAL EXIST IN THE GAME WORLD ------- + + var/check_1 = 0 + var/check_2 = 0 + if(step_to(D, Step_1)) + check_1 = 1 + for(var/obj/border_obstacle in Step_1) + if(border_obstacle.flags & ON_BORDER) + if(!border_obstacle.CheckExit(D, src)) + check_1 = 0 + // ------- YOU TRIED TO CLICK ON AN ITEM THROUGH A WINDOW (OR SIMILAR THING THAT LIMITS ON BORDERS) ON ONE OF THE DIRECITON TILES ------- + for(var/obj/border_obstacle in get_turf(src)) + if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) + if(!border_obstacle.CanPass(D, D.loc, 1, 0)) + // ------- YOU TRIED TO CLICK ON AN ITEM THROUGH A WINDOW (OR SIMILAR THING THAT LIMITS ON BORDERS) ON THE TILE YOU'RE ON ------- + check_1 = 0 + + D.loc = usr.loc + if(step_to(D, Step_2)) + check_2 = 1 + + for(var/obj/border_obstacle in Step_2) + if(border_obstacle.flags & ON_BORDER) + if(!border_obstacle.CheckExit(D, src)) + check_2 = 0 + for(var/obj/border_obstacle in get_turf(src)) + if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) + if(!border_obstacle.CanPass(D, D.loc, 1, 0)) + check_2 = 0 + + + if(check_1 || check_2) + ok = 1 + // ------- YOU CAN REACH THE ITEM THROUGH AT LEAST ONE OF THE TWO DIRECTIONS. GOOD. ------- + + /* + More info: + If you're trying to click an item in the north-east of your mob, the above section of code will first check if tehre's a tile to the north or you and to the east of you + These two tiles are Step_1 and Step_2. After this, a new dummy object is created on your location. It then tries to move to Step_1, If it succeeds, objects on the turf you're on and + the turf that Step_1 is are checked for items which have the ON_BORDER flag set. These are itmes which limit you on only one tile border. Windows, for the most part. + CheckExit() and CanPass() are use to determine this. The dummy object is then moved back to your location and it tries to move to Step_2. Same checks are performed here. + If at least one of the two checks succeeds, it means you can reach the item and ok is set to 1. + */ + else + // ------- OBJECT IS ON A CARDINAL TILE (NORTH, SOUTH, EAST OR WEST OR THE TILE YOU'RE ON) ------- + if(loc == usr.loc) + ok = 1 + // ------- OBJECT IS ON THE SAME TILE AS YOU ------- + else + ok = 1 + + //Now, check objects to block exit that are on the border + for(var/obj/border_obstacle in usr.loc) + if(border_obstacle.flags & ON_BORDER) + if(!border_obstacle.CheckExit(D, src)) + ok = 0 + + //Next, check objects to block entry that are on the border + for(var/obj/border_obstacle in get_turf(src)) + if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle)) + if(!border_obstacle.CanPass(D, D.loc, 1, 0)) + ok = 0 + /* + See the previous More info, for... more info... + */ + + //del(D) + // Garbage Collect Dummy + D.loc = null + D = null + + // ------- DUMMY OBJECT'S SERVED IT'S PURPOSE, IT'S REWARDED WITH A SWIFT DELETE ------- + if (!( ok )) + // ------- TESTS ABOVE DETERMINED YOU CANNOT REACH THE TILE ------- + return 0 + + if (!( usr.restrained() || (usr.lying && usr.buckled!=src) )) + // ------- YOU ARE NOT REASTRAINED ------- + + if (W) + // ------- YOU HAVE AN ITEM IN YOUR HAND - HANDLE ATTACKBY AND AFTERATTACK ------- + var/ignoreAA = 0 //Ignore afterattack(). Surgery uses this. + if (t5) + ignoreAA = src.attackby(W, usr) + if (W && !ignoreAA) + W.afterattack(src, usr, (t5 ? 1 : 0), params) + + else + // ------- YOU DO NOT HAVE AN ITEM IN YOUR HAND ------- + if (istype(usr, /mob/living/carbon/human)) + // ------- YOU ARE HUMAN ------- + src.attack_hand(usr, usr.hand) + else + // ------- YOU ARE NOT HUMAN. WHAT ARE YOU - DETERMINED HERE AND PROPER ATTACK_MOBTYPE CALLED ------- + if (istype(usr, /mob/living/carbon/monkey)) + src.attack_paw(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/alien/humanoid)) + if(usr.m_intent == "walk" && istype(usr, /mob/living/carbon/alien/humanoid/hunter)) + usr.m_intent = "run" + usr.hud_used.move_intent.icon_state = "running" + usr.update_icons() + src.attack_alien(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/alien/larva)) + src.attack_larva(usr) + else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) + src.attack_ai(usr, usr.hand) + else if(istype(usr, /mob/living/carbon/slime)) + src.attack_slime(usr) + else if(istype(usr, /mob/living/simple_animal)) + src.attack_animal(usr) + else + // ------- YOU ARE RESTRAINED. DETERMINE WHAT YOU ARE AND ATTACK WITH THE PROPER HAND_X PROC ------- + if (istype(usr, /mob/living/carbon/human)) + src.hand_h(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/monkey)) + src.hand_p(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/alien/humanoid)) + src.hand_al(usr, usr.hand) + else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) + src.hand_a(usr, usr.hand) + + else + // ------- ITEM INACESSIBLE OR CLICKING ON SCREEN ------- + if (istype(src, /obj/screen)) + // ------- IT'S THE HUD YOU'RE CLICKING ON ------- + usr.prev_move = usr.next_move + usr:lastDblClick = world.time + 2 + if (usr.next_move < world.time) + usr.next_move = world.time + 2 + else + return + + // ------- 2 DECISECOND DELAY FOR CLICKING PASSED ------- + + if (!( usr.restrained() )) + + // ------- YOU ARE NOT RESTRAINED ------- + if ((W && !( istype(src, /obj/screen) ))) + // ------- IT SHOULD NEVER GET TO HERE, DUE TO THE ISTYPE(SRC, /OBJ/SCREEN) FROM PREVIOUS IF-S - I TESTED IT WITH A DEBUG OUTPUT AND I COULDN'T GET THIST TO SHOW UP. ------- + src.attackby(W, usr) + if (W) + W.afterattack(src, usr,, params) + else + // ------- YOU ARE NOT RESTRAINED, AND ARE CLICKING A HUD OBJECT ------- + if (istype(usr, /mob/living/carbon/human)) + src.attack_hand(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/monkey)) + src.attack_paw(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/alien/humanoid)) + src.attack_alien(usr, usr.hand) + else + // ------- YOU ARE RESTRAINED CLICKING ON A HUD OBJECT ------- + if (istype(usr, /mob/living/carbon/human)) + src.hand_h(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/monkey)) + src.hand_p(usr, usr.hand) + else if (istype(usr, /mob/living/carbon/alien/humanoid)) + src.hand_al(usr, usr.hand) + else + // ------- YOU ARE CLICKING ON AN OBJECT THAT'S INACCESSIBLE TO YOU AND IS NOT YOUR HUD ------- + if((LASER in usr:mutations) && usr:a_intent == "harm" && world.time >= usr.next_move) + // ------- YOU HAVE THE LASER MUTATION, YOUR INTENT SET TO HURT AND IT'S BEEN MORE THAN A DECISECOND SINCE YOU LAS TATTACKED ------- + + var/turf/T = get_turf(usr) + var/turf/U = get_turf(src) + + + if(istype(usr, /mob/living/carbon/human)) + usr:nutrition -= rand(1,5) + usr:handle_regular_hud_updates() + + var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( usr.loc ) + A.icon = 'icons/effects/genetics.dmi' + A.icon_state = "eyelasers" + playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) + + A.firer = usr + A.def_zone = usr:get_organ_target() + A.original = src + A.current = T + A.yo = U.y - T.y + A.xo = U.x - T.x + spawn( 1 ) + A.process() + + usr.next_move = world.time + 6 + return diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 5867284bbaa..5c4b32a2ce3 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -1,134 +1,134 @@ -/* - Humans: - Adds an exception for gloves, to allow special glove types like the ninja ones. - - Otherwise pretty standard. -*/ -/mob/living/carbon/human/UnarmedAttack(var/atom/A, var/proximity) - var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines - - // Special glove functions: - // If the gloves do anything, have them return 1 to stop - // normal attack_hand() here. - if(proximity && istype(G) && G.Touch(A,1)) - return - - A.attack_hand(src) -/atom/proc/attack_hand(mob/user as mob) - return - -/* -/mob/living/carbon/human/RestrainedClickOn(var/atom/A) ---carbons will handle this - return -*/ - -/mob/living/carbon/RestrainedClickOn(var/atom/A) - return 0 - -/mob/living/carbon/human/RangedAttack(var/atom/A) - if(!gloves && !mutations.len) return - var/obj/item/clothing/gloves/G = gloves - if((LASER in mutations) && a_intent == "harm") - LaserEyes(A) // moved into a proc below - - else if(istype(G) && G.Touch(A,0)) // for magic gloves - return - - else if(TK in mutations) - switch(get_dist(src,A)) - if(1 to 5) // not adjacent may mean blocked by window - next_move += 2 - if(5 to 7) - next_move += 5 - if(8 to 15) - next_move += 10 - if(16 to 128) - return - A.attack_tk(src) - -/* - Animals & All Unspecified -*/ -/mob/living/UnarmedAttack(var/atom/A) - A.attack_animal(src) -/atom/proc/attack_animal(mob/user as mob) - return -/mob/living/RestrainedClickOn(var/atom/A) - return - - -/* - Monkeys -*/ -/mob/living/carbon/monkey/UnarmedAttack(var/atom/A) - A.attack_paw(src) -/atom/proc/attack_paw(mob/user as mob) - return - -/* - Monkey RestrainedClickOn() was apparently the - one and only use of all of the restrained click code - (except to stop you from doing things while handcuffed); - moving it here instead of various hand_p's has simplified - things considerably -*/ -/mob/living/carbon/monkey/RestrainedClickOn(var/atom/A) - if(..()) - return - if(a_intent != "harm" || !ismob(A)) return - if(istype(wear_mask, /obj/item/clothing/mask/muzzle)) - return - var/mob/living/carbon/ML = A - var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") - var/obj/item/organ/limb/affecting = null - if(ishuman(ML)) // why the hell is this not more general - affecting = ML:get_organ(ran_zone(dam_zone)) - var/armor = ML.run_armor_check(affecting, "melee") - if(prob(75)) - ML.apply_damage(rand(1,3), BRUTE, affecting, armor) - for(var/mob/O in viewers(ML, null)) - O.show_message("[name] bites [ML]!", 1) - if(armor >= 2) return - for(var/datum/disease/D in viruses) - if(istype(D, /datum/disease/jungle_fever)) - ML.contract_disease(D,1,0) - else - for(var/mob/O in viewers(ML, null)) - O.show_message("\red [src] has attempted to bite [ML]!", 1) - -/* - Aliens - Defaults to same as monkey in most places -*/ -/mob/living/carbon/alien/UnarmedAttack(var/atom/A) - A.attack_alien(src) -/atom/proc/attack_alien(mob/user as mob) - attack_paw(user) - return -/mob/living/carbon/alien/RestrainedClickOn(var/atom/A) - return - -// Babby aliens -/mob/living/carbon/alien/larva/UnarmedAttack(var/atom/A) - A.attack_larva(src) -/atom/proc/attack_larva(mob/user as mob) - return - - -/* - Slimes - Nothing happening here -*/ -/mob/living/carbon/slime/UnarmedAttack(var/atom/A) - A.attack_slime(src) -/atom/proc/attack_slime(mob/user as mob) - return -/mob/living/carbon/slime/RestrainedClickOn(var/atom/A) - return - -/* - New Players: - Have no reason to click on anything at all. -*/ -/mob/new_player/ClickOn() - return +/* + Humans: + Adds an exception for gloves, to allow special glove types like the ninja ones. + + Otherwise pretty standard. +*/ +/mob/living/carbon/human/UnarmedAttack(var/atom/A, var/proximity) + var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines + + // Special glove functions: + // If the gloves do anything, have them return 1 to stop + // normal attack_hand() here. + if(proximity && istype(G) && G.Touch(A,1)) + return + + A.attack_hand(src) +/atom/proc/attack_hand(mob/user as mob) + return + +/* +/mob/living/carbon/human/RestrainedClickOn(var/atom/A) ---carbons will handle this + return +*/ + +/mob/living/carbon/RestrainedClickOn(var/atom/A) + return 0 + +/mob/living/carbon/human/RangedAttack(var/atom/A) + if(!gloves && !mutations.len) return + var/obj/item/clothing/gloves/G = gloves + if((LASER in mutations) && a_intent == "harm") + LaserEyes(A) // moved into a proc below + + else if(istype(G) && G.Touch(A,0)) // for magic gloves + return + + else if(TK in mutations) + switch(get_dist(src,A)) + if(1 to 5) // not adjacent may mean blocked by window + next_move += 2 + if(5 to 7) + next_move += 5 + if(8 to 15) + next_move += 10 + if(16 to 128) + return + A.attack_tk(src) + +/* + Animals & All Unspecified +*/ +/mob/living/UnarmedAttack(var/atom/A) + A.attack_animal(src) +/atom/proc/attack_animal(mob/user as mob) + return +/mob/living/RestrainedClickOn(var/atom/A) + return + + +/* + Monkeys +*/ +/mob/living/carbon/monkey/UnarmedAttack(var/atom/A) + A.attack_paw(src) +/atom/proc/attack_paw(mob/user as mob) + return + +/* + Monkey RestrainedClickOn() was apparently the + one and only use of all of the restrained click code + (except to stop you from doing things while handcuffed); + moving it here instead of various hand_p's has simplified + things considerably +*/ +/mob/living/carbon/monkey/RestrainedClickOn(var/atom/A) + if(..()) + return + if(a_intent != "harm" || !ismob(A)) return + if(istype(wear_mask, /obj/item/clothing/mask/muzzle)) + return + var/mob/living/carbon/ML = A + var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") + var/obj/item/organ/limb/affecting = null + if(ishuman(ML)) // why the hell is this not more general + affecting = ML:get_organ(ran_zone(dam_zone)) + var/armor = ML.run_armor_check(affecting, "melee") + if(prob(75)) + ML.apply_damage(rand(1,3), BRUTE, affecting, armor) + for(var/mob/O in viewers(ML, null)) + O.show_message("[name] bites [ML]!", 1) + if(armor >= 2) return + for(var/datum/disease/D in viruses) + if(istype(D, /datum/disease/jungle_fever)) + ML.contract_disease(D,1,0) + else + for(var/mob/O in viewers(ML, null)) + O.show_message("\red [src] has attempted to bite [ML]!", 1) + +/* + Aliens + Defaults to same as monkey in most places +*/ +/mob/living/carbon/alien/UnarmedAttack(var/atom/A) + A.attack_alien(src) +/atom/proc/attack_alien(mob/user as mob) + attack_paw(user) + return +/mob/living/carbon/alien/RestrainedClickOn(var/atom/A) + return + +// Babby aliens +/mob/living/carbon/alien/larva/UnarmedAttack(var/atom/A) + A.attack_larva(src) +/atom/proc/attack_larva(mob/user as mob) + return + + +/* + Slimes + Nothing happening here +*/ +/mob/living/carbon/slime/UnarmedAttack(var/atom/A) + A.attack_slime(src) +/atom/proc/attack_slime(mob/user as mob) + return +/mob/living/carbon/slime/RestrainedClickOn(var/atom/A) + return + +/* + New Players: + Have no reason to click on anything at all. +*/ +/mob/new_player/ClickOn() + return diff --git a/code/_onclick/overmind.dm b/code/_onclick/overmind.dm index 91f24465569..f692ba8f7ea 100644 --- a/code/_onclick/overmind.dm +++ b/code/_onclick/overmind.dm @@ -1,17 +1,17 @@ -// Blob Overmind Controls - - -/mob/camera/blob/CtrlClickOn(var/atom/A) // Expand blob - var/turf/T = get_turf(A) - if(T) - expand_blob(T) - -/mob/camera/blob/MiddleClickOn(var/atom/A) // Rally spores - var/turf/T = get_turf(A) - if(T) - rally_spores(T) - -/mob/camera/blob/AltClickOn(var/atom/A) // Create a shield - var/turf/T = get_turf(A) - if(T) +// Blob Overmind Controls + + +/mob/camera/blob/CtrlClickOn(var/atom/A) // Expand blob + var/turf/T = get_turf(A) + if(T) + expand_blob(T) + +/mob/camera/blob/MiddleClickOn(var/atom/A) // Rally spores + var/turf/T = get_turf(A) + if(T) + rally_spores(T) + +/mob/camera/blob/AltClickOn(var/atom/A) // Create a shield + var/turf/T = get_turf(A) + if(T) create_shield(T) \ No newline at end of file diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 0abb637cce9..5df04e9312e 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -1,208 +1,208 @@ -/* - Telekinesis - - This needs more thinking out, but I might as well. -*/ -var/const/tk_maxrange = 15 - -/* - Telekinetic attack: - - By default, emulate the user's unarmed attack -*/ -/atom/proc/attack_tk(mob/user) - if(user.stat) return - user.UnarmedAttack(src,0) // attack_hand, attack_paw, etc - return - -/* - This is similar to item attack_self, but applies to anything - that you can grab with a telekinetic grab. - - It is used for manipulating things at range, for example, opening and closing closets. - There are not a lot of defaults at this time, add more where appropriate. -*/ -/atom/proc/attack_self_tk(mob/user) - return - -/obj/attack_tk(mob/user) - if(user.stat) return - if(anchored) - ..() - return - - var/obj/item/tk_grab/O = new(src) - user.put_in_active_hand(O) - O.host = user - O.focus_object(src) - return - -/obj/item/attack_tk(mob/user) - if(user.stat || !isturf(loc)) return - if((TK in user.mutations) && !user.get_active_hand()) // both should already be true to get here - var/obj/item/tk_grab/O = new(src) - user.put_in_active_hand(O) - O.host = user - O.focus_object(src) - else - warning("Strange attack_tk(): TK([TK in user.mutations]) empty hand([!user.get_active_hand()])") - return - - -/mob/attack_tk(mob/user) - return // needs more thinking about - -/* - TK Grab Item (the workhorse of old TK) - - * If you have not grabbed something, do a normal tk attack - * If you have something, throw it at the target. If it is already adjacent, do a normal attackby() - * If you click what you are holding, or attack_self(), do an attack_self_tk() on it. - * Deletes itself if it is ever not in your hand, or if you should have no access to TK. -*/ -/obj/item/tk_grab - name = "Telekinetic Grab" - desc = "Magic" - icon = 'icons/obj/magic.dmi'//Needs sprites - icon_state = "2" - flags = NOBLUDGEON - //item_state = null - w_class = 10.0 - layer = 20 - - var/last_throw = 0 - var/atom/movable/focus = null - var/mob/living/host = null - - - dropped(mob/user as mob) - if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item - if(focus.Adjacent(loc)) - focus.loc = loc - - del(src) - return - - - //stops TK grabs being equipped anywhere but into hands - equipped(var/mob/user, var/slot) - if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return - del(src) - return - - - attack_self(mob/user as mob) - if(focus) - focus.attack_self_tk(user) - - afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity)//TODO: go over this - if(!target || !user) return - if(last_throw+3 > world.time) return - if(!host || host != user) - del(src) - return - if(!(TK in host.mutations)) - del(src) - return - if(isobj(target) && !isturf(target.loc)) - return - - var/d = get_dist(user, target) - if(focus) d = max(d,get_dist(user,focus)) // whichever is further - switch(d) - if(0) - ; - if(1 to 5) // not adjacent may mean blocked by window - if(!proximity) - user.next_move += 2 - if(5 to 7) - user.next_move += 5 - if(8 to tk_maxrange) - user.next_move += 10 - else - user << "\blue Your mind won't reach that far." - return - - if(!focus) - focus_object(target, user) - return - - if(target == focus) - target.attack_self_tk(user) - return // todo: something like attack_self not laden with assumptions inherent to attack_self - - - if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus)) - var/obj/item/I = focus - var/resolved = target.attackby(I, user, user:get_organ_target()) - if(!resolved && target && I) - I.afterattack(target,user,1) // for splashing with beakers - - - else - apply_focus_overlay() - focus.throw_at(target, 10, 1) - last_throw = world.time - return - - attack(mob/living/M as mob, mob/living/user as mob, def_zone) - return - - - proc/focus_object(var/obj/target, var/mob/living/user) - if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later - if(target.anchored || !isturf(target.loc)) - del src - return - focus = target - update_icon() - apply_focus_overlay() - return - - - proc/apply_focus_overlay() - if(!focus) return - var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z)) - O.name = "sparkles" - O.anchored = 1 - O.density = 0 - O.layer = FLY_LAYER - O.dir = pick(cardinal) - O.icon = 'icons/effects/effects.dmi' - O.icon_state = "nothing" - flick("empdisable",O) - spawn(5) - O.delete() - return - - - update_icon() - overlays.Cut() - if(focus && focus.icon && focus.icon_state) - overlays += icon(focus.icon,focus.icon_state) - return - -/*Not quite done likely needs to use something thats not get_step_to - proc/check_path() - var/turf/ref = get_turf(src.loc) - var/turf/target = get_turf(focus.loc) - if(!ref || !target) return 0 - var/distance = get_dist(ref, target) - if(distance >= 10) return 0 - for(var/i = 1 to distance) - ref = get_step_to(ref, target, 0) - if(ref != target) return 0 - return 1 -*/ - -//equip_to_slot_or_del(obj/item/W, slot, del_on_fail = 1) -/* - if(istype(user, /mob/living/carbon)) - if(user:mutations & TK && get_dist(source, user) <= 7) - if(user:get_active_hand()) return 0 - var/X = source:x - var/Y = source:y - var/Z = source:z - -*/ - +/* + Telekinesis + + This needs more thinking out, but I might as well. +*/ +var/const/tk_maxrange = 15 + +/* + Telekinetic attack: + + By default, emulate the user's unarmed attack +*/ +/atom/proc/attack_tk(mob/user) + if(user.stat) return + user.UnarmedAttack(src,0) // attack_hand, attack_paw, etc + return + +/* + This is similar to item attack_self, but applies to anything + that you can grab with a telekinetic grab. + + It is used for manipulating things at range, for example, opening and closing closets. + There are not a lot of defaults at this time, add more where appropriate. +*/ +/atom/proc/attack_self_tk(mob/user) + return + +/obj/attack_tk(mob/user) + if(user.stat) return + if(anchored) + ..() + return + + var/obj/item/tk_grab/O = new(src) + user.put_in_active_hand(O) + O.host = user + O.focus_object(src) + return + +/obj/item/attack_tk(mob/user) + if(user.stat || !isturf(loc)) return + if((TK in user.mutations) && !user.get_active_hand()) // both should already be true to get here + var/obj/item/tk_grab/O = new(src) + user.put_in_active_hand(O) + O.host = user + O.focus_object(src) + else + warning("Strange attack_tk(): TK([TK in user.mutations]) empty hand([!user.get_active_hand()])") + return + + +/mob/attack_tk(mob/user) + return // needs more thinking about + +/* + TK Grab Item (the workhorse of old TK) + + * If you have not grabbed something, do a normal tk attack + * If you have something, throw it at the target. If it is already adjacent, do a normal attackby() + * If you click what you are holding, or attack_self(), do an attack_self_tk() on it. + * Deletes itself if it is ever not in your hand, or if you should have no access to TK. +*/ +/obj/item/tk_grab + name = "Telekinetic Grab" + desc = "Magic" + icon = 'icons/obj/magic.dmi'//Needs sprites + icon_state = "2" + flags = NOBLUDGEON + //item_state = null + w_class = 10.0 + layer = 20 + + var/last_throw = 0 + var/atom/movable/focus = null + var/mob/living/host = null + + + dropped(mob/user as mob) + if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item + if(focus.Adjacent(loc)) + focus.loc = loc + + qdel(src) + return + + + //stops TK grabs being equipped anywhere but into hands + equipped(var/mob/user, var/slot) + if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return + qdel(src) + return + + + attack_self(mob/user as mob) + if(focus) + focus.attack_self_tk(user) + + afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity)//TODO: go over this + if(!target || !user) return + if(last_throw+3 > world.time) return + if(!host || host != user) + qdel(src) + return + if(!(TK in host.mutations)) + qdel(src) + return + if(isobj(target) && !isturf(target.loc)) + return + + var/d = get_dist(user, target) + if(focus) d = max(d,get_dist(user,focus)) // whichever is further + switch(d) + if(0) + ; + if(1 to 5) // not adjacent may mean blocked by window + if(!proximity) + user.next_move += 2 + if(5 to 7) + user.next_move += 5 + if(8 to tk_maxrange) + user.next_move += 10 + else + user << "\blue Your mind won't reach that far." + return + + if(!focus) + focus_object(target, user) + return + + if(target == focus) + target.attack_self_tk(user) + return // todo: something like attack_self not laden with assumptions inherent to attack_self + + + if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus)) + var/obj/item/I = focus + var/resolved = target.attackby(I, user, user:get_organ_target()) + if(!resolved && target && I) + I.afterattack(target,user,1) // for splashing with beakers + + + else + apply_focus_overlay() + focus.throw_at(target, 10, 1) + last_throw = world.time + return + + attack(mob/living/M as mob, mob/living/user as mob, def_zone) + return + + + proc/focus_object(var/obj/target, var/mob/living/user) + if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later + if(target.anchored || !isturf(target.loc)) + qdel(src) + return + focus = target + update_icon() + apply_focus_overlay() + return + + + proc/apply_focus_overlay() + if(!focus) return + var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z)) + O.name = "sparkles" + O.anchored = 1 + O.density = 0 + O.layer = FLY_LAYER + O.dir = pick(cardinal) + O.icon = 'icons/effects/effects.dmi' + O.icon_state = "nothing" + flick("empdisable",O) + spawn(5) + O.delete() + return + + + update_icon() + overlays.Cut() + if(focus && focus.icon && focus.icon_state) + overlays += icon(focus.icon,focus.icon_state) + return + +/*Not quite done likely needs to use something thats not get_step_to + proc/check_path() + var/turf/ref = get_turf(src.loc) + var/turf/target = get_turf(focus.loc) + if(!ref || !target) return 0 + var/distance = get_dist(ref, target) + if(distance >= 10) return 0 + for(var/i = 1 to distance) + ref = get_step_to(ref, target, 0) + if(ref != target) return 0 + return 1 +*/ + +//equip_to_slot_or_del(obj/item/W, slot, qdel_on_fail = 1) +/* + if(istype(user, /mob/living/carbon)) + if(user:mutations & TK && get_dist(source, user) <= 7) + if(user:get_active_hand()) return 0 + var/X = source:x + var/Y = source:y + var/Z = source:z + +*/ + diff --git a/code/controllers/_DynamicAreaLighting_TG.dm b/code/controllers/_DynamicAreaLighting_TG.dm index 4b04963a45c..d8cf40a0d41 100644 --- a/code/controllers/_DynamicAreaLighting_TG.dm +++ b/code/controllers/_DynamicAreaLighting_TG.dm @@ -139,7 +139,7 @@ atom/movable/New() light = new(src) //Objects with opacity will trigger nearby lights to update at next lighting process. -atom/movable/Del() +atom/movable/Destroy() if(opacity) if(isturf(loc)) if(loc:lighting_lumcount > 1) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index c2c1cb2dd33..ea330a5abf4 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -98,6 +98,8 @@ var/revival_cloning = 1 var/revival_brain_life = -1 + var/rename_cyborg = 0 + //Used for modifying movement speed for mobs. //Unversal modifiers var/run_speed = 0 @@ -277,6 +279,8 @@ config.revival_cloning = text2num(value) if("revival_brain_life") config.revival_brain_life = text2num(value) + if("rename_cyborg") + config.rename_cyborg = 1 if("run_delay") config.run_speed = text2num(value) if("walk_delay") diff --git a/code/controllers/garbage.dm b/code/controllers/garbage.dm new file mode 100644 index 00000000000..4708564e096 --- /dev/null +++ b/code/controllers/garbage.dm @@ -0,0 +1,131 @@ +#define GC_COLLECTIONS_PER_TICK 100 // how many objects we're going to null the vars of per tick +#define GC_COLLECTION_TIMEOUT 300 // deciseconds to wait to let running procs finish before we just say fuck it and force del() the object +#define GC_DEL_CHECK_PER_TICK 100 // number of tests per tick to make sure our GC'd objects are actually GC'd +#define GC_FORCE_DEL_PER_TICK 20 // max force del() calls per tick + +var/datum/controller/garbage_collector/garbage = new() + +var/list/uncollectable_vars=list( +// "bounds", // bounds and its ilk are all caught by the issaved() check later on + "contents", + "gc_destroyed", + "invisibility", + "gender", // Causes runtimes if the logging is on + "parent", + "step_size", +) +// These are the vars left from /vg/'s implementation that aren't const or global +// I dunno how many are necessary but since most of these are numbers anyways, I don't care. + +/datum/controller/garbage_collector + var/dels = 0 // number of del()'s we've done this tick + var/list/queue = list() // list of things that have yet to have all their vars nulled out + var/list/destroyed = list() // list of refID's of things that should be garbage collected + // refID's are associated with the time at which they time out and need to be manually del() + // we do this so we aren't constantly locating them and preventing them from being gc'd + +/datum/controller/garbage_collector/proc/AddTrash(var/atom/movable/A) + if(!istype(A)) + return +// testing("GC: AddTrash([A.type])") + queue |= A + +/datum/controller/garbage_collector/proc/Pop() + var/atom/movable/A = queue[1] + if(!A) + queue.Cut(1, 2) +// testing("GC: Pop() given null") + return + if(!istype(A,/atom/movable)) +// testing("GC: -- Pop() given [A.type] --") + queue.Cut(1, 2) + dels++ + del(A) + return + for(var/vname in A.vars) + if(!issaved(A.vars[vname])) +// testing("GC: Skipping [vname] in [A.type]: it's const|global|tmp") + continue + if(vname in uncollectable_vars) +// testing("GC: Skipping [vname] in [A.type]: it's uncollectable") + continue +// testing("GC: Unsetting [vname] in [A.type]") + A.vars[vname] = null +// testing("GC: Pop([A.type]) - destroyed\[\ref[A]\] = [A.gc_destroyed] current time: [world.time] first:[queue[1]] second:[queue.len > 1 ? "[queue[2]]" : "NOTHING"]") + destroyed["\ref[A]"] = A.gc_destroyed + queue.Cut(1, 2) + +/datum/controller/garbage_collector/proc/process() + dels = 0 + var/i + for(i = 1, queue.len && i <= GC_COLLECTIONS_PER_TICK, i++) + Pop() + var/time_to_kill = world.time - GC_COLLECTION_TIMEOUT // Anything qdel() but not GC'd BEFORE this time needs to be manually del() + for(i = 1, destroyed.len && i <= GC_DEL_CHECK_PER_TICK, i++) + var/refID = destroyed[1] + var/GCd_at_time = destroyed[refID] + if(GCd_at_time > time_to_kill) +// testing("GC: [refID] not old enough, breaking at [world.time] for [GCd_at_time - time_to_kill] deciseconds until [GCd_at_time + GC_COLLECTION_TIMEOUT]") + break // Everything else is newer, skip them + var/atom/A = locate(refID) +// testing("GC: [refID] old enough to test: GCd_at_time: [GCd_at_time] time_to_kill: [time_to_kill] current: [world.time]") + if(A && A.gc_destroyed == GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake + // Something's still referring to the qdel'd object. Kill it. + if(dels >= GC_FORCE_DEL_PER_TICK) +// testing("GC: Reached max force dels per tick [dels] vs [GC_FORCE_DEL_PER_TICK]") + break // Server's already pretty pounded, everything else can wait 2 seconds + testing("GC: -- \ref[A] | [A.type] was unable to be garbage collected and was force del() --") + del(A) + dels++ +// else +// testing("GC: [refID] properly GC'd at [world.time] with timeout [GCd_at_time]") + destroyed.Cut(1, 2) + +/** +* NEVER USE THIS FOR ANYTHING OTHER THAN /atom/movable +* OTHER TYPES CANNOT BE QDEL'D BECAUSE THEIR LOC IS LOCKED OR THEY DON'T HAVE ONE. +* While I'm leaving the above comment in since /atoms cannot be garbage collected, datums and lists can be garbage collected just fine. +* Read the DM guide on it. Hit f1 and search for "garbage collection" +*/ +/proc/qdel(var/atom/movable/A) + if(!A) + return + if(!garbage) + del(A) + return + if(!istype(A)) + warning("qdel() passed object of type [A.type]. qdel() can only handle /atom/movable types.") + garbage.dels++ + del(A) + return + // Let our friend know they're about to get fucked up. + A.Destroy() + garbage.AddTrash(A) + + +/* +// Uncomment this verb and run it on things to report blockages. +/atom/verb/qdel_test() + set name = "qdel with test" + set category = "Debug" + set background = 1 + set src in world + + qdel(src) + for(var/datum/everything) //Yes this works. + for(var/everyvar in everything.vars) + var/variable = everything.vars[everyvar] + if(variable == src) + testing("Found [src.type] \ref[src] in [everything.type]'s [everyvar] var.") + else if(islist(variable)) + if(src in variable) + testing("Found [src.type]\ref[src] in [everything.type]'s [everyvar] var.") + for(var/atom/movable/everything) //The slow part. + for(var/everyvar in everything.vars) + var/variable = everything.vars[everyvar] + if(variable == src) + testing("Found [src.type] \ref[src] in [everything.type]'s [everyvar] var.") + else if(islist(variable)) + if(src in variable) + testing("Found [src.type]\ref[src] in [everything.type]'s [everyvar] var.") +*/ \ No newline at end of file diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 31b015dfa24..45d1af27ccf 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -27,6 +27,7 @@ datum/controller/game_controller var/nano_cost = 0 var/events_cost = 0 var/ticker_cost = 0 + var/gc_cost = 0 var/total_cost = 0 var/last_thing_processed @@ -63,7 +64,6 @@ datum/controller/game_controller/New() if(!emergency_shuttle) emergency_shuttle = new /datum/shuttle_controller/emergency_shuttle() if(!supply_shuttle) supply_shuttle = new /datum/controller/supply_shuttle() - datum/controller/game_controller/proc/setup() world.tick_lag = config.Ticklag @@ -201,8 +201,14 @@ datum/controller/game_controller/proc/process() ticker.process() ticker_cost = (world.timeofday - timer) / 10 + // GC + timer = world.timeofday + last_thing_processed = garbage.type + garbage.process() + gc_cost = (world.timeofday - timer) / 10 + //TIMING - total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + objects_cost + networks_cost + powernets_cost + nano_cost + events_cost + ticker_cost + total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + objects_cost + networks_cost + powernets_cost + nano_cost + events_cost + ticker_cost + gc_cost var/end_time = world.timeofday if(end_time < start_time) @@ -228,7 +234,7 @@ datum/controller/game_controller/proc/process_mobs() var/i = 1 while(i<=mob_list.len) var/mob/M = mob_list[i] - if(M) + if(M && !M.gc_destroyed) last_thing_processed = M.type M.Life() i++ @@ -250,7 +256,7 @@ datum/controller/game_controller/proc/process_machines() var/i = 1 while(i<=machines.len) var/obj/machinery/Machine = machines[i] - if(Machine) + if(Machine && !Machine.gc_destroyed) last_thing_processed = Machine.type if(Machine.process() != PROCESS_KILL) if(Machine) @@ -264,7 +270,7 @@ datum/controller/game_controller/proc/process_objects() var/i = 1 while(i<=processing_objects.len) var/obj/Object = processing_objects[i] - if(Object) + if(Object && !Object.gc_destroyed) last_thing_processed = Object.type Object.process() i++ diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 0ee9264a211..c33ccc2a00e 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -98,7 +98,7 @@ datum/shuttle_controller for(var/SC in shuttle_caller_list) if(istype(SC,/mob/living/silicon/ai)) var/mob/living/silicon/ai/AI = SC - if(AI.stat && !AI.client) + if(AI.stat || !AI.client) continue var/turf/T = get_turf(SC) if(T && T.z == 1) @@ -111,8 +111,8 @@ datum/shuttle_controller if(callshuttle) if(!online && direction == 1) //we don't call the shuttle if it's already coming incall(SHUTTLEAUTOCALLTIMER) //X minutes! If they want to recall, they have X-(X-5) minutes to do so - log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.") - message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1) + log_game("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.") + message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.", 1) captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.") world << sound('sound/AI/shuttlecalled.ogg') @@ -193,7 +193,7 @@ datum/shuttle_controller sleep(speed) step(src, direction) for(var/obj/effect/starender/E in loc) - del(src) + qdel(src) /obj/effect/starender diff --git a/code/controllers/supply_shuttle.dm b/code/controllers/supply_shuttle.dm index 2b401a431a3..758d1bd7c92 100644 --- a/code/controllers/supply_shuttle.dm +++ b/code/controllers/supply_shuttle.dm @@ -49,13 +49,13 @@ var/global/datum/controller/supply_shuttle/supply_shuttle /obj/structure/plasticflaps/ex_act(severity) switch(severity) if (1) - del(src) + qdel(src) if (2) if (prob(50)) - del(src) + qdel(src) if (3) if (prob(5)) - del(src) + qdel(src) /obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates name = "airtight plastic flaps" @@ -67,7 +67,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle T.blocks_air = 1 ..() - Del() //lazy hack to set the turf to allow air to pass if it's a simulated floor + Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor //wow this is terrible var/turf/T = get_turf(loc) if(T) if(istype(T, /turf/simulated/floor)) @@ -303,7 +303,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle discoveredPlants[S.type] = S.potency centcom_message += "+[S.rarity]: New species discovered: \"[capitalize(S.species)]\". Excellent work.
" points += S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later - del(MA) + qdel(MA) if(plasma_count) centcom_message += "+[round(plasma_count/plasma_per_point)]: Received [plasma_count] units of exotic material.
" @@ -387,7 +387,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle // If it has multiple items, there's a 1% of each going missing... Not for secure crates or those large wooden ones, though. if(contains.len > 1 && prob(1) && !findtext(SP.containertype,"/secure/") && !findtext(SP.containertype,"/largecrate/")) slip.erroneous |= MANIFEST_ERROR_ITEM // This item was not included in the shipment! - del(B2) // Lost in space... or the loading dock. + qdel(B2) // Lost in space... or the loading dock. //manifest finalisation slip.info += "
" diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 18fe42bbe4a..729db3c2c17 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -1,81 +1,84 @@ -//TODO: rewrite and standardise all controller datums to the datum/controller type -//TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done - -/client/proc/restart_controller(controller in list("Master","Failsafe","Lighting","Supply Shuttle")) - set category = "Debug" - set name = "Restart Controller" - set desc = "Restart one of the various periodic loop controllers for the game (be careful!)" - - if(!holder) return - usr = null - src = null - switch(controller) - if("Master") - new /datum/controller/game_controller() - master_controller.process() - feedback_add_details("admin_verb","RMC") - if("Failsafe") - new /datum/controller/failsafe() - feedback_add_details("admin_verb","RFailsafe") - if("Lighting") - new /datum/controller/lighting() - lighting_controller.process() - feedback_add_details("admin_verb","RLighting") - if("Supply Shuttle") - supply_shuttle.process() - feedback_add_details("admin_verb","RSupply") - message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.") - return - - -/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI", "Cameras", "Events")) - set category = "Debug" - set name = "Debug Controller" - set desc = "Debug the various periodic loop controllers for the game (be careful!)" - - if(!holder) return - switch(controller) - if("Master") - debug_variables(master_controller) - feedback_add_details("admin_verb","DMC") - if("Failsafe") - debug_variables(Failsafe) - feedback_add_details("admin_verb","DFailsafe") - if("Ticker") - debug_variables(ticker) - feedback_add_details("admin_verb","DTicker") - if("Lighting") - debug_variables(lighting_controller) - feedback_add_details("admin_verb","DLighting") - if("Air") - debug_variables(air_master) - feedback_add_details("admin_verb","DAir") - if("Jobs") - debug_variables(job_master) - feedback_add_details("admin_verb","DJobs") - if("Sun") - debug_variables(sun) - feedback_add_details("admin_verb","DSun") - if("Radio") - debug_variables(radio_controller) - feedback_add_details("admin_verb","DRadio") - if("Supply Shuttle") - debug_variables(supply_shuttle) - feedback_add_details("admin_verb","DSupply") - if("Emergency Shuttle") - debug_variables(emergency_shuttle) - feedback_add_details("admin_verb","DEmergency") - if("Configuration") - debug_variables(config) - feedback_add_details("admin_verb","DConf") - if("pAI") - debug_variables(paiController) - feedback_add_details("admin_verb","DpAI") - if("Cameras") - debug_variables(cameranet) - feedback_add_details("admin_verb","DCameras") - if("Events") - debug_variables(events) - feedback_add_details("admin_verb","DEvents") - message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") - return +//TODO: rewrite and standardise all controller datums to the datum/controller type +//TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done + +/client/proc/restart_controller(controller in list("Master","Failsafe","Lighting","Supply Shuttle")) + set category = "Debug" + set name = "Restart Controller" + set desc = "Restart one of the various periodic loop controllers for the game (be careful!)" + + if(!holder) return + usr = null + src = null + switch(controller) + if("Master") + new /datum/controller/game_controller() + master_controller.process() + feedback_add_details("admin_verb","RMC") + if("Failsafe") + new /datum/controller/failsafe() + feedback_add_details("admin_verb","RFailsafe") + if("Lighting") + new /datum/controller/lighting() + lighting_controller.process() + feedback_add_details("admin_verb","RLighting") + if("Supply Shuttle") + supply_shuttle.process() + feedback_add_details("admin_verb","RSupply") + message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.") + return + + +/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Garbage","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI", "Cameras", "Events")) + set category = "Debug" + set name = "Debug Controller" + set desc = "Debug the various periodic loop controllers for the game (be careful!)" + + if(!holder) return + switch(controller) + if("Master") + debug_variables(master_controller) + feedback_add_details("admin_verb","DMC") + if("Failsafe") + debug_variables(Failsafe) + feedback_add_details("admin_verb","DFailsafe") + if("Ticker") + debug_variables(ticker) + feedback_add_details("admin_verb","DTicker") + if("Lighting") + debug_variables(lighting_controller) + feedback_add_details("admin_verb","DLighting") + if("Garbage") + debug_variables(garbage) + feedback_add_details("admin_verb","DGarbage") + if("Air") + debug_variables(air_master) + feedback_add_details("admin_verb","DAir") + if("Jobs") + debug_variables(job_master) + feedback_add_details("admin_verb","DJobs") + if("Sun") + debug_variables(sun) + feedback_add_details("admin_verb","DSun") + if("Radio") + debug_variables(radio_controller) + feedback_add_details("admin_verb","DRadio") + if("Supply Shuttle") + debug_variables(supply_shuttle) + feedback_add_details("admin_verb","DSupply") + if("Emergency Shuttle") + debug_variables(emergency_shuttle) + feedback_add_details("admin_verb","DEmergency") + if("Configuration") + debug_variables(config) + feedback_add_details("admin_verb","DConf") + if("pAI") + debug_variables(paiController) + feedback_add_details("admin_verb","DpAI") + if("Cameras") + debug_variables(cameranet) + feedback_add_details("admin_verb","DCameras") + if("Events") + debug_variables(events) + feedback_add_details("admin_verb","DEvents") + message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") + return diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 80f451fc871..d333851fb73 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -617,7 +617,7 @@ client for(var/obj/Obj in world) if(Obj.type == O_type) i++ - del(Obj) + qdel(Obj) if(!i) usr << "No objects of this type exist" return @@ -628,7 +628,7 @@ client for(var/obj/Obj in world) if(istype(Obj,O_type)) i++ - del(Obj) + qdel(Obj) if(!i) usr << "No objects of this type exist" return diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 0b3e1e7e17b..3924c740a54 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -108,7 +108,6 @@ var/list/advance_cures = list( affected_mob.resistances[id] = id affected_mob.viruses -= src //remove the datum from the list del(src) //delete the datum to stop it processing - return // Returns the advance disease with a different reference memory. /datum/disease/advance/Copy(var/process = 0) diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm index 11a580dce5f..9db0b88b46b 100644 --- a/code/datums/diseases/advance/symptoms/genetics.dm +++ b/code/datums/diseases/advance/symptoms/genetics.dm @@ -1,81 +1,81 @@ -/* -////////////////////////////////////// - -DNA Saboteur - - Very noticable. - Lowers resistance tremendously. - No changes to stage speed. - Decreases transmittablity temrendously. - Fatal Level. - -Bonus - Cleans the DNA of a person and then randomly gives them a disability. - -////////////////////////////////////// -*/ - -/datum/symptom/genetic_mutation - - name = "Deoxyribonucleic Acid Saboteur" - stealth = -2 - resistance = -3 - stage_speed = 0 - transmittable = -3 - level = 6 - var/good_mutations = 0 - var/archived_dna = null - -/datum/symptom/genetic_mutation/Activate(var/datum/disease/advance/A) - ..() - if(prob(SYMPTOM_ACTIVATION_PROB)) - var/mob/living/M = A.affected_mob - switch(A.stage) - if(4, 5) - M << "[pick("Your skin feels itchy.", "You feel light headed.")]" - clean_randmut(M, good_mutations == 1 ? (good_se_blocks | op_se_blocks) : bad_se_blocks, 20) // Give them a random good/bad mutation. - domutcheck(M, null, 1) // Force the power to manifest - return - -// Archive their DNA before they were infected. -/datum/symptom/genetic_mutation/Start(var/datum/disease/advance/A) - var/mob/living/carbon/M = A.affected_mob - if(M) - if(!check_dna_integrity(M)) - return - archived_dna = M.dna.struc_enzymes - -// Give them back their old DNA when cured. -/datum/symptom/genetic_mutation/End(var/datum/disease/advance/A) - var/mob/living/carbon/M = A.affected_mob - if(M && archived_dna) - if(!check_dna_integrity(M)) - return - hardset_dna(M, se = archived_dna) - -/* -////////////////////////////////////// - -DNA Aide - - Very very noticable. - Lowers resistance tremendously. - No changes to stage speed. - Decreases transmittablity temrendously. - Fatal Level. - -Bonus - Cleans the DNA of a person and then randomly gives them a power.. - -////////////////////////////////////// -*/ - -/datum/symptom/genetic_mutation/powers - - name = "Deoxyribonucleic Acid Aide" - stealth = -3 - resistance = -4 - stage_speed = 0 - transmittable = -4 - level = 6 +/* +////////////////////////////////////// + +DNA Saboteur + + Very noticable. + Lowers resistance tremendously. + No changes to stage speed. + Decreases transmittablity temrendously. + Fatal Level. + +Bonus + Cleans the DNA of a person and then randomly gives them a disability. + +////////////////////////////////////// +*/ + +/datum/symptom/genetic_mutation + + name = "Deoxyribonucleic Acid Saboteur" + stealth = -2 + resistance = -3 + stage_speed = 0 + transmittable = -3 + level = 6 + var/good_mutations = 0 + var/archived_dna = null + +/datum/symptom/genetic_mutation/Activate(var/datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(4, 5) + M << "[pick("Your skin feels itchy.", "You feel light headed.")]" + clean_randmut(M, good_mutations == 1 ? (good_se_blocks | op_se_blocks) : bad_se_blocks, 20) // Give them a random good/bad mutation. + domutcheck(M, null, 1) // Force the power to manifest + return + +// Archive their DNA before they were infected. +/datum/symptom/genetic_mutation/Start(var/datum/disease/advance/A) + var/mob/living/carbon/M = A.affected_mob + if(M) + if(!check_dna_integrity(M)) + return + archived_dna = M.dna.struc_enzymes + +// Give them back their old DNA when cured. +/datum/symptom/genetic_mutation/End(var/datum/disease/advance/A) + var/mob/living/carbon/M = A.affected_mob + if(M && archived_dna) + if(!check_dna_integrity(M)) + return + hardset_dna(M, se = archived_dna) + +/* +////////////////////////////////////// + +DNA Aide + + Very very noticable. + Lowers resistance tremendously. + No changes to stage speed. + Decreases transmittablity temrendously. + Fatal Level. + +Bonus + Cleans the DNA of a person and then randomly gives them a power.. + +////////////////////////////////////// +*/ + +/datum/symptom/genetic_mutation/powers + + name = "Deoxyribonucleic Acid Aide" + stealth = -3 + resistance = -4 + stage_speed = 0 + transmittable = -4 + level = 6 good_mutations = 1 \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/vitiligo.dm b/code/datums/diseases/advance/symptoms/vitiligo.dm index fd7b0aca281..21036166dbe 100644 --- a/code/datums/diseases/advance/symptoms/vitiligo.dm +++ b/code/datums/diseases/advance/symptoms/vitiligo.dm @@ -1,41 +1,41 @@ -/* -////////////////////////////////////// -Vitiligo - - Extremely Noticable. - Decreases resistance slightly. - Reduces stage speed slightly. - Reduces transmission. - Critical Level. - -BONUS - Makes the mob lose skin pigmentation. - -////////////////////////////////////// -*/ - -/datum/symptom/vitiligo - - name = "Vitiligo" - stealth = -3 - resistance = -1 - stage_speed = -1 - transmittable = -2 - level = 5 - -/datum/symptom/vitiligo/Activate(var/datum/disease/advance/A) - ..() - if(prob(SYMPTOM_ACTIVATION_PROB)) - var/mob/living/M = A.affected_mob - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(H.skin_tone == "albino") - return - switch(A.stage) - if(5) - H.skin_tone = "albino" - H.update_body(0) - else - H.visible_message("[H] looks a bit pale...", "You look a bit pale...") - +/* +////////////////////////////////////// +Vitiligo + + Extremely Noticable. + Decreases resistance slightly. + Reduces stage speed slightly. + Reduces transmission. + Critical Level. + +BONUS + Makes the mob lose skin pigmentation. + +////////////////////////////////////// +*/ + +/datum/symptom/vitiligo + + name = "Vitiligo" + stealth = -3 + resistance = -1 + stage_speed = -1 + transmittable = -2 + level = 5 + +/datum/symptom/vitiligo/Activate(var/datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(H.skin_tone == "albino") + return + switch(A.stage) + if(5) + H.skin_tone = "albino" + H.update_body(0) + else + H.visible_message("[H] looks a bit pale...", "You look a bit pale...") + return \ No newline at end of file diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 619e0f988af..e014e901902 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -2,7 +2,7 @@ name = "Pierrot's Throat" max_stages = 4 spread = "Airborne" - cure = "A whole banana." + cure = "Banana products, especially banana bread." cure_id = "banana" cure_chance = 75 agent = "H0NI<42 Virus" @@ -22,4 +22,4 @@ if(3) if(prob(10)) affected_mob << "\red Your thoughts are interrupted by a loud HONK!" if(4) - if(prob(5)) affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) \ No newline at end of file + if(prob(5)) affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index 8e70770a4a4..1defba4e13d 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -1,51 +1,51 @@ -/datum/disease/rhumba_beat - name = "The Rhumba Beat" - max_stages = 5 - spread = "On contact" - spread_type = CONTACT_GENERAL - cure = "Chick Chicky Boom!" - cure_id = list("plasma") - agent = "Unknown" - affected_species = list("Human") - permeability_mod = 1 - -/datum/disease/rhumba_beat/stage_act() - ..() - switch(stage) - if(1) - if(affected_mob.ckey == "rosham") - src.cure() - if(2) - if(affected_mob.ckey == "rosham") - src.cure() - if(prob(45)) - affected_mob.adjustToxLoss(5) - affected_mob.updatehealth() - if(prob(1)) - affected_mob << "\red You feel strange..." - if(3) - if(affected_mob.ckey == "rosham") - src.cure() - if(prob(5)) - affected_mob << "\red You feel the urge to dance..." - else if(prob(5)) - affected_mob.emote("gasp") - else if(prob(10)) - affected_mob << "\red You feel the need to chick chicky boom..." - if(4) - if(affected_mob.ckey == "rosham") - src.cure() - if(prob(10)) - affected_mob.emote("gasp") - affected_mob << "\red You feel a burning beat inside..." - if(prob(20)) - affected_mob.adjustToxLoss(5) - affected_mob.updatehealth() - if(5) - if(affected_mob.ckey == "rosham") - src.cure() - affected_mob << "\red Your body is unable to contain the Rhumba Beat..." - if(prob(50)) - affected_mob.gib() - else +/datum/disease/rhumba_beat + name = "The Rhumba Beat" + max_stages = 5 + spread = "On contact" + spread_type = CONTACT_GENERAL + cure = "Chick Chicky Boom!" + cure_id = list("plasma") + agent = "Unknown" + affected_species = list("Human") + permeability_mod = 1 + +/datum/disease/rhumba_beat/stage_act() + ..() + switch(stage) + if(1) + if(affected_mob.ckey == "rosham") + src.cure() + if(2) + if(affected_mob.ckey == "rosham") + src.cure() + if(prob(45)) + affected_mob.adjustToxLoss(5) + affected_mob.updatehealth() + if(prob(1)) + affected_mob << "\red You feel strange..." + if(3) + if(affected_mob.ckey == "rosham") + src.cure() + if(prob(5)) + affected_mob << "\red You feel the urge to dance..." + else if(prob(5)) + affected_mob.emote("gasp") + else if(prob(10)) + affected_mob << "\red You feel the need to chick chicky boom..." + if(4) + if(affected_mob.ckey == "rosham") + src.cure() + if(prob(10)) + affected_mob.emote("gasp") + affected_mob << "\red You feel a burning beat inside..." + if(prob(20)) + affected_mob.adjustToxLoss(5) + affected_mob.updatehealth() + if(5) + if(affected_mob.ckey == "rosham") + src.cure() + affected_mob << "\red Your body is unable to contain the Rhumba Beat..." + if(prob(50)) + affected_mob.gib() + else return \ No newline at end of file diff --git a/code/datums/diseases/robotic_transformation.dm b/code/datums/diseases/robotic_transformation.dm index 935dd297a30..da0540c8bdc 100644 --- a/code/datums/diseases/robotic_transformation.dm +++ b/code/datums/diseases/robotic_transformation.dm @@ -1,64 +1,64 @@ -//Nanomachines! - -/datum/disease/robotic_transformation - name = "Robotic Transformation" - max_stages = 5 - spread = "Syringe" - spread_type = SPECIAL - cure = "An injection of copper." - cure_id = list("copper") - cure_chance = 5 - agent = "R2D2 Nanomachines" - affected_species = list("Human") - desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." - severity = "Major" - var/gibbed = 0 - -/datum/disease/robotic_transformation/stage_act() - ..() - switch(stage) - if(2) - if (prob(8)) - affected_mob << "Your joints feel stiff." - affected_mob.take_organ_damage(1) - if (prob(9)) - affected_mob << "\red Beep...boop.." - if (prob(9)) - affected_mob << "\red Bop...beeep..." - if(3) - if (prob(8)) - affected_mob << "\red Your joints feel very stiff." - affected_mob.take_organ_damage(1) - if (prob(8)) - affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) - if (prob(10)) - affected_mob << "Your skin feels loose." - affected_mob.take_organ_damage(5) - if (prob(4)) - affected_mob << "\red You feel a stabbing pain in your head." - affected_mob.Paralyse(2) - if (prob(4)) - affected_mob << "\red You can feel something move...inside." - if(4) - if (prob(10)) - affected_mob << "\red Your skin feels very loose." - affected_mob.take_organ_damage(8) - if (prob(20)) - affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee...")) - if (prob(8)) - affected_mob << "\red You can feel... something...inside you." - if(5) - affected_mob <<"\red Your skin feels as if it's about to burst off..." - affected_mob.adjustToxLoss(10) - affected_mob.updatehealth() - if(prob(40)) //So everyone can feel like robot Seth Brundle - if(src.gibbed != 0) return 0 - var/turf/T = find_loc(affected_mob) - gibs(T) - gibbed = 1 - var/mob/living/carbon/human/H = affected_mob - if(istype(H) && !jobban_isbanned(affected_mob, "Cyborg")) - H.Robotize() - else - affected_mob.death(1) - +//Nanomachines! + +/datum/disease/robotic_transformation + name = "Robotic Transformation" + max_stages = 5 + spread = "Syringe" + spread_type = SPECIAL + cure = "An injection of copper." + cure_id = list("copper") + cure_chance = 5 + agent = "R2D2 Nanomachines" + affected_species = list("Human") + desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." + severity = "Major" + var/gibbed = 0 + +/datum/disease/robotic_transformation/stage_act() + ..() + switch(stage) + if(2) + if (prob(8)) + affected_mob << "Your joints feel stiff." + affected_mob.take_organ_damage(1) + if (prob(9)) + affected_mob << "\red Beep...boop.." + if (prob(9)) + affected_mob << "\red Bop...beeep..." + if(3) + if (prob(8)) + affected_mob << "\red Your joints feel very stiff." + affected_mob.take_organ_damage(1) + if (prob(8)) + affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) + if (prob(10)) + affected_mob << "Your skin feels loose." + affected_mob.take_organ_damage(5) + if (prob(4)) + affected_mob << "\red You feel a stabbing pain in your head." + affected_mob.Paralyse(2) + if (prob(4)) + affected_mob << "\red You can feel something move...inside." + if(4) + if (prob(10)) + affected_mob << "\red Your skin feels very loose." + affected_mob.take_organ_damage(8) + if (prob(20)) + affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee...")) + if (prob(8)) + affected_mob << "\red You can feel... something...inside you." + if(5) + affected_mob <<"\red Your skin feels as if it's about to burst off..." + affected_mob.adjustToxLoss(10) + affected_mob.updatehealth() + if(prob(40)) //So everyone can feel like robot Seth Brundle + if(src.gibbed != 0) return 0 + var/turf/T = find_loc(affected_mob) + gibs(T) + gibbed = 1 + var/mob/living/carbon/human/H = affected_mob + if(istype(H) && !jobban_isbanned(affected_mob, "Cyborg")) + H.Robotize() + else + affected_mob.death(1) + diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 40413e626af..f1ee58534ec 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -1,172 +1,172 @@ -/datum/disease/transformation - - name = "Transformation" - max_stages = 5 - spread = "Acute" - spread_type = SPECIAL - cure = "A coder's love (theoretical)." - agent = "Shenanigans" - affected_species = list("Human", "Monkey", "Alien") - severity = "Major" - stage_prob = 10 - hidden = list(1, 1) - var/list/stage1 = list("You feel unremarkable.") - var/list/stage2 = list("You feel boring.") - var/list/stage3 = list("You feel utterly plain.") - var/list/stage4 = list("You feel white bread.") - var/list/stage5 = list("Oh the humanity!") - var/new_form = /mob/living/carbon/human - -/datum/disease/transformation/stage_act() - ..() - switch(stage) - if(1) - if (prob(10) && stage1) - affected_mob << pick(stage1) - if(2) - if (prob(10) && stage2) - affected_mob << pick(stage2) - if(3) - if (prob(20) && stage3) - affected_mob << pick(stage3) - if(4) - if (prob(20) && stage4) - affected_mob << pick(stage4) - if(5) - if(istype(affected_mob, /mob/living/carbon) && affected_mob.stat != DEAD) - if(stage5) - affected_mob << pick(stage5) - if(jobban_isbanned(affected_mob, new_form)) - affected_mob.death(1) - return - if(affected_mob.notransform) return - affected_mob.notransform = 1 - affected_mob.canmove = 0 - affected_mob.icon = null - affected_mob.overlays.Cut() - affected_mob.invisibility = 101 - for(var/obj/item/W in affected_mob) - if(istype(W, /obj/item/weapon/implant)) - del(W) - continue - W.layer = initial(W.layer) - W.loc = affected_mob.loc - W.dropped(affected_mob) - var/mob/living/new_mob = new new_form(affected_mob.loc) - if(istype(new_mob)) - new_mob.a_intent = "harm" - new_mob.universal_speak = 1 - if(affected_mob.mind) - affected_mob.mind.transfer_to(new_mob) - else - new_mob.key = affected_mob.key - del(affected_mob) - - -/datum/disease/transformation/robot - - name = "Robotic Transformation" - cure = "An injection of copper." - cure_id = list("copper") - cure_chance = 5 - agent = "R2D2 Nanomachines" - desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." - hidden = list(0, 0) - stage1 = list("") - stage2 = list("Your joints feel stiff.", "\red Beep...boop..") - stage3 = list("\red Your joints feel very stiff.", "Your skin feels loose.", "\red You can feel something move...inside.") - stage4 = list("\red Your skin feels very loose.", "\red You can feel... something...inside you.") - stage5 = list("\red Your skin feels as if it's about to burst off!") - new_form = /mob/living/silicon/robot - -/datum/disease/transformation/robot/stage_act() - ..() - switch(stage) - if(3) - if (prob(8)) - affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) - if (prob(4)) - affected_mob << "\red You feel a stabbing pain in your head." - affected_mob.Paralyse(2) - if(4) - if (prob(20)) - affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee...")) - - -/datum/disease/transformation/xeno - - name = "Xenomorph Transformation" - cure = "Spaceacillin & Glycerol" - cure_id = list("spaceacillin", "glycerol") - cure_chance = 5 - agent = "Rip-LEY Alien Microbes" - hidden = list(0, 0) - stage1 = list("") - stage2 = list("Your throat feels scratchy.", "\red Kill...") - stage3 = list("\red Your throat feels very scratchy.", "Your skin feels tight.", "\red You can feel something move...inside.") - stage4 = list("\red Your skin feels very tight.", "\red Your blood boils!", "\red You can feel... something...inside you.") - stage5 = list("\red Your skin feels as if it's about to burst off!") - new_form = /mob/living/carbon/alien/humanoid/hunter - -/datum/disease/transformation/xeno/stage_act() - ..() - switch(stage) - if(3) - if (prob(4)) - affected_mob << "\red You feel a stabbing pain in your head." - affected_mob.Paralyse(2) - if(4) - if (prob(20)) - affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!")) - - -/datum/disease/transformation/slime - name = "Advanced Mutation Transformation" - cure = "frost oil" - cure_id = list("frostoil") - cure_chance = 80 - agent = "Advanced Mutation Toxin" - desc = "This highly concentrated extract converts anything into more of itself." - hidden = list(0, 0) - stage1 = list("You don't feel very well.") - stage2 = list("You are turning a little green.") - stage3 = list("\red Your limbs are getting oozy.", "\red Your skin begins to peel away.") - stage4 = list("\red You are turning into a slime.") - stage5 = list("\red You have become a slime.") - new_form = /mob/living/carbon/slime - -/datum/disease/transformation/slime/stage_act() - ..() - switch(stage) - if(1) - if(ishuman(affected_mob) && affected_mob.dna && affected_mob.dna.mutantrace == "slime") - stage = 5 - if(3) - if(ishuman(affected_mob)) - var/mob/living/carbon/human/human = affected_mob - if(human.dna && !human.dna.mutantrace) - human.dna.mutantrace = "slime" - human.update_body() - - -/datum/disease/transformation/corgi - name = "The Barkening" - cure = "Death" - agent = "Fell Doge Majicks" - hidden = list(0, 0) - stage1 = list("BARK.") - stage2 = list("You feel the need to wear silly hats.") - stage3 = list("\red Must... eat... chocolate....", "\red YAP") - stage4 = list("\red Visions of washing machines assail your mind!") - stage5 = list("\red AUUUUUU!!!") - new_form = /mob/living/simple_animal/corgi - -/datum/disease/transformation/corgi/stage_act() - ..() - switch(stage) - if(3) - if (prob(8)) - affected_mob.say(pick("YAP", "Woof!")) - if(4) - if (prob(20)) - affected_mob.say(pick("Bark!", "AUUUUUU")) +/datum/disease/transformation + + name = "Transformation" + max_stages = 5 + spread = "Acute" + spread_type = SPECIAL + cure = "A coder's love (theoretical)." + agent = "Shenanigans" + affected_species = list("Human", "Monkey", "Alien") + severity = "Major" + stage_prob = 10 + hidden = list(1, 1) + var/list/stage1 = list("You feel unremarkable.") + var/list/stage2 = list("You feel boring.") + var/list/stage3 = list("You feel utterly plain.") + var/list/stage4 = list("You feel white bread.") + var/list/stage5 = list("Oh the humanity!") + var/new_form = /mob/living/carbon/human + +/datum/disease/transformation/stage_act() + ..() + switch(stage) + if(1) + if (prob(10) && stage1) + affected_mob << pick(stage1) + if(2) + if (prob(10) && stage2) + affected_mob << pick(stage2) + if(3) + if (prob(20) && stage3) + affected_mob << pick(stage3) + if(4) + if (prob(20) && stage4) + affected_mob << pick(stage4) + if(5) + if(istype(affected_mob, /mob/living/carbon) && affected_mob.stat != DEAD) + if(stage5) + affected_mob << pick(stage5) + if(jobban_isbanned(affected_mob, new_form)) + affected_mob.death(1) + return + if(affected_mob.notransform) return + affected_mob.notransform = 1 + affected_mob.canmove = 0 + affected_mob.icon = null + affected_mob.overlays.Cut() + affected_mob.invisibility = 101 + for(var/obj/item/W in affected_mob) + if(istype(W, /obj/item/weapon/implant)) + qdel(W) + continue + W.layer = initial(W.layer) + W.loc = affected_mob.loc + W.dropped(affected_mob) + var/mob/living/new_mob = new new_form(affected_mob.loc) + if(istype(new_mob)) + new_mob.a_intent = "harm" + new_mob.universal_speak = 1 + if(affected_mob.mind) + affected_mob.mind.transfer_to(new_mob) + else + new_mob.key = affected_mob.key + qdel(affected_mob) + + +/datum/disease/transformation/robot + + name = "Robotic Transformation" + cure = "An injection of copper." + cure_id = list("copper") + cure_chance = 5 + agent = "R2D2 Nanomachines" + desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." + hidden = list(0, 0) + stage1 = list("") + stage2 = list("Your joints feel stiff.", "\red Beep...boop..") + stage3 = list("\red Your joints feel very stiff.", "Your skin feels loose.", "\red You can feel something move...inside.") + stage4 = list("\red Your skin feels very loose.", "\red You can feel... something...inside you.") + stage5 = list("\red Your skin feels as if it's about to burst off!") + new_form = /mob/living/silicon/robot + +/datum/disease/transformation/robot/stage_act() + ..() + switch(stage) + if(3) + if (prob(8)) + affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) + if (prob(4)) + affected_mob << "\red You feel a stabbing pain in your head." + affected_mob.Paralyse(2) + if(4) + if (prob(20)) + affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee...")) + + +/datum/disease/transformation/xeno + + name = "Xenomorph Transformation" + cure = "Spaceacillin & Glycerol" + cure_id = list("spaceacillin", "glycerol") + cure_chance = 5 + agent = "Rip-LEY Alien Microbes" + hidden = list(0, 0) + stage1 = list("") + stage2 = list("Your throat feels scratchy.", "\red Kill...") + stage3 = list("\red Your throat feels very scratchy.", "Your skin feels tight.", "\red You can feel something move...inside.") + stage4 = list("\red Your skin feels very tight.", "\red Your blood boils!", "\red You can feel... something...inside you.") + stage5 = list("\red Your skin feels as if it's about to burst off!") + new_form = /mob/living/carbon/alien/humanoid/hunter + +/datum/disease/transformation/xeno/stage_act() + ..() + switch(stage) + if(3) + if (prob(4)) + affected_mob << "\red You feel a stabbing pain in your head." + affected_mob.Paralyse(2) + if(4) + if (prob(20)) + affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!")) + + +/datum/disease/transformation/slime + name = "Advanced Mutation Transformation" + cure = "frost oil" + cure_id = list("frostoil") + cure_chance = 80 + agent = "Advanced Mutation Toxin" + desc = "This highly concentrated extract converts anything into more of itself." + hidden = list(0, 0) + stage1 = list("You don't feel very well.") + stage2 = list("You are turning a little green.") + stage3 = list("\red Your limbs are getting oozy.", "\red Your skin begins to peel away.") + stage4 = list("\red You are turning into a slime.") + stage5 = list("\red You have become a slime.") + new_form = /mob/living/carbon/slime + +/datum/disease/transformation/slime/stage_act() + ..() + switch(stage) + if(1) + if(ishuman(affected_mob) && affected_mob.dna && affected_mob.dna.mutantrace == "slime") + stage = 5 + if(3) + if(ishuman(affected_mob)) + var/mob/living/carbon/human/human = affected_mob + if(human.dna && !human.dna.mutantrace) + human.dna.mutantrace = "slime" + human.update_body() + + +/datum/disease/transformation/corgi + name = "The Barkening" + cure = "Death" + agent = "Fell Doge Majicks" + hidden = list(0, 0) + stage1 = list("BARK.") + stage2 = list("You feel the need to wear silly hats.") + stage3 = list("\red Must... eat... chocolate....", "\red YAP") + stage4 = list("\red Visions of washing machines assail your mind!") + stage5 = list("\red AUUUUUU!!!") + new_form = /mob/living/simple_animal/corgi + +/datum/disease/transformation/corgi/stage_act() + ..() + switch(stage) + if(3) + if (prob(8)) + affected_mob.say(pick("YAP", "Woof!")) + if(4) + if (prob(20)) + affected_mob.say(pick("Bark!", "AUUUUUU")) diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index 2cb2b0e2c8a..8cbb8c81501 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -61,21 +61,21 @@ STI KALY - blind if(prob(chance)) if(!istype(H.head, /obj/item/clothing/head/wizard)) if(!H.unEquip(H.head)) - del H.head + qdel(H.head) H.head = new /obj/item/clothing/head/wizard(H) H.head.layer = 20 return if(prob(chance)) if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe)) if(!H.unEquip(H.wear_suit)) - del H.wear_suit + qdel(H.wear_suit) H.wear_suit = new /obj/item/clothing/suit/wizrobe(H) H.wear_suit.layer = 20 return if(prob(chance)) if(!istype(H.shoes, /obj/item/clothing/shoes/sandal)) if(!H.unEquip(H.shoes)) - del H.shoes + qdel(H.shoes) H.shoes = new /obj/item/clothing/shoes/sandal(H) H.shoes.layer = 20 return diff --git a/code/datums/diseases/xeno_transformation.dm b/code/datums/diseases/xeno_transformation.dm index e023c4e0d4e..7b19b9a0927 100644 --- a/code/datums/diseases/xeno_transformation.dm +++ b/code/datums/diseases/xeno_transformation.dm @@ -1,60 +1,60 @@ -//Xenomicrobes - -/datum/disease/xeno_transformation - name = "Xenomorph Transformation" - max_stages = 5 - spread = "Syringe" - spread_type = SPECIAL - cure = "Spaceacillin & Glycerol" - cure_id = list("spaceacillin", "glycerol") - cure_chance = 5 - agent = "Rip-LEY Alien Microbes" - affected_species = list("Human") - var/gibbed = 0 - -/datum/disease/xeno_transformation/stage_act() - ..() - switch(stage) - if(2) - if (prob(8)) - affected_mob << "Your throat feels scratchy." - affected_mob.take_organ_damage(1) - if (prob(9)) - affected_mob << "\red Kill..." - if (prob(9)) - affected_mob << "\red Kill..." - if(3) - if (prob(8)) - affected_mob << "\red Your throat feels very scratchy." - affected_mob.take_organ_damage(1) - /* - if (prob(8)) - affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) - */ - if (prob(10)) - affected_mob << "Your skin feels tight." - affected_mob.take_organ_damage(5) - if (prob(4)) - affected_mob << "\red You feel a stabbing pain in your head." - affected_mob.Paralyse(2) - if (prob(4)) - affected_mob << "\red You can feel something move...inside." - if(4) - if (prob(10)) - affected_mob << pick("\red Your skin feels very tight.", "\red Your blood boils!") - affected_mob.take_organ_damage(8) - if (prob(20)) - affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!")) - if (prob(8)) - affected_mob << "\red You can feel... something...inside you." - if(5) - affected_mob <<"\red Your skin feels impossibly calloused..." - affected_mob.adjustToxLoss(10) - affected_mob.updatehealth() - if(prob(40)) - if(gibbed != 0) return 0 - var/turf/T = find_loc(affected_mob) - gibs(T) - gibbed = 1 - affected_mob:Alienize() - +//Xenomicrobes + +/datum/disease/xeno_transformation + name = "Xenomorph Transformation" + max_stages = 5 + spread = "Syringe" + spread_type = SPECIAL + cure = "Spaceacillin & Glycerol" + cure_id = list("spaceacillin", "glycerol") + cure_chance = 5 + agent = "Rip-LEY Alien Microbes" + affected_species = list("Human") + var/gibbed = 0 + +/datum/disease/xeno_transformation/stage_act() + ..() + switch(stage) + if(2) + if (prob(8)) + affected_mob << "Your throat feels scratchy." + affected_mob.take_organ_damage(1) + if (prob(9)) + affected_mob << "\red Kill..." + if (prob(9)) + affected_mob << "\red Kill..." + if(3) + if (prob(8)) + affected_mob << "\red Your throat feels very scratchy." + affected_mob.take_organ_damage(1) + /* + if (prob(8)) + affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) + */ + if (prob(10)) + affected_mob << "Your skin feels tight." + affected_mob.take_organ_damage(5) + if (prob(4)) + affected_mob << "\red You feel a stabbing pain in your head." + affected_mob.Paralyse(2) + if (prob(4)) + affected_mob << "\red You can feel something move...inside." + if(4) + if (prob(10)) + affected_mob << pick("\red Your skin feels very tight.", "\red Your blood boils!") + affected_mob.take_organ_damage(8) + if (prob(20)) + affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!")) + if (prob(8)) + affected_mob << "\red You can feel... something...inside you." + if(5) + affected_mob <<"\red Your skin feels impossibly calloused..." + affected_mob.adjustToxLoss(10) + affected_mob.updatehealth() + if(prob(40)) + if(gibbed != 0) return 0 + var/turf/T = find_loc(affected_mob) + gibs(T) + gibbed = 1 + affected_mob:Alienize() + diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index 7c2fabbc9b8..f292e7648f7 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -11,8 +11,7 @@ ..() holder = atom if(!holder) //don't want this without a holder - spawn - del src + qdel(src) set_desc(steps.len) return @@ -60,8 +59,7 @@ proc/spawn_result() if(result) new result(get_turf(holder)) - spawn() - del holder + qdel(holder) return proc/set_desc(index as num) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index f68de313496..c6abd2773e8 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -49,7 +49,7 @@ //must succeed in most cases proc/setTeleatom(atom/movable/ateleatom) if(istype(ateleatom, /obj/effect) && !istype(ateleatom, /obj/effect/dummy/chameleon)) - del(ateleatom) + qdel(ateleatom) return 0 if(istype(ateleatom)) teleatom = ateleatom diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 424c10aa780..effbae56975 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -561,7 +561,7 @@ datum/mind var/obj/item/device/flash/flash = locate() in L if (!flash) usr << "\red Deleting flash failed!" - del(flash) + qdel(flash) if("repairflash") var/list/L = current.get_contents() @@ -574,7 +574,7 @@ datum/mind if("reequip") var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L - del(flash) + qdel(flash) take_uplink() var/fail = 0 fail |= !ticker.mode.equip_traitor(current, 1) @@ -721,15 +721,15 @@ datum/mind current.loc = get_turf(locate("landmark*Syndicate-Spawn")) if("dressup") var/mob/living/carbon/human/H = current - del(H.belt) - del(H.back) - del(H.ears) - del(H.gloves) - del(H.head) - del(H.shoes) - del(H.wear_id) - del(H.wear_suit) - del(H.w_uniform) + qdel(H.belt) + qdel(H.back) + qdel(H.ears) + qdel(H.gloves) + qdel(H.head) + qdel(H.shoes) + qdel(H.wear_id) + qdel(H.wear_suit) + qdel(H.w_uniform) if (!ticker.mode.equip_syndicate(current)) usr << "\red Equipping a syndicate failed!" @@ -840,7 +840,7 @@ datum/mind A.malf_picker.remove_verbs(A) A.make_laws() - del(A.malf_picker) + qdel(A.malf_picker) A.show_laws() A.icon_state = "ai" @@ -909,10 +909,10 @@ datum/mind var/list/L = current.get_contents() for (var/t in L) if (istype(t, /obj/item/device/pda)) - if (t:uplink) del(t:uplink) + if (t:uplink) qdel(t:uplink) t:uplink = null else if (istype(t, /obj/item/device/radio)) - if (t:traitorradio) del(t:traitorradio) + if (t:traitorradio) qdel(t:traitorradio) t:traitorradio = null t:traitor_frequency = 0.0 else if (istype(t, /obj/item/weapon/SWF_uplink) || istype(t, /obj/item/weapon/syndicate_uplink)) @@ -921,7 +921,7 @@ datum/mind R.loc = current.loc R.traitorradio = null R.traitor_frequency = 0.0 - del(t) + qdel(t) // remove wizards spells //If there are more special powers that need removal, they can be procced into here./N @@ -943,7 +943,7 @@ datum/mind proc/take_uplink() var/obj/item/device/uplink/hidden/H = find_syndicate_uplink() if(H) - del(H) + qdel(H) proc/make_AI_Malf() @@ -984,15 +984,15 @@ datum/mind current.loc = get_turf(locate("landmark*Syndicate-Spawn")) var/mob/living/carbon/human/H = current - del(H.belt) - del(H.back) - del(H.ears) - del(H.gloves) - del(H.head) - del(H.shoes) - del(H.wear_id) - del(H.wear_suit) - del(H.w_uniform) + qdel(H.belt) + qdel(H.back) + qdel(H.ears) + qdel(H.gloves) + qdel(H.head) + qdel(H.shoes) + qdel(H.wear_id) + qdel(H.wear_suit) + qdel(H.w_uniform) ticker.mode.equip_syndicate(current) @@ -1081,7 +1081,7 @@ datum/mind var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L - del(flash) + qdel(flash) take_uplink() var/fail = 0 // fail |= !ticker.mode.equip_traitor(current, 1) diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index d2c747dd5b8..4f2750c0c06 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -79,7 +79,7 @@ var/obj/result_obj = new result(container) for (var/obj/O in (container.contents-result_obj)) O.reagents.trans_to(result_obj, O.reagents.total_volume) - del(O) + qdel(O) container.reagents.clear_reagents() return result_obj @@ -91,7 +91,7 @@ O.reagents.del_reagent("nutriment") O.reagents.update_total() O.reagents.trans_to(result_obj, O.reagents.total_volume) - del(O) + qdel(O) container.reagents.clear_reagents() return result_obj diff --git a/code/datums/spell.dm b/code/datums/spell.dm index ac375b9b2a9..747b109a912 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -75,7 +75,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/mob/living/carbon/human/H = user - if(istype(H.wear_mask, /obj/item/clothing/mask/muzzle)) + if((invocation_type == "whisper" || invocation_type == "shout") && istype(H.wear_mask, /obj/item/clothing/mask/muzzle)) user << "You can't get the words out!" return 0 @@ -166,7 +166,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin spell.anchored = 1 spell.density = 0 spawn(overlay_lifespan) - del(spell) + qdel(spell) /obj/effect/proc_holder/spell/proc/after_cast(list/targets) for(var/atom/target in targets) diff --git a/code/datums/spells/charge.dm b/code/datums/spells/charge.dm index 0a524b004b7..a288e7d0421 100644 --- a/code/datums/spells/charge.dm +++ b/code/datums/spells/charge.dm @@ -38,14 +38,14 @@ var/obj/item/weapon/spellbook/oneuse/I = item if(prob(80)) user.visible_message("[I] catches fire!") - del(I) + qdel(I) else I.used = 0 charged_item = I break else if(istype(item, /obj/item/weapon/gun/magic)) var/obj/item/weapon/gun/magic/I = item - if(prob(80)) + if(prob(80) && !I.can_charge) I.max_charges-- if(I.max_charges <= 0) I.max_charges = 0 diff --git a/code/datums/spells/conjure.dm b/code/datums/spells/conjure.dm index 583c9b6dff8..2a7357e2e7f 100644 --- a/code/datums/spells/conjure.dm +++ b/code/datums/spells/conjure.dm @@ -22,7 +22,8 @@ if(T.density && !summon_ignore_density) targets -= T - playsound(src.loc, cast_sound, 50, 1) + if(cast_sound) + playsound(src.loc, cast_sound, 50, 1) if(do_after(usr,delay)) for(var/i=0,i[target]'s face lights up in fire, and after the event a horse's head takes its place!", \ "Your face burns up, and shortly after the fire you realise you have the face of a horse!") if(!target.unEquip(target.wear_mask)) - del target.wear_mask + qdel(target.wear_mask) target.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1) flick("e_flash", target.flash) diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm index c9cc3b037c0..1f2c79b646a 100644 --- a/code/datums/spells/mime.dm +++ b/code/datums/spells/mime.dm @@ -1,53 +1,53 @@ -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall - name = "Invisible wall" - desc = "The mime's performance transmutates into physical reality." - school = "mime" - panel = "Mime" - summon_type = list(/obj/effect/forcefield/mime) - invocation_type = "emote" - invocation_emote_self = "You form a wall in front of yourself." - summon_lifespan = 300 - charge_max = 300 - clothes_req = 0 - range = 0 - cast_sound = null - - -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click() - if(usr) - invocation = "[usr.real_name] looks as if a wall is in front of them." - else - invocation_type ="none" - ..() - - -/obj/effect/proc_holder/spell/targeted/mime/speak - name = "Speech" - desc = "Make or break a vow of silence." - school = "mime" - panel = "Mime" - clothes_req = 0 - human_req = 1 - charge_max = 3000 - range = -1 - include_user = 1 - -/obj/effect/proc_holder/spell/targeted/mime/speak/Click() - if(!usr) - return - if(!ishuman(usr)) - return - var/mob/living/carbon/human/H = usr - if(H.mind.miming) - still_recharging_msg = "You can't break your vow of silence that fast!" - else - still_recharging_msg = "You'll have to wait before you can give your vow of silence again." - ..() - -/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets) - for(var/mob/living/carbon/human/H in targets) - H.mind.miming=!H.mind.miming - if(H.mind.miming) - H << "You make a vow of silence." - else +/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall + name = "Invisible wall" + desc = "The mime's performance transmutates into physical reality." + school = "mime" + panel = "Mime" + summon_type = list(/obj/effect/forcefield/mime) + invocation_type = "emote" + invocation_emote_self = "You form a wall in front of yourself." + summon_lifespan = 300 + charge_max = 300 + clothes_req = 0 + range = 0 + cast_sound = null + + +/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click() + if(usr) + invocation = "[usr.real_name] looks as if a wall is in front of them." + else + invocation_type ="none" + ..() + + +/obj/effect/proc_holder/spell/targeted/mime/speak + name = "Speech" + desc = "Make or break a vow of silence." + school = "mime" + panel = "Mime" + clothes_req = 0 + human_req = 1 + charge_max = 3000 + range = -1 + include_user = 1 + +/obj/effect/proc_holder/spell/targeted/mime/speak/Click() + if(!usr) + return + if(!ishuman(usr)) + return + var/mob/living/carbon/human/H = usr + if(H.mind.miming) + still_recharging_msg = "You can't break your vow of silence that fast!" + else + still_recharging_msg = "You'll have to wait before you can give your vow of silence again." + ..() + +/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets) + for(var/mob/living/carbon/human/H in targets) + H.mind.miming=!H.mind.miming + if(H.mind.miming) + H << "You make a vow of silence." + else H << "You break your vow of silence." \ No newline at end of file diff --git a/code/datums/spells/projectile.dm b/code/datums/spells/projectile.dm index c63922ef7a2..3413fae3eff 100644 --- a/code/datums/spells/projectile.dm +++ b/code/datums/spells/projectile.dm @@ -61,7 +61,7 @@ break if(!target || (!proj_lingering && projectile.loc == current_loc)) //if it didn't move since last time - del(projectile) + qdel(projectile) break if(proj_trail && projectile) @@ -72,7 +72,7 @@ trail.icon_state = proj_trail_icon_state trail.density = 0 spawn(proj_trail_lifespan) - del(trail) + qdel(trail) if(projectile.loc in range(target.loc,proj_trigger_range)) projectile.perform(list(target)) @@ -83,4 +83,4 @@ sleep(proj_step_delay) if(projectile) - del(projectile) \ No newline at end of file + qdel(projectile) \ No newline at end of file diff --git a/code/datums/spells/trigger.dm b/code/datums/spells/trigger.dm index 1b7f2b330ff..65205fc29f3 100644 --- a/code/datums/spells/trigger.dm +++ b/code/datums/spells/trigger.dm @@ -12,9 +12,9 @@ var/spell_to_add = text2path(spell) new spell_to_add(src) //should result in adding to contents, needs testing -/obj/effect/proc_holder/spell/targeted/trigger/Del() +/obj/effect/proc_holder/spell/targeted/trigger/Destroy() //I think this entire proc is unnecessary but ok for(var/spell in contents) - del(spell) + qdel(spell) ..() diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index a51eea512db..fc26183f05e 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -57,7 +57,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine if(!path) continue var/atom/movable/AM = new path() manifest += "
  • [AM.name]
  • " - del AM //just to make sure they're deleted, no longer garbage collected, as there are way to many objects in crates that have other references. +// del AM //just to make sure they're deleted, no longer garbage collected, as there are way to many objects in crates that have other references. + qdel(AM) // How about we fix the issues rather than bypass them, mmkay? manifest += "" @@ -1101,4 +1102,4 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/clothing/under/suit_jacket/checkered, /obj/item/clothing/under/suit_jacket/tan) cost = 30 //Lots of very expensive items. You gotta pay up to look good! - containername = "formal-wear crate" + containername = "formal-wear crate" diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index b02ddd2b409..05dde50c127 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1,493 +1,493 @@ -var/list/uplink_items = list() - -/proc/get_uplink_items() - // If not already initialized.. - if(!uplink_items.len) - - // Fill in the list and order it like this: - // A keyed list, acting as categories, which are lists to the datum. - - var/list/last = list() - for(var/item in typesof(/datum/uplink_item)) - - var/datum/uplink_item/I = new item() - if(!I.item) - continue - if(I.gamemodes.len && ticker && !(ticker.mode.type in I.gamemodes)) - continue - if(I.excludefrom.len && ticker && (ticker.mode.type in I.excludefrom)) - continue - if(I.last) - last += I - continue - - if(!uplink_items[I.category]) - uplink_items[I.category] = list() - - uplink_items[I.category] += I - - for(var/datum/uplink_item/I in last) - - if(!uplink_items[I.category]) - uplink_items[I.category] = list() - - uplink_items[I.category] += I - - return uplink_items - -// You can change the order of the list by putting datums before/after one another OR -// you can use the last variable to make sure it appears last, well have the category appear last. - -/datum/uplink_item - var/name = "item name" - var/category = "item category" - var/desc = "item description" - var/item = null - var/cost = 0 - var/last = 0 // Appear last - var/list/gamemodes = list() // Empty list means it is in all the gamemodes. Otherwise place the gamemode name here. - var/list/excludefrom = list()//Empty list does nothing. Place the name of gamemode you don't want this item to be available in here. This is so you dont have to list EVERY mode to exclude something. - -/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U) - if(item) - U.uses -= max(cost, 0) - U.used_TC += cost - feedback_add_details("traitor_uplink_items_bought", "[item]") - return new item(loc) - -/datum/uplink_item/proc/buy(var/obj/item/device/uplink/U, var/mob/user) - - ..() - if(!istype(U)) - return 0 - - if (!user || user.stat || user.restrained()) - return 0 - - if (!( istype(user, /mob/living/carbon/human))) - return 0 - - // If the uplink's holder is in the user's contents - if ((U.loc in user.contents || (in_range(U.loc, user) && istype(U.loc.loc, /turf)))) - user.set_machine(U) - if(cost > U.uses) - return 0 - - var/obj/I = spawn_item(get_turf(user), U) - - if(istype(I, /obj/item) && ishuman(user)) - var/mob/living/carbon/human/A = user - A.put_in_any_hand_if_possible(I) - - if(istype(I,/obj/item/weapon/storage/box/) && I.contents.len>0) - for(var/atom/o in I) - U.purchase_log += "\icon[o]" - else - U.purchase_log += "\icon[I]" - - U.interact(user) - return 1 - return 0 - -/* -// -// UPLINK ITEMS -// -*/ - -// DANGEROUS WEAPONS - -/datum/uplink_item/dangerous - category = "Conspicuous and Dangerous Weapons" - -/datum/uplink_item/dangerous/revolver - name = "Full Revolver" - desc = "The syndicate revolver is a traditional handgun that fires .357 Magnum cartridges and has 7 chambers." - item = /obj/item/weapon/gun/projectile/revolver - cost = 6 - -/datum/uplink_item/dangerous/smg - name = "C-20r Submachine Gun" - desc = "A fully-loaded Scarborough Arms-developed submachine gun that fires 12mm automatic rounds with a 20-round magazine." - item = /obj/item/weapon/gun/projectile/automatic/c20r - cost = 7 - gamemodes = list(/datum/game_mode/nuclear) - -/datum/uplink_item/dangerous/machinegun - name = "L6 Squad Automatic Weapon" - desc = "A traditionally constructed machine gun made by AA-2531. This deadly weapon has a massive 50-round magazine of 7.62×51mm ammunition." - item = /obj/item/weapon/gun/projectile/automatic/l6_saw - cost = 20 - gamemodes = list(/datum/game_mode/nuclear) - -/datum/uplink_item/dangerous/crossbow - name = "Miniature Energy Crossbow" - desc = "A short bow mounted across a tiller in miniature. Small enough to fit into a pocket or slip into a bag unnoticed. It fires bolts tipped with toxin, a poison collected from an organism. \ - Its bolts stun enemies for short periods, and replenish automatically." - item = /obj/item/weapon/gun/energy/crossbow - cost = 5 - excludefrom = list(/datum/game_mode/nuclear) - -/datum/uplink_item/dangerous/flamethrower - name = "Flamethrower" - desc = "A flamethrower, fueled by a portion of highly flammable biotoxins stolen previously from Nanotrasen stations. Make a statement by roasting the filth in their own greed. Use with caution." - item = /obj/item/weapon/flamethrower/full/tank - cost = 6 - gamemodes = list(/datum/game_mode/nuclear) - -/datum/uplink_item/dangerous/sword - name = "Energy Sword" - desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be pocketed when inactive. Activating it produces a loud, distinctive noise." - item = /obj/item/weapon/melee/energy/sword - cost = 4 - -/datum/uplink_item/dangerous/emp - name = "EMP Kit" - desc = "A box that contains two EMP grenades, an EMP implant and a short ranged recharging device disguised as a flashlight. Useful to disrupt communication and silicon lifeforms." - item = /obj/item/weapon/storage/box/syndie_kit/emp - cost = 3 - -/datum/uplink_item/dangerous/syndicate_minibomb - name = "Syndicate Minibomb" - desc = "The Minibomb is a grenade with a five-second fuse." - item = /obj/item/weapon/grenade/syndieminibomb - cost = 3 - -/datum/uplink_item/dangerous/viscerators - name = "Viscerator Delivery Grenade" - desc = "A unique grenade that deploys a swarm of viscerators upon activation, which will chase down and shred any non-operatives in the area." - item = /obj/item/weapon/grenade/spawnergrenade/manhacks - cost = 4 - gamemodes = list(/datum/game_mode/nuclear) - -/datum/uplink_item/dangerous/bioterror - name = "Biohazardous Chemical Sprayer" - desc = "A chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger Cooperative, the deadly blend it comes stocked with will disorient, damage, and disable your foes... \ - Use with extreme caution, to prevent exposure to yourself and your fellow operatives." - item = /obj/item/weapon/reagent_containers/spray/chemsprayer/bioterror - cost = 10 - gamemodes = list(/datum/game_mode/nuclear) - -/datum/uplink_item/dangerous/gygax - name = "Gygax Exosuit" - desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent for hit-and-run style attacks. \ - This model lacks a method of space propulsion, and therefore it is advised to repair the mothership's teleporter if you wish to make use of it." - item = /obj/mecha/combat/gygax/dark/loaded - cost = 45 - gamemodes = list(/datum/game_mode/nuclear) - -/datum/uplink_item/dangerous/mauler - name = "Mauler Exosuit" - desc = "A massive and incredibly deadly Syndicate exosuit. Features long-range targetting, thrust vectoring, and deployable smoke." - item = /obj/mecha/combat/marauder/mauler/loaded - cost = 70 - gamemodes = list(/datum/game_mode/nuclear) -/datum/uplink_item/dangerous/syndieborg - name = "Syndicate Cyborg" - desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel." - item = /obj/item/weapon/antag_spawner/borg_tele - cost = 25 - gamemodes = list(/datum/game_mode/nuclear) -//for refunding the syndieborg teleporter -/datum/uplink_item/dangerous/syndieborg/spawn_item() - var/obj/item/weapon/antag_spawner/borg_tele/T = ..() - if(istype(T)) - T.TC_cost = cost - -// AMMUNITION - -/datum/uplink_item/ammo - category = "Ammunition" - -/datum/uplink_item/ammo/revolver - name = "Ammo-357" - desc = "A box that contains seven additional rounds for the revolver, made using an automatic lathe." - item = /obj/item/ammo_box/a357 - cost = 2 - -/datum/uplink_item/ammo/smg - name = "Ammo-12mm" - desc = "A 20-round 12mm magazine for use in the C-20r submachine gun." - item = /obj/item/ammo_box/magazine/m12mm - cost = 1 - gamemodes = list(/datum/game_mode/nuclear) - -/datum/uplink_item/ammo/pistol - name = "Ammo-10mm" - desc = "An additional 8-round 10mm magazine for use in the Stetchkin pistol." - item = /obj/item/ammo_box/magazine/m10mm - cost = 1 - gamemodes = list(/datum/game_mode/nuclear) - -/datum/uplink_item/ammo/machinegun - name = "Ammo-7.62×51mm" - desc = "A 50-round magazine of 7.62×51mm ammunition for use in the L6 SAW machinegun. By the time you need to use this, you'll already be on a pile of corpses." - item = /obj/item/ammo_box/magazine/m762 - cost = 6 - gamemodes = list(/datum/game_mode/nuclear) - -// STEALTHY WEAPONS - -/datum/uplink_item/stealthy_weapons - category = "Stealthy and Inconspicuous Weapons" - -/datum/uplink_item/stealthy_weapons/para_pen - name = "Paralysis Pen" - desc = "A syringe disguised as a functional pen, filled with a neuromuscular-blocking drug that renders a target immobile on injection and makes them seem dead to observers. \ - Side effects of the drug include noticeable drooling. The pen holds one dose of paralyzing agent, and cannot be refilled." - item = /obj/item/weapon/pen/paralysis - cost = 3 - excludefrom = list(/datum/game_mode/nuclear) - -/datum/uplink_item/stealthy_weapons/soap - name = "Syndicate Soap" - desc = "A sinister-looking surfactant used to clean blood stains to hide murders and prevent DNA analysis. You can also drop it underfoot to slip people." - item = /obj/item/weapon/soap/syndie - cost = 1 - -/datum/uplink_item/stealthy_weapons/detomatix - name = "Detomatix PDA Cartridge" - desc = "When inserted into a personal digital assistant, this cartridge gives you five opportunities to detonate PDAs of crewmembers who have their message feature enabled. \ - The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer. It has a chance to detonate your PDA." - item = /obj/item/weapon/cartridge/syndicate - cost = 3 - -/datum/uplink_item/stealthy_weapons/silencer - name = "Stetchkin Silencer" - desc = "Fitted for use on the Stetchkin pistol, this silencer will make its shots quieter when equipped onto it." - item = /obj/item/weapon/silencer - cost = 2 - gamemodes = list(/datum/game_mode/nuclear) - -// STEALTHY TOOLS - -/datum/uplink_item/stealthy_tools - category = "Stealth and Camouflage Items" - -/datum/uplink_item/stealthy_tools/chameleon_jumpsuit - name = "Chameleon Jumpsuit" - desc = "A jumpsuit used to imitate the uniforms of Nanotrasen crewmembers." - item = /obj/item/clothing/under/chameleon - cost = 3 - -/datum/uplink_item/stealthy_tools/chameleon_stamp - name = "Chameleon Stamp" - desc = "A stamp that can be activated to imitate an official Nanotrasen Stamp™. The disguised stamp will work exactly like the real stamp and will allow you to forge false documents to gain access or equipment; \ - it can also be used in a washing machine to forge clothing." - item = /obj/item/weapon/stamp/chameleon - cost = 1 - -/datum/uplink_item/stealthy_tools/syndigolashes - name = "No-Slip Brown Shoes" - desc = "These allow you to run on wet floors. They do not work on lubricated surfaces." - item = /obj/item/clothing/shoes/syndigaloshes - cost = 2 - -/datum/uplink_item/stealthy_tools/agent_card - name = "Agent Identification card" - desc = "Agent cards prevent artificial intelligences from tracking the wearer, and can copy access from other identification cards. The access is cumulative, so scanning one card does not erase the access gained from another." - item = /obj/item/weapon/card/id/syndicate - cost = 2 - -/datum/uplink_item/stealthy_tools/voice_changer - name = "Voice Changer" - item = /obj/item/clothing/mask/gas/voice - desc = "A conspicuous gas mask that mimics the voice named on your identification card. When no identification is worn, the mask will render your voice unrecognizable." - cost = 4 - -/datum/uplink_item/stealthy_tools/chameleon_proj - name = "Chameleon-Projector" - desc = "Projects an image across a user, disguising them as an object scanned with it, as long as they don't move the projector from their hand. The disguised user cannot run and rojectiles pass over them." - item = /obj/item/device/chameleon - cost = 4 - -/datum/uplink_item/stealthy_tools/camera_bug - name = "Camera Bug" - desc = "Enables you to bug cameras to view them remotely. Adding particular items to it alters its functions." - item = /obj/item/device/camera_bug - cost = 2 - -// DEVICE AND TOOLS - -/datum/uplink_item/device_tools - category = "Devices and Tools" - -/datum/uplink_item/device_tools/emag - name = "Cryptographic Sequencer" - desc = "The emag is a small card that unlocks hidden functions in electronic devices, subverts intended functions and characteristically breaks security mechanisms." - item = /obj/item/weapon/card/emag - cost = 3 - -/datum/uplink_item/device_tools/toolbox - name = "Full Syndicate Toolbox" - desc = "The syndicate toolbox is a suspicious black and red. Aside from tools, it comes with cable and a multitool. Insulated gloves are not included." - item = /obj/item/weapon/storage/toolbox/syndicate - cost = 1 - -/datum/uplink_item/device_tools/medkit - name = "Syndicate Medical Supply Kit" - desc = "The syndicate medkit is a suspicious black and red. Included is a combat stimulant injector for rapid healing, a medical hud for quick identification of injured comrades, \ - and other medical supplies helpful for a medical field operative.." - item = /obj/item/weapon/storage/firstaid/tactical - cost = 5 - gamemodes = list(/datum/game_mode/nuclear) - -/datum/uplink_item/device_tools/space_suit - name = "Syndicate Space Suit" - desc = "The red syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings." - item = /obj/item/weapon/storage/box/syndie_kit/space - cost = 3 - -/datum/uplink_item/device_tools/thermal - name = "Thermal Imaging Glasses" - desc = "These glasses are thermals disguised as engineers' optical meson scanners. \ - They allow you to see organisms through walls by capturing the upper portion of the infrared light spectrum, emitted as heat and light by objects. \ - Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks." - item = /obj/item/clothing/glasses/thermal/syndi - cost = 3 - -/datum/uplink_item/device_tools/binary - name = "Binary Translator Key" - desc = "A key, that when inserted into a radio headset, allows you to listen to and talk with artificial intelligences and cybernetic organisms in binary. " - item = /obj/item/device/encryptionkey/binary - cost = 3 - -/datum/uplink_item/device_tools/ai_detector - name = "Artificial Intelligence Detector" // changed name in case newfriends thought it detected disguised ai's - desc = "A functional multitool that turns red when it detects an artificial intelligence watching it or its holder. Knowing when an artificial intelligence is watching you is useful for knowing when to maintain cover." - item = /obj/item/device/multitool/ai_detect - cost = 1 - -/datum/uplink_item/device_tools/hacked_module - name = "Hacked AI Law Upload Module" - desc = "When used with an upload console, this module allows you to upload priority laws to an artificial intelligence. Be careful with their wording, as artificial intelligences may look for loopholes to exploit." - item = /obj/item/weapon/aiModule/syndicate - cost = 7 - -/datum/uplink_item/device_tools/plastic_explosives - name = "Composition C-4" - desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls, attach it to organisms to destroy them, or connect a signaler to its wiring to make it remotely detonable. \ - It has a modifiable timer with a minimum setting of 10 seconds." - item = /obj/item/weapon/plastique - cost = 2 - -/datum/uplink_item/device_tools/powersink - name = "Power sink" - desc = "When screwed to wiring attached to an electric grid, then activated, this large device places excessive load on the grid, causing a stationwide blackout. The sink cannot be carried because of its excessive size. \ - Ordering this sends you a small beacon that will teleport the power sink to your location on activation." - item = /obj/item/device/powersink - cost = 5 - -/datum/uplink_item/device_tools/singularity_beacon - name = "Singularity Beacon" - desc = "When screwed to wiring attached to an electric grid, then activated, this large device pulls the singularity towards it. \ - Does not work when the singularity is still in containment. A singularity beacon can cause catastrophic damage to a space station, \ - leading to an emergency evacuation. Because of its size, it cannot be carried. Ordering this sends you a small beacon that will teleport the larger beacon to your location on activation." - item = /obj/item/device/sbeacondrop - cost = 7 - -/datum/uplink_item/device_tools/syndicate_bomb - name = "Syndicate Bomb" - desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 60 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \ - You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb." - item = /obj/item/device/sbeacondrop/bomb - cost = 5 - excludefrom = list(/datum/game_mode/traitor/double_agents) - -/datum/uplink_item/device_tools/syndicate_detonator - name = "Syndicate Detonator" - desc = "The Syndicate Detonator is a companion device to the Syndicate Bomb. Simply press the included button and an encrypted radio frequency will instruct all live syndicate bombs to detonate. \ - Useful for when speed matters or you wish to synchronize multiple bomb blasts. Be sure to stand clear of the blast radius before using the detonator." - item = /obj/item/device/syndicatedetonator - cost = 1 - gamemodes = list(/datum/game_mode/nuclear) - -/datum/uplink_item/device_tools/teleporter - name = "Teleporter Circuit Board" - desc = "A printed circuit board that completes the teleporter onboard the mothership. Advise you test fire the teleporter before entering it, as malfunctions can occur." - item = /obj/item/weapon/circuitboard/teleporter - cost = 20 - gamemodes = list(/datum/game_mode/nuclear) - -/datum/uplink_item/device_tools/shield - name = "Energy Shield" - desc = "An incredibly useful personal shield projector, capable of reflecting energy projectiles and defending against other attacks." - item = /obj/item/weapon/shield/energy - cost = 8 - gamemodes = list(/datum/game_mode/nuclear) - - -// IMPLANTS - -/datum/uplink_item/implants - category = "Implants" - -/datum/uplink_item/implants/freedom - name = "Freedom Implant" - desc = "An implant injected into the body and later activated using a bodily gesture to attempt to slip restraints." - item = /obj/item/weapon/storage/box/syndie_kit/imp_freedom - cost = 3 - -/datum/uplink_item/implants/uplink - name = "Uplink Implant" - desc = "An implant injected into the body, and later activated using a bodily gesture to open an uplink with 5 telecrystals. \ - The ability for an agent to open an uplink after their posessions have been stripped from them makes this implant excellent for escaping confinement." - item = /obj/item/weapon/storage/box/syndie_kit/imp_uplink - cost = 10 - -/datum/uplink_item/implants/adrenal - name = "Adrenal Implant" - desc = "An implant injected into the body, and later activated using a bodily gesture to inject a chemical cocktail, which has a mild healing effect along with removing all stuns and increasing his speed." - item = /obj/item/weapon/storage/box/syndie_kit/imp_adrenal - cost = 4 - -// POINTLESS BADASSERY - -/datum/uplink_item/badass - category = "(Pointless) Badassery" - -/datum/uplink_item/badass/bundle - name = "Syndicate Bundle" - desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 10 telecrystals, but you do not know which specialisation you will receive." - item = /obj/item/weapon/storage/box/syndicate - cost = 10 - excludefrom = list(/datum/game_mode/nuclear) - -/datum/uplink_item/badass/syndiecards - name = "Syndicate Playing Cards" - desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, making them slightly more robust than a normal deck of cards. \ - You can also play card games with them." - item = /obj/item/toy/cards/deck/syndicate - cost = 1 - excludefrom = list(/datum/game_mode/nuclear) - -/datum/uplink_item/badass/balloon - name = "For showing that you are The Boss" - desc = "A useless red balloon with the syndicate logo on it, which can blow the deepest of covers." - item = /obj/item/toy/syndicateballoon - cost = 10 - -/datum/uplink_item/badass/random - name = "Random Item" - desc = "Picking this choice will send you a random item from the list. Useful for when you cannot think of a strategy to finish your objectives with." - item = /obj/item/weapon/storage/box/syndicate - cost = 0 - -/datum/uplink_item/badass/random/spawn_item(var/turf/loc, var/obj/item/device/uplink/U) - - var/list/buyable_items = get_uplink_items() - var/list/possible_items = list() - - for(var/category in buyable_items) - for(var/datum/uplink_item/I in buyable_items[category]) - if(I == src) - continue - if(I.cost > U.uses) - continue - possible_items += I - - if(possible_items.len) - var/datum/uplink_item/I = pick(possible_items) - U.uses -= max(0, I.cost) - feedback_add_details("traitor_uplink_items_bought","RN") - return new I.item(loc) +var/list/uplink_items = list() + +/proc/get_uplink_items() + // If not already initialized.. + if(!uplink_items.len) + + // Fill in the list and order it like this: + // A keyed list, acting as categories, which are lists to the datum. + + var/list/last = list() + for(var/item in typesof(/datum/uplink_item)) + + var/datum/uplink_item/I = new item() + if(!I.item) + continue + if(I.gamemodes.len && ticker && !(ticker.mode.type in I.gamemodes)) + continue + if(I.excludefrom.len && ticker && (ticker.mode.type in I.excludefrom)) + continue + if(I.last) + last += I + continue + + if(!uplink_items[I.category]) + uplink_items[I.category] = list() + + uplink_items[I.category] += I + + for(var/datum/uplink_item/I in last) + + if(!uplink_items[I.category]) + uplink_items[I.category] = list() + + uplink_items[I.category] += I + + return uplink_items + +// You can change the order of the list by putting datums before/after one another OR +// you can use the last variable to make sure it appears last, well have the category appear last. + +/datum/uplink_item + var/name = "item name" + var/category = "item category" + var/desc = "item description" + var/item = null + var/cost = 0 + var/last = 0 // Appear last + var/list/gamemodes = list() // Empty list means it is in all the gamemodes. Otherwise place the gamemode name here. + var/list/excludefrom = list()//Empty list does nothing. Place the name of gamemode you don't want this item to be available in here. This is so you dont have to list EVERY mode to exclude something. + +/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U) + if(item) + U.uses -= max(cost, 0) + U.used_TC += cost + feedback_add_details("traitor_uplink_items_bought", "[item]") + return new item(loc) + +/datum/uplink_item/proc/buy(var/obj/item/device/uplink/U, var/mob/user) + + ..() + if(!istype(U)) + return 0 + + if (!user || user.stat || user.restrained()) + return 0 + + if (!( istype(user, /mob/living/carbon/human))) + return 0 + + // If the uplink's holder is in the user's contents + if ((U.loc in user.contents || (in_range(U.loc, user) && istype(U.loc.loc, /turf)))) + user.set_machine(U) + if(cost > U.uses) + return 0 + + var/obj/I = spawn_item(get_turf(user), U) + + if(istype(I, /obj/item) && ishuman(user)) + var/mob/living/carbon/human/A = user + A.put_in_any_hand_if_possible(I) + + if(istype(I,/obj/item/weapon/storage/box/) && I.contents.len>0) + for(var/atom/o in I) + U.purchase_log += "\icon[o]" + else + U.purchase_log += "\icon[I]" + + U.interact(user) + return 1 + return 0 + +/* +// +// UPLINK ITEMS +// +*/ + +// DANGEROUS WEAPONS + +/datum/uplink_item/dangerous + category = "Conspicuous and Dangerous Weapons" + +/datum/uplink_item/dangerous/revolver + name = "Full Revolver" + desc = "The syndicate revolver is a traditional handgun that fires .357 Magnum cartridges and has 7 chambers." + item = /obj/item/weapon/gun/projectile/revolver + cost = 6 + +/datum/uplink_item/dangerous/smg + name = "C-20r Submachine Gun" + desc = "A fully-loaded Scarborough Arms-developed submachine gun that fires 12mm automatic rounds with a 20-round magazine." + item = /obj/item/weapon/gun/projectile/automatic/c20r + cost = 7 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/dangerous/machinegun + name = "L6 Squad Automatic Weapon" + desc = "A traditionally constructed machine gun made by AA-2531. This deadly weapon has a massive 50-round magazine of 7.62×51mm ammunition." + item = /obj/item/weapon/gun/projectile/automatic/l6_saw + cost = 20 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/dangerous/crossbow + name = "Miniature Energy Crossbow" + desc = "A short bow mounted across a tiller in miniature. Small enough to fit into a pocket or slip into a bag unnoticed. It fires bolts tipped with toxin, a poison collected from an organism. \ + Its bolts stun enemies for short periods, and replenish automatically." + item = /obj/item/weapon/gun/energy/crossbow + cost = 5 + excludefrom = list(/datum/game_mode/nuclear) + +/datum/uplink_item/dangerous/flamethrower + name = "Flamethrower" + desc = "A flamethrower, fueled by a portion of highly flammable biotoxins stolen previously from Nanotrasen stations. Make a statement by roasting the filth in their own greed. Use with caution." + item = /obj/item/weapon/flamethrower/full/tank + cost = 6 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/dangerous/sword + name = "Energy Sword" + desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be pocketed when inactive. Activating it produces a loud, distinctive noise." + item = /obj/item/weapon/melee/energy/sword + cost = 4 + +/datum/uplink_item/dangerous/emp + name = "EMP Kit" + desc = "A box that contains two EMP grenades, an EMP implant and a short ranged recharging device disguised as a flashlight. Useful to disrupt communication and silicon lifeforms." + item = /obj/item/weapon/storage/box/syndie_kit/emp + cost = 3 + +/datum/uplink_item/dangerous/syndicate_minibomb + name = "Syndicate Minibomb" + desc = "The Minibomb is a grenade with a five-second fuse." + item = /obj/item/weapon/grenade/syndieminibomb + cost = 3 + +/datum/uplink_item/dangerous/viscerators + name = "Viscerator Delivery Grenade" + desc = "A unique grenade that deploys a swarm of viscerators upon activation, which will chase down and shred any non-operatives in the area." + item = /obj/item/weapon/grenade/spawnergrenade/manhacks + cost = 4 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/dangerous/bioterror + name = "Biohazardous Chemical Sprayer" + desc = "A chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger Cooperative, the deadly blend it comes stocked with will disorient, damage, and disable your foes... \ + Use with extreme caution, to prevent exposure to yourself and your fellow operatives." + item = /obj/item/weapon/reagent_containers/spray/chemsprayer/bioterror + cost = 10 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/dangerous/gygax + name = "Gygax Exosuit" + desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent for hit-and-run style attacks. \ + This model lacks a method of space propulsion, and therefore it is advised to repair the mothership's teleporter if you wish to make use of it." + item = /obj/mecha/combat/gygax/dark/loaded + cost = 45 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/dangerous/mauler + name = "Mauler Exosuit" + desc = "A massive and incredibly deadly Syndicate exosuit. Features long-range targetting, thrust vectoring, and deployable smoke." + item = /obj/mecha/combat/marauder/mauler/loaded + cost = 70 + gamemodes = list(/datum/game_mode/nuclear) +/datum/uplink_item/dangerous/syndieborg + name = "Syndicate Cyborg" + desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel." + item = /obj/item/weapon/antag_spawner/borg_tele + cost = 25 + gamemodes = list(/datum/game_mode/nuclear) +//for refunding the syndieborg teleporter +/datum/uplink_item/dangerous/syndieborg/spawn_item() + var/obj/item/weapon/antag_spawner/borg_tele/T = ..() + if(istype(T)) + T.TC_cost = cost + +// AMMUNITION + +/datum/uplink_item/ammo + category = "Ammunition" + +/datum/uplink_item/ammo/revolver + name = "Ammo-357" + desc = "A box that contains seven additional rounds for the revolver, made using an automatic lathe." + item = /obj/item/ammo_box/a357 + cost = 2 + +/datum/uplink_item/ammo/smg + name = "Ammo-12mm" + desc = "A 20-round 12mm magazine for use in the C-20r submachine gun." + item = /obj/item/ammo_box/magazine/m12mm + cost = 1 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/ammo/pistol + name = "Ammo-10mm" + desc = "An additional 8-round 10mm magazine for use in the Stetchkin pistol." + item = /obj/item/ammo_box/magazine/m10mm + cost = 1 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/ammo/machinegun + name = "Ammo-7.62×51mm" + desc = "A 50-round magazine of 7.62×51mm ammunition for use in the L6 SAW machinegun. By the time you need to use this, you'll already be on a pile of corpses." + item = /obj/item/ammo_box/magazine/m762 + cost = 6 + gamemodes = list(/datum/game_mode/nuclear) + +// STEALTHY WEAPONS + +/datum/uplink_item/stealthy_weapons + category = "Stealthy and Inconspicuous Weapons" + +/datum/uplink_item/stealthy_weapons/para_pen + name = "Paralysis Pen" + desc = "A syringe disguised as a functional pen, filled with a neuromuscular-blocking drug that renders a target immobile on injection and makes them seem dead to observers. \ + Side effects of the drug include noticeable drooling. The pen holds one dose of paralyzing agent, and cannot be refilled." + item = /obj/item/weapon/pen/paralysis + cost = 3 + excludefrom = list(/datum/game_mode/nuclear) + +/datum/uplink_item/stealthy_weapons/soap + name = "Syndicate Soap" + desc = "A sinister-looking surfactant used to clean blood stains to hide murders and prevent DNA analysis. You can also drop it underfoot to slip people." + item = /obj/item/weapon/soap/syndie + cost = 1 + +/datum/uplink_item/stealthy_weapons/detomatix + name = "Detomatix PDA Cartridge" + desc = "When inserted into a personal digital assistant, this cartridge gives you five opportunities to detonate PDAs of crewmembers who have their message feature enabled. \ + The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer. It has a chance to detonate your PDA." + item = /obj/item/weapon/cartridge/syndicate + cost = 3 + +/datum/uplink_item/stealthy_weapons/silencer + name = "Stetchkin Silencer" + desc = "Fitted for use on the Stetchkin pistol, this silencer will make its shots quieter when equipped onto it." + item = /obj/item/weapon/silencer + cost = 2 + gamemodes = list(/datum/game_mode/nuclear) + +// STEALTHY TOOLS + +/datum/uplink_item/stealthy_tools + category = "Stealth and Camouflage Items" + +/datum/uplink_item/stealthy_tools/chameleon_jumpsuit + name = "Chameleon Jumpsuit" + desc = "A jumpsuit used to imitate the uniforms of Nanotrasen crewmembers." + item = /obj/item/clothing/under/chameleon + cost = 3 + +/datum/uplink_item/stealthy_tools/chameleon_stamp + name = "Chameleon Stamp" + desc = "A stamp that can be activated to imitate an official Nanotrasen Stamp™. The disguised stamp will work exactly like the real stamp and will allow you to forge false documents to gain access or equipment; \ + it can also be used in a washing machine to forge clothing." + item = /obj/item/weapon/stamp/chameleon + cost = 1 + +/datum/uplink_item/stealthy_tools/syndigolashes + name = "No-Slip Brown Shoes" + desc = "These allow you to run on wet floors. They do not work on lubricated surfaces." + item = /obj/item/clothing/shoes/syndigaloshes + cost = 2 + +/datum/uplink_item/stealthy_tools/agent_card + name = "Agent Identification card" + desc = "Agent cards prevent artificial intelligences from tracking the wearer, and can copy access from other identification cards. The access is cumulative, so scanning one card does not erase the access gained from another." + item = /obj/item/weapon/card/id/syndicate + cost = 2 + +/datum/uplink_item/stealthy_tools/voice_changer + name = "Voice Changer" + item = /obj/item/clothing/mask/gas/voice + desc = "A conspicuous gas mask that mimics the voice named on your identification card. When no identification is worn, the mask will render your voice unrecognizable." + cost = 4 + +/datum/uplink_item/stealthy_tools/chameleon_proj + name = "Chameleon-Projector" + desc = "Projects an image across a user, disguising them as an object scanned with it, as long as they don't move the projector from their hand. The disguised user cannot run and rojectiles pass over them." + item = /obj/item/device/chameleon + cost = 4 + +/datum/uplink_item/stealthy_tools/camera_bug + name = "Camera Bug" + desc = "Enables you to bug cameras to view them remotely. Adding particular items to it alters its functions." + item = /obj/item/device/camera_bug + cost = 2 + +// DEVICE AND TOOLS + +/datum/uplink_item/device_tools + category = "Devices and Tools" + +/datum/uplink_item/device_tools/emag + name = "Cryptographic Sequencer" + desc = "The emag is a small card that unlocks hidden functions in electronic devices, subverts intended functions and characteristically breaks security mechanisms." + item = /obj/item/weapon/card/emag + cost = 3 + +/datum/uplink_item/device_tools/toolbox + name = "Full Syndicate Toolbox" + desc = "The syndicate toolbox is a suspicious black and red. Aside from tools, it comes with cable and a multitool. Insulated gloves are not included." + item = /obj/item/weapon/storage/toolbox/syndicate + cost = 1 + +/datum/uplink_item/device_tools/medkit + name = "Syndicate Medical Supply Kit" + desc = "The syndicate medkit is a suspicious black and red. Included is a combat stimulant injector for rapid healing, a medical hud for quick identification of injured comrades, \ + and other medical supplies helpful for a medical field operative.." + item = /obj/item/weapon/storage/firstaid/tactical + cost = 5 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/device_tools/space_suit + name = "Syndicate Space Suit" + desc = "The red syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings." + item = /obj/item/weapon/storage/box/syndie_kit/space + cost = 3 + +/datum/uplink_item/device_tools/thermal + name = "Thermal Imaging Glasses" + desc = "These glasses are thermals disguised as engineers' optical meson scanners. \ + They allow you to see organisms through walls by capturing the upper portion of the infrared light spectrum, emitted as heat and light by objects. \ + Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks." + item = /obj/item/clothing/glasses/thermal/syndi + cost = 3 + +/datum/uplink_item/device_tools/binary + name = "Binary Translator Key" + desc = "A key, that when inserted into a radio headset, allows you to listen to and talk with artificial intelligences and cybernetic organisms in binary. " + item = /obj/item/device/encryptionkey/binary + cost = 3 + +/datum/uplink_item/device_tools/ai_detector + name = "Artificial Intelligence Detector" // changed name in case newfriends thought it detected disguised ai's + desc = "A functional multitool that turns red when it detects an artificial intelligence watching it or its holder. Knowing when an artificial intelligence is watching you is useful for knowing when to maintain cover." + item = /obj/item/device/multitool/ai_detect + cost = 1 + +/datum/uplink_item/device_tools/hacked_module + name = "Hacked AI Law Upload Module" + desc = "When used with an upload console, this module allows you to upload priority laws to an artificial intelligence. Be careful with their wording, as artificial intelligences may look for loopholes to exploit." + item = /obj/item/weapon/aiModule/syndicate + cost = 7 + +/datum/uplink_item/device_tools/plastic_explosives + name = "Composition C-4" + desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls, attach it to organisms to destroy them, or connect a signaler to its wiring to make it remotely detonable. \ + It has a modifiable timer with a minimum setting of 10 seconds." + item = /obj/item/weapon/plastique + cost = 2 + +/datum/uplink_item/device_tools/powersink + name = "Power sink" + desc = "When screwed to wiring attached to an electric grid, then activated, this large device places excessive load on the grid, causing a stationwide blackout. The sink cannot be carried because of its excessive size. \ + Ordering this sends you a small beacon that will teleport the power sink to your location on activation." + item = /obj/item/device/powersink + cost = 5 + +/datum/uplink_item/device_tools/singularity_beacon + name = "Singularity Beacon" + desc = "When screwed to wiring attached to an electric grid, then activated, this large device pulls the singularity towards it. \ + Does not work when the singularity is still in containment. A singularity beacon can cause catastrophic damage to a space station, \ + leading to an emergency evacuation. Because of its size, it cannot be carried. Ordering this sends you a small beacon that will teleport the larger beacon to your location on activation." + item = /obj/item/device/sbeacondrop + cost = 7 + +/datum/uplink_item/device_tools/syndicate_bomb + name = "Syndicate Bomb" + desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 60 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \ + You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb." + item = /obj/item/device/sbeacondrop/bomb + cost = 5 + excludefrom = list(/datum/game_mode/traitor/double_agents) + +/datum/uplink_item/device_tools/syndicate_detonator + name = "Syndicate Detonator" + desc = "The Syndicate Detonator is a companion device to the Syndicate Bomb. Simply press the included button and an encrypted radio frequency will instruct all live syndicate bombs to detonate. \ + Useful for when speed matters or you wish to synchronize multiple bomb blasts. Be sure to stand clear of the blast radius before using the detonator." + item = /obj/item/device/syndicatedetonator + cost = 1 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/device_tools/teleporter + name = "Teleporter Circuit Board" + desc = "A printed circuit board that completes the teleporter onboard the mothership. Advise you test fire the teleporter before entering it, as malfunctions can occur." + item = /obj/item/weapon/circuitboard/teleporter + cost = 20 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/device_tools/shield + name = "Energy Shield" + desc = "An incredibly useful personal shield projector, capable of reflecting energy projectiles and defending against other attacks." + item = /obj/item/weapon/shield/energy + cost = 8 + gamemodes = list(/datum/game_mode/nuclear) + + +// IMPLANTS + +/datum/uplink_item/implants + category = "Implants" + +/datum/uplink_item/implants/freedom + name = "Freedom Implant" + desc = "An implant injected into the body and later activated using a bodily gesture to attempt to slip restraints." + item = /obj/item/weapon/storage/box/syndie_kit/imp_freedom + cost = 3 + +/datum/uplink_item/implants/uplink + name = "Uplink Implant" + desc = "An implant injected into the body, and later activated using a bodily gesture to open an uplink with 5 telecrystals. \ + The ability for an agent to open an uplink after their posessions have been stripped from them makes this implant excellent for escaping confinement." + item = /obj/item/weapon/storage/box/syndie_kit/imp_uplink + cost = 10 + +/datum/uplink_item/implants/adrenal + name = "Adrenal Implant" + desc = "An implant injected into the body, and later activated using a bodily gesture to inject a chemical cocktail, which has a mild healing effect along with removing all stuns and increasing his speed." + item = /obj/item/weapon/storage/box/syndie_kit/imp_adrenal + cost = 4 + +// POINTLESS BADASSERY + +/datum/uplink_item/badass + category = "(Pointless) Badassery" + +/datum/uplink_item/badass/bundle + name = "Syndicate Bundle" + desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 10 telecrystals, but you do not know which specialisation you will receive." + item = /obj/item/weapon/storage/box/syndicate + cost = 10 + excludefrom = list(/datum/game_mode/nuclear) + +/datum/uplink_item/badass/syndiecards + name = "Syndicate Playing Cards" + desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, making them slightly more robust than a normal deck of cards. \ + You can also play card games with them." + item = /obj/item/toy/cards/deck/syndicate + cost = 1 + excludefrom = list(/datum/game_mode/nuclear) + +/datum/uplink_item/badass/balloon + name = "For showing that you are The Boss" + desc = "A useless red balloon with the syndicate logo on it, which can blow the deepest of covers." + item = /obj/item/toy/syndicateballoon + cost = 10 + +/datum/uplink_item/badass/random + name = "Random Item" + desc = "Picking this choice will send you a random item from the list. Useful for when you cannot think of a strategy to finish your objectives with." + item = /obj/item/weapon/storage/box/syndicate + cost = 0 + +/datum/uplink_item/badass/random/spawn_item(var/turf/loc, var/obj/item/device/uplink/U) + + var/list/buyable_items = get_uplink_items() + var/list/possible_items = list() + + for(var/category in buyable_items) + for(var/datum/uplink_item/I in buyable_items[category]) + if(I == src) + continue + if(I.cost > U.uses) + continue + possible_items += I + + if(possible_items.len) + var/datum/uplink_item/I = pick(possible_items) + U.uses -= max(0, I.cost) + feedback_add_details("traitor_uplink_items_bought","RN") + return new I.item(loc) diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 57335f811e6..372578e6038 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -37,7 +37,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048 . += text("
    \n[]
    \n[]
    \n[]
    \n[]
    \n[]
    \n[]
    \n[]", (A.locked ? "The door bolts have fallen!" : "The door bolts look up."), (A.lights ? "The door bolt lights are on." : "The door bolt lights are off!"), ((A.arePowerSystemsOn() && !(A.stat & NOPOWER)) ? "The test light is on." : "The test light is off!"), - (A.aiControlDisabled==0 ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."), + ((A.aiControlDisabled==0 && !A.emagged) ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."), (A.safe==0 ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."), (A.normalspeed==0 ? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off."), (A.emergency==0 ? "The emergency lights are off." : "The emergency lights are on.")) @@ -179,7 +179,8 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048 return if(AIRLOCK_WIRE_OPEN_DOOR) //tries to open the door without ID - //will succeed only if the ID wire is cut or the door requires no access + //will succeed only if the ID wire is cut or the door requires no access and it's not emagged + if(A.emagged) return if(!A.requiresID() || A.check_access(null)) if(A.density) A.open() else A.close() diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm index 2c826e6d527..77d9df4a391 100644 --- a/code/datums/wires/alarm.dm +++ b/code/datums/wires/alarm.dm @@ -1,94 +1,94 @@ - -/datum/wires/alarm - holder_type = /obj/machinery/alarm - wire_count = 5 - -var/const/AALARM_WIRE_IDSCAN = 1 -var/const/AALARM_WIRE_POWER = 2 -var/const/AALARM_WIRE_SYPHON = 4 -var/const/AALARM_WIRE_AI_CONTROL = 8 -var/const/AALARM_WIRE_AALARM = 16 - - -/datum/wires/alarm/CanUse(var/mob/living/L) - var/obj/machinery/alarm/A = holder - if(A.wiresexposed) - return 1 - return 0 - -/datum/wires/alarm/GetInteractWindow() - var/obj/machinery/alarm/A = holder - . += ..() - . += text("
    \n[(A.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
    \n[((A.shorted || (A.stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
    \n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") - -/datum/wires/alarm/UpdateCut(var/index, var/mended) - var/obj/machinery/alarm/A = holder - switch(index) - if(AALARM_WIRE_IDSCAN) - if(!mended) - A.locked = 1 - //world << "Idscan wire cut" - - if(AALARM_WIRE_POWER) - A.shock(usr, 50) - A.shorted = !mended - A.update_icon() - //world << "Power wire cut" - - if (AALARM_WIRE_AI_CONTROL) - if (A.aidisabled == !mended) - A.aidisabled = mended - //world << "AI Control Wire Cut" - - if(AALARM_WIRE_SYPHON) - if(!mended) - A.mode = 3 // AALARM_MODE_PANIC - A.apply_mode() - //world << "Syphon Wire Cut" - - if(AALARM_WIRE_AALARM) - if (A.alarm_area.atmosalert(2)) - A.post_alert(2) - A.update_icon() - -/datum/wires/alarm/UpdatePulsed(var/index) - var/obj/machinery/alarm/A = holder - switch(index) - if(AALARM_WIRE_IDSCAN) - A.locked = !A.locked - // world << "Idscan wire pulsed" - - if (AALARM_WIRE_POWER) - // world << "Power wire pulsed" - if(A.shorted == 0) - A.shorted = 1 - A.update_icon() - - spawn(12000) - if(A.shorted == 1) - A.shorted = 0 - A.update_icon() - - - if (AALARM_WIRE_AI_CONTROL) - // world << "AI Control wire pulsed" - if (A.aidisabled == 0) - A.aidisabled = 1 - A.updateDialog() - spawn(100) - if (A.aidisabled == 1) - A.aidisabled = 0 - - if(AALARM_WIRE_SYPHON) - // world << "Syphon wire pulsed" - if(A.mode == 1) // AALARM_MODE_SCRUB - A.mode = 3 // AALARM_MODE_PANIC - else - A.mode = 1 // AALARM_MODE_SCRUB - A.apply_mode() - - if(AALARM_WIRE_AALARM) - // world << "Aalarm wire pulsed" - if (A.alarm_area.atmosalert(0)) - A.post_alert(0) - A.update_icon() + +/datum/wires/alarm + holder_type = /obj/machinery/alarm + wire_count = 5 + +var/const/AALARM_WIRE_IDSCAN = 1 +var/const/AALARM_WIRE_POWER = 2 +var/const/AALARM_WIRE_SYPHON = 4 +var/const/AALARM_WIRE_AI_CONTROL = 8 +var/const/AALARM_WIRE_AALARM = 16 + + +/datum/wires/alarm/CanUse(var/mob/living/L) + var/obj/machinery/alarm/A = holder + if(A.wiresexposed) + return 1 + return 0 + +/datum/wires/alarm/GetInteractWindow() + var/obj/machinery/alarm/A = holder + . += ..() + . += text("
    \n[(A.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
    \n[((A.shorted || (A.stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
    \n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") + +/datum/wires/alarm/UpdateCut(var/index, var/mended) + var/obj/machinery/alarm/A = holder + switch(index) + if(AALARM_WIRE_IDSCAN) + if(!mended) + A.locked = 1 + //world << "Idscan wire cut" + + if(AALARM_WIRE_POWER) + A.shock(usr, 50) + A.shorted = !mended + A.update_icon() + //world << "Power wire cut" + + if (AALARM_WIRE_AI_CONTROL) + if (A.aidisabled == !mended) + A.aidisabled = mended + //world << "AI Control Wire Cut" + + if(AALARM_WIRE_SYPHON) + if(!mended) + A.mode = 3 // AALARM_MODE_PANIC + A.apply_mode() + //world << "Syphon Wire Cut" + + if(AALARM_WIRE_AALARM) + if (A.alarm_area.atmosalert(2)) + A.post_alert(2) + A.update_icon() + +/datum/wires/alarm/UpdatePulsed(var/index) + var/obj/machinery/alarm/A = holder + switch(index) + if(AALARM_WIRE_IDSCAN) + A.locked = !A.locked + // world << "Idscan wire pulsed" + + if (AALARM_WIRE_POWER) + // world << "Power wire pulsed" + if(A.shorted == 0) + A.shorted = 1 + A.update_icon() + + spawn(12000) + if(A.shorted == 1) + A.shorted = 0 + A.update_icon() + + + if (AALARM_WIRE_AI_CONTROL) + // world << "AI Control wire pulsed" + if (A.aidisabled == 0) + A.aidisabled = 1 + A.updateDialog() + spawn(100) + if (A.aidisabled == 1) + A.aidisabled = 0 + + if(AALARM_WIRE_SYPHON) + // world << "Syphon wire pulsed" + if(A.mode == 1) // AALARM_MODE_SCRUB + A.mode = 3 // AALARM_MODE_PANIC + else + A.mode = 1 // AALARM_MODE_SCRUB + A.apply_mode() + + if(AALARM_WIRE_AALARM) + // world << "Aalarm wire pulsed" + if (A.alarm_area.atmosalert(0)) + A.post_alert(0) + A.update_icon() diff --git a/code/datums/wires/autolathe.dm b/code/datums/wires/autolathe.dm index e382ce620f1..ccfa7f10221 100644 --- a/code/datums/wires/autolathe.dm +++ b/code/datums/wires/autolathe.dm @@ -1,58 +1,58 @@ -/datum/wires/autolathe - - holder_type = /obj/machinery/autolathe - wire_count = 10 - -var/const/AUTOLATHE_HACK_WIRE = 1 -var/const/AUTOLATHE_SHOCK_WIRE = 2 -var/const/AUTOLATHE_DISABLE_WIRE = 4 - -/datum/wires/autolathe/GetInteractWindow() - var/obj/machinery/autolathe/A = holder - . += ..() - . += text("
    The red light is [A.disabled ? "off" : "on"].
    The green light is [A.shocked ? "off" : "on"].
    The blue light is [A.hacked ? "off" : "on"].
    ") - -/datum/wires/autolathe/CanUse() - var/obj/machinery/autolathe/A = holder - if(A.panel_open) - return 1 - return 0 - -/datum/wires/autolathe/Interact(var/mob/living/user) - if(CanUse(user)) - var/obj/machinery/autolathe/V = holder - V.attack_hand(user) - -/datum/wires/autolathe/UpdateCut(index, mended) - var/obj/machinery/autolathe/A = holder - switch(index) - if(AUTOLATHE_HACK_WIRE) - A.hacked = !mended - if(AUTOLATHE_SHOCK_WIRE) - A.shocked = !mended - if(AUTOLATHE_DISABLE_WIRE) - A.disabled = !mended - -/datum/wires/autolathe/UpdatePulsed(index) - if(IsIndexCut(index)) - return - var/obj/machinery/autolathe/A = holder - switch(index) - if(AUTOLATHE_HACK_WIRE) - A.hacked = !A.hacked - spawn(50) - if(A && !IsIndexCut(index)) - A.hacked = 0 - Interact(usr) - if(AUTOLATHE_SHOCK_WIRE) - A.shocked = !A.shocked - spawn(50) - if(A && !IsIndexCut(index)) - A.shocked = 0 - Interact(usr) - if(AUTOLATHE_DISABLE_WIRE) - A.disabled = !A.disabled - spawn(50) - if(A && !IsIndexCut(index)) - A.disabled = 0 +/datum/wires/autolathe + + holder_type = /obj/machinery/autolathe + wire_count = 10 + +var/const/AUTOLATHE_HACK_WIRE = 1 +var/const/AUTOLATHE_SHOCK_WIRE = 2 +var/const/AUTOLATHE_DISABLE_WIRE = 4 + +/datum/wires/autolathe/GetInteractWindow() + var/obj/machinery/autolathe/A = holder + . += ..() + . += text("
    The red light is [A.disabled ? "off" : "on"].
    The green light is [A.shocked ? "off" : "on"].
    The blue light is [A.hacked ? "off" : "on"].
    ") + +/datum/wires/autolathe/CanUse() + var/obj/machinery/autolathe/A = holder + if(A.panel_open) + return 1 + return 0 + +/datum/wires/autolathe/Interact(var/mob/living/user) + if(CanUse(user)) + var/obj/machinery/autolathe/V = holder + V.attack_hand(user) + +/datum/wires/autolathe/UpdateCut(index, mended) + var/obj/machinery/autolathe/A = holder + switch(index) + if(AUTOLATHE_HACK_WIRE) + A.hacked = !mended + if(AUTOLATHE_SHOCK_WIRE) + A.shocked = !mended + if(AUTOLATHE_DISABLE_WIRE) + A.disabled = !mended + +/datum/wires/autolathe/UpdatePulsed(index) + if(IsIndexCut(index)) + return + var/obj/machinery/autolathe/A = holder + switch(index) + if(AUTOLATHE_HACK_WIRE) + A.hacked = !A.hacked + spawn(50) + if(A && !IsIndexCut(index)) + A.hacked = 0 + Interact(usr) + if(AUTOLATHE_SHOCK_WIRE) + A.shocked = !A.shocked + spawn(50) + if(A && !IsIndexCut(index)) + A.shocked = 0 + Interact(usr) + if(AUTOLATHE_DISABLE_WIRE) + A.disabled = !A.disabled + spawn(50) + if(A && !IsIndexCut(index)) + A.disabled = 0 Interact(usr) \ No newline at end of file diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index 4e4fabe3d38..6e3ac1d88b3 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -1,77 +1,77 @@ -/datum/wires/syndicatebomb - random = 1 - holder_type = /obj/machinery/syndicatebomb - wire_count = 5 - -var/const/WIRE_BOOM = 1 // Explodes if pulsed or cut while active, defuses a bomb that isn't active on cut -var/const/WIRE_UNBOLT = 2 // Unbolts the bomb if cut, hint on pulsed -var/const/WIRE_DELAY = 4 // Raises the timer on pulse, does nothing on cut -var/const/WIRE_PROCEED = 8 // Lowers the timer, explodes if cut while the bomb is active -var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if pulsed while already active, will stop a timer a bomb on cut - - -/datum/wires/syndicatebomb/CanUse(var/mob/living/L) - var/obj/machinery/syndicatebomb/P = holder - if(P.open_panel) - return 1 - return 0 - -/datum/wires/syndicatebomb/UpdatePulsed(var/index) - var/obj/machinery/syndicatebomb/P = holder - switch(index) - if(WIRE_BOOM) - if (P.active) - P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-") - P.timer = 0 - if(WIRE_UNBOLT) - P.loc.visible_message("\blue \icon[holder] The bolts spin in place for a moment.") - if(WIRE_DELAY) - playsound(P.loc, 'sound/machines/chime.ogg', 30, 1) - P.loc.visible_message("\blue \icon[holder] The bomb chirps.") - P.timer += 10 - if(WIRE_PROCEED) - playsound(P.loc, 'sound/machines/buzz-sigh.ogg', 30, 1) - P.loc.visible_message("\red \icon[holder] The bomb buzzes ominously!") - if (P.timer >= 61) //Long fuse bombs can suddenly become more dangerous if you tinker with them - P.timer = 60 - if (P.timer >= 21) - P.timer -= 10 - else if (P.timer >= 11) //both to prevent negative timers and to have a little mercy - P.timer = 10 - if(WIRE_ACTIVATE) - if(!P.active && !P.defused) - playsound(P.loc, 'sound/machines/click.ogg', 30, 1) - P.loc.visible_message("\red \icon[holder] You hear the bomb start ticking!") - P.active = 1 - P.icon_state = "[initial(P.icon_state)]-active[P.open_panel ? "-wires" : ""]" - else - P.loc.visible_message("\blue \icon[holder] The bomb seems to hesitate for a moment.") - P.timer += 5 - -/datum/wires/syndicatebomb/UpdateCut(var/index, var/mended) - var/obj/machinery/syndicatebomb/P = holder - switch(index) - if(WIRE_EXPLODE) - if(!mended) - if(P.active) - P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-") - P.timer = 0 - else - P.defused = 1 - if(mended) - P.defused = 0 //cutting and mending all the wires of an inactive bomb will thus cure any sabotage - if(WIRE_UNBOLT) - if (!mended && P.anchored) - playsound(P.loc, 'sound/effects/stealthoff.ogg', 30, 1) - P.loc.visible_message("\blue \icon[holder] The bolts lift out of the ground!") - P.anchored = 0 - if(WIRE_PROCEED) - if(!mended && P.active) - P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-") - P.timer = 0 - if(WIRE_ACTIVATE) - if (!mended && P.active) - P.loc.visible_message("\blue \icon[holder] The timer stops! The bomb has been defused!") - P.icon_state = "[initial(P.icon_state)]-inactive[P.open_panel ? "-wires" : ""]" - P.active = 0 +/datum/wires/syndicatebomb + random = 1 + holder_type = /obj/machinery/syndicatebomb + wire_count = 5 + +var/const/WIRE_BOOM = 1 // Explodes if pulsed or cut while active, defuses a bomb that isn't active on cut +var/const/WIRE_UNBOLT = 2 // Unbolts the bomb if cut, hint on pulsed +var/const/WIRE_DELAY = 4 // Raises the timer on pulse, does nothing on cut +var/const/WIRE_PROCEED = 8 // Lowers the timer, explodes if cut while the bomb is active +var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if pulsed while already active, will stop a timer a bomb on cut + + +/datum/wires/syndicatebomb/CanUse(var/mob/living/L) + var/obj/machinery/syndicatebomb/P = holder + if(P.open_panel) + return 1 + return 0 + +/datum/wires/syndicatebomb/UpdatePulsed(var/index) + var/obj/machinery/syndicatebomb/P = holder + switch(index) + if(WIRE_BOOM) + if (P.active) + P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-") + P.timer = 0 + if(WIRE_UNBOLT) + P.loc.visible_message("\blue \icon[holder] The bolts spin in place for a moment.") + if(WIRE_DELAY) + playsound(P.loc, 'sound/machines/chime.ogg', 30, 1) + P.loc.visible_message("\blue \icon[holder] The bomb chirps.") + P.timer += 10 + if(WIRE_PROCEED) + playsound(P.loc, 'sound/machines/buzz-sigh.ogg', 30, 1) + P.loc.visible_message("\red \icon[holder] The bomb buzzes ominously!") + if (P.timer >= 61) //Long fuse bombs can suddenly become more dangerous if you tinker with them + P.timer = 60 + if (P.timer >= 21) + P.timer -= 10 + else if (P.timer >= 11) //both to prevent negative timers and to have a little mercy + P.timer = 10 + if(WIRE_ACTIVATE) + if(!P.active && !P.defused) + playsound(P.loc, 'sound/machines/click.ogg', 30, 1) + P.loc.visible_message("\red \icon[holder] You hear the bomb start ticking!") + P.active = 1 + P.icon_state = "[initial(P.icon_state)]-active[P.open_panel ? "-wires" : ""]" + else + P.loc.visible_message("\blue \icon[holder] The bomb seems to hesitate for a moment.") + P.timer += 5 + +/datum/wires/syndicatebomb/UpdateCut(var/index, var/mended) + var/obj/machinery/syndicatebomb/P = holder + switch(index) + if(WIRE_EXPLODE) + if(!mended) + if(P.active) + P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-") + P.timer = 0 + else + P.defused = 1 + if(mended) + P.defused = 0 //cutting and mending all the wires of an inactive bomb will thus cure any sabotage + if(WIRE_UNBOLT) + if (!mended && P.anchored) + playsound(P.loc, 'sound/effects/stealthoff.ogg', 30, 1) + P.loc.visible_message("\blue \icon[holder] The bolts lift out of the ground!") + P.anchored = 0 + if(WIRE_PROCEED) + if(!mended && P.active) + P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-") + P.timer = 0 + if(WIRE_ACTIVATE) + if (!mended && P.active) + P.loc.visible_message("\blue \icon[holder] The timer stops! The bomb has been defused!") + P.icon_state = "[initial(P.icon_state)]-inactive[P.open_panel ? "-wires" : ""]" + P.active = 0 P.defused = 1 \ No newline at end of file diff --git a/code/datums/wires/taperecorder.dm b/code/datums/wires/taperecorder.dm index a5fa9bd3939..45eaef24421 100644 --- a/code/datums/wires/taperecorder.dm +++ b/code/datums/wires/taperecorder.dm @@ -1,40 +1,40 @@ -/datum/wires/taperecorder - wire_count = 2 - holder_type = /obj/item/device/taperecorder - -var/const/WIRE_PLAY = 1 -var/const/WIRE_RECORD = 2 - - -/datum/wires/taperecorder/UpdatePulsed(var/index) - switch(index) - if(WIRE_PLAY) - play() - if(WIRE_RECORD) - record() - -/datum/wires/taperecorder/CanUse(var/mob/living/L) - var/obj/item/device/taperecorder/T = holder - if(T.open_panel) - return 1 - return 0 - - -/datum/wires/taperecorder/proc/play() - var/obj/item/device/taperecorder/T = holder - T.stop() - T.play() - -/datum/wires/taperecorder/proc/record() - var/obj/item/device/taperecorder/T = holder - if(T.recording) - T.stop() - else - T.record() - -//helpers -/datum/wires/taperecorder/proc/get_play() - return !(wires_status & WIRE_PLAY) - -/datum/wires/taperecorder/proc/get_record() +/datum/wires/taperecorder + wire_count = 2 + holder_type = /obj/item/device/taperecorder + +var/const/WIRE_PLAY = 1 +var/const/WIRE_RECORD = 2 + + +/datum/wires/taperecorder/UpdatePulsed(var/index) + switch(index) + if(WIRE_PLAY) + play() + if(WIRE_RECORD) + record() + +/datum/wires/taperecorder/CanUse(var/mob/living/L) + var/obj/item/device/taperecorder/T = holder + if(T.open_panel) + return 1 + return 0 + + +/datum/wires/taperecorder/proc/play() + var/obj/item/device/taperecorder/T = holder + T.stop() + T.play() + +/datum/wires/taperecorder/proc/record() + var/obj/item/device/taperecorder/T = holder + if(T.recording) + T.stop() + else + T.record() + +//helpers +/datum/wires/taperecorder/proc/get_play() + return !(wires_status & WIRE_PLAY) + +/datum/wires/taperecorder/proc/get_record() return !(wires_status & WIRE_RECORD) \ No newline at end of file diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 8266946010f..51965f71cce 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -374,8 +374,8 @@ if(istype(A, /obj/effect/spacevine)) for(var/obj/effect/spacevine/B in orange(A,1)) if(prob(80)) - del B - del A + qdel(B) + qdel(A) /* /obj/item/weapon/cigarpacket diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index a56343316ea..d01c97a881d 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -42,7 +42,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station var/used_light = 0 var/used_environ = 0 - var/has_gravity = 1 + var/has_gravity = 0 var/no_air = null var/area/master // master area used for power calcluations @@ -82,8 +82,8 @@ proc/process_ghost_teleport_locs() if(istype(AR, /area/turret_protected/aisat) || istype(AR, /area/derelict) || istype(AR, /area/tdome)) ghostteleportlocs += AR.name ghostteleportlocs[AR.name] = AR - var/turf/picked = pick(get_area_turfs(AR.type)) - if (picked.z == 1 || picked.z == 5 || picked.z == 3) + var/turf/picked = safepick(get_area_turfs(AR.type)) + if (picked && (picked.z == 1 || picked.z == 5 || picked.z == 3)) ghostteleportlocs += AR.name ghostteleportlocs[AR.name] = AR @@ -305,6 +305,7 @@ proc/process_ghost_teleport_locs() name = "\improper Centcom" icon_state = "centcom" requires_power = 0 + has_gravity = 1 /area/centcom/control name = "\improper Centcom Docks" @@ -330,6 +331,7 @@ proc/process_ghost_teleport_locs() name = "\improper Syndicate Mothership" icon_state = "syndie-ship" requires_power = 0 + has_gravity = 1 /area/syndicate_mothership/control name = "\improper Syndicate Control Room" @@ -345,6 +347,7 @@ proc/process_ghost_teleport_locs() name = "\improper Asteroid" icon_state = "asteroid" requires_power = 0 + has_gravity = 1 /area/asteroid/cave name = "\improper Asteroid - Underground" @@ -360,19 +363,6 @@ proc/process_ghost_teleport_locs() lighting_use_dynamic = 1 InitializeLighting() - - - - - - - - - - - - - /area/planet/clown name = "\improper Clown Planet" icon_state = "honk" @@ -387,6 +377,7 @@ proc/process_ghost_teleport_locs() name = "\improper Thunderdome" icon_state = "thunder" requires_power = 0 + has_gravity = 1 /area/tdome/tdome1 name = "\improper Thunderdome (Team 1)" @@ -415,6 +406,7 @@ proc/process_ghost_teleport_locs() /area/syndicate_station/start name = "\improper Syndicate Forward Operating Base" icon_state = "yellow" + has_gravity = 1 /area/syndicate_station/southwest name = "\improper south-west of SS13" @@ -456,6 +448,7 @@ proc/process_ghost_teleport_locs() name = "\improper Wizard's Den" icon_state = "yellow" requires_power = 0 + has_gravity = 1 @@ -841,6 +834,10 @@ proc/process_ghost_teleport_locs() name = "\improper Chief Engineer's office" icon_state = "engine_control" + gravity_generator + name = "Gravity Generator Room" + icon_state = "blue" + //Solars @@ -1213,10 +1210,12 @@ proc/process_ghost_teleport_locs() /area/djstation name = "\improper Ruskie DJ Station" icon_state = "DJ" + has_gravity = 1 /area/djstation/solars name = "\improper DJ Station Solars" icon_state = "DJ" + has_gravity = 1 //DERELICT @@ -1474,6 +1473,7 @@ proc/process_ghost_teleport_locs() /area/awaymission name = "\improper Strange Location" icon_state = "away" + has_gravity = 1 /area/awaymission/example name = "\improper Strange Station" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index a5e978a3f6d..bd03bbf1207 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -260,9 +260,6 @@ if(!L.lastarea) L.lastarea = get_area(L.loc) var/area/newarea = get_area(L.loc) - var/area/oldarea = L.lastarea - if((oldarea.has_gravity == 0) && (newarea.has_gravity == 1) && (L.m_intent == "run")) // Being ready when you change areas gives you a chance to avoid falling all together. - thunk(L) L.lastarea = newarea @@ -300,32 +297,18 @@ if(L.&& L.client) L.client.played = 0 -/area/proc/gravitychange(var/gravitystate = 0) - - has_gravity = gravitystate - - if(gravitystate) - for(var/mob/living/carbon/human/M in contents) - thunk(M) - /area/proc/mob_activate(var/mob/living/L) return -/area/proc/thunk(mob) - if(istype(mob,/mob/living/carbon/human/)) // Only humans can wear magboots, so we give them a chance to. - if((istype(mob:shoes, /obj/item/clothing/shoes/magboots) && (mob:shoes.flags & NOSLIP))) - return - - if(istype(get_turf(mob), /turf/space)) // Can't fall onto nothing. - return - - if((istype(mob,/mob/living/carbon/human/)) && (mob:m_intent == "run")) // Only clumbsy humans can fall on their asses. - mob:AdjustStunned(5) - mob:AdjustWeakened(5) - - else if (istype(mob,/mob/living/carbon/human/)) - mob:AdjustStunned(2) - mob:AdjustWeakened(2) - - mob << "Gravity!" - +/proc/has_gravity(var/atom/AT) + var/area/A = get_area(AT) + var/turf/T = get_turf(AT) + if(istype(T, /turf/space)) // Turf never has gravity + return 0 + else if(A && A.has_gravity) // Areas which always has gravity + return 1 + else + // There's a gravity generator on our z level + if(T && gravity_generators["[T.z]"] && length(gravity_generators["[T.z]"])) + return 1 + return 0 \ No newline at end of file diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d836e61cf44..8df6edcb713 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -17,6 +17,9 @@ // replaced by OPENCONTAINER flags and atom/proc/is_open_container() ///Chemistry. + // Garbage collection + var/gc_destroyed //Time when this object + /atom/proc/throw_impact(atom/hit_atom) if(istype(hit_atom,/mob/living)) var/mob/living/M = hit_atom @@ -41,6 +44,16 @@ /atom/proc/CheckParts() return +// Like Del(), but for qdel. +// Called BEFORE qdel moves shit. +// Also called on del() +/atom/proc/Destroy() + gc_destroyed = world.time + if(reagents) + reagents.delete() + del(reagents) // Technically I think the reagent holder will gc, but let's be careful here and delete all the reagents and the holder too + invisibility = 101 + /atom/proc/assume_air(datum/gas_mixture/giver) del(giver) return null @@ -161,7 +174,7 @@ its easier to just keep the beam vertical. for(var/obj/effect/overlay/beam/O in orange(10,src)) //This section erases the previously drawn beam because I found it was easier to if(O.BeamSource==src) //just draw another instance of the beam instead of trying to manipulate all the - del O //pieces to a new orientation. + qdel(O) //pieces to a new orientation. var/Angle=round(Get_Angle(src,BeamTarget)) var/icon/I=new(icon,icon_state) I.Turn(Angle) @@ -202,7 +215,7 @@ its easier to just keep the beam vertical. X.pixel_y=Pixel_y sleep(3) //Changing this to a lower value will cause the beam to follow more smoothly with movement, but it will also be more laggy. //I've found that 3 ticks provided a nice balance for my use. - for(var/obj/effect/overlay/beam/O in orange(10,src)) if(O.BeamSource==src) del O + for(var/obj/effect/overlay/beam/O in orange(10,src)) if(O.BeamSource==src) qdel(O) //All atoms diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 8bb4db44c53..0c06a351d6c 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -22,6 +22,21 @@ src.last_move = get_dir(A, src.loc) return +/atom/movable/Del() + if(isnull(gc_destroyed) && loc) + testing("GC: -- [type] was deleted via del() rather than qdel() --") +// else if(isnull(gc_destroyed)) +// testing("GC: [type] was deleted via GC without qdel()") //Not really a huge issue but from now on, please qdel() +// else +// testing("GC: [type] was deleted via GC with qdel()") + ..() + +/atom/movable/Destroy() + loc = null // can never null their loc enough really + for(var/atom/movable/AM in contents) + qdel(AM) + . = ..() + // Previously known as HasEntered() // This is automatically called when something enters your square /atom/movable/Crossed(atom/movable/AM) @@ -76,7 +91,6 @@ var/dy = (target.y > src.y) ? NORTH : SOUTH var/dist_travelled = 0 var/dist_since_sleep = 0 - var/area/a = get_area(src.loc) var/tdist_x = dist_x; var/tdist_y = dist_y; @@ -90,7 +104,7 @@ tdy = dx; var/error = tdist_x/2 - tdist_y - while(target && (((((dist_x > dist_y) && ((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST))) || ((dist_x <= dist_y) && ((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH))) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space))) + while(target && (((((dist_x > dist_y) && ((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST))) || ((dist_x <= dist_y) && ((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH))) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || !has_gravity(src))) // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up if(!src.throwing) break if(!istype(src.loc, /turf)) break @@ -107,8 +121,6 @@ dist_since_sleep = 0 sleep(1) - a = get_area(src.loc) - //done throwing, either because it hit something or it finished moving src.throwing = 0 if(isobj(src)) src.throw_impact(get_turf(src)) diff --git a/code/game/dna.dm b/code/game/dna.dm index 53bbf73cc49..f4c6530b7b8 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -477,7 +477,7 @@ var/mob/M = G.affecting M.loc = loc user.stop_pulling() - del(G) + qdel(G) /obj/machinery/dna_scannernew/attack_hand(mob/user) if(..()) @@ -490,24 +490,15 @@ /obj/machinery/dna_scannernew/ex_act(severity) switch(severity) if(1.0) - for(var/atom/movable/A in src) - A.loc = loc - A.ex_act(severity) - del(src) + qdel(src) return if(2.0) if(prob(50)) - for(var/atom/movable/A in src) - A.loc = loc - A.ex_act(severity) - del(src) + qdel(src) return if(3.0) if(prob(25)) - for(var/atom/movable/A in src) - A.loc = loc - A.ex_act(severity) - del(src) + qdel(src) return else return @@ -515,9 +506,7 @@ /obj/machinery/dna_scannernew/blob_act() if(prob(75)) - for(var/atom/movable/A in contents) - A.loc = loc - del(src) + qdel(src) //DNA COMPUTER diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 9d33e32f6af..ebe28d02f89 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -1,144 +1,144 @@ -/obj/item/weapon/antag_spawner - throw_speed = 1 - throw_range = 5 - w_class = 1.0 - var/used = 0 - -/obj/item/weapon/antag_spawner/proc/spawn_antag(var/client/C, var/turf/T, var/type = "") - return - -/obj/item/weapon/antag_spawner/proc/equip_antag(mob/target as mob) - return - -/obj/item/weapon/antag_spawner/contract - name = "contract" - desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid." - icon = 'icons/obj/wizard.dmi' - icon_state ="scroll2" - -/obj/item/weapon/antag_spawner/contract/attack_self(mob/user as mob) - user.set_machine(src) - var/dat - if(used) - dat = "You have already summoned your apprentice.
    " - else - dat = "Contract of Apprenticeship:
    " - dat += "Using this contract, you may summon an apprentice to aid you on your mission.
    " - dat += "If you are unable to establish contact with your apprentice, you can feed the contract back to the spellbook to refund your points.
    " - dat += "Which school of magic is your apprentice studying?:
    " - dat += "Destruction
    " - dat += "Your apprentice is skilled in offensive magic. They know Magic Missile and Fireball.
    " - dat += "Bluespace Manipulation
    " - dat += "Your apprentice is able to defy physics, melting through solid objects and travelling great distances in the blink of an eye. They know Teleport and Ethereal Jaunt.
    " - dat += "Healing
    " - dat += "Your apprentice is training to cast spells that will aid your survival. They know Forcewall and Charge and come with a Staff of Healing.
    " - dat += "Robeless
    " - dat += "Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.
    " - user << browse(dat, "window=radio") - onclose(user, "radio") - return - -/obj/item/weapon/antag_spawner/contract/Topic(href, href_list) - ..() - var/mob/living/carbon/human/H = usr - - if(H.stat || H.restrained()) - return - if(!istype(H, /mob/living/carbon/human)) - return 1 - - if(loc == H || (in_range(src, H) && istype(loc, /turf))) - H.set_machine(src) - if(href_list["school"]) - if (used) - H << "You already used this contract!" - return - var/list/candidates = get_candidates(BE_WIZARD) - if(candidates.len) - src.used = 1 - var/client/C = pick(candidates) - spawn_antag(C, get_turf(H.loc), href_list["school"]) - else - H << "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later." - -/obj/item/weapon/antag_spawner/contract/spawn_antag(var/client/C, var/turf/T, var/type = "") - new /obj/effect/effect/harmless_smoke(T) - var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) - M.key = C.key - M << "You are the [usr.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals." - switch(type) - if("destruction") - M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null) - M.mind.spell_list += new /obj/effect/proc_holder/spell/dumbfire/fireball(null) - M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball." - if("bluespace") - M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null) - M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null) - M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt." - if("healing") - M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/charge(null) - M.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/magic/staff/healing(M), slot_r_hand) - M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall." - if("robeless") - M.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/knock(null) - M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(null) - M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap." - - equip_antag(M) - var/wizard_name_first = pick(wizard_first) - var/wizard_name_second = pick(wizard_second) - var/randomname = "[wizard_name_first] [wizard_name_second]" - var/newname = copytext(sanitize(input(M, "You are the wizard's apprentice. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN) - if (!newname) - newname = randomname - M.mind.name = newname - M.real_name = newname - M.name = newname - var/datum/objective/protect/new_objective = new /datum/objective/protect - new_objective.owner = M:mind - new_objective:target = usr:mind - new_objective.explanation_text = "Protect [usr.real_name], the wizard." - M.mind.objectives += new_objective - ticker.mode.traitors += M.mind - M.mind.special_role = "apprentice" - -/obj/item/weapon/antag_spawner/contract/equip_antag(mob/target as mob) - target.equip_to_slot_or_del(new /obj/item/device/radio/headset(target), slot_ears) - target.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(target), slot_w_uniform) - target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(target), slot_shoes) - target.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(target), slot_wear_suit) - target.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(target), slot_head) - target.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(target), slot_back) - target.equip_to_slot_or_del(new /obj/item/weapon/storage/box(target), slot_in_backpack) - target.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll/apprentice(target), slot_r_store) - -/obj/item/weapon/antag_spawner/borg_tele - name = "Syndicate Cyborg Teleporter" - desc = "A single-use teleporter used to deploy a Syndicate Cyborg on the field." - icon = 'icons/obj/device.dmi' - icon_state = "locator" - var/TC_cost = 0 - -/obj/item/weapon/antag_spawner/borg_tele/attack_self(mob/user as mob) - if(used) - user << "The teleporter is out of power." - return - var/list/borg_candicates = get_candidates(BE_OPERATIVE) - if(borg_candicates.len > 0) - used = 1 - var/client/C = pick(borg_candicates) - spawn_antag(C, get_turf(src.loc), "syndieborg") - else - user << "Unable to connect to Syndicate Command. Please wait and try again later or use the teleporter on your uplink to get your points refunded." - -/obj/item/weapon/antag_spawner/borg_tele/spawn_antag(var/client/C, var/turf/T, var/type = "") - var/datum/effect/effect/system/spark_spread/S = new /datum/effect/effect/system/spark_spread - S.set_up(4, 1, src) - S.start() - var/mob/living/silicon/robot/R = new /mob/living/silicon/robot/syndicate(T) - R.key = C.key - ticker.mode.syndicates += R.mind - ticker.mode.update_synd_icons_added(R.mind) - R.mind.special_role = "syndicate" +/obj/item/weapon/antag_spawner + throw_speed = 1 + throw_range = 5 + w_class = 1.0 + var/used = 0 + +/obj/item/weapon/antag_spawner/proc/spawn_antag(var/client/C, var/turf/T, var/type = "") + return + +/obj/item/weapon/antag_spawner/proc/equip_antag(mob/target as mob) + return + +/obj/item/weapon/antag_spawner/contract + name = "contract" + desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid." + icon = 'icons/obj/wizard.dmi' + icon_state ="scroll2" + +/obj/item/weapon/antag_spawner/contract/attack_self(mob/user as mob) + user.set_machine(src) + var/dat + if(used) + dat = "You have already summoned your apprentice.
    " + else + dat = "Contract of Apprenticeship:
    " + dat += "Using this contract, you may summon an apprentice to aid you on your mission.
    " + dat += "If you are unable to establish contact with your apprentice, you can feed the contract back to the spellbook to refund your points.
    " + dat += "Which school of magic is your apprentice studying?:
    " + dat += "Destruction
    " + dat += "Your apprentice is skilled in offensive magic. They know Magic Missile and Fireball.
    " + dat += "Bluespace Manipulation
    " + dat += "Your apprentice is able to defy physics, melting through solid objects and travelling great distances in the blink of an eye. They know Teleport and Ethereal Jaunt.
    " + dat += "Healing
    " + dat += "Your apprentice is training to cast spells that will aid your survival. They know Forcewall and Charge and come with a Staff of Healing.
    " + dat += "Robeless
    " + dat += "Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.
    " + user << browse(dat, "window=radio") + onclose(user, "radio") + return + +/obj/item/weapon/antag_spawner/contract/Topic(href, href_list) + ..() + var/mob/living/carbon/human/H = usr + + if(H.stat || H.restrained()) + return + if(!istype(H, /mob/living/carbon/human)) + return 1 + + if(loc == H || (in_range(src, H) && istype(loc, /turf))) + H.set_machine(src) + if(href_list["school"]) + if (used) + H << "You already used this contract!" + return + var/list/candidates = get_candidates(BE_WIZARD) + if(candidates.len) + src.used = 1 + var/client/C = pick(candidates) + spawn_antag(C, get_turf(H.loc), href_list["school"]) + else + H << "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later." + +/obj/item/weapon/antag_spawner/contract/spawn_antag(var/client/C, var/turf/T, var/type = "") + new /obj/effect/effect/harmless_smoke(T) + var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) + M.key = C.key + M << "You are the [usr.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals." + switch(type) + if("destruction") + M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null) + M.mind.spell_list += new /obj/effect/proc_holder/spell/dumbfire/fireball(null) + M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball." + if("bluespace") + M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null) + M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null) + M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt." + if("healing") + M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/charge(null) + M.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/magic/staff/healing(M), slot_r_hand) + M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall." + if("robeless") + M.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/knock(null) + M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(null) + M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap." + + equip_antag(M) + var/wizard_name_first = pick(wizard_first) + var/wizard_name_second = pick(wizard_second) + var/randomname = "[wizard_name_first] [wizard_name_second]" + var/newname = copytext(sanitize(input(M, "You are the wizard's apprentice. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN) + if (!newname) + newname = randomname + M.mind.name = newname + M.real_name = newname + M.name = newname + var/datum/objective/protect/new_objective = new /datum/objective/protect + new_objective.owner = M:mind + new_objective:target = usr:mind + new_objective.explanation_text = "Protect [usr.real_name], the wizard." + M.mind.objectives += new_objective + ticker.mode.traitors += M.mind + M.mind.special_role = "apprentice" + +/obj/item/weapon/antag_spawner/contract/equip_antag(mob/target as mob) + target.equip_to_slot_or_del(new /obj/item/device/radio/headset(target), slot_ears) + target.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(target), slot_w_uniform) + target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(target), slot_shoes) + target.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(target), slot_wear_suit) + target.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(target), slot_head) + target.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(target), slot_back) + target.equip_to_slot_or_del(new /obj/item/weapon/storage/box(target), slot_in_backpack) + target.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll/apprentice(target), slot_r_store) + +/obj/item/weapon/antag_spawner/borg_tele + name = "Syndicate Cyborg Teleporter" + desc = "A single-use teleporter used to deploy a Syndicate Cyborg on the field." + icon = 'icons/obj/device.dmi' + icon_state = "locator" + var/TC_cost = 0 + +/obj/item/weapon/antag_spawner/borg_tele/attack_self(mob/user as mob) + if(used) + user << "The teleporter is out of power." + return + var/list/borg_candicates = get_candidates(BE_OPERATIVE) + if(borg_candicates.len > 0) + used = 1 + var/client/C = pick(borg_candicates) + spawn_antag(C, get_turf(src.loc), "syndieborg") + else + user << "Unable to connect to Syndicate Command. Please wait and try again later or use the teleporter on your uplink to get your points refunded." + +/obj/item/weapon/antag_spawner/borg_tele/spawn_antag(var/client/C, var/turf/T, var/type = "") + var/datum/effect/effect/system/spark_spread/S = new /datum/effect/effect/system/spark_spread + S.set_up(4, 1, src) + S.start() + var/mob/living/silicon/robot/R = new /mob/living/silicon/robot/syndicate(T) + R.key = C.key + ticker.mode.syndicates += R.mind + ticker.mode.update_synd_icons_added(R.mind) + R.mind.special_role = "syndicate" R.faction = "syndicate" \ No newline at end of file diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index 4838dfb3d9c..e59b57e17e0 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -46,4 +46,4 @@ datum/game_mode/proc/auto_declare_completion_blob() for(var/datum/mind/blob in blob_mode.infected_crew) text += "
    [blob.key] was [blob.name]" world << text - return 1 + return 1 diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 271d2b04323..fd3ce5d5a5b 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -18,21 +18,19 @@ ..(loc, h) -/obj/effect/blob/core/Del() +/obj/effect/blob/core/Destroy() blob_cores -= src if(overmind) - del(overmind) + qdel(overmind) processing_objects.Remove(src) ..() - return /obj/effect/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) return /obj/effect/blob/core/update_icon() if(health <= 0) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - Delete() + qdel(src) return // update_icon is called when health changes so... call update_health in the overmind if(overmind) @@ -71,7 +69,7 @@ overmind_get_delay = world.time + 300 // 30 seconds if(overmind) - del(overmind) + qdel(overmind) var/client/C = null var/list/candidates = list() diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index 3045b830f9e..8388b7e7953 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -10,10 +10,13 @@ /obj/effect/blob/factory/update_icon() if(health <= 0) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - Delete() - return - return + qdel(src) + +/obj/effect/blob/factory/Destroy() + for(var/mob/living/simple_animal/hostile/blobspore/spore in spores) + if(spore.factory == src) + spore.factory = null + ..() /obj/effect/blob/factory/PulseAnimation(var/activate = 0) if(activate) @@ -120,9 +123,9 @@ S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud S.start() - del(src) + qdel(src) -/mob/living/simple_animal/hostile/blobspore/Del() +/mob/living/simple_animal/hostile/blobspore/Destroy() if(factory) factory.spores -= src if(contents) diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index a205cd59263..1b615aed0a8 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -14,11 +14,10 @@ /obj/effect/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) return -/obj/effect/blob/node/Del() +/obj/effect/blob/node/Destroy() blob_nodes -= src processing_objects.Remove(src) ..() - return /obj/effect/blob/node/Life() for(var/i = 1; i < 8; i += i) @@ -27,7 +26,6 @@ /obj/effect/blob/node/update_icon() if(health <= 0) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - Delete() + qdel(src) return return \ No newline at end of file diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm index 3c0892363cc..2480d48552f 100644 --- a/code/game/gamemodes/blob/blobs/resource.dm +++ b/code/game/gamemodes/blob/blobs/resource.dm @@ -9,10 +9,7 @@ /obj/effect/blob/resource/update_icon() if(health <= 0) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - Delete() - return - return + qdel(src) /obj/effect/blob/resource/PulseAnimation(var/activate = 0) if(activate) diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index 17d06f89f9a..e954cba6a4d 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -9,8 +9,7 @@ /obj/effect/blob/shield/update_icon() if(health <= 0) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - Delete() + qdel(src) return return diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index e469a0ce1bf..5ee9f5dd69d 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -1,100 +1,100 @@ -/mob/camera/blob - name = "Blob Overmind" - real_name = "Blob Overmind" - icon = 'icons/mob/blob.dmi' - icon_state = "marker" - - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - invisibility = INVISIBILITY_OBSERVER - - pass_flags = PASSBLOB - faction = "blob" - - var/obj/effect/blob/core/blob_core = null // The blob overmind's core - var/blob_points = 0 - var/max_blob_points = 100 - -/mob/camera/blob/New() - var/new_name = "[initial(name)] ([rand(1, 999)])" - name = new_name - real_name = new_name - ..() - -/mob/camera/blob/Login() - ..() - sync_mind() - src << "You are the overmind!" - src << "You are the overmind and can control the blob! You can expand, which will attack people, and place new blob pieces such as..." - src << "Normal Blob will expand your reach and allow you to upgrade into special blobs that perform certain functions." - src << "Shield Blob is a strong and expensive blob which can take more damage. It is fireproof and can block air, use this to protect yourself from station fires." - src << "Resource Blob is a blob which will collect more resources for you, try to build these earlier to get a strong income. It will benefit from being near your core or multiple nodes, by having an increased resource rate; put it alone and it won't create resources at all." - src << "Node Blob is a blob which will grow, like the core. Unlike the core it won't give you a small income but it can power resource and factory blobs to increase their rate." - src << "Factory Blob is a blob which will spawn blob spores which will attack nearby food. Putting this nearby nodes and your core will increase the spawn rate; put it alone and it will not spawn any spores." - src << "Shortcuts: CTRL Click = Expand Blob / Middle Mouse Click = Rally Spores / Alt Click = Create Shield" - update_health() - -/mob/camera/blob/proc/update_health() - if(blob_core) - hud_used.blobhealthdisplay.maptext = "
    [blob_core.health]
    " - -/mob/camera/blob/proc/add_points(var/points) - if(points != 0) - blob_points = Clamp(blob_points + points, 0, max_blob_points) - hud_used.blobpwrdisplay.maptext = "
    [src.blob_points]
    " - -/mob/camera/blob/say(var/message) - if (!message) - return - - if (src.client) - if(client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." - return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return - - if (stat) - return - - blob_talk(message) - -/mob/camera/blob/proc/blob_talk(message) - log_say("[key_name(src)] : [message]") - - message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - - if (!message) - return - - var/message_a = say_quote(message) - var/rendered = "Blob Telepathy, [name] [message_a]" - - for (var/mob/M in mob_list) - if(isovermind(M) || isobserver(M)) - M.show_message(rendered, 2) - -/mob/camera/blob/emote(var/act,var/m_type=1,var/message = null) - return - -/mob/camera/blob/blob_act() - return - -/mob/camera/blob/Stat() - - statpanel("Status") - ..() - if (client.statpanel == "Status") - if(blob_core) - stat(null, "Core Health: [blob_core.health]") - stat(null, "Power Stored: [blob_points]/[max_blob_points]") - return - -/mob/camera/blob/Move(var/NewLoc, var/Dir = 0) - var/obj/effect/blob/B = locate() in range("3x3", NewLoc) - if(B) - loc = NewLoc - else - return 0 - - +/mob/camera/blob + name = "Blob Overmind" + real_name = "Blob Overmind" + icon = 'icons/mob/blob.dmi' + icon_state = "marker" + + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + invisibility = INVISIBILITY_OBSERVER + + pass_flags = PASSBLOB + faction = "blob" + + var/obj/effect/blob/core/blob_core = null // The blob overmind's core + var/blob_points = 0 + var/max_blob_points = 100 + +/mob/camera/blob/New() + var/new_name = "[initial(name)] ([rand(1, 999)])" + name = new_name + real_name = new_name + ..() + +/mob/camera/blob/Login() + ..() + sync_mind() + src << "You are the overmind!" + src << "You are the overmind and can control the blob! You can expand, which will attack people, and place new blob pieces such as..." + src << "Normal Blob will expand your reach and allow you to upgrade into special blobs that perform certain functions." + src << "Shield Blob is a strong and expensive blob which can take more damage. It is fireproof and can block air, use this to protect yourself from station fires." + src << "Resource Blob is a blob which will collect more resources for you, try to build these earlier to get a strong income. It will benefit from being near your core or multiple nodes, by having an increased resource rate; put it alone and it won't create resources at all." + src << "Node Blob is a blob which will grow, like the core. Unlike the core it won't give you a small income but it can power resource and factory blobs to increase their rate." + src << "Factory Blob is a blob which will spawn blob spores which will attack nearby food. Putting this nearby nodes and your core will increase the spawn rate; put it alone and it will not spawn any spores." + src << "Shortcuts: CTRL Click = Expand Blob / Middle Mouse Click = Rally Spores / Alt Click = Create Shield" + update_health() + +/mob/camera/blob/proc/update_health() + if(blob_core) + hud_used.blobhealthdisplay.maptext = "
    [blob_core.health]
    " + +/mob/camera/blob/proc/add_points(var/points) + if(points != 0) + blob_points = Clamp(blob_points + points, 0, max_blob_points) + hud_used.blobpwrdisplay.maptext = "
    [src.blob_points]
    " + +/mob/camera/blob/say(var/message) + if (!message) + return + + if (src.client) + if(client.prefs.muted & MUTE_IC) + src << "You cannot send IC messages (muted)." + return + if (src.client.handle_spam_prevention(message,MUTE_IC)) + return + + if (stat) + return + + blob_talk(message) + +/mob/camera/blob/proc/blob_talk(message) + log_say("[key_name(src)] : [message]") + + message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) + + if (!message) + return + + var/message_a = say_quote(message) + var/rendered = "Blob Telepathy, [name] [message_a]" + + for (var/mob/M in mob_list) + if(isovermind(M) || isobserver(M)) + M.show_message(rendered, 2) + +/mob/camera/blob/emote(var/act,var/m_type=1,var/message = null) + return + +/mob/camera/blob/blob_act() + return + +/mob/camera/blob/Stat() + + statpanel("Status") + ..() + if (client.statpanel == "Status") + if(blob_core) + stat(null, "Core Health: [blob_core.health]") + stat(null, "Power Stored: [blob_points]/[max_blob_points]") + return + +/mob/camera/blob/Move(var/NewLoc, var/Dir = 0) + var/obj/effect/blob/B = locate() in range("3x3", NewLoc) + if(B) + loc = NewLoc + else + return 0 + + diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index c5eba3dc77f..4fc5281081b 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -160,6 +160,32 @@ return +/mob/camera/blob/verb/relocate_core() + set category = "Blob" + set name = "Relocate Core (80)" + set desc = "Relocates your core to the node you are on, your old core will be turned into a node." + + + var/turf/T = get_turf(src) + + if(!T) + return + + var/obj/effect/blob/node/B = locate(/obj/effect/blob/node) in T + if(!B) + src << "You must be on a blob node!" + return + + if(!can_buy(80)) + return + + // The old switcharoo. + var/turf/old_turf = blob_core.loc + blob_core.loc = T + B.loc = old_turf + return + + /mob/camera/blob/verb/revert() set category = "Blob" set name = "Remove Blob" @@ -178,7 +204,7 @@ src << "Unable to remove this blob." return - B.Delete() + B.Destroy() return diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 15b7f0a987f..c288eca5c88 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -23,10 +23,11 @@ return -/obj/effect/blob/Del() +/obj/effect/blob/Destroy() blobs -= src + if(isturf(loc)) //Necessary because Expand() is retarded and spawns a blob and then deletes it + playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) ..() - return /obj/effect/blob/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -118,7 +119,8 @@ B.loc = T else T.blob_act()//If we cant move in hit the turf - B.Delete() + B.loc = null //So we don't play the splat sound, see Destroy() + qdel(B) for(var/atom/A in T)//Hit everything in the turf A.blob_act() @@ -178,25 +180,16 @@ if(!ispath(type)) error("[type] is an invalid type for the blob.") new type(src.loc) - Delete() - return - -/obj/effect/blob/proc/Delete() - del(src) + qdel(src) /obj/effect/blob/normal icon_state = "blob" luminosity = 0 health = 21 -/obj/effect/blob/normal/Delete() - src.loc = null - blobs -= src - /obj/effect/blob/normal/update_icon() if(health <= 0) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - Delete() + qdel(src) else if(health <= 15) icon_state = "blob_damaged" else diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index 6cae17bd2cc..8307aea0f2f 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -1,80 +1,80 @@ -/* - * Don't use the apostrophe in name or desc. Causes script errors. - * TODO: combine atleast some of the functionality with /proc_holder/spell - */ - -/obj/effect/proc_holder/changeling - panel = "Changeling" - name = "Prototype Sting" - desc = "" // Fluff - var/helptext = "" // Details - var/chemical_cost = 0 // negative chemical cost is for passive abilities (chemical glands) - var/dna_cost = -1 //cost of the sting in dna points. 0 = auto-purchase, -1 = cannot be purchased - var/req_dna = 0 //amount of dna needed to use this ability. Changelings always have atleast 1 - var/req_human = 0 //if you need to be human to use this ability - var/req_stat = CONSCIOUS // CONSCIOUS, UNCONSCIOUS or DEAD - var/genetic_damage = 0 // genetic damage caused by using the sting. Nothing to do with cloneloss. - var/max_genetic_damage = 100 // hard counter for spamming abilities. Not used/balanced much yet. - - -/obj/effect/proc_holder/changeling/proc/on_purchase(var/mob/user) - return - -/obj/effect/proc_holder/changeling/Click() - var/mob/user = usr - if(!user || !user.mind || !user.mind.changeling) - return - try_to_sting(user) - -/obj/effect/proc_holder/changeling/proc/try_to_sting(var/mob/user, var/mob/target) - if(!can_sting(user, target)) - return - var/datum/changeling/c = user.mind.changeling - if(sting_action(user, target)) - sting_feedback(user, target) - take_chemical_cost(c) - -/obj/effect/proc_holder/changeling/proc/sting_action(var/mob/user, var/mob/target) - return 0 - -/obj/effect/proc_holder/changeling/proc/sting_feedback(var/mob/user, var/mob/target) - return 0 - -/obj/effect/proc_holder/changeling/proc/take_chemical_cost(var/datum/changeling/changeling) - changeling.chem_charges -= chemical_cost - changeling.geneticdamage += genetic_damage - -//Fairly important to remember to return 1 on success >.< -/obj/effect/proc_holder/changeling/proc/can_sting(var/mob/user, var/mob/target) - if(!ishuman(user) && !ismonkey(user)) //typecast everything from mob to carbon from this point onwards - return 0 - if(req_human && !ishuman(user)) - user << "We cannot do that in this form!" - return 0 - var/datum/changeling/c = user.mind.changeling - if(c.chem_chargesWe require at least [chemical_cost] unit\s of chemicals to do that!" - return 0 - if(c.absorbedcountWe require at least [req_dna] sample\s of compatible DNA." - return 0 - if(req_stat < user.stat) - user << "We are incapacitated." - return 0 - if((user.status_flags & FAKEDEATH) && name!="Regenerate") - user << "We are incapacitated." - return 0 - if(c.geneticdamage > max_genetic_damage) - user << "Our genomes are still reassembling. We need time to recover first." - return 0 - return 1 - -//used in /mob/Stat() -/obj/effect/proc_holder/changeling/proc/can_be_used_by(var/mob/user) - if(!ishuman(user) && !ismonkey(user)) - return 0 - if(req_human && !ishuman(user)) - return 0 - return 1 - - +/* + * Don't use the apostrophe in name or desc. Causes script errors. + * TODO: combine atleast some of the functionality with /proc_holder/spell + */ + +/obj/effect/proc_holder/changeling + panel = "Changeling" + name = "Prototype Sting" + desc = "" // Fluff + var/helptext = "" // Details + var/chemical_cost = 0 // negative chemical cost is for passive abilities (chemical glands) + var/dna_cost = -1 //cost of the sting in dna points. 0 = auto-purchase, -1 = cannot be purchased + var/req_dna = 0 //amount of dna needed to use this ability. Changelings always have atleast 1 + var/req_human = 0 //if you need to be human to use this ability + var/req_stat = CONSCIOUS // CONSCIOUS, UNCONSCIOUS or DEAD + var/genetic_damage = 0 // genetic damage caused by using the sting. Nothing to do with cloneloss. + var/max_genetic_damage = 100 // hard counter for spamming abilities. Not used/balanced much yet. + + +/obj/effect/proc_holder/changeling/proc/on_purchase(var/mob/user) + return + +/obj/effect/proc_holder/changeling/Click() + var/mob/user = usr + if(!user || !user.mind || !user.mind.changeling) + return + try_to_sting(user) + +/obj/effect/proc_holder/changeling/proc/try_to_sting(var/mob/user, var/mob/target) + if(!can_sting(user, target)) + return + var/datum/changeling/c = user.mind.changeling + if(sting_action(user, target)) + sting_feedback(user, target) + take_chemical_cost(c) + +/obj/effect/proc_holder/changeling/proc/sting_action(var/mob/user, var/mob/target) + return 0 + +/obj/effect/proc_holder/changeling/proc/sting_feedback(var/mob/user, var/mob/target) + return 0 + +/obj/effect/proc_holder/changeling/proc/take_chemical_cost(var/datum/changeling/changeling) + changeling.chem_charges -= chemical_cost + changeling.geneticdamage += genetic_damage + +//Fairly important to remember to return 1 on success >.< +/obj/effect/proc_holder/changeling/proc/can_sting(var/mob/user, var/mob/target) + if(!ishuman(user) && !ismonkey(user)) //typecast everything from mob to carbon from this point onwards + return 0 + if(req_human && !ishuman(user)) + user << "We cannot do that in this form!" + return 0 + var/datum/changeling/c = user.mind.changeling + if(c.chem_chargesWe require at least [chemical_cost] unit\s of chemicals to do that!" + return 0 + if(c.absorbedcountWe require at least [req_dna] sample\s of compatible DNA." + return 0 + if(req_stat < user.stat) + user << "We are incapacitated." + return 0 + if((user.status_flags & FAKEDEATH) && name!="Regenerate") + user << "We are incapacitated." + return 0 + if(c.geneticdamage > max_genetic_damage) + user << "Our genomes are still reassembling. We need time to recover first." + return 0 + return 1 + +//used in /mob/Stat() +/obj/effect/proc_holder/changeling/proc/can_be_used_by(var/mob/user) + if(!ishuman(user) && !ismonkey(user)) + return 0 + if(req_human && !ishuman(user)) + return 0 + return 1 + + diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index dbbb06a6052..e1e257b9271 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -1,391 +1,391 @@ -var/list/sting_paths -// totally stolen from the new player panel. YAYY - -/obj/effect/proc_holder/changeling/evolution_menu - name = "-Evolution Menu-" //Dashes are so it's listed before all the other abilities. - desc = "Choose our method of subjugation." - dna_cost = 0 - -/obj/effect/proc_holder/changeling/evolution_menu/Click() - if(!usr || !usr.mind || !usr.mind.changeling) - return - var/datum/changeling/changeling = usr.mind.changeling - - if(!sting_paths) - sting_paths = init_paths(/obj/effect/proc_holder/changeling) - - var/dat = create_menu(changeling) - usr << browse(dat, "window=powers;size=600x700")//900x480 - - -/obj/effect/proc_holder/changeling/evolution_menu/proc/create_menu(var/datum/changeling/changeling) - var/dat - dat +="Changling Evolution Menu" - - //javascript, the part that does most of the work~ - dat += {" - - - - - - - "} - - //body tag start + onload and onkeypress (onkeyup) javascript event calls - dat += "" - - //title + search bar - dat += {" - - - - - - - - -
    - Changeling Evolution Menu
    - Hover over a power to see more information
    - Current ability choices remaining: [changeling.geneticpoints]
    - By rendering a lifeform to a husk, we gain enough power to alter and adapt our evolutions.
    - (Readapt)
    -

    -

    - Search: -
    - - "} - - //player table header - dat += {" - - "} - - var/i = 1 - for(var/path in sting_paths) - - var/obj/effect/proc_holder/changeling/P = new path() - if(P.dna_cost <= 0) //Let's skip the crap we start with. Keeps the evolution menu uncluttered. - continue - - var/ownsthis = changeling.has_sting(P) - - var/color - if(ownsthis) - if(i%2 == 0) - color = "#d8ebd8" - else - color = "#c3dec3" - else - if(i%2 == 0) - color = "#f2f2f2" - else - color = "#e6e6e6" - - - dat += {" - - - - - - "} - - i++ - - - //player table ending - dat += {" -
    - - - Evolve [P][ownsthis ? " - Purchased" : ((P.dna_cost > 1) ? " - Cost: [P.dna_cost]" : "")] - -
    -
    -
    - - - - "} - return dat - - -/obj/effect/proc_holder/changeling/evolution_menu/Topic(href, href_list) - ..() - if(!(iscarbon(usr) && usr.mind && usr.mind.changeling)) - return - - if(href_list["P"]) - usr.mind.changeling.purchasePower(usr, href_list["P"]) - else if(href_list["readapt"]) - usr.mind.changeling.lingRespec(usr) - var/dat = create_menu(usr.mind.changeling) - usr << browse(dat, "window=powers;size=600x700") -///// - -/datum/changeling/proc/purchasePower(var/mob/living/carbon/user, var/sting_name) - - var/obj/effect/proc_holder/changeling/thepower = null - - if(!sting_paths) - sting_paths = init_paths(/obj/effect/proc_holder/changeling) - for(var/path in sting_paths) - var/obj/effect/proc_holder/changeling/S = new path() - if(S.name == sting_name) - thepower = S - - if(thepower == null) - user << "This is awkward. Changeling power purchase failed, please report this bug to a coder!" - return - - if(has_sting(thepower)) - user << "We have already evolved this ability!" - return - - if(geneticpoints < thepower.dna_cost) - user << "We have reached our capacity for abilities." - return - - if(user.status_flags & FAKEDEATH)//To avoid potential exploits by buying new powers while in stasis, which clears your verblist. - user << "We lack the energy to evolve new abilities right now." - return - - geneticpoints -= thepower.dna_cost - purchasedpowers += thepower - thepower.on_purchase(user) - -//Reselect powers -/datum/changeling/proc/lingRespec(var/mob/user) - if(canrespec) - user << "We have removed our evolutions from this form, and are now ready to readapt." - user.remove_changeling_powers(1) - canrespec = 0 - user.make_changeling() - return 1 - else - user << "You lack the power to readapt your evolutions!" - return 0 - -/mob/proc/make_changeling() - if(!mind) - return - if(!ishuman(src) && !ismonkey(src)) - return - if(!mind.changeling) - mind.changeling = new /datum/changeling(gender) - if(!sting_paths) - sting_paths = init_paths(/obj/effect/proc_holder/changeling) - if(mind.changeling.purchasedpowers) - remove_changeling_powers(1) - // purchase free powers. - for(var/path in sting_paths) - var/obj/effect/proc_holder/changeling/S = new path() - if(!S.dna_cost) - if(!mind.changeling.has_sting(S)) - mind.changeling.purchasedpowers+=S - S.on_purchase(src) - - var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste - mind.changeling.absorbed_dna |= C.dna - return 1 - -/datum/changeling/proc/reset() - chosen_sting = null - geneticpoints = initial(geneticpoints) - sting_range = initial(sting_range) - chem_storage = initial(chem_storage) - chem_recharge_rate = initial(chem_recharge_rate) - chem_charges = min(chem_charges, chem_storage) - mimicing = "" - -/mob/proc/remove_changeling_powers(var/keep_free_powers=0) - if(ishuman(src) || ismonkey(src)) - if(mind && mind.changeling) - digitalcamo = 0 - mind.changeling.reset() - for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers) - if(!(p.dna_cost == 0 && keep_free_powers)) - mind.changeling.purchasedpowers -= p - if(hud_used) - hud_used.lingstingdisplay.icon_state = null - hud_used.lingstingdisplay.invisibility = 101 - -/datum/changeling/proc/has_sting(obj/effect/proc_holder/changeling/power) - for(var/obj/effect/proc_holder/changeling/P in purchasedpowers) - if(power.name == P.name) - return 1 - return 0 +var/list/sting_paths +// totally stolen from the new player panel. YAYY + +/obj/effect/proc_holder/changeling/evolution_menu + name = "-Evolution Menu-" //Dashes are so it's listed before all the other abilities. + desc = "Choose our method of subjugation." + dna_cost = 0 + +/obj/effect/proc_holder/changeling/evolution_menu/Click() + if(!usr || !usr.mind || !usr.mind.changeling) + return + var/datum/changeling/changeling = usr.mind.changeling + + if(!sting_paths) + sting_paths = init_paths(/obj/effect/proc_holder/changeling) + + var/dat = create_menu(changeling) + usr << browse(dat, "window=powers;size=600x700")//900x480 + + +/obj/effect/proc_holder/changeling/evolution_menu/proc/create_menu(var/datum/changeling/changeling) + var/dat + dat +="Changling Evolution Menu" + + //javascript, the part that does most of the work~ + dat += {" + + + + + + + "} + + //body tag start + onload and onkeypress (onkeyup) javascript event calls + dat += "" + + //title + search bar + dat += {" + + + + + + + + +
    + Changeling Evolution Menu
    + Hover over a power to see more information
    + Current ability choices remaining: [changeling.geneticpoints]
    + By rendering a lifeform to a husk, we gain enough power to alter and adapt our evolutions.
    + (Readapt)
    +

    +

    + Search: +
    + + "} + + //player table header + dat += {" + + "} + + var/i = 1 + for(var/path in sting_paths) + + var/obj/effect/proc_holder/changeling/P = new path() + if(P.dna_cost <= 0) //Let's skip the crap we start with. Keeps the evolution menu uncluttered. + continue + + var/ownsthis = changeling.has_sting(P) + + var/color + if(ownsthis) + if(i%2 == 0) + color = "#d8ebd8" + else + color = "#c3dec3" + else + if(i%2 == 0) + color = "#f2f2f2" + else + color = "#e6e6e6" + + + dat += {" + + + + + + "} + + i++ + + + //player table ending + dat += {" +
    + + + Evolve [P][ownsthis ? " - Purchased" : ((P.dna_cost > 1) ? " - Cost: [P.dna_cost]" : "")] + +
    +
    +
    + + + + "} + return dat + + +/obj/effect/proc_holder/changeling/evolution_menu/Topic(href, href_list) + ..() + if(!(iscarbon(usr) && usr.mind && usr.mind.changeling)) + return + + if(href_list["P"]) + usr.mind.changeling.purchasePower(usr, href_list["P"]) + else if(href_list["readapt"]) + usr.mind.changeling.lingRespec(usr) + var/dat = create_menu(usr.mind.changeling) + usr << browse(dat, "window=powers;size=600x700") +///// + +/datum/changeling/proc/purchasePower(var/mob/living/carbon/user, var/sting_name) + + var/obj/effect/proc_holder/changeling/thepower = null + + if(!sting_paths) + sting_paths = init_paths(/obj/effect/proc_holder/changeling) + for(var/path in sting_paths) + var/obj/effect/proc_holder/changeling/S = new path() + if(S.name == sting_name) + thepower = S + + if(thepower == null) + user << "This is awkward. Changeling power purchase failed, please report this bug to a coder!" + return + + if(has_sting(thepower)) + user << "We have already evolved this ability!" + return + + if(geneticpoints < thepower.dna_cost) + user << "We have reached our capacity for abilities." + return + + if(user.status_flags & FAKEDEATH)//To avoid potential exploits by buying new powers while in stasis, which clears your verblist. + user << "We lack the energy to evolve new abilities right now." + return + + geneticpoints -= thepower.dna_cost + purchasedpowers += thepower + thepower.on_purchase(user) + +//Reselect powers +/datum/changeling/proc/lingRespec(var/mob/user) + if(canrespec) + user << "We have removed our evolutions from this form, and are now ready to readapt." + user.remove_changeling_powers(1) + canrespec = 0 + user.make_changeling() + return 1 + else + user << "You lack the power to readapt your evolutions!" + return 0 + +/mob/proc/make_changeling() + if(!mind) + return + if(!ishuman(src) && !ismonkey(src)) + return + if(!mind.changeling) + mind.changeling = new /datum/changeling(gender) + if(!sting_paths) + sting_paths = init_paths(/obj/effect/proc_holder/changeling) + if(mind.changeling.purchasedpowers) + remove_changeling_powers(1) + // purchase free powers. + for(var/path in sting_paths) + var/obj/effect/proc_holder/changeling/S = new path() + if(!S.dna_cost) + if(!mind.changeling.has_sting(S)) + mind.changeling.purchasedpowers+=S + S.on_purchase(src) + + var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste + mind.changeling.absorbed_dna |= C.dna + return 1 + +/datum/changeling/proc/reset() + chosen_sting = null + geneticpoints = initial(geneticpoints) + sting_range = initial(sting_range) + chem_storage = initial(chem_storage) + chem_recharge_rate = initial(chem_recharge_rate) + chem_charges = min(chem_charges, chem_storage) + mimicing = "" + +/mob/proc/remove_changeling_powers(var/keep_free_powers=0) + if(ishuman(src) || ismonkey(src)) + if(mind && mind.changeling) + digitalcamo = 0 + mind.changeling.reset() + for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers) + if(!(p.dna_cost == 0 && keep_free_powers)) + mind.changeling.purchasedpowers -= p + if(hud_used) + hud_used.lingstingdisplay.icon_state = null + hud_used.lingstingdisplay.invisibility = 101 + +/datum/changeling/proc/has_sting(obj/effect/proc_holder/changeling/power) + for(var/obj/effect/proc_holder/changeling/P in purchasedpowers) + if(power.name == P.name) + return 1 + return 0 diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index e873ec7c4ba..946ca14f8c4 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -1,96 +1,96 @@ -/obj/effect/proc_holder/changeling/absorbDNA - name = "Absorb DNA" - desc = "Absorb the DNA of our victim." - chemical_cost = 0 - dna_cost = 0 - req_human = 1 - max_genetic_damage = 100 - -/obj/effect/proc_holder/changeling/absorbDNA/can_sting(var/mob/living/carbon/user) - if(!..()) - return - - var/datum/changeling/changeling = user.mind.changeling - if(changeling.isabsorbing) - user << "We are already absorbing!" - return - - var/obj/item/weapon/grab/G = user.get_active_hand() - if(!istype(G)) - user << "We must be grabbing a creature in our active hand to absorb them." - return - if(G.state <= GRAB_NECK) - user << "We must have a tighter grip to absorb this creature." - return - - var/mob/living/carbon/target = G.affecting - return changeling.can_absorb_dna(user,target) - - - -/obj/effect/proc_holder/changeling/absorbDNA/sting_action(var/mob/user) - var/datum/changeling/changeling = user.mind.changeling - var/obj/item/weapon/grab/G = user.get_active_hand() - var/mob/living/carbon/human/target = G.affecting - for(var/stage = 1, stage<=3, stage++) - switch(stage) - if(1) - user << "This creature is compatible. We must hold still..." - if(2) - user << "We extend a proboscis." - user.visible_message("[user] extends a proboscis!") - if(3) - user << "We stab [target] with the proboscis." - user.visible_message("[user] stabs [target] with the proboscis!") - target << "You feel a sharp stabbing pain!" - target.take_overall_damage(40) - - feedback_add_details("changeling_powers","A[stage]") - if(!do_mob(user, target, 150)) - user << "Our absorption of [target] has been interrupted!" - changeling.isabsorbing = 0 - return - - user << "We have absorbed [target]!" - user.visible_message("[user] sucks the fluids from [target]!") - target << "You have been absorbed by the changeling!" - - changeling.absorb_dna(target) - - if(user.nutrition < 400) user.nutrition = min((user.nutrition + target.nutrition), 400) - - if(target.mind)//if the victim has got a mind - - target.mind.show_memory(src, 0) //I can read your mind, kekeke. Output all their notes. - - if(target.mind.changeling)//If the target was a changeling, suck out their extra juice and objective points! - changeling.chem_charges += min(target.mind.changeling.chem_charges, changeling.chem_storage) - changeling.absorbedcount += target.mind.changeling.absorbedcount - - target.mind.changeling.absorbed_dna.len = 1 - target.mind.changeling.absorbedcount = 0 - else - changeling.chem_charges += 10 - - changeling.isabsorbing = 0 - changeling.canrespec = 1 - - target.death(0) - target.Drain() - return 1 - - - -//Absorbs the target DNA. -/datum/changeling/proc/absorb_dna(mob/living/carbon/T) - if(absorbed_dna.len) - absorbed_dna.Cut(1,2) - T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set. - var/datum/dna/new_dna = new T.dna.type - new_dna.uni_identity = T.dna.uni_identity - new_dna.struc_enzymes = T.dna.struc_enzymes - new_dna.real_name = T.dna.real_name - new_dna.mutantrace = T.dna.mutantrace - new_dna.blood_type = T.dna.blood_type - absorbed_dna |= new_dna //And add the target DNA to our absorbed list. +/obj/effect/proc_holder/changeling/absorbDNA + name = "Absorb DNA" + desc = "Absorb the DNA of our victim." + chemical_cost = 0 + dna_cost = 0 + req_human = 1 + max_genetic_damage = 100 + +/obj/effect/proc_holder/changeling/absorbDNA/can_sting(var/mob/living/carbon/user) + if(!..()) + return + + var/datum/changeling/changeling = user.mind.changeling + if(changeling.isabsorbing) + user << "We are already absorbing!" + return + + var/obj/item/weapon/grab/G = user.get_active_hand() + if(!istype(G)) + user << "We must be grabbing a creature in our active hand to absorb them." + return + if(G.state <= GRAB_NECK) + user << "We must have a tighter grip to absorb this creature." + return + + var/mob/living/carbon/target = G.affecting + return changeling.can_absorb_dna(user,target) + + + +/obj/effect/proc_holder/changeling/absorbDNA/sting_action(var/mob/user) + var/datum/changeling/changeling = user.mind.changeling + var/obj/item/weapon/grab/G = user.get_active_hand() + var/mob/living/carbon/human/target = G.affecting + for(var/stage = 1, stage<=3, stage++) + switch(stage) + if(1) + user << "This creature is compatible. We must hold still..." + if(2) + user << "We extend a proboscis." + user.visible_message("[user] extends a proboscis!") + if(3) + user << "We stab [target] with the proboscis." + user.visible_message("[user] stabs [target] with the proboscis!") + target << "You feel a sharp stabbing pain!" + target.take_overall_damage(40) + + feedback_add_details("changeling_powers","A[stage]") + if(!do_mob(user, target, 150)) + user << "Our absorption of [target] has been interrupted!" + changeling.isabsorbing = 0 + return + + user << "We have absorbed [target]!" + user.visible_message("[user] sucks the fluids from [target]!") + target << "You have been absorbed by the changeling!" + + changeling.absorb_dna(target) + + if(user.nutrition < 400) user.nutrition = min((user.nutrition + target.nutrition), 400) + + if(target.mind)//if the victim has got a mind + + target.mind.show_memory(src, 0) //I can read your mind, kekeke. Output all their notes. + + if(target.mind.changeling)//If the target was a changeling, suck out their extra juice and objective points! + changeling.chem_charges += min(target.mind.changeling.chem_charges, changeling.chem_storage) + changeling.absorbedcount += target.mind.changeling.absorbedcount + + target.mind.changeling.absorbed_dna.len = 1 + target.mind.changeling.absorbedcount = 0 + else + changeling.chem_charges += 10 + + changeling.isabsorbing = 0 + changeling.canrespec = 1 + + target.death(0) + target.Drain() + return 1 + + + +//Absorbs the target DNA. +/datum/changeling/proc/absorb_dna(mob/living/carbon/T) + if(absorbed_dna.len) + absorbed_dna.Cut(1,2) + T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set. + var/datum/dna/new_dna = new T.dna.type + new_dna.uni_identity = T.dna.uni_identity + new_dna.struc_enzymes = T.dna.struc_enzymes + new_dna.real_name = T.dna.real_name + new_dna.mutantrace = T.dna.mutantrace + new_dna.blood_type = T.dna.blood_type + absorbed_dna |= new_dna //And add the target DNA to our absorbed list. absorbedcount++ //all that done, let's increment the objective counter. \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/digitalcamo.dm b/code/game/gamemodes/changeling/powers/digitalcamo.dm index 92ae8e7781e..d63e5777f79 100644 --- a/code/game/gamemodes/changeling/powers/digitalcamo.dm +++ b/code/game/gamemodes/changeling/powers/digitalcamo.dm @@ -1,17 +1,17 @@ -/obj/effect/proc_holder/changeling/digitalcamo - name = "Digital Camouflage" - desc = "By evolving the ability to distort our form and proprotions, we defeat common altgorithms used to detect lifeforms on cameras." - helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us... uncanny." - dna_cost = 1 - -//Prevents AIs tracking you but makes you easily detectable to the human-eye. -/obj/effect/proc_holder/changeling/digitalcamo/sting_action(var/mob/user) - - if(user.digitalcamo) - user << "We return to normal." - else - user << "We distort our form to prevent AI-tracking." - user.digitalcamo = !user.digitalcamo - - feedback_add_details("changeling_powers","CAM") - return 1 +/obj/effect/proc_holder/changeling/digitalcamo + name = "Digital Camouflage" + desc = "By evolving the ability to distort our form and proprotions, we defeat common altgorithms used to detect lifeforms on cameras." + helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us... uncanny." + dna_cost = 1 + +//Prevents AIs tracking you but makes you easily detectable to the human-eye. +/obj/effect/proc_holder/changeling/digitalcamo/sting_action(var/mob/user) + + if(user.digitalcamo) + user << "We return to normal." + else + user << "We distort our form to prevent AI-tracking." + user.digitalcamo = !user.digitalcamo + + feedback_add_details("changeling_powers","CAM") + return 1 diff --git a/code/game/gamemodes/changeling/powers/epinephrine.dm b/code/game/gamemodes/changeling/powers/epinephrine.dm index 19b809a54ce..20fe4a677b9 100644 --- a/code/game/gamemodes/changeling/powers/epinephrine.dm +++ b/code/game/gamemodes/changeling/powers/epinephrine.dm @@ -1,26 +1,26 @@ -/obj/effect/proc_holder/changeling/epinephrine - name = "Epinephrine Overdose" - desc = "We evolve additional sacs of adrenaline throughout our body." - helptext = "Removes all stuns instantly and adds a short-term reduction in further stuns. Can be used while unconscious. Continued use poisons the body." - chemical_cost = 30 - dna_cost = 1 - req_human = 1 - req_stat = UNCONSCIOUS - -//Recover from stuns. -/obj/effect/proc_holder/changeling/epinephrine/sting_action(var/mob/user) - - if(user.lying) - user << "We arise." - else - user << "Adrenaline rushes through us." - user.stat = 0 - user.SetParalysis(0) - user.SetStunned(0) - user.SetWeakened(0) - user.lying = 0 - user.update_canmove() - user.reagents.add_reagent("synaptizine", 20) - - feedback_add_details("changeling_powers","UNS") - return 1 +/obj/effect/proc_holder/changeling/epinephrine + name = "Epinephrine Overdose" + desc = "We evolve additional sacs of adrenaline throughout our body." + helptext = "Removes all stuns instantly and adds a short-term reduction in further stuns. Can be used while unconscious. Continued use poisons the body." + chemical_cost = 30 + dna_cost = 1 + req_human = 1 + req_stat = UNCONSCIOUS + +//Recover from stuns. +/obj/effect/proc_holder/changeling/epinephrine/sting_action(var/mob/user) + + if(user.lying) + user << "We arise." + else + user << "Adrenaline rushes through us." + user.stat = 0 + user.SetParalysis(0) + user.SetStunned(0) + user.SetWeakened(0) + user.lying = 0 + user.update_canmove() + user.reagents.add_reagent("synaptizine", 20) + + feedback_add_details("changeling_powers","UNS") + return 1 diff --git a/code/game/gamemodes/changeling/powers/fakedeath.dm b/code/game/gamemodes/changeling/powers/fakedeath.dm index df6f4424b70..ad0cb2bbfe1 100644 --- a/code/game/gamemodes/changeling/powers/fakedeath.dm +++ b/code/game/gamemodes/changeling/powers/fakedeath.dm @@ -1,35 +1,35 @@ -/obj/effect/proc_holder/changeling/fakedeath - name = "Regenerative Stasis" - desc = "We fall into a stasis, allowing us to regenerate." - chemical_cost = 10 - dna_cost = 0 - req_stat = DEAD - max_genetic_damage = 100 - - -//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay. -/obj/effect/proc_holder/changeling/fakedeath/sting_action(var/mob/living/user) - - user << "We begin our stasis, preparing energy to arise once more." - - user.status_flags |= FAKEDEATH //play dead - user.update_canmove() - - if(user.stat != DEAD) - user.emote("deathgasp") - user.tod = worldtime2text() - - spawn(800) - if(user && user.mind && user.mind.changeling && user.mind.changeling.purchasedpowers) - user << "We are ready to regenerate." - user.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/revive(null) - - feedback_add_details("changeling_powers","FD") - return 1 - -/obj/effect/proc_holder/changeling/fakedeath/can_sting(var/mob/user) - if(user.status_flags & FAKEDEATH) - return - if(!user.stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death - return +/obj/effect/proc_holder/changeling/fakedeath + name = "Regenerative Stasis" + desc = "We fall into a stasis, allowing us to regenerate." + chemical_cost = 10 + dna_cost = 0 + req_stat = DEAD + max_genetic_damage = 100 + + +//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay. +/obj/effect/proc_holder/changeling/fakedeath/sting_action(var/mob/living/user) + + user << "We begin our stasis, preparing energy to arise once more." + + user.status_flags |= FAKEDEATH //play dead + user.update_canmove() + + if(user.stat != DEAD) + user.emote("deathgasp") + user.tod = worldtime2text() + + spawn(800) + if(user && user.mind && user.mind.changeling && user.mind.changeling.purchasedpowers) + user << "We are ready to regenerate." + user.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/revive(null) + + feedback_add_details("changeling_powers","FD") + return 1 + +/obj/effect/proc_holder/changeling/fakedeath/can_sting(var/mob/user) + if(user.status_flags & FAKEDEATH) + return + if(!user.stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death + return return ..() \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index b9448dabd18..9f67ef05d84 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -1,20 +1,20 @@ -/obj/effect/proc_holder/changeling/fleshmend - name = "Fleshmend" - desc = "Our flesh rapidly regenerates, healing our wounds." - helptext = "Heals a moderate amount of damage over a short period of time. Can be used while unconscious." - chemical_cost = 30 - dna_cost = 1 - req_stat = UNCONSCIOUS - -//Starts healing you every second for 10 seconds. Can be used whilst unconscious. -/obj/effect/proc_holder/changeling/fleshmend/sting_action(var/mob/living/user) - user << "We begin to heal rapidly." - spawn(0) - for(var/i = 0, i<10,i++) - user.adjustBruteLoss(-10) - user.adjustOxyLoss(-10) - user.adjustFireLoss(-10) - sleep(10) - - feedback_add_details("changeling_powers","RR") +/obj/effect/proc_holder/changeling/fleshmend + name = "Fleshmend" + desc = "Our flesh rapidly regenerates, healing our wounds." + helptext = "Heals a moderate amount of damage over a short period of time. Can be used while unconscious." + chemical_cost = 30 + dna_cost = 1 + req_stat = UNCONSCIOUS + +//Starts healing you every second for 10 seconds. Can be used whilst unconscious. +/obj/effect/proc_holder/changeling/fleshmend/sting_action(var/mob/living/user) + user << "We begin to heal rapidly." + spawn(0) + for(var/i = 0, i<10,i++) + user.adjustBruteLoss(-10) + user.adjustOxyLoss(-10) + user.adjustFireLoss(-10) + sleep(10) + + feedback_add_details("changeling_powers","RR") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/glands.dm b/code/game/gamemodes/changeling/powers/glands.dm index 861a4f28e98..b6f6aaf5e47 100644 --- a/code/game/gamemodes/changeling/powers/glands.dm +++ b/code/game/gamemodes/changeling/powers/glands.dm @@ -1,13 +1,13 @@ -/obj/effect/proc_holder/changeling/glands - name = "Engorged Chemical Glands" - desc = "Our chemical glands swell, permitting us to store more chemicals inside of them." - helptext = "Allows us to store an extra 25 units of chemicals, and doubles production rate." - dna_cost = 1 - chemical_cost = -1 - -/obj/effect/proc_holder/changeling/glands/on_purchase(var/mob/user) - ..() - var/datum/changeling/changeling=user.mind.changeling - changeling.chem_storage += 25 - changeling.chem_recharge_rate *=2 +/obj/effect/proc_holder/changeling/glands + name = "Engorged Chemical Glands" + desc = "Our chemical glands swell, permitting us to store more chemicals inside of them." + helptext = "Allows us to store an extra 25 units of chemicals, and doubles production rate." + dna_cost = 1 + chemical_cost = -1 + +/obj/effect/proc_holder/changeling/glands/on_purchase(var/mob/user) + ..() + var/datum/changeling/changeling=user.mind.changeling + changeling.chem_storage += 25 + changeling.chem_recharge_rate *=2 return \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm index 5446f36847f..3f9aa14b702 100644 --- a/code/game/gamemodes/changeling/powers/hivemind.dm +++ b/code/game/gamemodes/changeling/powers/hivemind.dm @@ -1,71 +1,71 @@ -// HIVE MIND UPLOAD/DOWNLOAD DNA -var/list/datum/dna/hivemind_bank = list() - -/obj/effect/proc_holder/changeling/hivemind_upload - name = "Hive Channel" - desc = "Allows us to channel DNA in the airwaves to allow other changelings to absorb it." - chemical_cost = 10 - dna_cost = 0 - -/obj/effect/proc_holder/changeling/hivemind_upload/sting_action(var/mob/user) - var/datum/changeling/changeling = user.mind.changeling - var/list/names = list() - for(var/datum/dna/DNA in changeling.absorbed_dna) - if(!(DNA in hivemind_bank)) - names += DNA.real_name - - if(names.len <= 0) - user << "The airwaves already have all of our DNA." - return - - var/chosen_name = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names - if(!chosen_name) - return - - var/datum/dna/chosen_dna = changeling.get_dna(chosen_name) - if(!chosen_dna) - return - - hivemind_bank += chosen_dna - user << "We channel the DNA of [chosen_name] to the air." - feedback_add_details("changeling_powers","HU") - return 1 - -/obj/effect/proc_holder/changeling/hivemind_download - name = "Hive Absorb" - desc = "Allows us to absorb DNA that has been channeled to the airwaves. Does not count towards absorb objectives." - chemical_cost = 20 - dna_cost = 0 - -/obj/effect/proc_holder/changeling/hivemind_download/can_sting(var/mob/living/carbon/user) - if(!..()) - return - var/datum/changeling/changeling = user.mind.changeling - if(changeling.absorbed_dna[1] == user.dna)//If our current DNA is the stalest, we gotta ditch it. - user << "We have reached our capacity to store genetic information! We must transform before absorbing more." - return - return 1 - -/obj/effect/proc_holder/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) - if(!(DNA in changeling.absorbed_dna)) - names[DNA.real_name] = DNA - - if(names.len <= 0) - user << "There's no new DNA to absorb from the air." - return - - var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names - if(!S) return - var/datum/dna/chosen_dna = names[S] - if(!chosen_dna) - return - - if(changeling.absorbed_dna.len) - changeling.absorbed_dna.Cut(1,2) - changeling.absorbed_dna |= chosen_dna - user << "We absorb the DNA of [S] from the air." - feedback_add_details("changeling_powers","HD") +// HIVE MIND UPLOAD/DOWNLOAD DNA +var/list/datum/dna/hivemind_bank = list() + +/obj/effect/proc_holder/changeling/hivemind_upload + name = "Hive Channel" + desc = "Allows us to channel DNA in the airwaves to allow other changelings to absorb it." + chemical_cost = 10 + dna_cost = 0 + +/obj/effect/proc_holder/changeling/hivemind_upload/sting_action(var/mob/user) + var/datum/changeling/changeling = user.mind.changeling + var/list/names = list() + for(var/datum/dna/DNA in changeling.absorbed_dna) + if(!(DNA in hivemind_bank)) + names += DNA.real_name + + if(names.len <= 0) + user << "The airwaves already have all of our DNA." + return + + var/chosen_name = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names + if(!chosen_name) + return + + var/datum/dna/chosen_dna = changeling.get_dna(chosen_name) + if(!chosen_dna) + return + + hivemind_bank += chosen_dna + user << "We channel the DNA of [chosen_name] to the air." + feedback_add_details("changeling_powers","HU") + return 1 + +/obj/effect/proc_holder/changeling/hivemind_download + name = "Hive Absorb" + desc = "Allows us to absorb DNA that has been channeled to the airwaves. Does not count towards absorb objectives." + chemical_cost = 20 + dna_cost = 0 + +/obj/effect/proc_holder/changeling/hivemind_download/can_sting(var/mob/living/carbon/user) + if(!..()) + return + var/datum/changeling/changeling = user.mind.changeling + if(changeling.absorbed_dna[1] == user.dna)//If our current DNA is the stalest, we gotta ditch it. + user << "We have reached our capacity to store genetic information! We must transform before absorbing more." + return + return 1 + +/obj/effect/proc_holder/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) + if(!(DNA in changeling.absorbed_dna)) + names[DNA.real_name] = DNA + + if(names.len <= 0) + user << "There's no new DNA to absorb from the air." + return + + var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names + if(!S) return + var/datum/dna/chosen_dna = names[S] + if(!chosen_dna) + return + + if(changeling.absorbed_dna.len) + changeling.absorbed_dna.Cut(1,2) + changeling.absorbed_dna |= chosen_dna + user << "We absorb the DNA of [S] from the air." + feedback_add_details("changeling_powers","HD") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm index 139687bbf37..06c59138291 100644 --- a/code/game/gamemodes/changeling/powers/humanform.dm +++ b/code/game/gamemodes/changeling/powers/humanform.dm @@ -1,33 +1,33 @@ -/obj/effect/proc_holder/changeling/humanform - name = "Human form" - desc = "We change into a human." - chemical_cost = 5 - genetic_damage = 3 - req_dna = 1 - max_genetic_damage = 3 - -//Transform into a human. -/obj/effect/proc_holder/changeling/humanform/sting_action(var/mob/living/carbon/user) - var/datum/changeling/changeling = user.mind.changeling - var/list/names = list() - for(var/datum/dna/DNA in changeling.absorbed_dna) - names += "[DNA.real_name]" - - var/chosen_name = input("Select the target DNA: ", "Target DNA", null) as null|anything in names - if(!chosen_name) - return - - var/datum/dna/chosen_dna = changeling.get_dna(chosen_name) - if(!chosen_dna) - return - - user << "We transform our appearance." - user.dna = chosen_dna - - user.humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSRC),chosen_dna.real_name) - - changeling.purchasedpowers -= src - feedback_add_details("changeling_powers","LFT") - del(user) - return 1 - +/obj/effect/proc_holder/changeling/humanform + name = "Human form" + desc = "We change into a human." + chemical_cost = 5 + genetic_damage = 3 + req_dna = 1 + max_genetic_damage = 3 + +//Transform into a human. +/obj/effect/proc_holder/changeling/humanform/sting_action(var/mob/living/carbon/user) + var/datum/changeling/changeling = user.mind.changeling + var/list/names = list() + for(var/datum/dna/DNA in changeling.absorbed_dna) + names += "[DNA.real_name]" + + var/chosen_name = input("Select the target DNA: ", "Target DNA", null) as null|anything in names + if(!chosen_name) + return + + var/datum/dna/chosen_dna = changeling.get_dna(chosen_name) + if(!chosen_dna) + return + + user << "We transform our appearance." + user.dna = chosen_dna + + user.humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSRC),chosen_dna.real_name) + + changeling.purchasedpowers -= src + feedback_add_details("changeling_powers","LFT") + qdel(user) + return 1 + diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm index 084c688d4b7..1b46d1aca9d 100644 --- a/code/game/gamemodes/changeling/powers/lesserform.dm +++ b/code/game/gamemodes/changeling/powers/lesserform.dm @@ -1,18 +1,18 @@ -/obj/effect/proc_holder/changeling/lesserform - name = "Lesser form" - desc = "We debase ourselves and become lesser. We become a monkey." - chemical_cost = 5 - dna_cost = 1 - genetic_damage = 3 - req_human = 1 - -//Transform into a monkey. -/obj/effect/proc_holder/changeling/lesserform/sting_action(var/mob/living/carbon/human/user) - user << "Our genes cry out!" - - var/mob/living/carbon/monkey/O = user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSE | TR_KEEPSRC) - - O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) - feedback_add_details("changeling_powers","LF") - .=1 - del(user) +/obj/effect/proc_holder/changeling/lesserform + name = "Lesser form" + desc = "We debase ourselves and become lesser. We become a monkey." + chemical_cost = 5 + dna_cost = 1 + genetic_damage = 3 + req_human = 1 + +//Transform into a monkey. +/obj/effect/proc_holder/changeling/lesserform/sting_action(var/mob/living/carbon/human/user) + user << "Our genes cry out!" + + var/mob/living/carbon/monkey/O = user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSE | TR_KEEPSRC) + + O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) + feedback_add_details("changeling_powers","LF") + .=1 + qdel(user) diff --git a/code/game/gamemodes/changeling/powers/mimic_voice.dm b/code/game/gamemodes/changeling/powers/mimic_voice.dm index 6bf264e3e24..bb8ed8e6ea6 100644 --- a/code/game/gamemodes/changeling/powers/mimic_voice.dm +++ b/code/game/gamemodes/changeling/powers/mimic_voice.dm @@ -1,28 +1,28 @@ -/obj/effect/proc_holder/changeling/mimicvoice - name = "Mimic Voice" - desc = "We shape our vocal glands to sound like a desired voice." - helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this." - chemical_cost = 0 //constant chemical drain hardcoded - dna_cost = 1 - req_human = 1 - - -// Fake Voice -/obj/effect/proc_holder/changeling/mimicvoice/sting_action(var/mob/user) - var/datum/changeling/changeling=user.mind.changeling - if(changeling.mimicing) - changeling.mimicing = "" - changeling.chem_recharge_slowdown -= 0.5 - user << "We return our vocal glands to their original position." - return - - var/mimic_voice = input("Enter a name to mimic.", "Mimic Voice", null) as text - if(!mimic_voice) - return - - changeling.mimicing = mimic_voice - changeling.chem_recharge_slowdown += 0.5 - user << "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active." - user << "Use this power again to return to our original voice and reproduce chemicals again." - +/obj/effect/proc_holder/changeling/mimicvoice + name = "Mimic Voice" + desc = "We shape our vocal glands to sound like a desired voice." + helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this." + chemical_cost = 0 //constant chemical drain hardcoded + dna_cost = 1 + req_human = 1 + + +// Fake Voice +/obj/effect/proc_holder/changeling/mimicvoice/sting_action(var/mob/user) + var/datum/changeling/changeling=user.mind.changeling + if(changeling.mimicing) + changeling.mimicing = "" + changeling.chem_recharge_slowdown -= 0.5 + user << "We return our vocal glands to their original position." + return + + var/mimic_voice = input("Enter a name to mimic.", "Mimic Voice", null) as text + if(!mimic_voice) + return + + changeling.mimicing = mimic_voice + changeling.chem_recharge_slowdown += 0.5 + user << "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active." + user << "Use this power again to return to our original voice and reproduce chemicals again." + feedback_add_details("changeling_powers","MV") \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 6ff0c287501..6ab4db1fe08 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -1,170 +1,170 @@ -/* - Changeling Mutations! ~By Miauw - Contains: - Arm Blade - Space Suit - TODO: - Shield - Armor -*/ - -/obj/effect/proc_holder/changeling/arm_blade - name = "Arm Blade" - desc = "We reform one of our arms into a deadly blade." - helptext = "Cannot be used while in lesser form." - chemical_cost = 20 - dna_cost = 1 - genetic_damage = 8 - req_human = 1 - - -/obj/effect/proc_holder/changeling/arm_blade/try_to_sting(var/mob/user, var/mob/target) - if(istype(user.l_hand, /obj/item/weapon/melee/arm_blade)) //Not the nicest way to do it, but eh - del user.l_hand - user.visible_message("With a sickening crunch, [user] reforms his blade into an arm!", "We assimilate our blade into our body", "With a sickening crunch, [user] reforms his blade into an arm!", "We assimilate our blade into our body", "A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!") - -/obj/item/weapon/melee/arm_blade/dropped(mob/user) - visible_message("With a sickening crunch, [user] reforms his blade into an arm!", "We assimilate our blade into our body", "" - return - - else if(A.locked) - user << "The airlock's bolts prevent it from being forced." - return - - else - //user.say("Heeeeeeeeeerrre's Johnny!") - user.visible_message("[user] forces the door to open with \his [src]!", "We force the door to open.", "You hear a metal screeching sound.") - A.open(1) - -//Space Suit & Helmet -/obj/effect/proc_holder/changeling/organic_space_suit - name = "Organic Space Suit" - desc = "We grow an organic suit to protect ourselves from space exposure." - helptext = "We must constantly repair our form to make it space-proof, reducing chemical production while we are protected. Retreating the suit damages our genomes. Cannot be used in lesser form." - chemical_cost = 20 - dna_cost = 1 - genetic_damage = 8 - req_human = 1 - -/obj/effect/proc_holder/changeling/organic_space_suit/try_to_sting(var/mob/user, var/mob/target) - var/datum/changeling/changeling = user.mind.changeling - if(!ishuman(user)) - return - var/mob/living/carbon/human/H = user - if(changeling.space_suit_active) - changeling.space_suit_active = 0 - H.visible_message("[H] casts off their flesh shell!", "We cast off our protective organic shell, temporarily weakening our genomes.", "You hear the organic matter ripping and tearing!") - del H.wear_suit - del H.head - H.update_inv_wear_suit() - H.update_inv_head() - H.update_hair() - - var/turf/simulated/T = get_turf(H) - if(istype(T)) - T.add_blood(H) //So real blood decals - playsound(H.loc, 'sound/effects/splat.ogg', 50, 1) //So real sounds - changeling.geneticdamage += 8 //Casting off a space suit leaves you weak for a few seconds. - changeling.chem_recharge_slowdown -= 0.5 - return - ..(H, target) - -/obj/effect/proc_holder/changeling/organic_space_suit/sting_action(var/mob/living/carbon/human/user) - if(!user.canUnEquip(user.wear_suit)) - user << "\the [user.wear_suit] is stuck to your body, you cannot grow a space suit over it!" - return - if(!user.canUnEquip(user.head)) - user << "\the [user.head] is stuck on your head, you cannot grow a space helmet over it!" - return - user.unEquip(user.head) - user.unEquip(user.wear_suit) - user.equip_to_slot_if_possible(new /obj/item/clothing/suit/space/changeling(user), slot_wear_suit, 1, 1, 1) - user.equip_to_slot_if_possible(new /obj/item/clothing/head/helmet/space/changeling(user), slot_head, 1, 1, 1) - user.visible_message("[user]'s flesh rapidly inflates, forming a bloated mass around their body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!") - var/datum/changeling/changeling = user.mind.changeling - changeling.space_suit_active = 1 - changeling.chem_recharge_slowdown +=0.5 - return 1 - -/obj/item/clothing/suit/space/changeling - name = "flesh mass" - icon_state = "lingspacesuit" - desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel." - flags = STOPSPRESSUREDMAGE | NODROP //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff) - allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/tank/oxygen) - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //No armor at all. - -/obj/item/clothing/suit/space/changeling/New() - processing_objects += src - -/obj/item/clothing/suit/space/changeling/dropped() - del src - -/obj/item/clothing/suit/space/changeling/process() - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - H.reagents.add_reagent("dexalinp", REAGENTS_METABOLISM) - -/obj/item/clothing/head/helmet/space/changeling - name = "flesh mass" - icon_state = "lingspacehelmet" - desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front." - flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | NODROP //Again, no THICKMATERIAL. - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - -/obj/item/clothing/head/helmet/space/changeling/dropped() - del src +/* + Changeling Mutations! ~By Miauw + Contains: + Arm Blade + Space Suit + TODO: + Shield + Armor +*/ + +/obj/effect/proc_holder/changeling/arm_blade + name = "Arm Blade" + desc = "We reform one of our arms into a deadly blade." + helptext = "Cannot be used while in lesser form." + chemical_cost = 20 + dna_cost = 1 + genetic_damage = 8 + req_human = 1 + + +/obj/effect/proc_holder/changeling/arm_blade/try_to_sting(var/mob/user, var/mob/target) + if(istype(user.l_hand, /obj/item/weapon/melee/arm_blade)) //Not the nicest way to do it, but eh + qdel(user.l_hand) + user.visible_message("With a sickening crunch, [user] reforms his blade into an arm!", "We assimilate our blade into our body", "With a sickening crunch, [user] reforms his blade into an arm!", "We assimilate our blade into our body", "A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!") + +/obj/item/weapon/melee/arm_blade/dropped(mob/user) + visible_message("With a sickening crunch, [user] reforms his blade into an arm!", "We assimilate our blade into our body", "" + return + + else if(A.locked) + user << "The airlock's bolts prevent it from being forced." + return + + else + //user.say("Heeeeeeeeeerrre's Johnny!") + user.visible_message("[user] forces the door to open with \his [src]!", "We force the door to open.", "You hear a metal screeching sound.") + A.open(1) + +//Space Suit & Helmet +/obj/effect/proc_holder/changeling/organic_space_suit + name = "Organic Space Suit" + desc = "We grow an organic suit to protect ourselves from space exposure." + helptext = "We must constantly repair our form to make it space-proof, reducing chemical production while we are protected. Retreating the suit damages our genomes. Cannot be used in lesser form." + chemical_cost = 20 + dna_cost = 1 + genetic_damage = 8 + req_human = 1 + +/obj/effect/proc_holder/changeling/organic_space_suit/try_to_sting(var/mob/user, var/mob/target) + var/datum/changeling/changeling = user.mind.changeling + if(!ishuman(user)) + return + var/mob/living/carbon/human/H = user + if(changeling.space_suit_active) + changeling.space_suit_active = 0 + H.visible_message("[H] casts off their flesh shell!", "We cast off our protective organic shell, temporarily weakening our genomes.", "You hear the organic matter ripping and tearing!") + qdel(H.wear_suit) + qdel(H.head) + H.update_inv_wear_suit() + H.update_inv_head() + H.update_hair() + + var/turf/simulated/T = get_turf(H) + if(istype(T)) + T.add_blood(H) //So real blood decals + playsound(H.loc, 'sound/effects/splat.ogg', 50, 1) //So real sounds + changeling.geneticdamage += 8 //Casting off a space suit leaves you weak for a few seconds. + changeling.chem_recharge_slowdown -= 0.5 + return + ..(H, target) + +/obj/effect/proc_holder/changeling/organic_space_suit/sting_action(var/mob/living/carbon/human/user) + if(!user.canUnEquip(user.wear_suit)) + user << "\the [user.wear_suit] is stuck to your body, you cannot grow a space suit over it!" + return + if(!user.canUnEquip(user.head)) + user << "\the [user.head] is stuck on your head, you cannot grow a space helmet over it!" + return + user.unEquip(user.head) + user.unEquip(user.wear_suit) + user.equip_to_slot_if_possible(new /obj/item/clothing/suit/space/changeling(user), slot_wear_suit, 1, 1, 1) + user.equip_to_slot_if_possible(new /obj/item/clothing/head/helmet/space/changeling(user), slot_head, 1, 1, 1) + user.visible_message("[user]'s flesh rapidly inflates, forming a bloated mass around their body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!") + var/datum/changeling/changeling = user.mind.changeling + changeling.space_suit_active = 1 + changeling.chem_recharge_slowdown +=0.5 + return 1 + +/obj/item/clothing/suit/space/changeling + name = "flesh mass" + icon_state = "lingspacesuit" + desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel." + flags = STOPSPRESSUREDMAGE | NODROP //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff) + allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/tank/oxygen) + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //No armor at all. + +/obj/item/clothing/suit/space/changeling/New() + processing_objects += src + +/obj/item/clothing/suit/space/changeling/dropped() + qdel(src) + +/obj/item/clothing/suit/space/changeling/process() + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.reagents.add_reagent("dexalinp", REAGENTS_METABOLISM) + +/obj/item/clothing/head/helmet/space/changeling + name = "flesh mass" + icon_state = "lingspacehelmet" + desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front." + flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | NODROP //Again, no THICKMATERIAL. + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + +/obj/item/clothing/head/helmet/space/changeling/dropped() + qdel(src) diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index d3b4f724a02..d18d2e33a7a 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -1,21 +1,21 @@ -/obj/effect/proc_holder/changeling/panacea - name = "Anatomic Panacea" - desc = "Expels impurifications from our form; curing diseases, genetic disabilities, and removing toxins and radiation." - helptext = "Can be used while unconscious." - chemical_cost = 25 - dna_cost = 1 - req_stat = UNCONSCIOUS - -//Heals the things that the other regenerative abilities don't. -/obj/effect/proc_holder/changeling/panacea/sting_action(var/mob/user) - - user << "We cleanse impurities from our form." - user.reagents.add_reagent("ryetalyn", 10) - user.reagents.add_reagent("hyronalin", 10) - user.reagents.add_reagent("anti_toxin", 20) - - for(var/datum/disease/D in user.viruses) - D.cure() - - feedback_add_details("changeling_powers","AP") +/obj/effect/proc_holder/changeling/panacea + name = "Anatomic Panacea" + desc = "Expels impurifications from our form; curing diseases, genetic disabilities, and removing toxins and radiation." + helptext = "Can be used while unconscious." + chemical_cost = 25 + dna_cost = 1 + req_stat = UNCONSCIOUS + +//Heals the things that the other regenerative abilities don't. +/obj/effect/proc_holder/changeling/panacea/sting_action(var/mob/user) + + user << "We cleanse impurities from our form." + user.reagents.add_reagent("ryetalyn", 10) + user.reagents.add_reagent("hyronalin", 10) + user.reagents.add_reagent("anti_toxin", 20) + + for(var/datum/disease/D in user.viruses) + D.cure() + + feedback_add_details("changeling_powers","AP") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 0738c58ab38..69c09bd383f 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -1,30 +1,30 @@ -/obj/effect/proc_holder/changeling/revive - name = "Regenerate" - desc = "We regenerate, healing all damage from our form." - chemical_cost = 10 - req_stat = DEAD - -//Revive from regenerative stasis -/obj/effect/proc_holder/changeling/revive/sting_action(var/mob/living/carbon/user) - - if(user.stat == DEAD) - dead_mob_list -= user - living_mob_list += user - user.stat = CONSCIOUS - user.tod = null - user.setToxLoss(0) - user.setOxyLoss(0) - user.setCloneLoss(0) - user.SetParalysis(0) - user.SetStunned(0) - user.SetWeakened(0) - user.radiation = 0 - user.heal_overall_damage(user.getBruteLoss(), user.getFireLoss()) - user.reagents.clear_reagents() - user << "We have regenerated." - - user.status_flags &= ~(FAKEDEATH) - user.update_canmove() - user.mind.changeling.purchasedpowers -= src - feedback_add_details("changeling_powers","CR") +/obj/effect/proc_holder/changeling/revive + name = "Regenerate" + desc = "We regenerate, healing all damage from our form." + chemical_cost = 10 + req_stat = DEAD + +//Revive from regenerative stasis +/obj/effect/proc_holder/changeling/revive/sting_action(var/mob/living/carbon/user) + + if(user.stat == DEAD) + dead_mob_list -= user + living_mob_list += user + user.stat = CONSCIOUS + user.tod = null + user.setToxLoss(0) + user.setOxyLoss(0) + user.setCloneLoss(0) + user.SetParalysis(0) + user.SetStunned(0) + user.SetWeakened(0) + user.radiation = 0 + user.heal_overall_damage(user.getBruteLoss(), user.getFireLoss()) + user.reagents.clear_reagents() + user << "We have regenerated." + + user.status_flags &= ~(FAKEDEATH) + user.update_canmove() + user.mind.changeling.purchasedpowers -= src + feedback_add_details("changeling_powers","CR") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 0d0b52eea4d..046d8f9512e 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -1,45 +1,45 @@ -/obj/effect/proc_holder/changeling/resonant_shriek - name = "Resonant Shriek" - desc = "Our lungs and vocal chords shift, allowing us to briefly emit a noise that deafens and confuses the weak-minded." - helptext = "Emits a high-frequency sound that confuses and deafens humans, blows out nearby lights and overloads cyborg sensors." - chemical_cost = 25 - dna_cost = 1 - req_human = 1 - -//A flashy ability, good for crowd control and sewing chaos. -/obj/effect/proc_holder/changeling/resonant_shriek/sting_action(var/mob/user) - for(var/mob/living/M in hearers(4, user)) - if(iscarbon(M)) - if(!M.mind || !M.mind.changeling) - M.ear_deaf += 30 - M.confused += 20 - M.Jitter(50) - else - M << sound('sound/effects/screech.ogg') - - if(issilicon(M)) - M << sound('sound/weapons/flash.ogg') - M.Weaken(rand(5,10)) - - for(var/obj/machinery/light/L in range(4, user)) - L.on = 1 - L.broken() - - feedback_add_details("changeling_powers","RS") - return 1 - -/obj/effect/proc_holder/changeling/dissonant_shriek - name = "Dissonant Shriek" - desc = "We shift our vocal cords to release a high-frequency sound that overloads nearby electronics." - chemical_cost = 20 - dna_cost = 1 - -//A flashy ability, good for crowd control and sewing chaos. -/obj/effect/proc_holder/changeling/dissonant_shriek/sting_action(var/mob/user) - for(var/obj/machinery/light/L in range(5, usr)) - L.on = 1 - L.broken() - empulse(get_turf(user), 2, 5, 1) - return 1 - - +/obj/effect/proc_holder/changeling/resonant_shriek + name = "Resonant Shriek" + desc = "Our lungs and vocal chords shift, allowing us to briefly emit a noise that deafens and confuses the weak-minded." + helptext = "Emits a high-frequency sound that confuses and deafens humans, blows out nearby lights and overloads cyborg sensors." + chemical_cost = 25 + dna_cost = 1 + req_human = 1 + +//A flashy ability, good for crowd control and sewing chaos. +/obj/effect/proc_holder/changeling/resonant_shriek/sting_action(var/mob/user) + for(var/mob/living/M in hearers(4, user)) + if(iscarbon(M)) + if(!M.mind || !M.mind.changeling) + M.ear_deaf += 30 + M.confused += 20 + M.Jitter(50) + else + M << sound('sound/effects/screech.ogg') + + if(issilicon(M)) + M << sound('sound/weapons/flash.ogg') + M.Weaken(rand(5,10)) + + for(var/obj/machinery/light/L in range(4, user)) + L.on = 1 + L.broken() + + feedback_add_details("changeling_powers","RS") + return 1 + +/obj/effect/proc_holder/changeling/dissonant_shriek + name = "Dissonant Shriek" + desc = "We shift our vocal cords to release a high-frequency sound that overloads nearby electronics." + chemical_cost = 20 + dna_cost = 1 + +//A flashy ability, good for crowd control and sewing chaos. +/obj/effect/proc_holder/changeling/dissonant_shriek/sting_action(var/mob/user) + for(var/obj/machinery/light/L in range(5, usr)) + L.on = 1 + L.broken() + empulse(get_turf(user), 2, 5, 1) + return 1 + + diff --git a/code/game/gamemodes/changeling/powers/spiders.dm b/code/game/gamemodes/changeling/powers/spiders.dm index bb61f84258d..cc4bcea557a 100644 --- a/code/game/gamemodes/changeling/powers/spiders.dm +++ b/code/game/gamemodes/changeling/powers/spiders.dm @@ -1,16 +1,16 @@ -/obj/effect/proc_holder/changeling/spiders - name = "Spread Infestation" - desc = "Our form divides, creating arachnids which will grow into deadly beasts." - helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 5 DNA absorptions." - chemical_cost = 50 - dna_cost = 1 - req_dna = 5 - -//Makes some spiderlings. Good for setting traps and causing general trouble. -/obj/effect/proc_holder/changeling/spiders/sting_action(var/mob/user) - for(var/i=0, i<2, i++) - var/obj/effect/spider/spiderling/S = new(user.loc) - S.grow_as = /mob/living/simple_animal/hostile/giant_spider/hunter - - feedback_add_details("changeling_powers","SI") - return 1 +/obj/effect/proc_holder/changeling/spiders + name = "Spread Infestation" + desc = "Our form divides, creating arachnids which will grow into deadly beasts." + helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 5 DNA absorptions." + chemical_cost = 50 + dna_cost = 1 + req_dna = 5 + +//Makes some spiderlings. Good for setting traps and causing general trouble. +/obj/effect/proc_holder/changeling/spiders/sting_action(var/mob/user) + for(var/i=0, i<2, i++) + var/obj/effect/spider/spiderling/S = new(user.loc) + S.grow_as = /mob/living/simple_animal/hostile/giant_spider/hunter + + feedback_add_details("changeling_powers","SI") + return 1 diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 4c9b9fafdb8..d6cddbfff25 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -1,163 +1,163 @@ -/obj/effect/proc_holder/changeling/sting - name = "Tiny Prick" - desc = "Stabby stabby" - var/sting_icon = null - -/obj/effect/proc_holder/changeling/sting/Click() - var/mob/user = usr - if(!user || !user.mind || !user.mind.changeling) - return - if(!(user.mind.changeling.chosen_sting)) - set_sting(user) - else - unset_sting(user) - return - -/obj/effect/proc_holder/changeling/sting/proc/set_sting(var/mob/user) - user << "We prepare our sting, use alt+click or middle mouse button on target to sting them." - user.mind.changeling.chosen_sting = src - user.hud_used.lingstingdisplay.icon_state = sting_icon - user.hud_used.lingstingdisplay.invisibility = 0 - -/obj/effect/proc_holder/changeling/sting/proc/unset_sting(var/mob/user) - user << "We retract our sting, we can't sting anyone for now." - user.mind.changeling.chosen_sting = null - user.hud_used.lingstingdisplay.icon_state = null - user.hud_used.lingstingdisplay.invisibility = 101 - -/mob/living/carbon/proc/unset_sting() - if(mind && mind.changeling && mind.changeling.chosen_sting) - src.mind.changeling.chosen_sting.unset_sting(src) - -/obj/effect/proc_holder/changeling/sting/can_sting(var/mob/user, var/mob/target) - if(!..()) - return - if(!user.mind.changeling.chosen_sting) - user << "We haven't prepared our sting yet!" - if(!iscarbon(target)) - return - if(!isturf(user.loc)) - return - if(get_dist(user, target) > (user.mind.changeling.sting_range)) - return //sanity check as AStar is still throwing insane stunts - if(!AStar(user.loc, target.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, user.mind.changeling.sting_range)) - return //hope this ancient magic still works - return 1 - -/obj/effect/proc_holder/changeling/sting/sting_feedback(var/mob/user, var/mob/target) - user << "We stealthily sting [target.name]." - if(target.mind && target.mind.changeling) - target << "You feel a tiny prick." - add_logs(user, target, "unsuccessfully stung") - return 1 - - -/obj/effect/proc_holder/changeling/sting/transformation - name = "Transformation Sting" - desc = "We silently sting a human, injecting a retrovirus that forces them to transform." - helptext = "Does not provide a warning to others. The victim will transform much like a changeling would." - sting_icon = "sting_transform" - chemical_cost = 40 - dna_cost = 1 - var/datum/dna/selected_dna = null - -/obj/effect/proc_holder/changeling/sting/transformation/can_sting(var/mob/user, var/mob/target) - if(!..()) - return - var/datum/changeling/changeling = user.mind.changeling - selected_dna = changeling.select_dna("Select the target DNA: ", "Target DNA") - if(!selected_dna) - return - if((HUSK in target.mutations) || !check_dna_integrity(target)) - user << "Our sting appears ineffective against its DNA." - return 0 - return 1 - -/obj/effect/proc_holder/changeling/sting/transformation/sting_action(var/mob/user, var/mob/target) - add_logs(user, target, "stung", object="transformation sting", addition=" new identity is [selected_dna.real_name]") - var/datum/dna/NewDNA = selected_dna - hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.mutantrace, NewDNA.blood_type) - updateappearance(target) - feedback_add_details("changeling_powers","TS") - return 1 - -obj/effect/proc_holder/changeling/sting/extract_dna - name = "Extract DNA Sting" - desc = "We stealthily sting a target and extract their DNA." - helptext = "Will give you the DNA of your target, allowing you to transform into them." - sting_icon = "sting_extract" - chemical_cost = 25 - dna_cost = 0 - -/obj/effect/proc_holder/changeling/sting/extract_dna/can_sting(var/mob/user, var/mob/target) - if(..()) - return user.mind.changeling.can_absorb_dna(user, target) - -/obj/effect/proc_holder/changeling/sting/extract_dna/sting_action(var/mob/user, var/mob/target) - add_logs(user, target, "stung", object="extraction sting") - user.mind.changeling.absorb_dna(target, user) - feedback_add_details("changeling_powers","ED") - return 1 - -obj/effect/proc_holder/changeling/sting/mute - name = "Mute Sting" - desc = "We silently sting a human, completely silencing them for a short time." - helptext = "Does not provide a warning to the victim that they have been stung, until they try to speak and cannot." - sting_icon = "sting_mute" - chemical_cost = 20 - dna_cost = 1 - -/obj/effect/proc_holder/changeling/sting/mute/sting_action(var/mob/user, var/mob/living/carbon/target) - add_logs(user, target, "stung", object="mute sting") - target.silent += 30 - feedback_add_details("changeling_powers","MS") - return 1 - -obj/effect/proc_holder/changeling/sting/blind - name = "Blind Sting" - desc = "Temporarily blinds the target." - helptext = "This sting completely blinds a target for a short time. The target does not notice they have been stung." - sting_icon = "sting_blind" - chemical_cost = 25 - dna_cost = 1 - -/obj/effect/proc_holder/changeling/sting/blind/sting_action(var/mob/user, var/mob/target) - add_logs(user, target, "stung", object="blind sting") - target << "Your eyes burn horrifically!" - target.disabilities |= NEARSIGHTED - target.eye_blind = 20 - target.eye_blurry = 40 - feedback_add_details("changeling_powers","BS") - return 1 - -obj/effect/proc_holder/changeling/sting/LSD - name = "Hallucination Sting" - desc = "Causes terror in the target." - helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung. The effect occurs after 30 to 60 seconds." - sting_icon = "sting_lsd" - chemical_cost = 5 - dna_cost = 1 - -/obj/effect/proc_holder/changeling/sting/LSD/sting_action(var/mob/user, var/mob/living/carbon/target) - add_logs(user, target, "stung", object="LSD sting") - spawn(rand(300,600)) - if(target) - target.hallucination += 400 - feedback_add_details("changeling_powers","HS") - return 1 - -obj/effect/proc_holder/changeling/sting/cryo - name = "Cryogenic Sting" - desc = "We silently sting a human with a cocktail of chemicals that freeze them." - helptext = "Does not provide a warning to the victim, though they will likely realize they are suddenly freezing." - sting_icon = "sting_cryo" - chemical_cost = 15 - dna_cost = 1 - -/obj/effect/proc_holder/changeling/sting/cryo/sting_action(var/mob/user, var/mob/target) - add_logs(user, target, "stung", object="cryo sting") - if(target.reagents) - target.reagents.add_reagent("frostoil", 30) - target.reagents.add_reagent("ice", 30) - feedback_add_details("changeling_powers","CS") +/obj/effect/proc_holder/changeling/sting + name = "Tiny Prick" + desc = "Stabby stabby" + var/sting_icon = null + +/obj/effect/proc_holder/changeling/sting/Click() + var/mob/user = usr + if(!user || !user.mind || !user.mind.changeling) + return + if(!(user.mind.changeling.chosen_sting)) + set_sting(user) + else + unset_sting(user) + return + +/obj/effect/proc_holder/changeling/sting/proc/set_sting(var/mob/user) + user << "We prepare our sting, use alt+click or middle mouse button on target to sting them." + user.mind.changeling.chosen_sting = src + user.hud_used.lingstingdisplay.icon_state = sting_icon + user.hud_used.lingstingdisplay.invisibility = 0 + +/obj/effect/proc_holder/changeling/sting/proc/unset_sting(var/mob/user) + user << "We retract our sting, we can't sting anyone for now." + user.mind.changeling.chosen_sting = null + user.hud_used.lingstingdisplay.icon_state = null + user.hud_used.lingstingdisplay.invisibility = 101 + +/mob/living/carbon/proc/unset_sting() + if(mind && mind.changeling && mind.changeling.chosen_sting) + src.mind.changeling.chosen_sting.unset_sting(src) + +/obj/effect/proc_holder/changeling/sting/can_sting(var/mob/user, var/mob/target) + if(!..()) + return + if(!user.mind.changeling.chosen_sting) + user << "We haven't prepared our sting yet!" + if(!iscarbon(target)) + return + if(!isturf(user.loc)) + return + if(get_dist(user, target) > (user.mind.changeling.sting_range)) + return //sanity check as AStar is still throwing insane stunts + if(!AStar(user.loc, target.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, user.mind.changeling.sting_range)) + return //hope this ancient magic still works + return 1 + +/obj/effect/proc_holder/changeling/sting/sting_feedback(var/mob/user, var/mob/target) + user << "We stealthily sting [target.name]." + if(target.mind && target.mind.changeling) + target << "You feel a tiny prick." + add_logs(user, target, "unsuccessfully stung") + return 1 + + +/obj/effect/proc_holder/changeling/sting/transformation + name = "Transformation Sting" + desc = "We silently sting a human, injecting a retrovirus that forces them to transform." + helptext = "Does not provide a warning to others. The victim will transform much like a changeling would." + sting_icon = "sting_transform" + chemical_cost = 40 + dna_cost = 1 + var/datum/dna/selected_dna = null + +/obj/effect/proc_holder/changeling/sting/transformation/can_sting(var/mob/user, var/mob/target) + if(!..()) + return + var/datum/changeling/changeling = user.mind.changeling + selected_dna = changeling.select_dna("Select the target DNA: ", "Target DNA") + if(!selected_dna) + return + if((HUSK in target.mutations) || !check_dna_integrity(target)) + user << "Our sting appears ineffective against its DNA." + return 0 + return 1 + +/obj/effect/proc_holder/changeling/sting/transformation/sting_action(var/mob/user, var/mob/target) + add_logs(user, target, "stung", object="transformation sting", addition=" new identity is [selected_dna.real_name]") + var/datum/dna/NewDNA = selected_dna + hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.mutantrace, NewDNA.blood_type) + updateappearance(target) + feedback_add_details("changeling_powers","TS") + return 1 + +obj/effect/proc_holder/changeling/sting/extract_dna + name = "Extract DNA Sting" + desc = "We stealthily sting a target and extract their DNA." + helptext = "Will give you the DNA of your target, allowing you to transform into them." + sting_icon = "sting_extract" + chemical_cost = 25 + dna_cost = 0 + +/obj/effect/proc_holder/changeling/sting/extract_dna/can_sting(var/mob/user, var/mob/target) + if(..()) + return user.mind.changeling.can_absorb_dna(user, target) + +/obj/effect/proc_holder/changeling/sting/extract_dna/sting_action(var/mob/user, var/mob/target) + add_logs(user, target, "stung", object="extraction sting") + user.mind.changeling.absorb_dna(target, user) + feedback_add_details("changeling_powers","ED") + return 1 + +obj/effect/proc_holder/changeling/sting/mute + name = "Mute Sting" + desc = "We silently sting a human, completely silencing them for a short time." + helptext = "Does not provide a warning to the victim that they have been stung, until they try to speak and cannot." + sting_icon = "sting_mute" + chemical_cost = 20 + dna_cost = 1 + +/obj/effect/proc_holder/changeling/sting/mute/sting_action(var/mob/user, var/mob/living/carbon/target) + add_logs(user, target, "stung", object="mute sting") + target.silent += 30 + feedback_add_details("changeling_powers","MS") + return 1 + +obj/effect/proc_holder/changeling/sting/blind + name = "Blind Sting" + desc = "Temporarily blinds the target." + helptext = "This sting completely blinds a target for a short time. The target does not notice they have been stung." + sting_icon = "sting_blind" + chemical_cost = 25 + dna_cost = 1 + +/obj/effect/proc_holder/changeling/sting/blind/sting_action(var/mob/user, var/mob/target) + add_logs(user, target, "stung", object="blind sting") + target << "Your eyes burn horrifically!" + target.disabilities |= NEARSIGHTED + target.eye_blind = 20 + target.eye_blurry = 40 + feedback_add_details("changeling_powers","BS") + return 1 + +obj/effect/proc_holder/changeling/sting/LSD + name = "Hallucination Sting" + desc = "Causes terror in the target." + helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung. The effect occurs after 30 to 60 seconds." + sting_icon = "sting_lsd" + chemical_cost = 5 + dna_cost = 1 + +/obj/effect/proc_holder/changeling/sting/LSD/sting_action(var/mob/user, var/mob/living/carbon/target) + add_logs(user, target, "stung", object="LSD sting") + spawn(rand(300,600)) + if(target) + target.hallucination += 400 + feedback_add_details("changeling_powers","HS") + return 1 + +obj/effect/proc_holder/changeling/sting/cryo + name = "Cryogenic Sting" + desc = "We silently sting a human with a cocktail of chemicals that freeze them." + helptext = "Does not provide a warning to the victim, though they will likely realize they are suddenly freezing." + sting_icon = "sting_cryo" + chemical_cost = 15 + dna_cost = 1 + +/obj/effect/proc_holder/changeling/sting/cryo/sting_action(var/mob/user, var/mob/target) + add_logs(user, target, "stung", object="cryo sting") + if(target.reagents) + target.reagents.add_reagent("frostoil", 30) + target.reagents.add_reagent("ice", 30) + feedback_add_details("changeling_powers","CS") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm index d3ebd5bbe3c..612d7871abc 100644 --- a/code/game/gamemodes/changeling/powers/transform.dm +++ b/code/game/gamemodes/changeling/powers/transform.dm @@ -1,36 +1,36 @@ -/obj/effect/proc_holder/changeling/transform - name = "Transform" - desc = "We take on the appearance and voice of one we have absorbed." - chemical_cost = 5 - dna_cost = 0 - req_dna = 1 - req_human = 1 - max_genetic_damage = 3 - -//Change our DNA to that of somebody we've absorbed. -/obj/effect/proc_holder/changeling/transform/sting_action(var/mob/living/carbon/user) - var/datum/changeling/changeling = user.mind.changeling - var/datum/dna/chosen_dna = changeling.select_dna("Select the target DNA: ", "Target DNA") - - if(!chosen_dna) - return - - - user.dna = chosen_dna - user.real_name = chosen_dna.real_name - updateappearance(user) - domutcheck(user, null) - - feedback_add_details("changeling_powers","TR") - return 1 - -/datum/changeling/proc/select_dna(var/prompt, var/title) - var/list/names = list() - for(var/datum/dna/DNA in absorbed_dna) - names += "[DNA.real_name]" - - var/chosen_name = input(prompt, title, null) as null|anything in names - if(!chosen_name) - return - var/datum/dna/chosen_dna = get_dna(chosen_name) +/obj/effect/proc_holder/changeling/transform + name = "Transform" + desc = "We take on the appearance and voice of one we have absorbed." + chemical_cost = 5 + dna_cost = 0 + req_dna = 1 + req_human = 1 + max_genetic_damage = 3 + +//Change our DNA to that of somebody we've absorbed. +/obj/effect/proc_holder/changeling/transform/sting_action(var/mob/living/carbon/user) + var/datum/changeling/changeling = user.mind.changeling + var/datum/dna/chosen_dna = changeling.select_dna("Select the target DNA: ", "Target DNA") + + if(!chosen_dna) + return + + + user.dna = chosen_dna + user.real_name = chosen_dna.real_name + updateappearance(user) + domutcheck(user, null) + + feedback_add_details("changeling_powers","TR") + return 1 + +/datum/changeling/proc/select_dna(var/prompt, var/title) + var/list/names = list() + for(var/datum/dna/DNA in absorbed_dna) + names += "[DNA.real_name]" + + var/chosen_name = input(prompt, title, null) as null|anything in names + if(!chosen_name) + return + var/datum/dna/chosen_dna = get_dna(chosen_name) return chosen_dna \ No newline at end of file diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 98c99bcb69f..0f0b2543fe6 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -112,8 +112,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", usr << "It reads: [desc]." sleep(30) explosion(src.loc, 0, 2, 5, 5) - if(src) - del(src) + qdel(src) */ if(!desc) usr << "A spell circle drawn in blood. It reads: [word1] [word2] [word3]." @@ -126,11 +125,11 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", attackby(I as obj, user as mob) if(istype(I, /obj/item/weapon/tome) && iscultist(user)) user << "You retrace your steps, carefully undoing the lines of the rune." - del(src) + qdel(src) return else if(istype(I, /obj/item/weapon/nullrod)) user << "You disrupt the vile magic with the deadening field of the null rod!" - del(src) + qdel(src) return return diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 6c01ed0203f..80a4782f206 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -20,7 +20,7 @@ var/list/sacrificed = list() user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric" if (istype(user, /mob/living)) user.take_overall_damage(5, 0) - del(src) + qdel(src) if(allrunesloc && index != 0) if(istype(src,/obj/effect/rune)) user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting @@ -57,7 +57,7 @@ var/list/sacrificed = list() user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric" if (istype(user, /mob/living)) user.take_overall_damage(5, 0) - del(src) + qdel(src) for(var/mob/living/carbon/C in orange(1,src)) if(iscultist(C) && !C.stat) culcount++ @@ -91,7 +91,7 @@ var/list/sacrificed = list() new /obj/item/weapon/tome(src.loc) else new /obj/item/weapon/tome(usr.loc) - del(src) + qdel(src) return @@ -156,7 +156,8 @@ var/list/sacrificed = list() new narsie_type(src.loc) // Summon her! if(ticker.mode.name == "cult") ticker.mode:eldergod = 0 - del(src) // Stops cultists from spamming the rune to summon narsie more than once. + qdel(src) // Stops cultists from spamming the rune to summon narsie more than once. + // Might actually be wise to straight up del() this return else return fizzle() @@ -174,8 +175,7 @@ var/list/sacrificed = list() T.hotspot_expose(700,125) var/rune = src // detaching the proc - in theory empulse(U, (range_red - 2), range_red) - del(rune) - return + qdel(rune) /////////////////////////////////////////SIXTH RUNE @@ -303,7 +303,7 @@ var/list/sacrificed = list() corpse_to_raise.radiation = 0 // corpse_to_raise.buckled = null // if(corpse_to_raise.handcuffed) -// del(corpse_to_raise.handcuffed) +// qdel(corpse_to_raise.handcuffed) // corpse_to_raise.update_inv_handcuffed(0) corpse_to_raise.stat = CONSCIOUS corpse_to_raise.updatehealth() @@ -346,7 +346,7 @@ var/list/sacrificed = list() usr.say("Kla[pick("'","`")]atu barada nikt'o!") for (var/mob/V in viewers(src)) V.show_message("\red The rune turns into gray dust, veiling the surrounding runes.", 3) - del(src) + qdel(src) else usr.whisper("Kla[pick("'","`")]atu barada nikt'o!") usr << "\red Your talisman turns into gray dust, veiling the surrounding runes." @@ -407,7 +407,7 @@ var/list/sacrificed = list() "\red You hear liquid flowing.") D.real_name = "[pick(first_names_male)] [pick(last_names)]" D.universal_speak = 1 - D.status_flags &= ~GODMODE + D.status_flags = CANSTUN|CANWEAKEN|CANPARALYSE|CANPUSH D.key = ghost.key @@ -511,8 +511,8 @@ var/list/sacrificed = list() for (var/mob/V in viewers(src)) V.show_message("\red The runes turn into dust, which then forms into an arcane image on the paper.", 3) usr.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!") - del(imbued_from) - del(newtalisman) + qdel(imbued_from) + qdel(newtalisman) else return fizzle() @@ -745,7 +745,7 @@ var/list/sacrificed = list() usr.say("Nikt[pick("'","`")]o barada kla'atu!") for (var/mob/V in viewers(src)) V.show_message("\red The rune turns into red dust, reveaing the surrounding runes.", 3) - del(src) + qdel(src) return if(istype(W,/obj/item/weapon/paper/talisman)) usr.whisper("Nikt[pick("'","`")]o barada kla'atu!") @@ -821,7 +821,7 @@ var/list/sacrificed = list() for(var/mob/living/carbon/C in users) user.take_overall_damage(15, 0) C.say("Khari[pick("'","`")]d! Gual'te nikka!") - del(src) + qdel(src) return fizzle() /////////////////////////////////////////NINETEENTH RUNE @@ -855,7 +855,7 @@ var/list/sacrificed = list() user.visible_message("\red Rune disappears with a flash of red light, and in its place now a body lies.", \ "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \ "\red You hear a pop and smell ozone.") - del(src) + qdel(src) return fizzle() /////////////////////////////////////////TWENTIETH RUNES @@ -877,7 +877,7 @@ var/list/sacrificed = list() if(affected) usr.say("Sti[pick("'","`")] kaliedir!") usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust." - del(src) + qdel(src) else return fizzle() else @@ -920,7 +920,7 @@ var/list/sacrificed = list() if(affected) usr.say("Sti[pick("'","`")] kaliesin!") usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust." - del(src) + qdel(src) else return fizzle() else @@ -973,7 +973,7 @@ var/list/sacrificed = list() if(iscultist(C) && !C.stat) C.say("Dedo ol[pick("'","`")]btoh!") C.take_overall_damage(15, 0) - del(src) + qdel(src) else return fizzle() return @@ -1003,8 +1003,8 @@ var/list/sacrificed = list() M << "\red Blood suddenly ignites, burning you!" var/turf/T = get_turf(B) T.hotspot_expose(700,125) - del(B) - del(src) + qdel(B) + qdel(src) ////////// Rune 24 (counting burningblood, which kinda doesnt work yet.) @@ -1026,7 +1026,7 @@ var/list/sacrificed = list() var/mob/living/silicon/S = L S.Weaken(5) S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3) - del(src) + qdel(src) else ///When invoked as talisman, stun and mute the target mob. usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!") var/obj/item/weapon/nullrod/N = locate() in T @@ -1068,6 +1068,5 @@ var/list/sacrificed = list() //the below calls update_icons() at the end, which will update overlay icons by using the (now updated) cache user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) //put in hands or on floor - del(src) - return + qdel(src) diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 3c981c1de40..4f3591bbcaf 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -42,7 +42,7 @@ if(src && src.imbue!="supply" && src.imbue!="runestun") if(delete) user.drop_item(src) - del(src) + qdel(src) return else user << "You see strange symbols on the paper. Are they supposed to mean something?" @@ -55,7 +55,7 @@ user.take_organ_damage(5, 0) call(/obj/effect/rune/proc/runestun)(T) user.drop_item(src) - del(src) + qdel(src) else ..() ///If its some other talisman, use the generic attack code, is this supposed to work this way? else @@ -64,7 +64,7 @@ proc/supply(var/key) if (!src.uses) - del(src) + qdel(src) return var/dat = "There are [src.uses] bloody runes on the parchment.
    " diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 60d68580439..1addcf7340b 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -129,7 +129,7 @@ var/global/datum/controller/gameticker/ticker for(var/obj/effect/landmark/start/S in landmarks_list) //Deleting Startpoints but we need the ai point to AI-ize people later if (S.name != "AI") - del(S) + qdel(S) world << "Enjoy the game!" world << sound('sound/AI/welcome.ogg') // Skie //Holiday Round-start stuff ~Carn @@ -234,8 +234,8 @@ var/global/datum/controller/gameticker/ticker //Otherwise if its a verb it will continue on afterwards. sleep(300) - if(cinematic) del(cinematic) //end the cinematic - if(temp_buckle) del(temp_buckle) //release everybody + if(cinematic) qdel(cinematic) //end the cinematic + if(temp_buckle) qdel(temp_buckle) //release everybody return @@ -248,7 +248,7 @@ var/global/datum/controller/gameticker/ticker player.AIize() else player.create_character() - del(player) + qdel(player) else player.new_player_panel() diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index e284e5b025f..ec4d155e8d0 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -96,7 +96,7 @@ spawn(50) if(M) explosion(get_turf(M), 0,1,1,0) - del(M) + qdel(M) else src << "Out of uses." else src << "That's not a machine." diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index d8bf3df1a7e..a72761d20d8 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -17,7 +17,7 @@ /datum/game_mode/meteor/post_setup() - defer_powernet_rebuild = 2//Might help with the lag +// defer_powernet_rebuild = 2//Might help with the lag spawn (rand(waittime_l, waittime_h)) send_intercept() spawn(meteordelay) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index e68da194442..4f790db04fe 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -105,12 +105,12 @@ !istype(A,/obj/machinery/field/generator) && \ prob(15)) explosion(src.loc, 4, 5, 6, 7, 0) - del(src) + qdel(src) /obj/effect/meteor/ex_act(severity) if (severity < 4) - del(src) + qdel(src) return /obj/effect/meteor/big @@ -126,7 +126,7 @@ if(!istype(A,/obj/machinery/power/emitter) && \ !istype(A,/obj/machinery/field/generator)) if(--src.hits <= 0) - del(src) //Dont blow up singularity containment if we get stuck there. + qdel(src) //Dont blow up singularity containment if we get stuck there. if (A) for(var/mob/M in player_list) @@ -141,10 +141,10 @@ if (--src.hits <= 0) if(prob(15) && !istype(A, /obj/structure/grille)) explosion(src.loc, 1, 2, 3, 4, 0) - del(src) + qdel(src) /obj/effect/meteor/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/pickaxe)) - del(src) + qdel(src) return ..() \ No newline at end of file diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index b03f7ef275b..4008de70f13 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -102,7 +102,7 @@ for(var/obj/effect/landmark/A in landmarks_list) if(A.name == "Syndicate-Spawn") synd_spawn += get_turf(A) - del(A) + qdel(A) continue var/obj/effect/landmark/uplinklocker = locate("landmark*Syndicate-Uplink") //i will be rewriting this shortly @@ -333,7 +333,7 @@ text += "(Syndicates used [TC_uses] TC) [purchases]" if(TC_uses==0 && station_was_nuked && !is_operatives_are_dead()) - text += "" + text += "" world << text return 1 diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 9e45f6d0e4d..cf4080a840d 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -205,7 +205,7 @@ var/bomb_set return return -/obj/item/weapon/disk/nuclear/Del() +/obj/item/weapon/disk/nuclear/Destroy() if(blobstart.len > 0) var/obj/D = new /obj/item/weapon/disk/nuclear(pick(blobstart)) message_admins("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).") diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index e1e5a5dd91c..c720112f353 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -281,7 +281,7 @@ datum/objective/steal/proc/select_target() //For admins setting objectives manua if (!custom_target) return var/tmp_obj = new custom_target var/custom_name = tmp_obj:name - del(tmp_obj) + qdel(tmp_obj) custom_name = copytext(sanitize(input("Enter target name:", "Objective target", custom_name) as text|null),1,MAX_MESSAGE_LEN) if (!custom_name) return steal_target = custom_target diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 0219844aa32..2391bf5f283 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -1,190 +1,190 @@ -//Contains the target item datums for Steal objectives. - -datum/objective_item - var/name = "A silly bike horn! Honk!" - var/targetitem = /obj/item/weapon/bikehorn //typepath of the objective item - var/difficulty = 9001 //vaguely how hard it is to do this objective - var/list/excludefromjob = list() //If you don't want a job to get a certain objective (no captain stealing his own medal, etcetc) - var/list/altitems = list() //Items which can serve as an alternative to the objective (darn you blueprints) - -datum/proc/check_special_completion() //for objectives with special checks (is that slime extract unused? does that intellicard have an ai in it? etcetc) - return 1 - - -datum/objective_item/steal/caplaser - name = "the captain's antique laser gun" - targetitem = /obj/item/weapon/gun/energy/laser/captain - difficulty = 5 - excludefromjob = list("Captain") - -datum/objective_item/steal/handtele - name = "a hand teleporter" - targetitem = /obj/item/weapon/hand_tele - difficulty = 5 - excludefromjob = list("Captain") - -datum/objective_item/steal/rcd - name = "a rapid-construction-device" - targetitem = /obj/item/weapon/rcd - difficulty = 3 - -datum/objective_item/steal/jetpack - name = "a jetpack" - targetitem = /obj/item/weapon/tank/jetpack - difficulty = 3 - -datum/objective_item/steal/magboots - name = "a pair of magboots" - targetitem = /obj/item/clothing/shoes/magboots - difficulty = 5 - excludefromjob = list("Chief Engineer") - -datum/objective_item/steal/corgimeat - name = "a piece of corgi meat" - targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi - difficulty = 5 - excludefromjob = list("Head of Personnel") //>hurting your little buddy ever - -datum/objective_item/steal/capmedal - name = "the medal of captaincy" - targetitem = /obj/item/clothing/tie/medal/gold/captain - difficulty = 5 - excludefromjob = list("Captain") - -datum/objective_item/steal/hypo - name = "the hypospray" - targetitem = /obj/item/weapon/reagent_containers/hypospray - difficulty = 5 - excludefromjob = list("Chief Medical Officer") - -datum/objective_item/steal/nukedisc - name = "the nuclear authentication disk" - targetitem = /obj/item/weapon/disk/nuclear - difficulty = 5 - excludefromjob = list("Captain") - -datum/objective_item/steal/ablative - name = "an ablative armor vest" - targetitem = /obj/item/clothing/suit/armor/laserproof - difficulty = 3 - excludefromjob = list("Head of Security", "Warden") - -datum/objective_item/steal/reactive - name = "the reactive teleport armor" - targetitem = /obj/item/clothing/suit/armor/reactive - difficulty = 5 - excludefromjob = list("Research Director") - - -//Items with special checks! -datum/objective_item/steal/plasma - name = "28 moles of plasma (full tank)" - targetitem = /obj/item/weapon/tank - difficulty = 3 - excludefromjob = list("Chief Engineer","Research Director","Station Engineer","Scientist","Atmospheric Technician") - -datum/objective_item/plasma/check_special_completion(var/obj/item/weapon/tank/T) - var/target_amount = text2num(name) - var/found_amount = 0 - found_amount += T.air_contents.toxins - return found_amount>=target_amount - - -datum/objective_item/steal/functionalai - name = "a functional AI" - targetitem = /obj/item/device/aicard - difficulty = 20 //beyond the impossible - -datum/objective_item/functionalai/check_special_completion(var/obj/item/device/aicard/C) - for(var/mob/living/silicon/ai/A in C) - if(istype(A, /mob/living/silicon/ai) && A.stat != 2) //See if any AI's are alive inside that card. - return 1 - return 0 - -datum/objective_item/steal/blueprints - name = "the station blueprints" - targetitem = /obj/item/blueprints - difficulty = 10 - excludefromjob = list("Chief Engineer") - altitems = list(/obj/item/weapon/photo) - -datum/objective_item/blueprints/check_special_completion(var/obj/item/I) - if(istype(I, /obj/item/blueprints)) - return 1 - if(istype(I, /obj/item/weapon/photo)) - var/obj/item/weapon/photo/P = I - if(P.blueprints) //if the blueprints are in frame - return 1 - return 0 - -datum/objective_item/steal/slime - name = "an unused sample of slime extract" - targetitem = /obj/item/slime_extract - difficulty = 3 - excludefromjob = list("Research Director","Scientist") - -datum/objective_item/slime/check_special_completion(var/obj/item/slime_extract/E) - if(E.Uses > 0) - return 1 - return 0 - - -//Old ninja objectives. -datum/objective_item/special/pinpointer - name = "the captain's pinpointer" - targetitem = /obj/item/weapon/pinpointer - difficulty = 10 - -datum/objective_item/special/aegun - name = "an advanced energy gun" - targetitem = /obj/item/weapon/gun/energy/gun/nuclear - difficulty = 10 - -datum/objective_item/special/ddrill - name = "a diamond drill" - targetitem = /obj/item/weapon/pickaxe/diamonddrill - difficulty = 10 - -datum/objective_item/special/boh - name = "a bag of holding" - targetitem = /obj/item/weapon/storage/backpack/holding - difficulty = 10 - -datum/objective_item/special/hypercell - name = "a hyper-capacity cell" - targetitem = /obj/item/weapon/stock_parts/cell/hyper - difficulty = 5 - -datum/objective_item/special/laserpointer - name = "a laser pointer" - targetitem = /obj/item/device/laser_pointer - difficulty = 5 - -//Stack objectives get their own subtype -datum/objective_item/stack - name = "5 cardboards" - targetitem = /obj/item/stack/sheet/cardboard - difficulty = 9001 - -datum/objective_item/stack/check_special_completion(var/obj/item/stack/S) - var/target_amount = text2num(name) - var/found_amount = 0 - - if(istype(S, targetitem)) - found_amount = S.amount - return found_amount>=target_amount - -datum/objective_item/stack/diamond - name = "10 diamonds" - targetitem = /obj/item/stack/sheet/mineral/diamond - difficulty = 10 - -datum/objective_item/stack/gold - name = "50 gold bars" - targetitem = /obj/item/stack/sheet/mineral/gold - difficulty = 15 - -datum/objective_item/stack/uranium - name = "25 refined uranium bars" - targetitem = /obj/item/stack/sheet/mineral/uranium +//Contains the target item datums for Steal objectives. + +datum/objective_item + var/name = "A silly bike horn! Honk!" + var/targetitem = /obj/item/weapon/bikehorn //typepath of the objective item + var/difficulty = 9001 //vaguely how hard it is to do this objective + var/list/excludefromjob = list() //If you don't want a job to get a certain objective (no captain stealing his own medal, etcetc) + var/list/altitems = list() //Items which can serve as an alternative to the objective (darn you blueprints) + +datum/proc/check_special_completion() //for objectives with special checks (is that slime extract unused? does that intellicard have an ai in it? etcetc) + return 1 + + +datum/objective_item/steal/caplaser + name = "the captain's antique laser gun" + targetitem = /obj/item/weapon/gun/energy/laser/captain + difficulty = 5 + excludefromjob = list("Captain") + +datum/objective_item/steal/handtele + name = "a hand teleporter" + targetitem = /obj/item/weapon/hand_tele + difficulty = 5 + excludefromjob = list("Captain") + +datum/objective_item/steal/rcd + name = "a rapid-construction-device" + targetitem = /obj/item/weapon/rcd + difficulty = 3 + +datum/objective_item/steal/jetpack + name = "a jetpack" + targetitem = /obj/item/weapon/tank/jetpack + difficulty = 3 + +datum/objective_item/steal/magboots + name = "a pair of magboots" + targetitem = /obj/item/clothing/shoes/magboots + difficulty = 5 + excludefromjob = list("Chief Engineer") + +datum/objective_item/steal/corgimeat + name = "a piece of corgi meat" + targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi + difficulty = 5 + excludefromjob = list("Head of Personnel") //>hurting your little buddy ever + +datum/objective_item/steal/capmedal + name = "the medal of captaincy" + targetitem = /obj/item/clothing/tie/medal/gold/captain + difficulty = 5 + excludefromjob = list("Captain") + +datum/objective_item/steal/hypo + name = "the hypospray" + targetitem = /obj/item/weapon/reagent_containers/hypospray + difficulty = 5 + excludefromjob = list("Chief Medical Officer") + +datum/objective_item/steal/nukedisc + name = "the nuclear authentication disk" + targetitem = /obj/item/weapon/disk/nuclear + difficulty = 5 + excludefromjob = list("Captain") + +datum/objective_item/steal/ablative + name = "an ablative armor vest" + targetitem = /obj/item/clothing/suit/armor/laserproof + difficulty = 3 + excludefromjob = list("Head of Security", "Warden") + +datum/objective_item/steal/reactive + name = "the reactive teleport armor" + targetitem = /obj/item/clothing/suit/armor/reactive + difficulty = 5 + excludefromjob = list("Research Director") + + +//Items with special checks! +datum/objective_item/steal/plasma + name = "28 moles of plasma (full tank)" + targetitem = /obj/item/weapon/tank + difficulty = 3 + excludefromjob = list("Chief Engineer","Research Director","Station Engineer","Scientist","Atmospheric Technician") + +datum/objective_item/plasma/check_special_completion(var/obj/item/weapon/tank/T) + var/target_amount = text2num(name) + var/found_amount = 0 + found_amount += T.air_contents.toxins + return found_amount>=target_amount + + +datum/objective_item/steal/functionalai + name = "a functional AI" + targetitem = /obj/item/device/aicard + difficulty = 20 //beyond the impossible + +datum/objective_item/functionalai/check_special_completion(var/obj/item/device/aicard/C) + for(var/mob/living/silicon/ai/A in C) + if(istype(A, /mob/living/silicon/ai) && A.stat != 2) //See if any AI's are alive inside that card. + return 1 + return 0 + +datum/objective_item/steal/blueprints + name = "the station blueprints" + targetitem = /obj/item/blueprints + difficulty = 10 + excludefromjob = list("Chief Engineer") + altitems = list(/obj/item/weapon/photo) + +datum/objective_item/blueprints/check_special_completion(var/obj/item/I) + if(istype(I, /obj/item/blueprints)) + return 1 + if(istype(I, /obj/item/weapon/photo)) + var/obj/item/weapon/photo/P = I + if(P.blueprints) //if the blueprints are in frame + return 1 + return 0 + +datum/objective_item/steal/slime + name = "an unused sample of slime extract" + targetitem = /obj/item/slime_extract + difficulty = 3 + excludefromjob = list("Research Director","Scientist") + +datum/objective_item/slime/check_special_completion(var/obj/item/slime_extract/E) + if(E.Uses > 0) + return 1 + return 0 + + +//Old ninja objectives. +datum/objective_item/special/pinpointer + name = "the captain's pinpointer" + targetitem = /obj/item/weapon/pinpointer + difficulty = 10 + +datum/objective_item/special/aegun + name = "an advanced energy gun" + targetitem = /obj/item/weapon/gun/energy/gun/nuclear + difficulty = 10 + +datum/objective_item/special/ddrill + name = "a diamond drill" + targetitem = /obj/item/weapon/pickaxe/diamonddrill + difficulty = 10 + +datum/objective_item/special/boh + name = "a bag of holding" + targetitem = /obj/item/weapon/storage/backpack/holding + difficulty = 10 + +datum/objective_item/special/hypercell + name = "a hyper-capacity cell" + targetitem = /obj/item/weapon/stock_parts/cell/hyper + difficulty = 5 + +datum/objective_item/special/laserpointer + name = "a laser pointer" + targetitem = /obj/item/device/laser_pointer + difficulty = 5 + +//Stack objectives get their own subtype +datum/objective_item/stack + name = "5 cardboards" + targetitem = /obj/item/stack/sheet/cardboard + difficulty = 9001 + +datum/objective_item/stack/check_special_completion(var/obj/item/stack/S) + var/target_amount = text2num(name) + var/found_amount = 0 + + if(istype(S, targetitem)) + found_amount = S.amount + return found_amount>=target_amount + +datum/objective_item/stack/diamond + name = "10 diamonds" + targetitem = /obj/item/stack/sheet/mineral/diamond + difficulty = 10 + +datum/objective_item/stack/gold + name = "50 gold bars" + targetitem = /obj/item/stack/sheet/mineral/gold + difficulty = 15 + +datum/objective_item/stack/uranium + name = "25 refined uranium bars" + targetitem = /obj/item/stack/sheet/mineral/uranium difficulty = 10 \ No newline at end of file diff --git a/code/game/gamemodes/sandbox/airlock_maker.dm b/code/game/gamemodes/sandbox/airlock_maker.dm index adde1d030f2..97e418ea7e4 100644 --- a/code/game/gamemodes/sandbox/airlock_maker.dm +++ b/code/game/gamemodes/sandbox/airlock_maker.dm @@ -90,14 +90,14 @@ datum/airlock_maker if("cancel" in href_list) usr << browse(null,"window=airlockmaker") - del linked - del src + qdel(linked) + qdel(src) return if("done" in href_list) usr << browse(null,"window=airlockmaker") var/turf/t_loc = linked.loc - del linked + qdel(linked) if(!istype(t_loc)) return diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index d830512ff66..9840315d2ae 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -7,13 +7,13 @@ var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS) for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) avnums[i] = i - + HULKBLOCK = pick_n_take(avnums) TELEBLOCK = pick_n_take(avnums) - + FIREBLOCK = pick_n_take(avnums) XRAYBLOCK = pick_n_take(avnums) - + CLUMSYBLOCK = pick_n_take(avnums) STRANGEBLOCK = pick_n_take(avnums) DEAFBLOCK = pick_n_take(avnums) @@ -28,7 +28,7 @@ bad_se_blocks = list(NEARSIGHTEDBLOCK,EPILEPSYBLOCK,STRANGEBLOCK,COUGHBLOCK,CLUMSYBLOCK,TOURETTESBLOCK,NERVOUSBLOCK,DEAFBLOCK,BLINDBLOCK) good_se_blocks = list(FIREBLOCK,XRAYBLOCK) op_se_blocks = list(HULKBLOCK,TELEBLOCK) - + NULLED_SE = repeat_string(DNA_STRUC_ENZYMES_BLOCKS, repeat_string(DNA_BLOCK_SIZE, "_")) NULLED_UI = repeat_string(DNA_UNI_IDENTITY_BLOCKS, repeat_string(DNA_BLOCK_SIZE, "_")) // HIDDEN MUTATIONS / SUPERPOWERS INITIALIZTION @@ -68,103 +68,3 @@ // Populate the syndicate coalition: for(var/datum/faction/syndicate/S in ticker.factions) ticker.syndicate_coalition.Add(S) - - -/* This was used for something before, I think, but is not worth the effort to process now. -/proc/setupcorpses() - for (var/obj/effect/landmark/A in landmarks_list) - if (A.name == "Corpse") - var/mob/living/carbon/human/M = new /mob/living/carbon/human(A.loc) - M.real_name = "Corpse" - M.death() - del(A) - continue - if (A.name == "Corpse-Engineer") - var/mob/living/carbon/human/M = new /mob/living/carbon/human(A.loc) - M.real_name = "Corpse" - M.death() - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(M), slot_ears) - M.equip_to_slot_or_del(new /obj/item/device/pda/engineering(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(M), slot_shoes) - // M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/t_scanner(M), slot_r_store) - //M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) - if (prob(50)) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask) - if (prob(50)) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/hardhat(M), slot_head) - else - if (prob(50)) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/welding(M), slot_head) - del(A) - continue - if (A.name == "Corpse-Engineer-Space") - var/mob/living/carbon/human/M = new /mob/living/carbon/human(A.loc) - M.real_name = "Corpse" - M.death() - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(M), slot_ears) - M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space(M), slot_wear_suit) - // M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/t_scanner(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask) - if (prob(50)) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/hardhat(M), slot_head) - else - if (prob(50)) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/welding(M), slot_head) - else - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space(M), slot_head) - del(A) - continue - if (A.name == "Corpse-Engineer-Chief") - var/mob/living/carbon/human/M = new /mob/living/carbon/human(A.loc) - M.real_name = "Corpse" - M.death() - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(M), slot_ears) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/utilitybelt(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(M), slot_shoes) - // M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/t_scanner(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) - if (prob(50)) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask) - if (prob(50)) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/hardhat(M), slot_head) - else - if (prob(50)) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/welding(M), slot_head) - del(A) - continue - if (A.name == "Corpse-Syndicate") - var/mob/living/carbon/human/M = new /mob/living/carbon/human(A.loc) - M.real_name = "Corpse" - M.death() - M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears) - //M.equip_to_slot_or_del(new /obj/item/weapon/gun/revolver(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask) - if (prob(50)) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate(M), slot_wear_suit) - if (prob(50)) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/swat(M), slot_head) - else - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate(M), slot_head) - else - M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/swat(M), slot_head) - del(A) - continue -*/ diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm index f07cd2a5437..e5c41aa12e2 100644 --- a/code/game/gamemodes/traitor/double_agents.dm +++ b/code/game/gamemodes/traitor/double_agents.dm @@ -1,91 +1,91 @@ -/datum/game_mode/traitor/double_agents - name = "double agents" - config_tag = "double_agents" - restricted_jobs = list("Cyborg", "AI", "Captain", "Head of Personnel", "Chief Medical Officer", "Research Director", "Chief Engineer", "Head of Security") // Human / Minor roles only. - required_players = 25 - required_enemies = 5 - recommended_enemies = 8 - - traitor_name = "double agent" - - traitors_possible = 8 //hard limit on traitors if scaling is turned off - scale_modifier = 0.5 // Nearly twice as many double agents - - var/list/target_list = list() - var/list/late_joining_list = list() - -/datum/game_mode/traitor/double_agents/announce() - world << "The current game mode is - Double Agents!" - world << "There are double agents killing eachother! Do not let them succeed!" - -/datum/game_mode/traitor/double_agents/post_setup() - var/i = 0 - for(var/datum/mind/traitor in traitors) - i++ - if(i + 1 > traitors.len) - i = 0 - target_list[traitor] = traitors[i + 1] - ..() - -/datum/game_mode/traitor/double_agents/forge_traitor_objectives(var/datum/mind/traitor) - - if(target_list.len && target_list[traitor]) // Is a double agent - - // Assassinate - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = traitor - kill_objective.target = target_list[traitor] - kill_objective.explanation_text = "Assassinate [kill_objective.target.current.real_name], the [kill_objective.target.special_role]." - traitor.objectives += kill_objective - - // Escape - var/datum/objective/escape/escape_objective = new - escape_objective.owner = traitor - traitor.objectives += escape_objective - - else - ..() // Give them standard objectives. - return - -/datum/game_mode/traitor/double_agents/add_latejoin_traitor(var/datum/mind/character) - - check_potential_agents() - - // As soon as we get 3 or 4 extra latejoin traitors, make them traitors and kill each other. - if(late_joining_list.len >= rand(3, 4)) - // True randomness - shuffle(late_joining_list) - // Reset the target_list, it'll be used again in force_traitor_objectives - target_list = list() - - // Basically setting the target_list for who is killing who - var/i = 0 - for(var/datum/mind/traitor in late_joining_list) - i++ - if(i + 1 > late_joining_list.len) - i = 0 - target_list[traitor] = late_joining_list[i + 1] - traitor.special_role = traitor_name - - // Now, give them their targets - for(var/datum/mind/traitor in target_list) - ..(traitor) - - late_joining_list = list() - else - late_joining_list += character - return - -/datum/game_mode/traitor/double_agents/proc/check_potential_agents() - - for(var/M in late_joining_list) - if(istype(M, /datum/mind)) - var/datum/mind/agent_mind = M - if(ishuman(agent_mind.current)) - var/mob/living/carbon/human/H = agent_mind.current - if(H.stat != DEAD) - if(H.client) - continue // It all checks out. - - // If any check fails, remove them from our list +/datum/game_mode/traitor/double_agents + name = "double agents" + config_tag = "double_agents" + restricted_jobs = list("Cyborg", "AI", "Captain", "Head of Personnel", "Chief Medical Officer", "Research Director", "Chief Engineer", "Head of Security") // Human / Minor roles only. + required_players = 25 + required_enemies = 5 + recommended_enemies = 8 + + traitor_name = "double agent" + + traitors_possible = 8 //hard limit on traitors if scaling is turned off + scale_modifier = 0.5 // Nearly twice as many double agents + + var/list/target_list = list() + var/list/late_joining_list = list() + +/datum/game_mode/traitor/double_agents/announce() + world << "The current game mode is - Double Agents!" + world << "There are double agents killing eachother! Do not let them succeed!" + +/datum/game_mode/traitor/double_agents/post_setup() + var/i = 0 + for(var/datum/mind/traitor in traitors) + i++ + if(i + 1 > traitors.len) + i = 0 + target_list[traitor] = traitors[i + 1] + ..() + +/datum/game_mode/traitor/double_agents/forge_traitor_objectives(var/datum/mind/traitor) + + if(target_list.len && target_list[traitor]) // Is a double agent + + // Assassinate + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = traitor + kill_objective.target = target_list[traitor] + kill_objective.explanation_text = "Assassinate [kill_objective.target.current.real_name], the [kill_objective.target.special_role]." + traitor.objectives += kill_objective + + // Escape + var/datum/objective/escape/escape_objective = new + escape_objective.owner = traitor + traitor.objectives += escape_objective + + else + ..() // Give them standard objectives. + return + +/datum/game_mode/traitor/double_agents/add_latejoin_traitor(var/datum/mind/character) + + check_potential_agents() + + // As soon as we get 3 or 4 extra latejoin traitors, make them traitors and kill each other. + if(late_joining_list.len >= rand(3, 4)) + // True randomness + shuffle(late_joining_list) + // Reset the target_list, it'll be used again in force_traitor_objectives + target_list = list() + + // Basically setting the target_list for who is killing who + var/i = 0 + for(var/datum/mind/traitor in late_joining_list) + i++ + if(i + 1 > late_joining_list.len) + i = 0 + target_list[traitor] = late_joining_list[i + 1] + traitor.special_role = traitor_name + + // Now, give them their targets + for(var/datum/mind/traitor in target_list) + ..(traitor) + + late_joining_list = list() + else + late_joining_list += character + return + +/datum/game_mode/traitor/double_agents/proc/check_potential_agents() + + for(var/M in late_joining_list) + if(istype(M, /datum/mind)) + var/datum/mind/agent_mind = M + if(ishuman(agent_mind.current)) + var/mob/living/carbon/human/H = agent_mind.current + if(H.stat != DEAD) + if(H.client) + continue // It all checks out. + + // If any check fails, remove them from our list late_joining_list -= M \ No newline at end of file diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 2ba796e294f..1b8f4ce1185 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -219,7 +219,7 @@ if(uplink_true) text += " (used [TC_uses] TC) [purchases]" if(TC_uses==0 && traitorwin) - text += "" + text += "" text += objectives diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 5e4cd0b0052..8023e387c92 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -27,7 +27,7 @@ /obj/effect/rend/New() spawn(50) new /obj/machinery/singularity/narsie/wizard(get_turf(src)) - del(src) + qdel(src) return return @@ -66,13 +66,12 @@ new /mob/living/simple_animal/cow(loc) cowsleft-- if(cowsleft <= 0) - del src + qdel(src) /obj/effect/rend/cow/attackby(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/weapon/nullrod)) visible_message("\red [I] strikes a blow against \the [src], banishing it!") - spawn(1) - del src + qdel(src) return ..() diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index 641f27c0317..0097faa46fc 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -1,6 +1,10 @@ /mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic + var/list/gunslist = list("taser","egun","laser","revolver","detective","smg","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","mateba","smg","uzi","crossbow","saw") + var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge","wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying", "staffdoor", "special") + var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos") + usr << "You summoned [summon_type ? "magic" : "guns"]!" message_admins("[key_name_admin(usr, 1)] summoned [summon_type ? "magic" : "guns"]!") log_game("[key_name(usr)] summoned [summon_type ? "magic" : "guns"]!") @@ -20,8 +24,9 @@ for(var/datum/objective/OBJ in H.mind.objectives) H << "Objective #[obj_count]: [OBJ.explanation_text]" obj_count++ - var/randomizeguns = pick("taser","egun","laser","revolver","detective","smg","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","mateba","smg","uzi","crossbow","saw") - var/randomizemagic = pick("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge","wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying") + var/randomizeguns = pick(gunslist) + var/randomizemagic = pick(magiclist) + var/randomizemagicspecial = pick(magicspeciallist) if(!summon_type) switch (randomizeguns) if("taser") @@ -95,10 +100,10 @@ new /obj/item/weapon/gun/magic/wand/teleport(get_turf(H)) if("wanddoor") new /obj/item/weapon/gun/magic/wand/door(get_turf(H)) - if("staffchange") - new /obj/item/weapon/gun/magic/staff/change(get_turf(H)) if("staffhealing") new /obj/item/weapon/gun/magic/staff/healing(get_turf(H)) + if("staffdoor") + new /obj/item/weapon/gun/magic/staff/door(get_turf(H)) if("armor") new /obj/item/clothing/suit/space/rig/wizard(get_turf(H)) new /obj/item/clothing/head/helmet/space/rig/wizard(get_turf(H)) @@ -109,4 +114,19 @@ H.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) H.see_in_dark = 8 H.see_invisible = SEE_INVISIBLE_LEVEL_TWO - H << "\blue The walls suddenly disappear." + H << "The walls suddenly disappear." + + if("special") + magiclist -= "special" //only one super OP item per summoning max + switch (randomizemagicspecial) + if("staffchange") + new /obj/item/weapon/gun/magic/staff/change(get_turf(H)) + if("staffanimation") + new /obj/item/weapon/gun/magic/staff/animate(get_turf(H)) + if("wandbelt") + new /obj/item/weapon/storage/belt/wands/full(get_turf(H)) + if("contract") + new /obj/item/weapon/antag_spawner/contract(get_turf(H)) + if("staffchaos") + new /obj/item/weapon/gun/magic/staff/chaos(get_turf(H)) + H << "You suddenly feel lucky." \ No newline at end of file diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 1de83394304..80ea4f0ff40 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -115,7 +115,7 @@ animation.icon = 'icons/mob/mob.dmi' animation.master = T flick("dust-h", animation) - del(animation) + qdel(animation) var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc ) S.loc = C //put shade in stone S.status_flags |= GODMODE //So they won't die inside the stone somehow @@ -131,7 +131,7 @@ U << "\blue Capture successful!: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone." U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls." C.imprinted = "[S.name]" - del T + qdel(T) if("SHADE") var/mob/living/simple_animal/shade/T = target var/obj/item/device/soulstone/C = src @@ -167,11 +167,11 @@ else ticker.mode.cult+=Z.mind ticker.mode.update_cult_icons_added(Z.mind) - del(T) + qdel(T) Z << "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, create shield walls and even deflect energy weapons, and rip apart enemies and walls alike." Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." Z.cancel_camera() - del(C) + qdel(C) if("Wraith") var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(T.loc)) @@ -182,11 +182,11 @@ else ticker.mode.cult+=Z.mind ticker.mode.update_cult_icons_added(Z.mind) - del(T) + qdel(T) Z << "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." Z.cancel_camera() - del(C) + qdel(C) if("Artificer") var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(T.loc)) @@ -197,11 +197,11 @@ else ticker.mode.cult+=Z.mind ticker.mode.update_cult_icons_added(Z.mind) - del(T) + qdel(T) Z << "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, use magic missile, repair allied constructs (by clicking on them), and most important of all create new constructs (Use your Artificer spell to summon a new construct shell and Summon Soulstone to create a new soulstone)." Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." Z.cancel_camera() - del(C) + qdel(C) else U << "\red Creation failed!: \black The soul stone is empty! Go kill someone!" return diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 33a93e602e0..03fbafa36b4 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -10,6 +10,7 @@ var/temp = null var/max_uses = 5 var/op = 1 + var/activepage /obj/item/weapon/spellbook/attackby(obj/item/O as obj, mob/user as mob) if(istype(O, /obj/item/weapon/antag_spawner/contract)) @@ -20,7 +21,7 @@ user << "You feed the contract back into the spellbook, refunding your points." src.max_uses++ src.uses++ - del (O) + qdel(O) @@ -30,12 +31,23 @@ var/dat if(temp) dat = "[temp]

    Clear" - else - dat = "The Book of Spells:
    " - dat += "Spells left to memorize: [uses]
    " + else if (!activepage || activepage == "return") + dat = "The Book of Magic:
    " + dat += "Uses remaining: [uses]
    " + dat += "
    " + dat += "Learn and Improve Magical Abilities
    " + dat += "Summon Magical Tools and Weapons
    " + dat += "Cast Powerful One Time Spells
    " + + dat += "
    " + dat += "Re-memorize Spells
    " + + else if (activepage == "spells") + dat += "Spells:
    " + dat += "Spells that can be reused endlessly. Unless stated otherwise all spells require full wizard garb as a focus.
    " + dat += "The number after the spell name is the cooldown time. You can reduce this number by spending more points on the spell.
    " + dat += "
    " - dat += "Memorize which spell:
    " - dat += "The number after the spell name is the cooldown time.
    " dat += "Magic Missile (15)
    " dat += "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.
    " @@ -82,6 +94,18 @@ dat += "Flesh to Stone (60)
    " dat += "This spell will curse a person to immediately turn into an unmoving statue. The effect will eventually wear off if the statue is not destroyed.
    " + dat += "
    " + + dat += "Return
    " + + else if (activepage == "oneuse") + + dat += "One Time Spells:
    " + dat += "These potent spells can only be used once and will be used automatically upon purchase.
    " + dat += "The effects are global and irreversable, these spells cannot be unlearned, but they can be bought multiple times.
    " + + dat += "
    " + dat += "Summon Guns (One time use, global spell)
    " dat += "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill eachother. Just be careful not to get hit in the crossfire!
    " @@ -89,25 +113,42 @@ dat += "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time.
    " dat += "
    " - dat += "Artefacts:
    " - dat += "Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of spells.
    " - dat += "It is recommended that only experienced wizards attempt to wield such artefacts.
    " + + dat += "Return
    " + + else if (activepage == "artifacts") + + dat += "Artifacts:
    " + dat += "Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of uses.
    " + dat += "These items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
    " dat += "
    " dat += "Staff of Change
    " dat += "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself.
    " dat += "
    " + dat += "Staff of Animation
    " + dat += "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines.
    " + dat += "
    " + + dat += "Staff of Door Creation
    " + dat += "A particular staff that can mold solid metal into ornate wooden doors. Useful for getting around in the absence of other transportation. Does not work on glass.
    " + dat += "
    " + + dat += "Staff of Chaos
    " + dat += "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended.
    " + dat += "
    " + dat += "Six Soul Stone Shards and the spell Artificer
    " dat += "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot.
    " dat += "
    " - dat += "Mastercrafted Armor Set
    " - dat += "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space.
    " + dat += "Wand Assortment
    " + dat += "A collection of wands that allow for a wide variety of utility. Wands do not recharge, so be conservative in use. Comes in a handy belt.
    " dat += "
    " - dat += "Staff of Animation
    " - dat += "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines.
    " + dat += "Mastercrafted Armor Set
    " + dat += "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space.
    " dat += "
    " dat += "Contract of Apprenticeship
    " @@ -118,7 +159,8 @@ dat += "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision.
    " dat += "
    " - dat += "Re-memorize Spells
    " + + dat += "Return
    " user << browse(dat, "window=radio") onclose(user, "radio") return @@ -148,11 +190,13 @@ feedback_add_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells else temp = "You may only re-memorize spells whilst located inside the wizard sanctuary." + else if(href_list["spell_choice"] == "spells" || href_list["spell_choice"] == "artifacts" || href_list["spell_choice"] == "oneuse" || href_list["spell_choice"] == "return") + activepage = href_list["spell_choice"] else if(uses >= 1 && max_uses >=1) uses-- /* */ - var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", fleshtostone = "Flesh to Stone", summonguns = "Summon Guns", summonmagic = "Summon Magic", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation") + var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", fleshtostone = "Flesh to Stone", summonguns = "Summon Guns", summonmagic = "Summon Magic", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", staffchaos = "Staff of Chaos", staffdoor = "Staff of Door Creation", wands = "Wand Assortment") var/already_knows = 0 for(var/obj/effect/proc_holder/spell/aspell in H.mind.spell_list) if(available_spells[href_list["spell_choice"]] == initial(aspell.name)) @@ -280,6 +324,21 @@ new /obj/item/weapon/gun/magic/staff/animate(get_turf(H)) temp = "You have purchased a staff of animation." max_uses-- + if("staffchaos") + feedback_add_details("wizard_spell_learned","SC") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + new /obj/item/weapon/gun/magic/staff/chaos(get_turf(H)) + temp = "You have purchased a staff of chaos." + max_uses-- + if("staffdoor") + feedback_add_details("wizard_spell_learned","SD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + new /obj/item/weapon/gun/magic/staff/door(get_turf(H)) + temp = "You have purchased a staff of door creation." + max_uses-- + if("wands") + feedback_add_details("wizard_spell_learned","WA") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + new /obj/item/weapon/storage/belt/wands/full(get_turf(H)) + temp = "You have purchased an assortment of wands." + max_uses-- if("contract") feedback_add_details("wizard_spell_learned","CT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells new /obj/item/weapon/antag_spawner/contract(get_turf(H)) @@ -299,6 +358,7 @@ else if(href_list["temp"]) temp = null + activepage = null attack_self(H) return @@ -355,7 +415,7 @@ /obj/item/weapon/spellbook/oneuse/fireball/recoil(mob/user as mob) ..() explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) - del(src) + qdel(src) /obj/item/weapon/spellbook/oneuse/smoke spell = /obj/effect/proc_holder/spell/targeted/smoke @@ -473,9 +533,9 @@ magichead.flags_inv = null //so you can still see their face magichead.voicechange = 1 //NEEEEIIGHH if(!user.unEquip(user.wear_mask)) - del user.wear_mask + qdel(user.wear_mask) user.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1) - del src + qdel(src) else user <<"I say thee neigh" diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 11430663e72..6306d8d5a6b 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -146,12 +146,12 @@ return //So zards properly get their items when they are admin-made. - del(wizard_mob.wear_suit) - del(wizard_mob.head) - del(wizard_mob.shoes) - del(wizard_mob.r_hand) - del(wizard_mob.r_store) - del(wizard_mob.l_store) + qdel(wizard_mob.wear_suit) + qdel(wizard_mob.head) + qdel(wizard_mob.shoes) + qdel(wizard_mob.r_hand) + qdel(wizard_mob.r_store) + qdel(wizard_mob.l_store) wizard_mob.equip_to_slot_or_del(new /obj/item/device/radio/headset(wizard_mob), slot_ears) wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(wizard_mob), slot_w_uniform) @@ -264,7 +264,7 @@ //To batch-remove wizard spells. Linked to mind.dm. /mob/proc/spellremove(var/mob/M as mob) for(var/obj/effect/proc_holder/spell/spell_to_remove in src.mind.spell_list) - del(spell_to_remove) + qdel(spell_to_remove) /*Checks if the wizard can cast spells. Made a proc so this is not repeated 14 (or more) times.*/ diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 8f90db9ba41..97ea9dd91d1 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -336,4 +336,4 @@ var/global/lawyer = 0//Checks for another lawyer else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - return 1 + return 1 diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 5618b788db9..080a104a54a 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -12,11 +12,13 @@ access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, - access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom) + access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom, + access_tech_storage) minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, - access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom) + access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom, + access_tech_storage) minimal_player_age = 7 equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 28c35234880..42e2368ca52 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -148,38 +148,124 @@ faction = "Station" total_positions = 5 spawn_positions = 5 - supervisors = "the head of security" + supervisors = "the head of security, and the head of your assigned department (if applicable)" selection_color = "#ffeeee" access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue) minimal_access = list(access_security, access_sec_doors, access_brig, access_court) //But see /datum/job/warden/get_access() minimal_player_age = 7 - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears) - if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back) - if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_s_store) - H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/melee/baton/loaded(H), slot_in_backpack) - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) - L.imp_in = H - L.implanted = 1 - return 1 +/datum/job/officer/equip(var/mob/living/carbon/human/H) + if(!H) return 0 + if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back) + if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back) + assign_sec_to_department(H) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head) + H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_s_store) + H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store) + if(H.backbag == 1) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand) + else + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) + H.equip_to_slot_or_del(new /obj/item/weapon/melee/baton/loaded(H), slot_in_backpack) + var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) + L.imp_in = H + L.implanted = 1 + return 1 /datum/job/officer/get_access() var/list/L = list() L = ..() | check_config_for_sec_maint() - return L \ No newline at end of file + return L + +var/list/sec_departments = list("engineering", "supply", "medical", "science") + +/datum/job/officer/proc/assign_sec_to_department(var/mob/living/carbon/human/H) + if(!H) return 0 + if(!sec_departments.len) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears) + else + var/department = pick(sec_departments) + sec_departments -= department + var/dep_access = null + var/destination = null + switch(department) + if("supply") + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/cargo(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/supply(H), slot_ears) + dep_access = list(access_mailsorting, access_mining) + destination = /area/security/checkpoint/supply + if("engineering") + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/engine(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/engi(H), slot_ears) + dep_access = list(access_construction, access_engine) + destination = /area/security/checkpoint/engineering + if("medical") + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/med(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/med(H), slot_ears) + dep_access = list(access_medical) + destination = /area/security/checkpoint/medical + if("science") + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/science(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/sci(H), slot_ears) + dep_access = list(access_research) + destination = /area/security/checkpoint/science + var/teleport = 0 + if(!config.sec_start_brig) + if(destination) + if(!ticker || ticker.current_state <= GAME_STATE_SETTING_UP) + teleport = 1 + if(teleport) + var/turf/T + var/safety = 0 + while(safety < 25) + T = safepick(get_area_turfs(destination)) + if(T && !H.Move(T)) + safety += 1 + continue + else + break + H << "You have been assigned to [department]!" + access += dep_access + +/obj/item/device/radio/headset/headset_sec/department/New() + wires = new(src) + secure_radio_connections = new + + if(radio_controller) + initialize() + recalculateChannels() + +/obj/item/device/radio/headset/headset_sec/department/engi + keyslot1 = new /obj/item/device/encryptionkey/headset_sec + keyslot2 = new /obj/item/device/encryptionkey/headset_eng + +/obj/item/device/radio/headset/headset_sec/department/supply + keyslot1 = new /obj/item/device/encryptionkey/headset_sec + keyslot2 = new /obj/item/device/encryptionkey/headset_cargo + +/obj/item/device/radio/headset/headset_sec/department/med + keyslot1 = new /obj/item/device/encryptionkey/headset_sec + keyslot2 = new /obj/item/device/encryptionkey/headset_med + +/obj/item/device/radio/headset/headset_sec/department/sci + keyslot1 = new /obj/item/device/encryptionkey/headset_sec + keyslot2 = new /obj/item/device/encryptionkey/headset_sci + +/obj/item/clothing/under/rank/security/cargo/New() + attachTie(new /obj/item/clothing/tie/armband/cargo) + +/obj/item/clothing/under/rank/security/engine/New() + attachTie(new /obj/item/clothing/tie/armband/engine) + +/obj/item/clothing/under/rank/security/science/New() + attachTie(new /obj/item/clothing/tie/armband/science) + +/obj/item/clothing/under/rank/security/med/New() + attachTie(new /obj/item/clothing/tie/armband/medblue) \ No newline at end of file diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index cc9a7b6a66d..4edd13f156a 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -20,9 +20,9 @@ hide(T.intact) - Del() + Destroy() if(Beacon) - del(Beacon) + qdel(Beacon) ..() // update the invisibility and icon diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm index ae4e13f1516..44b7e583929 100644 --- a/code/game/machinery/Freezer.dm +++ b/code/game/machinery/Freezer.dm @@ -43,11 +43,6 @@ default_deconstruction_crowbar(I) if(default_change_direction_wrench(user, I)) - if(node) - disconnect(node) - initialize() - if(node) - node.update_icon() return /obj/machinery/atmospherics/unary/cold_sink/freezer/update_icon() @@ -165,11 +160,6 @@ default_deconstruction_crowbar(I) if(default_change_direction_wrench(user, I)) - if(node) - disconnect(node) - initialize() - if(node) - node.update_icon() return /obj/machinery/atmospherics/unary/heat_reservoir/heater/update_icon() diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index fb1a05ff1dd..f59ff9c6f1e 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -1,93 +1,93 @@ -/obj/machinery/pdapainter - name = "\improper PDA painter" - desc = "A PDA painting machine. To use, simply insert your PDA and choose the desired preset paint scheme." - icon = 'icons/obj/pda.dmi' - icon_state = "pdapainter" - density = 1 - anchored = 1 - var/obj/item/device/pda/storedpda = null - var/list/colorlist = list() - - -/obj/machinery/pdapainter/update_icon() - overlays.Cut() - - if(stat & BROKEN) - icon_state = "[initial(icon_state)]-broken" - return - - if(storedpda) - overlays += "[initial(icon_state)]-closed" - - if(powered()) - icon_state = initial(icon_state) - else - icon_state = "[initial(icon_state)]-off" - - return - -/obj/machinery/pdapainter/New() - ..() - var/blocked = list(/obj/item/device/pda/ai/pai, /obj/item/device/pda/ai, /obj/item/device/pda/heads, - /obj/item/device/pda/clear, /obj/item/device/pda/syndicate) - - for(var/P in typesof(/obj/item/device/pda)-blocked) - var/obj/item/device/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 - - -/obj/machinery/pdapainter/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, /obj/item/device/pda)) - if(storedpda) - user << "There is already a PDA inside." - return - else - var/obj/item/device/pda/P = usr.get_active_hand() - if(istype(P)) - user.drop_item() - storedpda = P - P.loc = src - P.add_fingerprint(usr) - update_icon() - - -/obj/machinery/pdapainter/attack_hand(mob/user as mob) - ..() - - src.add_fingerprint(user) - - if(storedpda) - var/obj/item/device/pda/P - P = input(user, "Select your color!", "PDA Painting") as null|anything in colorlist - if(!P) - return - if(!in_range(src, user)) - return - - storedpda.icon_state = P.icon_state - storedpda.desc = P.desc - - else - user << "The [src] is empty." - - -/obj/machinery/pdapainter/verb/ejectpda() - set name = "Eject PDA" - set category = "Object" - set src in oview(1) - - if(storedpda) - storedpda.loc = get_turf(src.loc) - storedpda = null - update_icon() - else - usr << "The [src] is empty." - - -/obj/machinery/pdapainter/power_change() - ..() +/obj/machinery/pdapainter + name = "\improper PDA painter" + desc = "A PDA painting machine. To use, simply insert your PDA and choose the desired preset paint scheme." + icon = 'icons/obj/pda.dmi' + icon_state = "pdapainter" + density = 1 + anchored = 1 + var/obj/item/device/pda/storedpda = null + var/list/colorlist = list() + + +/obj/machinery/pdapainter/update_icon() + overlays.Cut() + + if(stat & BROKEN) + icon_state = "[initial(icon_state)]-broken" + return + + if(storedpda) + overlays += "[initial(icon_state)]-closed" + + if(powered()) + icon_state = initial(icon_state) + else + icon_state = "[initial(icon_state)]-off" + + return + +/obj/machinery/pdapainter/New() + ..() + var/blocked = list(/obj/item/device/pda/ai/pai, /obj/item/device/pda/ai, /obj/item/device/pda/heads, + /obj/item/device/pda/clear, /obj/item/device/pda/syndicate) + + for(var/P in typesof(/obj/item/device/pda)-blocked) + var/obj/item/device/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 + + +/obj/machinery/pdapainter/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(istype(O, /obj/item/device/pda)) + if(storedpda) + user << "There is already a PDA inside." + return + else + var/obj/item/device/pda/P = usr.get_active_hand() + if(istype(P)) + user.drop_item() + storedpda = P + P.loc = src + P.add_fingerprint(usr) + update_icon() + + +/obj/machinery/pdapainter/attack_hand(mob/user as mob) + ..() + + src.add_fingerprint(user) + + if(storedpda) + var/obj/item/device/pda/P + P = input(user, "Select your color!", "PDA Painting") as null|anything in colorlist + if(!P) + return + if(!in_range(src, user)) + return + + storedpda.icon_state = P.icon_state + storedpda.desc = P.desc + + else + user << "The [src] is empty." + + +/obj/machinery/pdapainter/verb/ejectpda() + set name = "Eject PDA" + set category = "Object" + set src in oview(1) + + if(storedpda) + storedpda.loc = get_turf(src.loc) + storedpda = null + update_icon() + else + usr << "The [src] is empty." + + +/obj/machinery/pdapainter/power_change() + ..() update_icon() \ No newline at end of file diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 9a68f02820b..657997e2506 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -61,12 +61,12 @@ for(var/atom/movable/A in src) A.loc = loc A.blob_act() - del(src) + qdel(src) /obj/machinery/sleeper/attack_animal(var/mob/living/simple_animal/M)//Stop putting hostile mobs in things guise if(M.environment_smash) visible_message("[M.name] smashes [src] apart!") - del(src) + qdel(src) return /obj/machinery/sleeper/attackby(obj/item/I, mob/user) @@ -88,21 +88,21 @@ for(var/atom/movable/A in src) A.loc = loc ex_act(severity) - del(src) + qdel(src) return if(2.0) if(prob(50)) for(var/atom/movable/A in src) A.loc = loc ex_act(severity) - del(src) + qdel(src) return if(3.0) if(prob(25)) for(var/atom/movable/A in src) A.loc = loc ex_act(severity) - del(src) + qdel(src) /obj/machinery/sleeper/emp_act(severity) @@ -131,7 +131,7 @@ ..() open_machine() -/obj/machinery/sleeper/Del() +/obj/machinery/sleeper/Destroy() var/turf/T = loc T.contents += contents ..() diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 9b030f21d60..23352d566ac 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -1,124 +1,124 @@ -/obj/machinery/ai_slipper - name = "\improper AI liquid dispenser" - icon = 'icons/obj/device.dmi' - icon_state = "motion3" - layer = 3 - anchored = 1.0 - var/uses = 20 - var/disabled = 1 - var/lethal = 0 - var/locked = 1 - var/cooldown_time = 0 - var/cooldown_timeleft = 0 - var/cooldown_on = 0 - req_access = list(access_ai_upload) - -/obj/machinery/ai_slipper/power_change() - if(stat & BROKEN) - return - else - if( powered() ) - stat &= ~NOPOWER - else - icon_state = "motion0" - stat |= NOPOWER - -/obj/machinery/ai_slipper/proc/setState(var/enabled, var/uses) - src.disabled = disabled - src.uses = uses - src.power_change() - -/obj/machinery/ai_slipper/attackby(obj/item/weapon/W, mob/user) - if(stat & (NOPOWER|BROKEN)) - return - if (istype(user, /mob/living/silicon)) - return src.attack_hand(user) - else // trying to unlock the interface - if (src.allowed(usr)) - locked = !locked - user << "You [ locked ? "lock" : "unlock"] the device." - if (locked) - if (user.machine==src) - user.unset_machine() - user << browse(null, "window=ai_slipper") - else - if (user.machine==src) - src.attack_hand(usr) - else - user << "\red Access denied." - return - return - -/obj/machinery/ai_slipper/attack_ai(mob/user as mob) - return attack_hand(user) - -/obj/machinery/ai_slipper/attack_hand(mob/user as mob) - if(stat & (NOPOWER|BROKEN)) - return - if ( (get_dist(src, user) > 1 )) - if (!istype(user, /mob/living/silicon)) - user << text("Too far away.") - user.unset_machine() - user << browse(null, "window=ai_slipper") - return - - user.set_machine(src) - var/loc = src.loc - if (istype(loc, /turf)) - loc = loc:loc - if (!istype(loc, /area)) - user << text("Turret badly positioned - loc.loc is [].", loc) - return - var/area/area = loc - var/t = "AI Liquid Dispenser ([format_text(area.name)])
    " - - if(src.locked && (!istype(user, /mob/living/silicon))) - t += "(Swipe ID card to unlock control panel.)
    " - else - t += text("Dispenser [] - []?
    \n", src.disabled?"deactivated":"activated", src, src.disabled?"Enable":"Disable") - t += text("Uses Left: [uses]. Activate the dispenser?
    \n") - - user << browse(t, "window=computer;size=575x450") - onclose(user, "computer") - return - -/obj/machinery/ai_slipper/Topic(href, href_list) - if(..()) - return - if (src.locked) - if (!istype(usr, /mob/living/silicon)) - usr << "Control panel is locked!" - return - if (href_list["toggleOn"]) - src.disabled = !src.disabled - icon_state = src.disabled? "motion0":"motion3" - if (href_list["toggleUse"]) - if(cooldown_on || disabled) - return - else - new /obj/effect/effect/foam(src.loc) - src.uses-- - cooldown_on = 1 - cooldown_time = world.timeofday + 100 - slip_process() - return - - src.attack_hand(usr) - return - -/obj/machinery/ai_slipper/proc/slip_process() - while(cooldown_time - world.timeofday > 0) - var/ticksleft = cooldown_time - world.timeofday - - if(ticksleft > 1e5) - cooldown_time = world.timeofday + 10 // midnight rollover - - - cooldown_timeleft = (ticksleft / 10) - sleep(5) - if (uses <= 0) - return - if (uses >= 0) - cooldown_on = 0 - src.power_change() +/obj/machinery/ai_slipper + name = "\improper AI liquid dispenser" + icon = 'icons/obj/device.dmi' + icon_state = "motion3" + layer = 3 + anchored = 1.0 + var/uses = 20 + var/disabled = 1 + var/lethal = 0 + var/locked = 1 + var/cooldown_time = 0 + var/cooldown_timeleft = 0 + var/cooldown_on = 0 + req_access = list(access_ai_upload) + +/obj/machinery/ai_slipper/power_change() + if(stat & BROKEN) + return + else + if( powered() ) + stat &= ~NOPOWER + else + icon_state = "motion0" + stat |= NOPOWER + +/obj/machinery/ai_slipper/proc/setState(var/enabled, var/uses) + src.disabled = disabled + src.uses = uses + src.power_change() + +/obj/machinery/ai_slipper/attackby(obj/item/weapon/W, mob/user) + if(stat & (NOPOWER|BROKEN)) + return + if (istype(user, /mob/living/silicon)) + return src.attack_hand(user) + else // trying to unlock the interface + if (src.allowed(usr)) + locked = !locked + user << "You [ locked ? "lock" : "unlock"] the device." + if (locked) + if (user.machine==src) + user.unset_machine() + user << browse(null, "window=ai_slipper") + else + if (user.machine==src) + src.attack_hand(usr) + else + user << "\red Access denied." + return + return + +/obj/machinery/ai_slipper/attack_ai(mob/user as mob) + return attack_hand(user) + +/obj/machinery/ai_slipper/attack_hand(mob/user as mob) + if(stat & (NOPOWER|BROKEN)) + return + if ( (get_dist(src, user) > 1 )) + if (!istype(user, /mob/living/silicon)) + user << text("Too far away.") + user.unset_machine() + user << browse(null, "window=ai_slipper") + return + + user.set_machine(src) + var/loc = src.loc + if (istype(loc, /turf)) + loc = loc:loc + if (!istype(loc, /area)) + user << text("Turret badly positioned - loc.loc is [].", loc) + return + var/area/area = loc + var/t = "AI Liquid Dispenser ([format_text(area.name)])
    " + + if(src.locked && (!istype(user, /mob/living/silicon))) + t += "(Swipe ID card to unlock control panel.)
    " + else + t += text("Dispenser [] - []?
    \n", src.disabled?"deactivated":"activated", src, src.disabled?"Enable":"Disable") + t += text("Uses Left: [uses]. Activate the dispenser?
    \n") + + user << browse(t, "window=computer;size=575x450") + onclose(user, "computer") + return + +/obj/machinery/ai_slipper/Topic(href, href_list) + if(..()) + return + if (src.locked) + if (!istype(usr, /mob/living/silicon)) + usr << "Control panel is locked!" + return + if (href_list["toggleOn"]) + src.disabled = !src.disabled + icon_state = src.disabled? "motion0":"motion3" + if (href_list["toggleUse"]) + if(cooldown_on || disabled) + return + else + new /obj/effect/effect/foam(src.loc) + src.uses-- + cooldown_on = 1 + cooldown_time = world.timeofday + 100 + slip_process() + return + + src.attack_hand(usr) + return + +/obj/machinery/ai_slipper/proc/slip_process() + while(cooldown_time - world.timeofday > 0) + var/ticksleft = cooldown_time - world.timeofday + + if(ticksleft > 1e5) + cooldown_time = world.timeofday + 10 // midnight rollover + + + cooldown_timeleft = (ticksleft / 10) + sleep(5) + if (uses <= 0) + return + if (uses >= 0) + cooldown_on = 0 + src.power_change() return \ No newline at end of file diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 66f7f8c480e..206d7cc15be 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -816,7 +816,7 @@ table tr:first-child th:first-child { border: none;} spawn(20) cable.amount -= 5 if(!cable.amount) - del(cable) + qdel(cable) user << "You wire the air alarm!" wires.wires_status = 0 @@ -829,14 +829,14 @@ table tr:first-child th:first-child { border: none;} buildstage = 1 update_icon() user.drop_item() - del(W) + qdel(W) return if(istype(W, /obj/item/weapon/wrench)) user << "You detach \the [src] from the wall!" playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) new /obj/item/alarm_frame( user.loc ) - del(src) + qdel(src) return return ..() @@ -878,7 +878,7 @@ Code shamelessly copied from apc_frame /obj/item/alarm_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 ) - del(src) + qdel(src) return ..() @@ -905,7 +905,7 @@ Code shamelessly copied from apc_frame new /obj/machinery/alarm(loc, ndir, 1) - del(src) + qdel(src) /* @@ -1006,7 +1006,7 @@ FIRE ALARM coil.amount -= 5 if(!coil.amount) - del(coil) + qdel(coil) buildstage = 2 user << "You wire \the [src]!" @@ -1023,7 +1023,7 @@ FIRE ALARM if(0) if(istype(W, /obj/item/weapon/firealarm_electronics)) user << "You insert the circuit!" - del(W) + qdel(W) buildstage = 1 update_icon() @@ -1032,7 +1032,7 @@ FIRE ALARM var/obj/item/firealarm_frame/frame = new /obj/item/firealarm_frame() frame.loc = user.loc playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - del(src) + qdel(src) return src.alarm() @@ -1213,7 +1213,7 @@ Code shamelessly copied from apc_frame /obj/item/firealarm_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 ) - del(src) + qdel(src) return ..() @@ -1240,7 +1240,7 @@ Code shamelessly copied from apc_frame new /obj/machinery/firealarm(loc, ndir, 1) - del(src) + qdel(src) /* * Party button diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 7f843721df1..0897335b5ed 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -22,58 +22,61 @@ obj/machinery/air_sensor var/datum/radio_frequency/radio_connection - update_icon() +obj/machinery/air_sensor/update_icon() icon_state = "gsensor[on]" - process() - if(on) - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.data["tag"] = id_tag - signal.data["timestamp"] = world.time +obj/machinery/air_sensor/process() + if(on) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.data["tag"] = id_tag + signal.data["timestamp"] = world.time - var/datum/gas_mixture/air_sample = return_air() + var/datum/gas_mixture/air_sample = return_air() - if(output&1) - signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1)) - if(output&2) - signal.data["temperature"] = round(air_sample.temperature,0.1) + if(output&1) + signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1)) + if(output&2) + signal.data["temperature"] = round(air_sample.temperature,0.1) - if(output>4) - var/total_moles = air_sample.total_moles() - if(total_moles > 0) - if(output&4) - signal.data["oxygen"] = round(100*air_sample.oxygen/total_moles,0.1) - if(output&8) - signal.data["toxins"] = round(100*air_sample.toxins/total_moles,0.1) - if(output&16) - signal.data["nitrogen"] = round(100*air_sample.nitrogen/total_moles,0.1) - if(output&32) - signal.data["carbon_dioxide"] = round(100*air_sample.carbon_dioxide/total_moles,0.1) - else - signal.data["oxygen"] = 0 - signal.data["toxins"] = 0 - signal.data["nitrogen"] = 0 - signal.data["carbon_dioxide"] = 0 - signal.data["sigtype"]="status" - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + if(output>4) + var/total_moles = air_sample.total_moles() + if(total_moles > 0) + if(output&4) + signal.data["oxygen"] = round(100*air_sample.oxygen/total_moles,0.1) + if(output&8) + signal.data["toxins"] = round(100*air_sample.toxins/total_moles,0.1) + if(output&16) + signal.data["nitrogen"] = round(100*air_sample.nitrogen/total_moles,0.1) + if(output&32) + signal.data["carbon_dioxide"] = round(100*air_sample.carbon_dioxide/total_moles,0.1) + else + signal.data["oxygen"] = 0 + signal.data["toxins"] = 0 + signal.data["nitrogen"] = 0 + signal.data["carbon_dioxide"] = 0 + signal.data["sigtype"]="status" + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) +obj/machinery/air_sensor/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) - initialize() +obj/machinery/air_sensor/initialize() + set_frequency(frequency) + +obj/machinery/air_sensor/New() + ..() + + if(radio_controller) set_frequency(frequency) - New() +obj/machinery/computer/general_air_control/Destroy() + radio_controller.remove_object(src, frequency) ..() - if(radio_controller) - set_frequency(frequency) - obj/machinery/computer/general_air_control icon = 'icons/obj/computer.dmi' icon_state = "tank" @@ -87,306 +90,357 @@ obj/machinery/computer/general_air_control var/list/sensor_information = list() var/datum/radio_frequency/radio_connection - attack_hand(mob/user) - if(..(user)) - return - //user << browse(return_text(),"window=computer") - user.set_machine(src) - //onclose(user, "computer") +obj/machinery/computer/general_air_control/New() + ..() - var/datum/browser/popup = new(user, "computer", name, 465, 390) - popup.set_content(return_text()) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - - interact(mob/user) - attack_hand(user) - - process() - ..() - src.updateDialog() - - receive_signal(datum/signal/signal) - if(!signal || signal.encryption) return - - var/id_tag = signal.data["tag"] - if(!id_tag || !sensors.Find(id_tag)) return - - sensor_information[id_tag] = signal.data - - proc/return_text() - var/sensor_data - if(sensors.len) - for(var/id_tag in sensors) - var/long_name = sensors[id_tag] - var/list/data = sensor_information[id_tag] - var/sensor_part = "

    [long_name]

    " - - if(data) - if(data["pressure"]) - sensor_part += " Pressure: [data["pressure"]] kPa
    " - else - sensor_part += " Pressure: No pressure detected
    " - if(data["temperature"]) - sensor_part += " Temperature: [data["temperature"]] K
    " - if(data["oxygen"]||data["toxins"]||data["nitrogen"]||data["carbon_dioxide"]) - sensor_part += " Gas Composition :" - if(data["oxygen"]) - sensor_part += "[data["oxygen"]]% O2; " - if(data["nitrogen"]) - sensor_part += "[data["nitrogen"]]% N; " - if(data["carbon_dioxide"]) - sensor_part += "[data["carbon_dioxide"]]% CO2; " - if(data["toxins"]) - sensor_part += "[data["toxins"]]% TX; " - - else - sensor_part = "[long_name] can not be found!
    " - - sensor_data += sensor_part - - else - sensor_data = "No sensors connected." - - var/output = {" -

    Sensor Data

    [sensor_data]"} - - return output - - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) - - initialize() + if(radio_controller) set_frequency(frequency) - large_tank_control - icon = 'icons/obj/computer.dmi' - icon_state = "tank" +obj/machinery/computer/general_air_control/attack_hand(mob/user) + if(..(user)) + return + //user << browse(return_text(),"window=computer") + user.set_machine(src) + //onclose(user, "computer") - var/input_tag - var/output_tag + var/datum/browser/popup = new(user, "computer", name, 465, 390) + popup.set_content(return_text()) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() - var/list/input_info - var/list/output_info +obj/machinery/computer/general_air_control/interact(mob/user) + attack_hand(user) - var/pressure_setting = ONE_ATMOSPHERE * 45 +obj/machinery/computer/general_air_control/process() + ..() + src.updateDialog() +obj/machinery/computer/general_air_control/receive_signal(datum/signal/signal) + if(!signal || signal.encryption) return - return_text() - var/output = ..() + var/id_tag = signal.data["tag"] + if(!id_tag || !sensors.Find(id_tag)) return + + sensor_information = list() + + sensor_information[id_tag] = signal.data + +obj/machinery/computer/general_air_control/proc/return_text() + var/sensor_data + if(sensors.len) + for(var/id_tag in sensors) + var/long_name = sensors[id_tag] + var/list/data = sensor_information[id_tag] + var/sensor_part = "

    [long_name]

    " + + if(data) + if(data["pressure"]) + sensor_part += " Pressure: [data["pressure"]] kPa
    " + else + sensor_part += " Pressure: No pressure detected
    " + if(data["temperature"]) + sensor_part += " Temperature: [data["temperature"]] K
    " + if(data["oxygen"]||data["toxins"]||data["nitrogen"]||data["carbon_dioxide"]) + sensor_part += " Gas Composition : " + if(data["oxygen"]) + sensor_part += "[data["oxygen"]]% O2; " + if(data["nitrogen"]) + sensor_part += "[data["nitrogen"]]% N; " + if(data["carbon_dioxide"]) + sensor_part += "[data["carbon_dioxide"]]% CO2; " + if(data["toxins"]) + sensor_part += "[data["toxins"]]% TX; " + + else + sensor_part = "[long_name] can not be found!
    " + + sensor_data += sensor_part + + else + sensor_data = "No sensors connected." + + var/output = {" +

    Sensor Data

    [sensor_data]"} + + return output + +obj/machinery/computer/general_air_control/Destroy() + radio_controller.remove_object(src, frequency) + ..() + +obj/machinery/computer/general_air_control/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) + +obj/machinery/computer/general_air_control/initialize() + set_frequency(frequency) + +obj/machinery/computer/general_air_control/large_tank_control + icon = 'icons/obj/computer.dmi' + icon_state = "tank" + + var/input_tag + var/output_tag + frequency = 1441 + circuit = /obj/item/weapon/circuitboard/large_tank_control + + var/list/input_info + var/list/output_info + + var/pressure_setting = ONE_ATMOSPHERE * 45 + +obj/machinery/computer/general_air_control/large_tank_control/proc/reconnect(mob/user) //This hacky madness is the evidence of the fact that a lot of machines were never meant to be constructable, im so sorry you had to see this + var/list/IO = list() + var/datum/radio_frequency/air_freq = radio_controller.return_frequency(1443) + var/datum/radio_frequency/gas_freq = radio_controller.return_frequency(1441) + var/list/devices = air_freq.devices["_default"] + devices |= gas_freq.devices["_default"] + for(var/obj/machinery/atmospherics/unary/vent_pump/U in devices) + var/list/text = text2list(U.id_tag, "_") + IO |= text[1] + for(var/obj/machinery/atmospherics/unary/outlet_injector/U in devices) + var/list/text = text2list(U.id, "_") + IO |= text[1] + if(!IO.len) + user << "No machinery detected." + var/S = input("Select the device set: ", "Selection", IO[1]) as anything in IO + if(src) + src.input_tag = "[S]_in" + src.output_tag = "[S]_out" + name = "[uppertext(S)] Supply Control" + var/list/new_devices = gas_freq.devices["4"] + new_devices |= air_freq.devices["4"] + for(var/obj/machinery/air_sensor/U in new_devices) + var/list/text = text2list(U.id_tag, "_") + if(text[1] == S) + sensors = list("[S]_sensor" = "Tank") + break + + if(S == "air") + frequency = 1443 + else + frequency = 1441 + + set_frequency(frequency) + + for(var/obj/machinery/atmospherics/unary/outlet_injector/U in devices) + U.broadcast_status() + + for(var/obj/machinery/atmospherics/unary/vent_pump/U in devices) + U.broadcast_status() + +obj/machinery/computer/general_air_control/large_tank_control/return_text() + var/output = "Reconnect
    " + output += ..() //if(signal.data) // input_info = signal.data // Attempting to fix intake control - output += "

    Tank Control System

    " - if(input_info) - var/power = (input_info["power"]) - var/volume_rate = input_info["volume_rate"] - output += {"Input: [power?("Injecting"):("On Hold")] Refresh
    + output += "

    Tank Control System

    " + if(input_info) + var/power = (input_info["power"]) + var/volume_rate = input_info["volume_rate"] + output += {"Input: [power?("Injecting"):("On Hold")] Refresh
    Rate: [volume_rate] L/sec
    "} - output += "Command: Toggle Power
    " + output += "Command: Toggle Power
    " - else - output += "ERROR: Can not find input port Search
    " + else + output += "ERROR: Can not find input port
    " - output += "
    " + output += "
    " - if(output_info) - var/power = (output_info["power"]) - var/output_pressure = output_info["internal"] - output += {"Output: [power?("Open"):("On Hold")] Refresh
    + if(output_info) + var/power = (output_info["power"]) + var/output_pressure = output_info["internal"] + output += {"Output: [power?("Open"):("On Hold")] Refresh
    Max Output Pressure: [output_pressure] kPa
    "} - output += "Command: Toggle Power Set Pressure
    " + output += "Command: Toggle Power Set Pressure
    " - else - output += "ERROR: Can not find output port Search
    " + else + output += "ERROR: Can not find output port
    " - output += "Max Output Pressure Set: - - - - [pressure_setting] kPa + + + +
    " + output += "Max Output Pressure Set: - - - - [pressure_setting] kPa + + + +
    " - return output + return output - receive_signal(datum/signal/signal) - if(!signal || signal.encryption) return +obj/machinery/computer/general_air_control/large_tank_control/receive_signal(datum/signal/signal) + if(!signal || signal.encryption) return - var/id_tag = signal.data["tag"] + var/id_tag = signal.data["tag"] - if(input_tag == id_tag) - input_info = signal.data - else if(output_tag == id_tag) - output_info = signal.data - else - ..(signal) + if(input_tag == id_tag) + input_info = signal.data + else if(output_tag == id_tag) + output_info = signal.data + else + ..(signal) - Topic(href, href_list) - if(..()) - return +obj/machinery/computer/general_air_control/large_tank_control/Topic(href, href_list) + if(..()) + return - if(href_list["adj_pressure"]) - var/change = text2num(href_list["adj_pressure"]) - pressure_setting = Clamp(pressure_setting + change, 0, 50*ONE_ATMOSPHERE) - spawn(1) - src.updateDialog() - return + if(href_list["adj_pressure"]) + var/change = text2num(href_list["adj_pressure"]) + pressure_setting = Clamp(pressure_setting + change, 0, 50*ONE_ATMOSPHERE) + spawn(1) + src.updateDialog() + return - if(!radio_connection) - return 0 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - if(href_list["in_refresh_status"]) - input_info = null - signal.data = list ("tag" = input_tag, "status") + if(!radio_connection) + return 0 + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + if(href_list["reconnect"]) + reconnect(usr) + if(href_list["in_refresh_status"]) + input_info = null + signal.data = list ("tag" = input_tag, "status") - if(href_list["in_toggle_injector"]) - input_info = null - signal.data = list ("tag" = input_tag, "power_toggle") + if(href_list["in_toggle_injector"]) + input_info = null + signal.data = list ("tag" = input_tag, "power_toggle") - if(href_list["out_refresh_status"]) - output_info = null - signal.data = list ("tag" = output_tag, "status") + if(href_list["out_refresh_status"]) + output_info = null + signal.data = list ("tag" = output_tag, "status") - if(href_list["out_toggle_power"]) - output_info = null - signal.data = list ("tag" = output_tag, "power_toggle") + if(href_list["out_toggle_power"]) + output_info = null + signal.data = list ("tag" = output_tag, "power_toggle") - if(href_list["out_set_pressure"]) - output_info = null - signal.data = list ("tag" = output_tag, "set_internal_pressure" = "[pressure_setting]") + if(href_list["out_set_pressure"]) + output_info = null + signal.data = list ("tag" = output_tag, "set_internal_pressure" = "[pressure_setting]") - signal.data["sigtype"]="command" - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + signal.data["sigtype"]="command" + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - spawn(5) - src.updateDialog() + spawn(5) + src.updateDialog() - fuel_injection - icon = 'icons/obj/computer.dmi' - icon_state = "atmos" +obj/machinery/computer/general_air_control/fuel_injection + icon = 'icons/obj/computer.dmi' + icon_state = "atmos" - var/device_tag - var/list/device_info + var/device_tag + var/list/device_info - var/automation = 0 + var/automation = 0 - var/cutoff_temperature = 2000 - var/on_temperature = 1200 + var/cutoff_temperature = 2000 + var/on_temperature = 1200 - process() - if(automation) - if(!radio_connection) - return 0 +obj/machinery/computer/general_air_control/fuel_injection/process() + if(automation) + if(!radio_connection) + return 0 - var/injecting = 0 - for(var/id_tag in sensor_information) - var/list/data = sensor_information[id_tag] - if(data["temperature"]) - if(data["temperature"] >= cutoff_temperature) - injecting = 0 - break - if(data["temperature"] <= on_temperature) - injecting = 1 + var/injecting = 0 + for(var/id_tag in sensor_information) + var/list/data = sensor_information[id_tag] + if(data["temperature"]) + if(data["temperature"] >= cutoff_temperature) + injecting = 0 + break + if(data["temperature"] <= on_temperature) + injecting = 1 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src - signal.data = list( - "tag" = device_tag, - "power" = injecting, - "sigtype"="command" - ) + signal.data = list( + "tag" = device_tag, + "power" = injecting, + "sigtype"="command" + ) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - ..() + ..() - return_text() - var/output = ..() +obj/machinery/computer/general_air_control/fuel_injection/return_text() + var/output = ..() - output += "Fuel Injection System
    " - if(device_info) - var/power = device_info["power"] - var/volume_rate = device_info["volume_rate"] - output += {"Status: [power?("Injecting"):("On Hold")] Refresh
    + output += "Fuel Injection System
    " + if(device_info) + var/power = device_info["power"] + var/volume_rate = device_info["volume_rate"] + output += {"Status: [power?("Injecting"):("On Hold")] Refresh
    Rate: [volume_rate] L/sec
    "} - if(automation) - output += "Automated Fuel Injection: Engaged
    " - output += "Injector Controls Locked Out
    " - else - output += "Automated Fuel Injection: Disengaged
    " - output += "Injector: Toggle Power Inject (1 Cycle)
    " + if(automation) + output += "Automated Fuel Injection: Engaged
    " + output += "Injector Controls Locked Out
    " + else + output += "Automated Fuel Injection: Disengaged
    " + output += "Injector: Toggle Power Inject (1 Cycle)
    " - else - output += "ERROR: Can not find device Search
    " + else + output += "ERROR: Can not find device Search
    " - return output + return output - receive_signal(datum/signal/signal) - if(!signal || signal.encryption) return +obj/machinery/computer/general_air_control/fuel_injection/receive_signal(datum/signal/signal) + if(!signal || signal.encryption) return - var/id_tag = signal.data["tag"] + var/id_tag = signal.data["tag"] - if(device_tag == id_tag) - device_info = signal.data - else - ..(signal) + if(device_tag == id_tag) + device_info = signal.data + else + ..(signal) - Topic(href, href_list) - if(..()) - return +obj/machinery/computer/general_air_control/fuel_injection/Topic(href, href_list) + if(..()) + return - if(href_list["refresh_status"]) - device_info = null - if(!radio_connection) - return 0 + if(href_list["refresh_status"]) + device_info = null + if(!radio_connection) + return 0 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - signal.data = list( - "tag" = device_tag, - "status", - "sigtype"="command" - ) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + signal.data = list( + "tag" = device_tag, + "status", + "sigtype"="command" + ) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - if(href_list["toggle_automation"]) - automation = !automation + if(href_list["toggle_automation"]) + automation = !automation - if(href_list["toggle_injector"]) - device_info = null - if(!radio_connection) - return 0 + if(href_list["toggle_injector"]) + device_info = null + if(!radio_connection) + return 0 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - signal.data = list( - "tag" = device_tag, - "power_toggle", - "sigtype"="command" - ) - - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - - if(href_list["injection"]) - if(!radio_connection) - return 0 - - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - signal.data = list( - "tag" = device_tag, - "inject", - "sigtype"="command" - ) - - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + signal.data = list( + "tag" = device_tag, + "power_toggle", + "sigtype"="command" + ) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + if(href_list["injection"]) + if(!radio_connection) + return 0 + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + signal.data = list( + "tag" = device_tag, + "inject", + "sigtype"="command" + ) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index c2ca35aba10..4c2c0bfbde1 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -213,14 +213,14 @@ update_flag switch(severity) if(1.0) if(destroyed || prob(30)) - del(src) + qdel(src) else src.health = 0 healthcheck() return if(2.0) if(destroyed) - del(src) + qdel(src) else src.health -= rand(40, 100) healthcheck() diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 23f96f27f0c..896e042696b 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -96,7 +96,7 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe_meter(src.loc) - del(src) + qdel(src) return ..() diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 76021357ae4..7dc6ea0347c 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -26,7 +26,7 @@ else update_icon() - Del() + Destroy() del(air_contents) ..() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 2daf3184d7d..61413cc47a2 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -179,7 +179,7 @@ var/global/list/autolathe_recipes_hidden = list( \ src.g_amount += g_amt * amount user << "You insert [amount] sheet[amount>1 ? "s" : ""] to the autolathe." if (O && O.loc == src) - del(O) + qdel(O) busy = 0 src.updateUsrDialog() diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index b197385018b..f957a2d3a46 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -27,7 +27,7 @@ SetLuminosity(0) /obj/machinery/bot/proc/explode() - del(src) + qdel(src) /obj/machinery/bot/proc/healthcheck() if (src.health <= 0) diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index ce39df4ad50..b67a6b018b8 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -304,7 +304,7 @@ text("[src.oddbutton ? "Yes" : "No" src.cleaning = 1 spawn(50) src.cleaning = 0 - del(target) + qdel(target) src.icon_state = "cleanbot[src.on]" src.anchored = 0 src.target = null @@ -324,20 +324,20 @@ text("[src.oddbutton ? "Yes" : "No" var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - del(src) + qdel(src) return /obj/item/weapon/bucket_sensor/attackby(var/obj/item/W, mob/user as mob) ..() if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm)) user.drop_item() - del(W) + qdel(W) var/turf/T = get_turf(src.loc) var/obj/machinery/bot/cleanbot/A = new /obj/machinery/bot/cleanbot(T) A.name = src.created_name user << "You add the robot arm to the bucket and sensor assembly. Beep boop!" user.unEquip(src, 1) - del src + qdel(src) else if (istype(W, /obj/item/weapon/pen)) var/t = copytext(stripped_input(user, "Enter new robot name", src.name, src.created_name),1,MAX_NAME_LEN) diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index d748856d1bf..b1792a5a6b3 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -791,7 +791,7 @@ Auto Patrol: []"}, s.start() new /obj/effect/decal/cleanable/oil(src.loc) - del(src) + qdel(src) /obj/machinery/bot/ed209/proc/shootAt(var/mob/target) @@ -897,7 +897,7 @@ Auto Patrol: []"}, if(0,1) if(istype(W, /obj/item/robot_parts/l_leg) || istype(W, /obj/item/robot_parts/r_leg)) user.drop_item() - del(W) + qdel(W) build_step++ user << "You add the robot leg to [src]." name = "legs/frame assembly" @@ -915,7 +915,7 @@ Auto Patrol: []"}, lasercolor = "b" if(lasercolor || istype(W, /obj/item/clothing/suit/armor/vest)) user.drop_item() - del(W) + qdel(W) build_step++ user << "You add the armor to [src]." name = "vest/legs/frame assembly" @@ -944,7 +944,7 @@ Auto Patrol: []"}, return user.drop_item() - del(W) + qdel(W) build_step++ user << "You add the helmet to [src]." name = "covered and shielded frame assembly" @@ -954,7 +954,7 @@ Auto Patrol: []"}, if(5) if(isprox(W)) user.drop_item() - del(W) + qdel(W) build_step++ user << "You add the prox sensor to [src]." name = "covered, shielded and sensored frame assembly" @@ -994,7 +994,7 @@ Auto Patrol: []"}, src.item_state = "[lasercolor]ed209_taser" src.icon_state = "[lasercolor]ed209_taser" user.drop_item() - del(W) + qdel(W) if(8) if(istype(W, /obj/item/weapon/screwdriver)) @@ -1014,9 +1014,9 @@ Auto Patrol: []"}, var/turf/T = get_turf(src) new /obj/machinery/bot/ed209(T,created_name,lasercolor) user.drop_item() - del(W) + qdel(W) user.unEquip(src, 1) - del(src) + qdel(src) /obj/machinery/bot/ed209/bullet_act(var/obj/item/projectile/Proj) @@ -1043,9 +1043,9 @@ Auto Patrol: []"}, /obj/machinery/bot/ed209/bluetag/New()//If desired, you spawn red and bluetag bots easily new /obj/machinery/bot/ed209(get_turf(src),null,"b") - del(src) + qdel(src) /obj/machinery/bot/ed209/redtag/New() new /obj/machinery/bot/ed209(get_turf(src),null,"r") - del(src) + qdel(src) diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm index d8160c1ee72..963f2785dfb 100644 --- a/code/game/machinery/bots/floorbot.dm +++ b/code/game/machinery/bots/floorbot.dm @@ -331,7 +331,7 @@ T.amount -= i else src.amount += T.amount - del(T) + qdel(T) src.updateicon() src.target = null src.repairing = 0 @@ -351,7 +351,7 @@ var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel T.amount = 4 T.loc = M.loc - del(M) + qdel(M) src.target = null src.repairing = 0 @@ -387,7 +387,7 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - del(src) + qdel(src) return @@ -400,23 +400,23 @@ return if(user.s_active) user.s_active.close(user) - del(T) + qdel(T) var/obj/item/weapon/toolbox_tiles/B = new /obj/item/weapon/toolbox_tiles user.put_in_hands(B) user << "You add the tiles into the empty toolbox. They protrude from the top." user.unEquip(src, 1) - del(src) + qdel(src) /obj/item/weapon/toolbox_tiles/attackby(var/obj/item/W, mob/user as mob) ..() if(isprox(W)) - del(W) + qdel(W) var/obj/item/weapon/toolbox_tiles_sensor/B = new /obj/item/weapon/toolbox_tiles_sensor() B.created_name = src.created_name user.put_in_hands(B) user << "You add the sensor to the toolbox and tiles!" user.unEquip(src, 1) - del(src) + qdel(src) else if (istype(W, /obj/item/weapon/pen)) var/t = copytext(stripped_input(user, "Enter new robot name", src.name, src.created_name),1,MAX_NAME_LEN) @@ -430,13 +430,13 @@ /obj/item/weapon/toolbox_tiles_sensor/attackby(var/obj/item/W, mob/user as mob) ..() if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm)) - del(W) + qdel(W) var/turf/T = get_turf(user.loc) var/obj/machinery/bot/floorbot/A = new /obj/machinery/bot/floorbot(T) A.name = src.created_name user << "You add the robot arm to the odd looking toolbox assembly! Boop beep!" user.unEquip(src, 1) - del(src) + qdel(src) else if (istype(W, /obj/item/weapon/pen)) var/t = stripped_input(user, "Enter new robot name", src.name, src.created_name) diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index 97699e949fe..e40e9a21db2 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -476,7 +476,7 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - del(src) + qdel(src) return /obj/machinery/bot/medbot/Bump(M as mob|obj) //Leave no door unopened! @@ -551,11 +551,11 @@ else if(istype(src,/obj/item/weapon/storage/firstaid/o2)) A.skin = "o2" - del(S) + qdel(S) user.put_in_hands(A) user << "You add the robot arm to the first aid kit." user.unEquip(src, 1) - del(src) + qdel(src) /obj/item/weapon/firstaid_arm_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -572,7 +572,7 @@ if(0) if(istype(W, /obj/item/device/healthanalyzer)) user.drop_item() - del(W) + qdel(W) src.build_step++ user << "You add the health sensor to [src]." src.name = "First aid/robot arm/health analyzer assembly" @@ -581,7 +581,7 @@ if(1) if(isprox(W)) user.drop_item() - del(W) + qdel(W) src.build_step++ user << "You complete the Medibot! Beep boop." var/turf/T = get_turf(src) @@ -589,5 +589,5 @@ S.skin = src.skin S.name = src.created_name user.unEquip(src, 1) - del(src) + qdel(src) diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index a8a26761705..47a26e226c5 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -908,4 +908,4 @@ var/global/mulebot_count = 0 new /obj/effect/decal/cleanable/oil(src.loc) unload(0) - del(src) + qdel(src) diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index 42eff9005a2..7c2c15fed4d 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -682,7 +682,7 @@ Auto Patrol: []"}, s.start() new /obj/effect/decal/cleanable/oil(src.loc) - del(src) + qdel(src) /obj/machinery/bot/secbot/attack_alien(var/mob/living/carbon/alien/user as mob) ..() @@ -702,12 +702,12 @@ Auto Patrol: []"}, return if(S.secured) - del(S) + qdel(S) var/obj/item/weapon/secbot_assembly/A = new /obj/item/weapon/secbot_assembly user.put_in_hands(A) user << "You add the signaler to the helmet." user.unEquip(src, 1) - del(src) + qdel(src) else return @@ -733,7 +733,7 @@ Auto Patrol: []"}, user << "You add the prox sensor to [src]!" overlays += "hs_eye" name = "helmet/signaler/prox sensor assembly" - del(I) + qdel(I) else if(((istype(I, /obj/item/robot_parts/l_arm)) || (istype(I, /obj/item/robot_parts/r_arm))) && (build_step == 2)) user.drop_item() @@ -741,7 +741,7 @@ Auto Patrol: []"}, user << "You add the robot arm to [src]!" name = "helmet/signaler/prox sensor/robot arm assembly" overlays += "hs_arm" - del(I) + qdel(I) else if((istype(I, /obj/item/weapon/melee/baton)) && (build_step >= 3)) user.drop_item() @@ -750,8 +750,8 @@ Auto Patrol: []"}, var/obj/machinery/bot/secbot/S = new /obj/machinery/bot/secbot S.loc = get_turf(src) S.name = created_name - del(I) - del(src) + qdel(I) + qdel(src) else if(istype(I, /obj/item/weapon/pen)) var/t = copytext(stripped_input(user, "Enter new robot name", name, created_name),1,MAX_NAME_LEN) @@ -766,7 +766,7 @@ Auto Patrol: []"}, new /obj/item/device/assembly/signaler(get_turf(src)) new /obj/item/clothing/head/helmet(get_turf(src)) user << "You disconnect the signaler from the helmet." - del(src) + qdel(src) else if(build_step == 2) overlays -= "hs_eye" diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 7577a2ddbe7..b9386833cb3 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -48,7 +48,7 @@ if(z == 1 && prob(3)) deactivate() -/obj/machinery/camera/Del() +/obj/machinery/camera/Destroy() if(istype(bug)) bug.bugged_cameras -= src.c_tag ..() @@ -90,7 +90,7 @@ return /obj/machinery/camera/blob_act() - del(src) + qdel(src) return /obj/machinery/camera/proc/setViewRange(var/num = 7) @@ -131,7 +131,7 @@ if(assembly) assembly.loc = src.loc assembly.state = 1 - del(src) + qdel(src) // OTHER @@ -180,7 +180,7 @@ playsound(loc, 'sound/weapons/blade1.ogg', 50, 1) playsound(loc, "sparks", 50, 1) visible_message("\blue The camera has been sliced apart by [] with an energy blade!") - del(src) + qdel(src) else if(istype(W, /obj/item/device/laser_pointer)) var/obj/item/device/laser_pointer/L = W L.laser_act(src, user) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 09a548833d4..631d2eb9700 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -353,7 +353,7 @@ src.icon_state = "pod_g" src.occupant.ghostize() spawn(5) - del(src.occupant) + qdel(src.occupant) return /obj/machinery/clonepod/relaymove(mob/user as mob) @@ -372,21 +372,21 @@ for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) - del(src) + qdel(src) return if(2.0) if (prob(50)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) - del(src) + qdel(src) return if(3.0) if (prob(25)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) - del(src) + qdel(src) return return diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 79252be3b86..e4c6e621fee 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -136,7 +136,7 @@ // loadProgram(target) //This could all be done better, but it works for now. -/obj/machinery/computer/HolodeckControl/Del() +/obj/machinery/computer/HolodeckControl/Destroy() emergencyShutdown() ..() @@ -205,7 +205,7 @@ if(!silent) var/obj/oldobj = obj visible_message("The [oldobj.name] fades away!") - del(obj) + qdel(obj) /obj/machinery/computer/HolodeckControl/proc/checkInteg(var/area/A) for(var/turf/T in A) @@ -236,10 +236,10 @@ derez(item) for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck) - del(B) + qdel(B) for(var/mob/living/simple_animal/hostile/carp/C in linkedholodeck) - del(C) + qdel(C) holographic_items = A.copy_contents_to(linkedholodeck , 1) @@ -334,7 +334,7 @@ G.affecting.loc = src.loc G.affecting.Weaken(5) visible_message("\red [G.assailant] puts [G.affecting] on the table.") - del(W) + qdel(W) return if (istype(W, /obj/item/weapon/wrench)) @@ -356,9 +356,6 @@ flags = ON_BORDER -/obj/structure/holowindow/Del() - ..() - /obj/item/weapon/holo damtype = STAMINA @@ -452,7 +449,7 @@ G.affecting.loc = src.loc G.affecting.Weaken(5) visible_message("\red [G.assailant] dunks [G.affecting] into the [src]!", 3) - del(W) + qdel(W) return else if (istype(W, /obj/item) && get_dist(src,user)<2) user.drop_item(src) @@ -511,7 +508,7 @@ currentarea = get_area(src.loc) if(!currentarea) - del(src) + qdel(src) if(eventstarted) usr << "The event has already begun!" @@ -542,7 +539,7 @@ eventstarted = 1 for(var/obj/structure/holowindow/W in currentarea) - del(W) + qdel(W) for(var/mob/M in currentarea) M << "FIGHT!" \ No newline at end of file diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 1fac9a1592a..5f0e35b08ec 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -29,7 +29,7 @@ if(!src || !WT.remove_fuel(0, user)) return user << "You deconstruct the frame." new /obj/item/stack/sheet/plasteel( loc, 4) - del(src) + qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) @@ -67,7 +67,7 @@ playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20)) P:amount -= 5 - if(!P:amount) del(P) + if(!P:amount) qdel(P) user << "You add cables to the frame." state = 3 icon_state = "3" @@ -89,7 +89,7 @@ if(do_after(user, 20)) if (P) P:amount -= 2 - if(!P:amount) del(P) + if(!P:amount) qdel(P) user << "You put in the glass panel." state = 4 icon_state = "4" @@ -171,7 +171,7 @@ if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created A.rename_self("ai", 1) feedback_inc("cyborg_ais_created",1) - del(src) + qdel(src) /obj/structure/AIcore/deactivated name = "inactive AI" @@ -272,7 +272,7 @@ That prevents a few funky behaviors. A.cancel_camera() A << "You have been uploaded to a stationary terminal. Remote device connection restored." U << "\blue Transfer successful: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." - del(T) + qdel(T) if("NINJASUIT") var/obj/item/clothing/suit/space/space_ninja/C = src var/mob/living/silicon/ai/A = C.AI @@ -283,7 +283,7 @@ That prevents a few funky behaviors. A.cancel_camera() A << "You have been uploaded to a stationary terminal. Remote device connection restored." U << "\blue Transfer successful: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." - del(T) + qdel(T) if("AIFIXER")//AI Fixer terminal. var/obj/machinery/computer/aifixer/T = target switch(interaction) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 6dfa1f4dd5f..993f8e03777 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -1,137 +1,137 @@ -/obj/machinery/computer/aifixer - name = "\improper AI system integrity restorer" - icon = 'icons/obj/computer.dmi' - icon_state = "ai-fixer" - req_access = list(access_captain, access_robotics, access_heads) - var/mob/living/silicon/ai/occupier = null - var/active = 0 - circuit = /obj/item/weapon/circuitboard/aifixer - -/obj/machinery/computer/aifixer/New() - src.overlays += image('icons/obj/computer.dmi', "ai-fixer-empty") - ..() - - -/obj/machinery/computer/aifixer/attackby(I as obj, user as mob) - if(occupier && istype(I, /obj/item/weapon/screwdriver)) - if(stat & (NOPOWER|BROKEN)) - user << "The screws on [name]'s screen won't budge." - else - user << "The screws on [name]'s screen won't budge and it emits a warning beep." - return - - if(istype(I, /obj/item/device/aicard)) - var/obj/item/device/aicard/AIcard = I - if(stat & (NOPOWER|BROKEN)) - if(occupier) - AIcard.transfer_ai("AIFIXER","AICARD",src,user) - overlays.Cut() - return - user << "This terminal isn't functioning right now, get it working!" - return - AIcard.transfer_ai("AIFIXER","AICARD",src,user) - else - ..() - return - -/obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob) - if(..()) - return - interact(user) - -/obj/machinery/computer/aifixer/interact(mob/user) - - var/dat = "" - - if (src.occupier) - var/laws - dat += "

    Stored AI: [src.occupier.name]

    " - dat += "System integrity: [(src.occupier.health+100)/2]%
    " - - if (src.occupier.laws.zeroth) - laws += "0: [src.occupier.laws.zeroth]
    " - - var/number = 1 - for (var/index = 1, index <= src.occupier.laws.inherent.len, index++) - var/law = src.occupier.laws.inherent[index] - if (length(law) > 0) - laws += "[number]: [law]
    " - number++ - - for (var/index = 1, index <= src.occupier.laws.supplied.len, index++) - var/law = src.occupier.laws.supplied[index] - if (length(law) > 0) - laws += "[number]: [law]
    " - number++ - - dat += "Laws:
    [laws]
    " - - if (src.occupier.stat == 2) - dat += "AI non-functional" - else - dat += "AI functional" - if (!src.active) - dat += {"

    Begin Reconstruction"} - else - dat += "

    Reconstruction in process, please wait.
    " - dat += {"
    Close"} - - //user << browse(dat, "window=computer;size=400x500") - //onclose(user, "computer") - var/datum/browser/popup = new(user, "computer", "AI System Integrity Restorer", 400, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer/aifixer/process() - if(..()) - src.updateDialog() - return - -/obj/machinery/computer/aifixer/Topic(href, href_list) - if(..()) - return - if (href_list["fix"]) - src.active = 1 - src.overlays += image('icons/obj/computer.dmi', "ai-fixer-on") - while (src.occupier.health < 100) - src.occupier.adjustOxyLoss(-1) - src.occupier.adjustFireLoss(-1) - src.occupier.adjustToxLoss(-1) - src.occupier.adjustBruteLoss(-1) - src.occupier.updatehealth() - if (src.occupier.health >= 0 && src.occupier.stat == 2) - src.occupier.stat = 0 - src.occupier.lying = 0 - dead_mob_list -= src.occupier - living_mob_list += src.occupier - src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-404") - src.overlays += image('icons/obj/computer.dmi', "ai-fixer-full") - src.updateUsrDialog() - sleep(10) - src.active = 0 - src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-on") - - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - - -/obj/machinery/computer/aifixer/update_icon() - ..() - // Broken / Unpowered - if((stat & BROKEN) || (stat & NOPOWER)) - overlays.Cut() - - // Working / Powered - else - if (occupier) - switch (occupier.stat) - if (0) - overlays += image('icons/obj/computer.dmi', "ai-fixer-full") - if (2) - overlays += image('icons/obj/computer.dmi', "ai-fixer-404") - else - overlays += image('icons/obj/computer.dmi', "ai-fixer-empty") +/obj/machinery/computer/aifixer + name = "\improper AI system integrity restorer" + icon = 'icons/obj/computer.dmi' + icon_state = "ai-fixer" + req_access = list(access_captain, access_robotics, access_heads) + var/mob/living/silicon/ai/occupier = null + var/active = 0 + circuit = /obj/item/weapon/circuitboard/aifixer + +/obj/machinery/computer/aifixer/New() + src.overlays += image('icons/obj/computer.dmi', "ai-fixer-empty") + ..() + + +/obj/machinery/computer/aifixer/attackby(I as obj, user as mob) + if(occupier && istype(I, /obj/item/weapon/screwdriver)) + if(stat & (NOPOWER|BROKEN)) + user << "The screws on [name]'s screen won't budge." + else + user << "The screws on [name]'s screen won't budge and it emits a warning beep." + return + + if(istype(I, /obj/item/device/aicard)) + var/obj/item/device/aicard/AIcard = I + if(stat & (NOPOWER|BROKEN)) + if(occupier) + AIcard.transfer_ai("AIFIXER","AICARD",src,user) + overlays.Cut() + return + user << "This terminal isn't functioning right now, get it working!" + return + AIcard.transfer_ai("AIFIXER","AICARD",src,user) + else + ..() + return + +/obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob) + if(..()) + return + interact(user) + +/obj/machinery/computer/aifixer/interact(mob/user) + + var/dat = "" + + if (src.occupier) + var/laws + dat += "

    Stored AI: [src.occupier.name]

    " + dat += "System integrity: [(src.occupier.health+100)/2]%
    " + + if (src.occupier.laws.zeroth) + laws += "0: [src.occupier.laws.zeroth]
    " + + var/number = 1 + for (var/index = 1, index <= src.occupier.laws.inherent.len, index++) + var/law = src.occupier.laws.inherent[index] + if (length(law) > 0) + laws += "[number]: [law]
    " + number++ + + for (var/index = 1, index <= src.occupier.laws.supplied.len, index++) + var/law = src.occupier.laws.supplied[index] + if (length(law) > 0) + laws += "[number]: [law]
    " + number++ + + dat += "Laws:
    [laws]
    " + + if (src.occupier.stat == 2) + dat += "AI non-functional" + else + dat += "AI functional" + if (!src.active) + dat += {"

    Begin Reconstruction"} + else + dat += "

    Reconstruction in process, please wait.
    " + dat += {"
    Close"} + + //user << browse(dat, "window=computer;size=400x500") + //onclose(user, "computer") + var/datum/browser/popup = new(user, "computer", "AI System Integrity Restorer", 400, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/computer/aifixer/process() + if(..()) + src.updateDialog() + return + +/obj/machinery/computer/aifixer/Topic(href, href_list) + if(..()) + return + if (href_list["fix"]) + src.active = 1 + src.overlays += image('icons/obj/computer.dmi', "ai-fixer-on") + while (src.occupier.health < 100) + src.occupier.adjustOxyLoss(-1) + src.occupier.adjustFireLoss(-1) + src.occupier.adjustToxLoss(-1) + src.occupier.adjustBruteLoss(-1) + src.occupier.updatehealth() + if (src.occupier.health >= 0 && src.occupier.stat == 2) + src.occupier.stat = 0 + src.occupier.lying = 0 + dead_mob_list -= src.occupier + living_mob_list += src.occupier + src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-404") + src.overlays += image('icons/obj/computer.dmi', "ai-fixer-full") + src.updateUsrDialog() + sleep(10) + src.active = 0 + src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-on") + + + src.add_fingerprint(usr) + src.updateUsrDialog() + return + + +/obj/machinery/computer/aifixer/update_icon() + ..() + // Broken / Unpowered + if((stat & BROKEN) || (stat & NOPOWER)) + overlays.Cut() + + // Working / Powered + else + if (occupier) + switch (occupier.stat) + if (0) + overlays += image('icons/obj/computer.dmi', "ai-fixer-full") + if (2) + overlays += image('icons/obj/computer.dmi', "ai-fixer-404") + else + overlays += image('icons/obj/computer.dmi', "ai-fixer-empty") diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 92ea6494e8d..449bc3b3074 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -31,7 +31,7 @@ ..() var/choice = pick(typesof(/obj/machinery/computer/arcade) - /obj/machinery/computer/arcade) new choice(loc) - del(src) + qdel(src) /obj/machinery/computer/arcade/proc/prizevend() if(!contents.len) diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 614933c0635..428d8384235 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -16,6 +16,10 @@ ..() set_frequency(receive_frequency) +/obj/machinery/computer/atmos_alert/Destroy() + radio_controller.remove_object(src, receive_frequency) + ..() + /obj/machinery/computer/atmos_alert/receive_signal(datum/signal/signal) if(!signal || signal.encryption) return diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index bb52196d1d5..99134bed064 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -28,6 +28,10 @@ var/list/records = null var/frame_desc = null +/obj/item/weapon/circuitboard/large_tank_control + name = "cirquir board (Large Tank Control)" + build_path = /obj/machinery/computer/general_air_control/large_tank_control + origin_tech = "programming=2;engineering=3;materials=2" /obj/item/weapon/circuitboard/turbine_computer name = "circuit board (Turbine Computer)" build_path = /obj/machinery/computer/turbine_computer @@ -282,7 +286,7 @@ user << "You deconstruct the frame." var/obj/item/stack/sheet/metal/M = new (loc, 5) M.add_fingerprint(user) - del(src) + qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) @@ -328,7 +332,7 @@ if(do_after(user, 20)) if(C && C.amount >= 5) C.amount -= 5 - if(C.amount <= 0) del(C) + if(C.amount <= 0) qdel(C) user << "You add cables to the frame." src.state = 3 src.icon_state = "3" @@ -376,4 +380,4 @@ var/obj/item/weapon/circuitboard/shuttle/C = circuit S.id = C.id transfer_fingerprints_to(B) - del(src) + qdel(src) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 632ea76875b..abcd6c8edd6 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -573,7 +573,7 @@ frequency.post_signal(src, status_signal) -/obj/machinery/computer/communications/Del() +/obj/machinery/computer/communications/Destroy() shuttle_caller_list -= src emergency_shuttle.autoshuttlecall() ..() diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index e8a020fcf29..d387102becf 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -38,11 +38,11 @@ /obj/machinery/computer/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(25)) - del(src) + qdel(src) return if (prob(50)) verbs.Cut() @@ -111,7 +111,7 @@ user << "\blue You disconnect the monitor." A.state = 4 A.icon_state = "4" - del(src) + qdel(src) return /obj/machinery/computer/attack_hand(user) @@ -140,4 +140,4 @@ return user.visible_message("[user.name] smashes against the [src.name] with its claws.",\ "You smash against the [src.name] with your claws.",\ - "You hear a clicking sound.") \ No newline at end of file + "You hear a clicking sound.") diff --git a/code/game/machinery/computer/syndicate_shuttle.dm b/code/game/machinery/computer/syndicate_shuttle.dm index fb6aa607ab9..2d264251da9 100644 --- a/code/game/machinery/computer/syndicate_shuttle.dm +++ b/code/game/machinery/computer/syndicate_shuttle.dm @@ -28,6 +28,8 @@ var/area/transit_location = locate(/area/syndicate_station/transit) curr_location.move_contents_to(transit_location) curr_location = transit_location + curr_location.has_gravity = 0 + transit_location.has_gravity = 1 sleep(SYNDICATE_SHUTTLE_MOVE_TIME) curr_location.move_contents_to(dest_location) diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 5409ba20ff0..9f9c32260d2 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -1,221 +1,221 @@ -#define NUKESCALINGMODIFIER 0.5 - -var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","Foxtrot","Zero", "Niner") - - -/obj/machinery/computer/telecrystals - name = "\improper Telecrystal assignment station" - desc = "A device used to manage telecrystals during group operations. You shouldn't be looking at this particular one..." - icon_state = "tcstation" - -///////////////////////////////////////////// -/obj/machinery/computer/telecrystals/uplinker - name = "\improper Telecrystal upload/recieve station" - desc = "A device used to manage telecrystals during group operations. To use, simply insert your uplink. With your uplink installed \ - you can upload your telecrystals to the group's pool using the console, or be assigned additional telecrystals by your lieutenant." - icon_state = "tcstation" - var/obj/item/uplinkholder = null - var/obj/machinery/computer/telecrystals/boss/linkedboss = null - -/obj/machinery/computer/telecrystals/uplinker/New() - ..() - - var/ID - if(possible_uplinker_IDs.len) - ID = pick(possible_uplinker_IDs) - possible_uplinker_IDs -= ID - name = "[name] [ID]" - else - name = "[name] [rand(1,999)]" - - -/obj/machinery/computer/telecrystals/uplinker/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, /obj/item)) - - if(uplinkholder) - user << "The [src] already has an uplink in it." - return - - if(O.hidden_uplink) - var/obj/item/P = user.get_active_hand() - user.drop_item() - uplinkholder = P - P.loc = src - P.add_fingerprint(user) - update_icon() - updateUsrDialog() - else - user << "The [O] doesn't appear to be an uplink..." - - - -/obj/machinery/computer/telecrystals/uplinker/update_icon() - overlays.Cut() - if(uplinkholder) - overlays += "[initial(icon_state)]-closed" - - -/obj/machinery/computer/telecrystals/uplinker/proc/ejectuplink() - if(uplinkholder) - uplinkholder.loc = get_turf(src.loc) - uplinkholder = null - update_icon() - -/obj/machinery/computer/telecrystals/uplinker/proc/donateTC(var/amt, var/addLog = 1) - if(uplinkholder && linkedboss) - if(amt <= uplinkholder.hidden_uplink.uses) - uplinkholder.hidden_uplink.uses -= amt - linkedboss.storedcrystals += amt - if(addLog) - linkedboss.logTransfer("[src] donated [amt] telecrystals to [linkedboss].") - -/obj/machinery/computer/telecrystals/uplinker/proc/giveTC(var/amt, var/addLog = 1) - if(uplinkholder && linkedboss) - if(amt <= linkedboss.storedcrystals) - uplinkholder.hidden_uplink.uses += amt - linkedboss.storedcrystals -= amt - if(addLog) - linkedboss.logTransfer("[src] recieved [amt] telecrystals from [linkedboss].") - -/////// - -/obj/machinery/computer/telecrystals/uplinker/attack_hand(mob/user as mob) - if(..()) - return - src.add_fingerprint(user) - user.set_machine(src) - - var/dat = "" - if(linkedboss) - dat += "[linkedboss] has [linkedboss.storedcrystals] telecrystals available for distribution.

    " - else - dat += "No linked management consoles detected. Scan for uplink stations using the management console.

    " - - if(uplinkholder) - dat += "[uplinkholder.hidden_uplink.uses] telecrystals remain in this uplink.
    " - if(linkedboss) - dat += "Donate TC: 1 | 5" - dat += "
    Eject Uplink" - - - var/datum/browser/popup = new(user, "computer", "Telecrystal Upload/Recieve Station", 700, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer/telecrystals/uplinker/Topic(href, href_list) - if(..()) - return - - if(href_list["donate1"]) - donateTC(1) - - if(href_list["donate5"]) - donateTC(5) - - if(href_list["eject"]) - ejectuplink() - - src.updateUsrDialog() - - -///////////////////////////////////////// -/obj/machinery/computer/telecrystals/boss - name = "team Telecrystal management console" - desc = "A device used to manage telecrystals during group operations. To use, simply initialize the machine by scanning for nearby uplink stations. \ - Once the consoles are linked up, you can assign any telecrystals amongst your operatives; be they donated by your agents or rationed to the squad \ - based on the danger rating of the mission." - icon_state = "tcboss" - var/virgin = 1 - var/scanrange = 10 - var/storedcrystals = 0 - var/list/TCstations = list() - var/list/transferlog = list() - -/obj/machinery/computer/telecrystals/boss/proc/logTransfer(var/logmessage) - transferlog += ("[worldtime2text()] [logmessage]") - -/obj/machinery/computer/telecrystals/boss/proc/scanUplinkers() - for(var/obj/machinery/computer/telecrystals/uplinker/A in range(scanrange, src.loc)) - if(!A.linkedboss) - TCstations += A - A.linkedboss = src - if(virgin) - getDangerous() - virgin = 0 - -/obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population. - ..() - var/danger - danger = player_list.len - while(!IsMultiple(++danger,10))//Just round up to the nearest multiple of ten. - scaleTC(danger) - -/obj/machinery/computer/telecrystals/boss/proc/scaleTC(var/amt)//Its own proc, since it'll probably need a lot of tweaks for balance, use a fancier algorhithm, etc. - storedcrystals += amt * NUKESCALINGMODIFIER - -///////// - -/obj/machinery/computer/telecrystals/boss/attack_hand(var/mob/user as mob) - if(..()) - return - src.add_fingerprint(user) - user.set_machine(src) - - - var/dat = "" - dat += "Scan for TC stations.
    " - dat += "This [src] has [storedcrystals] telecrystals available for distribution.
    " - dat += "

    " - - - for(var/obj/machinery/computer/telecrystals/uplinker/A in TCstations) - dat += "[A.name] | " - if(A.uplinkholder) - dat += "[A.uplinkholder.hidden_uplink.uses] telecrystals." - if(storedcrystals) - dat+= "
    Add TC: 1 | 5" - dat += "
    " - - if(TCstations.len) - dat += "

    Evenly distribute remaining TC.

    " - - - for(var/entry in transferlog) - dat += "[entry]
    " - - - var/datum/browser/popup = new(user, "computer", "Team Telecrystal Management Console", 700, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer/telecrystals/boss/Topic(href, href_list) - if(..()) - return - - if(href_list["scan"]) - scanUplinkers() - - if(href_list["give1"]) - var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give1"]) - A.giveTC(1) - - if(href_list["give5"]) - var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give5"]) - A.giveTC(5) - - if(href_list["distrib"]) - var/sanity = 0 - while(storedcrystals && sanity < 100) - for(var/obj/machinery/computer/telecrystals/uplinker/A in TCstations) - A.giveTC(1,0) - sanity++ - logTransfer("[src] evenly distributed telecrystals.") - - src.updateUsrDialog() - return - +#define NUKESCALINGMODIFIER 0.5 + +var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","Foxtrot","Zero", "Niner") + + +/obj/machinery/computer/telecrystals + name = "\improper Telecrystal assignment station" + desc = "A device used to manage telecrystals during group operations. You shouldn't be looking at this particular one..." + icon_state = "tcstation" + +///////////////////////////////////////////// +/obj/machinery/computer/telecrystals/uplinker + name = "\improper Telecrystal upload/recieve station" + desc = "A device used to manage telecrystals during group operations. To use, simply insert your uplink. With your uplink installed \ + you can upload your telecrystals to the group's pool using the console, or be assigned additional telecrystals by your lieutenant." + icon_state = "tcstation" + var/obj/item/uplinkholder = null + var/obj/machinery/computer/telecrystals/boss/linkedboss = null + +/obj/machinery/computer/telecrystals/uplinker/New() + ..() + + var/ID + if(possible_uplinker_IDs.len) + ID = pick(possible_uplinker_IDs) + possible_uplinker_IDs -= ID + name = "[name] [ID]" + else + name = "[name] [rand(1,999)]" + + +/obj/machinery/computer/telecrystals/uplinker/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(istype(O, /obj/item)) + + if(uplinkholder) + user << "The [src] already has an uplink in it." + return + + if(O.hidden_uplink) + var/obj/item/P = user.get_active_hand() + user.drop_item() + uplinkholder = P + P.loc = src + P.add_fingerprint(user) + update_icon() + updateUsrDialog() + else + user << "The [O] doesn't appear to be an uplink..." + + + +/obj/machinery/computer/telecrystals/uplinker/update_icon() + overlays.Cut() + if(uplinkholder) + overlays += "[initial(icon_state)]-closed" + + +/obj/machinery/computer/telecrystals/uplinker/proc/ejectuplink() + if(uplinkholder) + uplinkholder.loc = get_turf(src.loc) + uplinkholder = null + update_icon() + +/obj/machinery/computer/telecrystals/uplinker/proc/donateTC(var/amt, var/addLog = 1) + if(uplinkholder && linkedboss) + if(amt <= uplinkholder.hidden_uplink.uses) + uplinkholder.hidden_uplink.uses -= amt + linkedboss.storedcrystals += amt + if(addLog) + linkedboss.logTransfer("[src] donated [amt] telecrystals to [linkedboss].") + +/obj/machinery/computer/telecrystals/uplinker/proc/giveTC(var/amt, var/addLog = 1) + if(uplinkholder && linkedboss) + if(amt <= linkedboss.storedcrystals) + uplinkholder.hidden_uplink.uses += amt + linkedboss.storedcrystals -= amt + if(addLog) + linkedboss.logTransfer("[src] recieved [amt] telecrystals from [linkedboss].") + +/////// + +/obj/machinery/computer/telecrystals/uplinker/attack_hand(mob/user as mob) + if(..()) + return + src.add_fingerprint(user) + user.set_machine(src) + + var/dat = "" + if(linkedboss) + dat += "[linkedboss] has [linkedboss.storedcrystals] telecrystals available for distribution.

    " + else + dat += "No linked management consoles detected. Scan for uplink stations using the management console.

    " + + if(uplinkholder) + dat += "[uplinkholder.hidden_uplink.uses] telecrystals remain in this uplink.
    " + if(linkedboss) + dat += "Donate TC: 1 | 5" + dat += "
    Eject Uplink" + + + var/datum/browser/popup = new(user, "computer", "Telecrystal Upload/Recieve Station", 700, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/computer/telecrystals/uplinker/Topic(href, href_list) + if(..()) + return + + if(href_list["donate1"]) + donateTC(1) + + if(href_list["donate5"]) + donateTC(5) + + if(href_list["eject"]) + ejectuplink() + + src.updateUsrDialog() + + +///////////////////////////////////////// +/obj/machinery/computer/telecrystals/boss + name = "team Telecrystal management console" + desc = "A device used to manage telecrystals during group operations. To use, simply initialize the machine by scanning for nearby uplink stations. \ + Once the consoles are linked up, you can assign any telecrystals amongst your operatives; be they donated by your agents or rationed to the squad \ + based on the danger rating of the mission." + icon_state = "tcboss" + var/virgin = 1 + var/scanrange = 10 + var/storedcrystals = 0 + var/list/TCstations = list() + var/list/transferlog = list() + +/obj/machinery/computer/telecrystals/boss/proc/logTransfer(var/logmessage) + transferlog += ("[worldtime2text()] [logmessage]") + +/obj/machinery/computer/telecrystals/boss/proc/scanUplinkers() + for(var/obj/machinery/computer/telecrystals/uplinker/A in range(scanrange, src.loc)) + if(!A.linkedboss) + TCstations += A + A.linkedboss = src + if(virgin) + getDangerous() + virgin = 0 + +/obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population. + ..() + var/danger + danger = player_list.len + while(!IsMultiple(++danger,10))//Just round up to the nearest multiple of ten. + scaleTC(danger) + +/obj/machinery/computer/telecrystals/boss/proc/scaleTC(var/amt)//Its own proc, since it'll probably need a lot of tweaks for balance, use a fancier algorhithm, etc. + storedcrystals += amt * NUKESCALINGMODIFIER + +///////// + +/obj/machinery/computer/telecrystals/boss/attack_hand(var/mob/user as mob) + if(..()) + return + src.add_fingerprint(user) + user.set_machine(src) + + + var/dat = "" + dat += "Scan for TC stations.
    " + dat += "This [src] has [storedcrystals] telecrystals available for distribution.
    " + dat += "

    " + + + for(var/obj/machinery/computer/telecrystals/uplinker/A in TCstations) + dat += "[A.name] | " + if(A.uplinkholder) + dat += "[A.uplinkholder.hidden_uplink.uses] telecrystals." + if(storedcrystals) + dat+= "
    Add TC: 1 | 5" + dat += "
    " + + if(TCstations.len) + dat += "

    Evenly distribute remaining TC.

    " + + + for(var/entry in transferlog) + dat += "[entry]
    " + + + var/datum/browser/popup = new(user, "computer", "Team Telecrystal Management Console", 700, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/computer/telecrystals/boss/Topic(href, href_list) + if(..()) + return + + if(href_list["scan"]) + scanUplinkers() + + if(href_list["give1"]) + var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give1"]) + A.giveTC(1) + + if(href_list["give5"]) + var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give5"]) + A.giveTC(5) + + if(href_list["distrib"]) + var/sanity = 0 + while(storedcrystals && sanity < 100) + for(var/obj/machinery/computer/telecrystals/uplinker/A in TCstations) + A.giveTC(1,0) + sanity++ + logTransfer("[src] evenly distributed telecrystals.") + + src.updateUsrDialog() + return + #undef NUKESCALINGMODIFIER \ No newline at end of file diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index f321d06f2e2..c06bb4e015e 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -61,7 +61,7 @@ if(do_after(user, 20)) if(C) C.amount -= 5 - if(!C.amount) del(C) + if(!C.amount) qdel(C) user << "You add cables to the frame." state = 2 icon_state = "box_1" @@ -69,7 +69,7 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) user << "You dismantle the frame." new /obj/item/stack/sheet/metal(src.loc, 5) - del(src) + qdel(src) if(2) if(istype(P, /obj/item/weapon/circuitboard)) var/obj/item/weapon/circuitboard/B = P @@ -122,14 +122,14 @@ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) var/obj/machinery/new_machine = new src.circuit.build_path(src.loc) for(var/obj/O in new_machine.component_parts) - del(O) + qdel(O) new_machine.component_parts = list() for(var/obj/O in src) O.loc = null new_machine.component_parts += O circuit.loc = null new_machine.RefreshParts() - del(src) + qdel(src) if(istype(P, /obj/item)) var/success diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 646c4e1c616..12114bbc399 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -35,10 +35,9 @@ current_heat_capacity = 50 * C efficiency = C -/obj/machinery/atmospherics/unary/cryo_cell/Del() +/obj/machinery/atmospherics/unary/cryo_cell/Destroy() var/turf/T = loc T.contents += contents - ..() var/obj/item/weapon/reagent_containers/glass/B = beaker if(beaker) B.loc = get_step(loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube @@ -227,11 +226,6 @@ return if(default_change_direction_wrench(user, I)) - if(node) - disconnect(node) - initialize() - if(node) - node.update_icon() return if(exchange_parts(user, I)) @@ -242,6 +236,8 @@ /obj/machinery/atmospherics/unary/cryo_cell/open_machine() if(!state_open && !panel_open) layer = 3 + if(occupant) + occupant.bodytemperature = Clamp(occupant.bodytemperature, 261, 360) ..() if(beaker) beaker.loc = src @@ -273,6 +269,7 @@ return if(occupant) if(occupant.stat == 2 || occupant.health >= 100) //Why waste energy on dead or healthy people + occupant.bodytemperature = T0C return occupant.bodytemperature += 2*(air_contents.temperature - occupant.bodytemperature) * current_heat_capacity / (current_heat_capacity + air_contents.heat_capacity()) occupant.bodytemperature = max(occupant.bodytemperature, air_contents.temperature) // this is so ugly i'm sorry for doing it i'll fix it later i promise diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 6d812b5cc66..d8955ceceaa 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -87,14 +87,14 @@ for reference: new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) - del(src) + qdel(src) ..() ex_act(severity) switch(severity) if(1.0) visible_message("\red The barricade is blown apart!") - del(src) + qdel(src) return if(2.0) src.health -= 25 @@ -103,7 +103,7 @@ for reference: new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) - del(src) + qdel(src) return meteorhit() @@ -111,14 +111,14 @@ for reference: new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) - del(src) + qdel(src) return blob_act() src.health -= 25 if (src.health <= 0) visible_message("\red The blob eats through the barricade!") - del(src) + qdel(src) return CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff. @@ -267,4 +267,4 @@ for reference: explosion(src.loc,-1,-1,0) if(src) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e5701ae6d41..b9e7e23edb3 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -237,7 +237,7 @@ /obj/machinery/door/airlock/plasma/proc/PlasmaBurn(temperature) atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 500) new/obj/structure/door_assembly/door_assembly_0( src.loc ) - del (src) + qdel(src) /obj/machinery/door/airlock/plasma/BlockSuperconductivity() //we don't stop the heat~ return 0 @@ -443,7 +443,10 @@ About the new airlock wires panel: src.hack(user) return else - user << "Airlock AI control has been blocked with a firewall. Unable to hack." + user << "Airlock AI control has been blocked with a firewall. Unable to hack." + if(emagged) + user << "Unable to interface: Airlock is unresponsive." + return //Separate interface for the AI. user.set_machine(src) @@ -897,7 +900,6 @@ About the new airlock wires panel: playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") if(do_after(user,40)) - user << "\blue You removed the airlock electronics!" switch(src.doortype) if(0) new/obj/structure/door_assembly/door_assembly_0( src.loc ) if(1) new/obj/structure/door_assembly/door_assembly_com( src.loc ) @@ -933,6 +935,11 @@ About the new airlock wires panel: if(31) new/obj/structure/door_assembly/door_assembly_science( src.loc ) if(32) new/obj/structure/door_assembly/door_assembly_science/glass( src.loc ) if(33) new/obj/structure/door_assembly/door_assembly_highsecurity(src.loc) + if(emagged) + user << "You discard the damaged electronics." + qdel(src) + return + user << "You removed the airlock electronics!" var/obj/item/weapon/airlock_electronics/ae if(!electronics) @@ -943,31 +950,31 @@ About the new airlock wires panel: electronics = null ae.loc = src.loc - del(src) + qdel(src) return else if(arePowerSystemsOn() && !(stat & NOPOWER)) - user << "\blue The airlock's motors resist your efforts to force it." + user << " The airlock's motors resist your efforts to force it." else if(locked) - user << "\blue The airlock's bolts prevent it from being forced." - else if( !welded && !operating ) + user << " The airlock's bolts prevent it from being forced." + else if( !welded && !operating) if(density) if(beingcrowbarred == 0) //being fireaxe'd var/obj/item/weapon/twohanded/fireaxe/F = C if(F:wielded) - spawn(0) open(1) + spawn(0) open(2) else - user << "\red You need to be wielding the Fire axe to do that." + user << "You need to be wielding the Fire axe to do that." else - spawn(0) open(1) + spawn(0) open(2) else if(beingcrowbarred == 0) var/obj/item/weapon/twohanded/fireaxe/F = C if(F:wielded) - spawn(0) close(1) + spawn(0) close(2) else - user << "\red You need to be wielding the Fire axe to do that." + user << "You need to be wielding the Fire axe to do that." else - spawn(0) close(1) + spawn(0) close(2) else if(istype(C, /obj/item/weapon/airlock_painter)) change_paintjob(C, user) @@ -986,15 +993,18 @@ About the new airlock wires panel: if(!forced) if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) ) return 0 - use_power(50) - if(istype(src, /obj/machinery/door/airlock/glass)) - playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) - if(istype(src, /obj/machinery/door/airlock/clown)) - playsound(src.loc, 'sound/items/bikehorn.ogg', 30, 1) - else - playsound(src.loc, 'sound/machines/airlock.ogg', 30, 1) - if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) - src.closeOther.close() + if(forced < 2) + if(emagged) + return 0 + use_power(50) + if(istype(src, /obj/machinery/door/airlock/glass)) + playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) + if(istype(src, /obj/machinery/door/airlock/clown)) + playsound(src.loc, 'sound/items/bikehorn.ogg', 30, 1) + else + playsound(src.loc, 'sound/machines/airlock.ogg', 30, 1) + if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) + src.closeOther.close() if(autoclose && normalspeed) spawn(150) @@ -1021,13 +1031,16 @@ About the new airlock wires panel: crush() - use_power(50) - if(istype(src, /obj/machinery/door/airlock/glass)) - playsound(src.loc, 'sound/machines/windowdoor.ogg', 30, 1) - if(istype(src, /obj/machinery/door/airlock/clown)) - playsound(src.loc, 'sound/items/bikehorn.ogg', 30, 1) - else - playsound(src.loc, 'sound/machines/airlock.ogg', 30, 1) + if(forced < 2) + if(emagged) + return + use_power(50) + if(istype(src, /obj/machinery/door/airlock/glass)) + playsound(src.loc, 'sound/machines/windowdoor.ogg', 30, 1) + if(istype(src, /obj/machinery/door/airlock/clown)) + playsound(src.loc, 'sound/items/bikehorn.ogg', 30, 1) + else + playsound(src.loc, 'sound/machines/airlock.ogg', 30, 1) var/obj/structure/window/killthis = (locate(/obj/structure/window) in get_turf(src)) if(killthis) killthis.ex_act(2)//Smashin windows @@ -1047,6 +1060,7 @@ About the new airlock wires panel: /obj/machinery/door/airlock/proc/prison_open() + if(emagged) return src.locked = 0 src.open() src.locked = 1 diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index a6027db5455..d71b255df22 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -30,7 +30,7 @@ return -/obj/machinery/door/Del() +/obj/machinery/door/Destroy() density = 0 air_update_turf(1) update_freelook_sight() @@ -41,7 +41,7 @@ //return /obj/machinery/door/Bumped(atom/AM) - if(p_open || operating) return + if(operating || emagged) return if(ismob(AM)) var/mob/M = AM if(world.time - M.last_bumped <= 10) return //Can bump-open one airlock per second. This is to prevent shock spam. @@ -87,7 +87,7 @@ if(!src.requiresID()) user = null - if(density) + if(density && !emagged) if(allowed(user) || src.emergency == 1) open() else flick("door_deny", src) return @@ -117,8 +117,9 @@ /obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/device/detective_scanner)) return - if(src.operating || isrobot(user)) return //borgs can't attack doors open because it conflicts with their AI-like interaction with them. + if(isrobot(user)) return //borgs can't attack doors open because it conflicts with their AI-like interaction with them. src.add_fingerprint(user) + if(operating || emagged) return if(!Adjacent(user)) user = null if(!src.requiresID()) @@ -127,7 +128,14 @@ flick("door_spark", src) sleep(6) open() - operating = -1 + emagged = 1 + if(istype(src, /obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/A = src + A.lights = 0 + A.locked = 1 + A.loseMainPower() + A.loseBackupPower() + A.update_icon() return 1 if(src.allowed(user) || src.emergency == 1) if(src.density) @@ -142,7 +150,7 @@ /obj/machinery/door/blob_act() if(prob(40)) - del(src) + qdel(src) return @@ -160,10 +168,10 @@ /obj/machinery/door/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) if(2.0) if(prob(25)) - del(src) + qdel(src) if(3.0) if(prob(80)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread @@ -199,9 +207,9 @@ /obj/machinery/door/proc/open() if(!density) return 1 - if(operating > 0) return + if(operating) return if(!ticker) return 0 - if(!operating) operating = 1 + operating = 1 do_animate("opening") icon_state = "door0" diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index c3a724ad244..3695c80ef45 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -312,9 +312,9 @@ f1.sd_SetOpacity(opacity) f2.sd_SetOpacity(opacity) - Del() - del f1 - del f2 + Destroy() + qdel(f1) + qdel(f2) ..() /obj/machinery/door/poddoor/two_tile_ver @@ -331,9 +331,9 @@ f1.sd_SetOpacity(opacity) f2.sd_SetOpacity(opacity) - Del() - del f1 - del f2 + Destroy() + qdel(f1) + qdel(f2) ..() /obj/machinery/door/poddoor/four_tile_hor @@ -358,11 +358,11 @@ f4.sd_SetOpacity(opacity) f3.sd_SetOpacity(opacity) - Del() - del f1 - del f2 - del f3 - del f4 + Destroy() + qdel(f1) + qdel(f2) + qdel(f3) + qdel(f4) ..() /obj/machinery/door/poddoor/four_tile_ver @@ -387,11 +387,11 @@ f4.sd_SetOpacity(opacity) f3.sd_SetOpacity(opacity) - Del() - del f1 - del f2 - del f3 - del f4 + Destroy() + qdel(f1) + qdel(f2) + qdel(f3) + qdel(f4) ..() /obj/machinery/door/poddoor/filler_object diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 09b9452cebc..a8cb4bd6c6a 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -20,7 +20,7 @@ src.base_state = src.icon_state return -/obj/machinery/door/window/Del() +/obj/machinery/door/window/Destroy() density = 0 playsound(src, "shatter", 70, 1) ..() @@ -100,7 +100,7 @@ return 1 /obj/machinery/door/window/close() - if (src.operating) + if (src.operating || emagged) return 0 src.operating = 1 flick(text("[]closing", src.base_state), src) @@ -125,7 +125,7 @@ var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src.loc) CC.amount = 2 src.density = 0 - del(src) + qdel(src) return /obj/machinery/door/window/bullet_act(var/obj/item/projectile/Proj) @@ -165,7 +165,7 @@ var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src.loc) CC.amount = 2 src.density = 0 - del(src) + qdel(src) else return src.attack_hand(user) @@ -206,7 +206,7 @@ var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src.loc) CC.amount = 2 src.density = 0 - del(src) + qdel(src) return diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 202de927d85..6a1518e311b 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -13,7 +13,7 @@ var/list/doppler_arrays = list() ..() doppler_arrays += src -/obj/machinery/doppler_array/Del() +/obj/machinery/doppler_array/Destroy() doppler_arrays -= src ..() diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 5442248986a..c1b0248ac3c 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -105,7 +105,8 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/proc/clear_holo() // hologram.SetLuminosity(0)//Clear lighting. //handled by the lighting controller when its ower is deleted - del(hologram)//Get rid of hologram. + qdel(hologram)//Get rid of hologram. + hologram = null if(master.current == src) master.current = null master = null//Null the master, since no-one is using it now. @@ -160,26 +161,26 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) if(2.0) if (prob(50)) - del(src) + qdel(src) if(3.0) if (prob(5)) - del(src) + qdel(src) return /obj/machinery/hologram/blob_act() - del(src) + qdel(src) return /obj/machinery/hologram/meteorhit() - del(src) + qdel(src) return -/obj/machinery/hologram/Del() +/obj/machinery/hologram/holopad/Destroy() if(hologram) - src:clear_holo() + clear_holo() ..() /* diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index a033eb44002..48af8644879 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -25,7 +25,7 @@ if(input_obj) if(isturf(input_obj.loc)) input_plate = input_obj.loc - del(input_obj) + qdel(input_obj) break if(!input_plate) @@ -101,7 +101,7 @@ M.client.eye = src M.loc = src src.occupant = M - del(G) + qdel(G) update_icon() @@ -159,7 +159,7 @@ add_logs(user, occupant, "gibbed") src.occupant.death(1) src.occupant.ghostize() - del(src.occupant) + qdel(src.occupant) spawn(src.gibtime) playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) operating = 0 diff --git a/code/game/machinery/kitchen/icecream_vat.dm b/code/game/machinery/kitchen/icecream_vat.dm index cb949c00eec..0108b1f8fd3 100644 --- a/code/game/machinery/kitchen/icecream_vat.dm +++ b/code/game/machinery/kitchen/icecream_vat.dm @@ -1,246 +1,246 @@ -#define ICECREAM_VANILLA 1 -#define FLAVOUR_CHOCOLATE 2 -#define FLAVOUR_STRAWBERRY 3 -#define FLAVOUR_BLUE 4 -#define CONE_WAFFLE 5 -#define CONE_CHOC 6 -#define INGR_MILK 7 -#define INGR_FLOUR 8 -#define INGR_SUGAR 9 -#define INGR_ICE 10 -#define MUCK 11 - -var/list/ingredients_source = list( -"berryjuice" = FLAVOUR_STRAWBERRY,\ -"coco" = FLAVOUR_CHOCOLATE,\ -"singulo" = FLAVOUR_BLUE,\ -"milk" = INGR_MILK,\ -"soymilk" = INGR_MILK,\ -"ice" = INGR_ICE,\ -"flour" = INGR_FLOUR,\ -"sugar" = INGR_SUGAR,\ -) - -/proc/get_icecream_flavour_string(var/flavour_type) - switch(flavour_type) - if(FLAVOUR_CHOCOLATE) - return "chocolate" - if(FLAVOUR_STRAWBERRY) - return "strawberry" - if(FLAVOUR_BLUE) - return "blue" - if(CONE_WAFFLE) - return "waffle" - if(CONE_CHOC) - return "chocolate" - if(INGR_MILK) - return "milk" - if(INGR_FLOUR) - return "flour" - if(INGR_SUGAR) - return "sugar" - if(INGR_ICE) - return "ice" - if(MUCK) - return "muck" - else - return "vanilla" - -/obj/machinery/icecream_vat - name = "icecream vat" - desc = "Ding-aling ding dong. Get your Nanotrasen-approved ice cream!" - icon = 'icons/obj/kitchen.dmi' - icon_state = "icecream_vat" - density = 1 - anchored = 0 - var/list/ingredients = list() - var/dispense_flavour = ICECREAM_VANILLA - var/obj/item/weapon/reagent_containers/glass/held_container - -/obj/machinery/icecream_vat/New() - ..() - - while(ingredients.len < 11) - ingredients.Add(5) - -/obj/machinery/icecream_vat/attack_hand(mob/user as mob) - user.set_machine(src) - interact(user) - -/obj/machinery/icecream_vat/interact(mob/user as mob) - var/dat - dat += "Dispense vanilla icecream There is [ingredients[ICECREAM_VANILLA]] scoops of vanilla icecream left (made from milk and ice).
    " - dat += "Dispense strawberry icecream There is [ingredients[FLAVOUR_STRAWBERRY]] dollops of strawberry flavouring left (obtained from berry juice.
    " - dat += "Dispense chocolate icecream There is [ingredients[FLAVOUR_CHOCOLATE]] dollops of chocolate flavouring left (obtained from cocoa powder).
    " - dat += "Dispense blue icecream There is [ingredients[FLAVOUR_BLUE]] dollops of blue flavouring left (obtained from bluespace tomato singulo).
    " - dat += "
    " - dat += "Dispense waffle cones There are [ingredients[CONE_WAFFLE]] waffle cones left.
    " - dat += "Dispense chocolate cones There are [ingredients[CONE_CHOC]] chocolate cones left.
    " - dat += "
    " - dat += "Make waffle cones There is [ingredients[INGR_FLOUR]]/[ingredients[INGR_SUGAR]] of flour and sugar left.
    " - dat += "Make chocolate cones There is [ingredients[FLAVOUR_CHOCOLATE]]/[ingredients[CONE_WAFFLE]] of chocolate flavouring and waffle cones left.
    " - dat += "Make vanilla icecream There is [ingredients[INGR_MILK]]/[ingredients[INGR_ICE]] of milk and ice left.
    " - dat += "
    " - if(held_container) - dat += "Eject [held_container] " - else - dat += "No beaker inserted. " - dat += "Refresh Close" - - var/datum/browser/popup = new(user, "icecreamvat","Icecream Vat", 700, 400, src) - popup.set_content(dat) - popup.open() - -/obj/machinery/icecream_vat/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, /obj/item/weapon/reagent_containers)) - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/icecream)) - var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = O - if(!I.ice_creamed) - if(ingredients[ICECREAM_VANILLA] > 0) - var/flavour_name = get_icecream_flavour_string(dispense_flavour) - if(ingredients[dispense_flavour] > 0) - src.visible_message("\icon[src] [user] scoops delicious [flavour_name] flavoured icecream into [I].") - ingredients[dispense_flavour] -= 1 - ingredients[ICECREAM_VANILLA] -= 1 - - I.add_ice_cream(dispense_flavour) - if(held_container) - held_container.reagents.trans_to(I, 10) - if(I.reagents.total_volume < 10) - I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume) - else - user << "There is not enough [flavour_name] flavouring left! Insert more of the required ingredients." - else - user << "There is not enough icecream left! Insert more milk and ice." - else - user << "[O] already has icecream in it." - else if(istype(O, /obj/item/weapon/reagent_containers/glass)) - if(held_container) - user << "You must remove [held_container] from [src] first." - else - user << "You insert [O] into [src]." - user.drop_item() - O.loc = src - held_container = O - else - var/obj/item/weapon/reagent_containers/R = O - if(R.reagents) - src.visible_message("[user] has emptied all of [R] into [src].") - for (var/datum/reagent/current_reagent in R.reagents.reagent_list) - if(ingredients_source[current_reagent.id]) - add(ingredients_source[current_reagent.id], current_reagent.volume / 2) - else - add(MUCK, current_reagent.volume / 5) - R.reagents.clear_reagents() - return 1 - else - ..() - -/obj/machinery/icecream_vat/proc/add(var/add_type, var/amount) - if(add_type <= ingredients.len) - ingredients[add_type] += amount - updateDialog() - -/obj/machinery/icecream_vat/proc/make(var/mob/user, var/make_type) - switch(make_type) - if(CONE_WAFFLE) - if(ingredients[INGR_FLOUR] > 0 && ingredients[INGR_SUGAR] > 0) - var/amount = max( min(ingredients[INGR_FLOUR], ingredients[INGR_SUGAR]), 5) - ingredients[INGR_FLOUR] -= amount - ingredients[INGR_SUGAR] -= amount - ingredients[CONE_WAFFLE] += amount - src.visible_message("[user] cooks up some waffle cones.") - else - user << "You require sugar and flour to make waffle cones." - if(CONE_CHOC) - if(ingredients[FLAVOUR_CHOCOLATE] > 0 && ingredients[CONE_WAFFLE] > 0) - var/amount = min(ingredients[CONE_WAFFLE], ingredients[FLAVOUR_CHOCOLATE]) - ingredients[CONE_WAFFLE] -= amount - ingredients[FLAVOUR_CHOCOLATE] -= amount - ingredients[CONE_CHOC] += amount - src.visible_message("[user] cooks up some chocolate cones.") - else - user << "You require waffle cones and chocolate flavouring to make chocolate cones." - if(ICECREAM_VANILLA) - if(ingredients[INGR_ICE] > 0 && ingredients[INGR_MILK] > 0) - var/amount = min(ingredients[INGR_ICE], ingredients[INGR_MILK]) - ingredients[INGR_ICE] -= amount - ingredients[INGR_MILK] -= amount - ingredients[ICECREAM_VANILLA] += amount - src.visible_message("[user] whips up some vanilla icecream.") - else - user << "You require milk and ice to make vanilla icecream." - updateDialog() - -/obj/machinery/icecream_vat/Topic(href, href_list) - if(..()) - return - if(href_list["dispense"]) - dispense_flavour = text2num(href_list["dispense"]) - src.visible_message("\blue[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.") - - if(href_list["cone"]) - var/dispense_cone = text2num(href_list["cone"]) - if(ingredients[dispense_cone] <= ingredients.len) - var/cone_name = get_icecream_flavour_string(dispense_cone) - if(ingredients[dispense_cone] >= 1) - ingredients[dispense_cone] -= 1 - var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = new(src.loc) - I.cone_type = cone_name - I.icon_state = "icecream_cone_[cone_name]" - I.desc = "Delicious [cone_name] cone, but no ice cream." - src.visible_message("[usr] dispenses a crunchy [cone_name] cone from [src].") - else - usr << "There are no [cone_name] cones left!" - updateDialog() - - if(href_list["make"]) - make( usr, text2num(href_list["make"]) ) - updateDialog() - - if(href_list["eject"]) - if(held_container) - held_container.loc = src.loc - held_container = null - updateDialog() - - if(href_list["refresh"]) - updateDialog() - - if(href_list["close"]) - usr.unset_machine() - usr << browse(null,"window=icecreamvat") - return - -/obj/item/weapon/reagent_containers/food/snacks/icecream - name = "ice cream cone" - desc = "Delicious waffle cone, but no ice cream." - icon = 'icons/obj/kitchen.dmi' - icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time - layer = 3.1 - var/ice_creamed = 0 - var/cone_type - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/icecream/New() - create_reagents(20) - reagents.add_reagent("nutriment", 5) - -/obj/item/weapon/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour) - var/flavour_name = get_icecream_flavour_string(flavour) - name = "[flavour_name] icecream" - src.overlays += "icecream_[flavour_name]" - desc = "Delicious [cone_type] cone with a dollop of [flavour_name] ice cream." - ice_creamed = 1 - -#undef ICECREAM_VANILLA -#undef FLAVOUR_CHOCOLATE -#undef FLAVOUR_STRAWBERRY -#undef FLAVOUR_BLUE -#undef CONE_WAFFLE -#undef CONE_CHOC -#undef INGR_MILK -#undef INGR_FLOUR -#undef INGR_SUGAR -#undef INGR_ICE -#undef MUCK +#define ICECREAM_VANILLA 1 +#define FLAVOUR_CHOCOLATE 2 +#define FLAVOUR_STRAWBERRY 3 +#define FLAVOUR_BLUE 4 +#define CONE_WAFFLE 5 +#define CONE_CHOC 6 +#define INGR_MILK 7 +#define INGR_FLOUR 8 +#define INGR_SUGAR 9 +#define INGR_ICE 10 +#define MUCK 11 + +var/list/ingredients_source = list( +"berryjuice" = FLAVOUR_STRAWBERRY,\ +"coco" = FLAVOUR_CHOCOLATE,\ +"singulo" = FLAVOUR_BLUE,\ +"milk" = INGR_MILK,\ +"soymilk" = INGR_MILK,\ +"ice" = INGR_ICE,\ +"flour" = INGR_FLOUR,\ +"sugar" = INGR_SUGAR,\ +) + +/proc/get_icecream_flavour_string(var/flavour_type) + switch(flavour_type) + if(FLAVOUR_CHOCOLATE) + return "chocolate" + if(FLAVOUR_STRAWBERRY) + return "strawberry" + if(FLAVOUR_BLUE) + return "blue" + if(CONE_WAFFLE) + return "waffle" + if(CONE_CHOC) + return "chocolate" + if(INGR_MILK) + return "milk" + if(INGR_FLOUR) + return "flour" + if(INGR_SUGAR) + return "sugar" + if(INGR_ICE) + return "ice" + if(MUCK) + return "muck" + else + return "vanilla" + +/obj/machinery/icecream_vat + name = "icecream vat" + desc = "Ding-aling ding dong. Get your Nanotrasen-approved ice cream!" + icon = 'icons/obj/kitchen.dmi' + icon_state = "icecream_vat" + density = 1 + anchored = 0 + var/list/ingredients = list() + var/dispense_flavour = ICECREAM_VANILLA + var/obj/item/weapon/reagent_containers/glass/held_container + +/obj/machinery/icecream_vat/New() + ..() + + while(ingredients.len < 11) + ingredients.Add(5) + +/obj/machinery/icecream_vat/attack_hand(mob/user as mob) + user.set_machine(src) + interact(user) + +/obj/machinery/icecream_vat/interact(mob/user as mob) + var/dat + dat += "Dispense vanilla icecream There is [ingredients[ICECREAM_VANILLA]] scoops of vanilla icecream left (made from milk and ice).
    " + dat += "Dispense strawberry icecream There is [ingredients[FLAVOUR_STRAWBERRY]] dollops of strawberry flavouring left (obtained from berry juice.
    " + dat += "Dispense chocolate icecream There is [ingredients[FLAVOUR_CHOCOLATE]] dollops of chocolate flavouring left (obtained from cocoa powder).
    " + dat += "Dispense blue icecream There is [ingredients[FLAVOUR_BLUE]] dollops of blue flavouring left (obtained from bluespace tomato singulo).
    " + dat += "
    " + dat += "Dispense waffle cones There are [ingredients[CONE_WAFFLE]] waffle cones left.
    " + dat += "Dispense chocolate cones There are [ingredients[CONE_CHOC]] chocolate cones left.
    " + dat += "
    " + dat += "Make waffle cones There is [ingredients[INGR_FLOUR]]/[ingredients[INGR_SUGAR]] of flour and sugar left.
    " + dat += "Make chocolate cones There is [ingredients[FLAVOUR_CHOCOLATE]]/[ingredients[CONE_WAFFLE]] of chocolate flavouring and waffle cones left.
    " + dat += "Make vanilla icecream There is [ingredients[INGR_MILK]]/[ingredients[INGR_ICE]] of milk and ice left.
    " + dat += "
    " + if(held_container) + dat += "Eject [held_container] " + else + dat += "No beaker inserted. " + dat += "Refresh Close" + + var/datum/browser/popup = new(user, "icecreamvat","Icecream Vat", 700, 400, src) + popup.set_content(dat) + popup.open() + +/obj/machinery/icecream_vat/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(istype(O, /obj/item/weapon/reagent_containers)) + if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/icecream)) + var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = O + if(!I.ice_creamed) + if(ingredients[ICECREAM_VANILLA] > 0) + var/flavour_name = get_icecream_flavour_string(dispense_flavour) + if(ingredients[dispense_flavour] > 0) + src.visible_message("\icon[src] [user] scoops delicious [flavour_name] flavoured icecream into [I].") + ingredients[dispense_flavour] -= 1 + ingredients[ICECREAM_VANILLA] -= 1 + + I.add_ice_cream(dispense_flavour) + if(held_container) + held_container.reagents.trans_to(I, 10) + if(I.reagents.total_volume < 10) + I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume) + else + user << "There is not enough [flavour_name] flavouring left! Insert more of the required ingredients." + else + user << "There is not enough icecream left! Insert more milk and ice." + else + user << "[O] already has icecream in it." + else if(istype(O, /obj/item/weapon/reagent_containers/glass)) + if(held_container) + user << "You must remove [held_container] from [src] first." + else + user << "You insert [O] into [src]." + user.drop_item() + O.loc = src + held_container = O + else + var/obj/item/weapon/reagent_containers/R = O + if(R.reagents) + src.visible_message("[user] has emptied all of [R] into [src].") + for (var/datum/reagent/current_reagent in R.reagents.reagent_list) + if(ingredients_source[current_reagent.id]) + add(ingredients_source[current_reagent.id], current_reagent.volume / 2) + else + add(MUCK, current_reagent.volume / 5) + R.reagents.clear_reagents() + return 1 + else + ..() + +/obj/machinery/icecream_vat/proc/add(var/add_type, var/amount) + if(add_type <= ingredients.len) + ingredients[add_type] += amount + updateDialog() + +/obj/machinery/icecream_vat/proc/make(var/mob/user, var/make_type) + switch(make_type) + if(CONE_WAFFLE) + if(ingredients[INGR_FLOUR] > 0 && ingredients[INGR_SUGAR] > 0) + var/amount = max( min(ingredients[INGR_FLOUR], ingredients[INGR_SUGAR]), 5) + ingredients[INGR_FLOUR] -= amount + ingredients[INGR_SUGAR] -= amount + ingredients[CONE_WAFFLE] += amount + src.visible_message("[user] cooks up some waffle cones.") + else + user << "You require sugar and flour to make waffle cones." + if(CONE_CHOC) + if(ingredients[FLAVOUR_CHOCOLATE] > 0 && ingredients[CONE_WAFFLE] > 0) + var/amount = min(ingredients[CONE_WAFFLE], ingredients[FLAVOUR_CHOCOLATE]) + ingredients[CONE_WAFFLE] -= amount + ingredients[FLAVOUR_CHOCOLATE] -= amount + ingredients[CONE_CHOC] += amount + src.visible_message("[user] cooks up some chocolate cones.") + else + user << "You require waffle cones and chocolate flavouring to make chocolate cones." + if(ICECREAM_VANILLA) + if(ingredients[INGR_ICE] > 0 && ingredients[INGR_MILK] > 0) + var/amount = min(ingredients[INGR_ICE], ingredients[INGR_MILK]) + ingredients[INGR_ICE] -= amount + ingredients[INGR_MILK] -= amount + ingredients[ICECREAM_VANILLA] += amount + src.visible_message("[user] whips up some vanilla icecream.") + else + user << "You require milk and ice to make vanilla icecream." + updateDialog() + +/obj/machinery/icecream_vat/Topic(href, href_list) + if(..()) + return + if(href_list["dispense"]) + dispense_flavour = text2num(href_list["dispense"]) + src.visible_message("\blue[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.") + + if(href_list["cone"]) + var/dispense_cone = text2num(href_list["cone"]) + if(ingredients[dispense_cone] <= ingredients.len) + var/cone_name = get_icecream_flavour_string(dispense_cone) + if(ingredients[dispense_cone] >= 1) + ingredients[dispense_cone] -= 1 + var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = new(src.loc) + I.cone_type = cone_name + I.icon_state = "icecream_cone_[cone_name]" + I.desc = "Delicious [cone_name] cone, but no ice cream." + src.visible_message("[usr] dispenses a crunchy [cone_name] cone from [src].") + else + usr << "There are no [cone_name] cones left!" + updateDialog() + + if(href_list["make"]) + make( usr, text2num(href_list["make"]) ) + updateDialog() + + if(href_list["eject"]) + if(held_container) + held_container.loc = src.loc + held_container = null + updateDialog() + + if(href_list["refresh"]) + updateDialog() + + if(href_list["close"]) + usr.unset_machine() + usr << browse(null,"window=icecreamvat") + return + +/obj/item/weapon/reagent_containers/food/snacks/icecream + name = "ice cream cone" + desc = "Delicious waffle cone, but no ice cream." + icon = 'icons/obj/kitchen.dmi' + icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time + layer = 3.1 + var/ice_creamed = 0 + var/cone_type + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/icecream/New() + create_reagents(20) + reagents.add_reagent("nutriment", 5) + +/obj/item/weapon/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour) + var/flavour_name = get_icecream_flavour_string(flavour) + name = "[flavour_name] icecream" + src.overlays += "icecream_[flavour_name]" + desc = "Delicious [cone_type] cone with a dollop of [flavour_name] ice cream." + ice_creamed = 1 + +#undef ICECREAM_VANILLA +#undef FLAVOUR_CHOCOLATE +#undef FLAVOUR_STRAWBERRY +#undef FLAVOUR_BLUE +#undef CONE_WAFFLE +#undef CONE_CHOC +#undef INGR_MILK +#undef INGR_FLOUR +#undef INGR_SUGAR +#undef INGR_ICE +#undef MUCK diff --git a/code/game/machinery/kitchen/juicer.dm b/code/game/machinery/kitchen/juicer.dm index c2b3fbbc0dc..f93bfc68340 100644 --- a/code/game/machinery/kitchen/juicer.dm +++ b/code/game/machinery/kitchen/juicer.dm @@ -158,7 +158,7 @@ for (var/obj/item/weapon/reagent_containers/food/snacks/O in src.contents) var/r_id = get_juice_id(O) beaker.reagents.add_reagent(r_id,get_juice_amount(O)) - del(O) + qdel(O) if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) break diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index b34fbb1df71..540bfeeec26 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -391,7 +391,7 @@ var/id = O.reagents.get_master_reagent_id() if (id) amount+=O.reagents.get_reagent_amount(id) - del(O) + qdel(O) src.reagents.clear_reagents() ffuu.reagents.add_reagent("carbon", amount) ffuu.reagents.add_reagent("toxin", amount/10) diff --git a/code/game/machinery/kitchen/monkeyrecycler.dm b/code/game/machinery/kitchen/monkeyrecycler.dm index 364c956edaf..31c2aa37d98 100644 --- a/code/game/machinery/kitchen/monkeyrecycler.dm +++ b/code/game/machinery/kitchen/monkeyrecycler.dm @@ -27,7 +27,7 @@ user << "\red The monkey is struggling far too much to put it in the recycler." else user.drop_item() - del(target) + qdel(target) user << "\blue You stuff the monkey in the machine." playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) use_power(500) diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm index 4fa866635b2..05b5afe5a3f 100644 --- a/code/game/machinery/kitchen/processor.dm +++ b/code/game/machinery/kitchen/processor.dm @@ -23,7 +23,7 @@ if (src.output && loc) new src.output(loc) if (what) - del(what) + qdel(what) // Note to self: Make this safer /* objs */ meat diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index b3672caa522..a2b378ba426 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -267,7 +267,7 @@ obj/machinery/smartfridge/drying_rack/load() //For updating the filled overlay else var/dried = S.dried_type new dried(src.loc) - del S + qdel(S) return 1 return 0 diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 2d2ea1cfcbb..db84ff75a83 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -46,7 +46,7 @@ Class Variables: Class Procs: New() 'game/machinery/machine.dm' - Del() 'game/machinery/machine.dm' + Destroy() 'game/machinery/machine.dm' auto_use_power() 'game/machinery/machine.dm' This proc determines how power mode power is deducted by the machine. @@ -108,12 +108,14 @@ Class Procs: var/state_open = 0 var/mob/living/occupant = null var/unsecuring_tool = /obj/item/weapon/wrench + var/interact_offline = 0 // Can the machine be interacted with while de-powered. /obj/machinery/New() ..() machines += src -/obj/machinery/Del() +/obj/machinery/Destroy() + machines.Remove(src) ..() /obj/machinery/process()//If you dont use process or power why are you here @@ -170,22 +172,22 @@ Class Procs: /obj/machinery/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(25)) - del(src) + qdel(src) return else return /obj/machinery/blob_act() if(prob(50)) - del(src) + qdel(src) /obj/machinery/proc/auto_use_power() if(!powered(power_channel)) @@ -198,7 +200,7 @@ Class Procs: /obj/machinery/Topic(href, href_list) ..() - if(stat & (NOPOWER|BROKEN)) + if(!interact_offline && stat & (NOPOWER|BROKEN)) return 1 if(usr.restrained() || usr.lying || usr.stat) return 1 @@ -237,7 +239,7 @@ Class Procs: return src.attack_hand(user) /obj/machinery/attack_hand(mob/user as mob) - if(stat & (NOPOWER|BROKEN|MAINT)) + if(!interact_offline && stat & (NOPOWER|BROKEN|MAINT)) return 1 if(user.lying || user.stat) return 1 @@ -285,7 +287,7 @@ Class Procs: if(I.reliability != 100 && crit_fail) I.crit_fail = 1 I.loc = src.loc - del(src) + qdel(src) /obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/icon_state_open, var/icon_state_closed, var/obj/item/weapon/screwdriver/S) if(istype(S)) @@ -345,4 +347,4 @@ Class Procs: for(var/var/obj/item/C in component_parts) user << " [C.name]" return 1 - return 0 + return 0 diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 8a30aab9651..174c80104e1 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -164,7 +164,7 @@ if(prob(electricity_level)) explosion(loc, 0, 1, 2, 3) // ooo dat shit EXPLODES son spawn(2) - del(src) + qdel(src) */ updateicon() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index a34f48fac9a..078abc9d240 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -75,7 +75,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/obj/machinery/newscaster/N = new(loc) N.pixel_y -= (loc.y - on_wall.y) * 32 N.pixel_x -= (loc.x - on_wall.x) * 32 - del(src) + qdel(src) @@ -139,7 +139,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.update_icon() //for any custom ones on the map... ..() //I just realised the newscasters weren't in the global machines list. The superconstructor call will tend to that -/obj/machinery/newscaster/Del() +/obj/machinery/newscaster/Destroy() allCasters -= src ..() @@ -183,12 +183,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) src.isbroken=1 if(prob(50)) - del(src) + qdel(src) else src.update_icon() //can't place it above the return and outside the if-else. or we might get runtimes of null.update_icon() if(prob(50)) goes in. return @@ -750,7 +750,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(do_after(user, 60)) new /obj/item/newscaster_frame(loc) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - del(src) + qdel(src) return if (src.isbroken) diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index 35954c0c8b6..e8e0fd7d30d 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -353,7 +353,7 @@ proc/getb(col) /mob/proc/clearmap() src.client.screen -= src.mapobjs for(var/obj/screen/O in mapobjs) - del(O) + qdel(O) mapobjs = null src.unset_machine() diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 4cec3d742c7..69b80866b86 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -543,7 +543,7 @@ Buildable meters "[user] fastens the [src].", \ "\blue You have fastened the [src].", \ "You hear ratchet.") - del(src) // remove the pipe item + qdel(src) // remove the pipe item return //TODO: DEFERRED @@ -571,7 +571,7 @@ Buildable meters new/obj/machinery/meter( src.loc ) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "\blue You have fastened the meter to the pipe" - del(src) + qdel(src) #undef PIPE_SIMPLE_STRAIGHT #undef PIPE_SIMPLE_BENT diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 03a6b917f10..68497181eae 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -75,7 +75,7 @@ if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter)) usr << "You put [W] back into [src]." user.drop_item() - del(W) + qdel(W) return else if (istype(W, /obj/item/weapon/wrench)) if (!anchored && !isinspace()) @@ -116,7 +116,7 @@ //Allow you to push disposal pipes into it (for those with density 1) /obj/machinery/pipedispenser/disposal/Crossed(var/obj/structure/disposalconstruct/pipe as obj) if(istype(pipe) && !pipe.anchored) - del(pipe) + qdel(pipe) Nah */ @@ -132,7 +132,7 @@ Nah if (pipe.anchored) return - del(pipe) + qdel(pipe) /obj/machinery/pipedispenser/disposal/attack_hand(user as mob) if(..()) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index dd352c00bd7..3671edddeaa 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -133,9 +133,9 @@ egun = 1 -/obj/machinery/porta_turret/Del() +/obj/machinery/porta_turret/Destroy() //deletes its own cover with it - del(cover) + qdel(cover) ..() @@ -261,7 +261,7 @@ new /obj/item/device/assembly/prox_sensor(loc) else user << "You remove the turret but did not manage to salvage anything." - del(src) + qdel(src) if(istype(I, /obj/item/weapon/card/emag) && !emagged) //Emagging the turret makes it go bonkers and stun everyone. It also makes @@ -288,7 +288,7 @@ user << "You unsecure the exterior bolts on the turret." icon_state = "turretCover" invisibility = 0 - del(cover) //deletes the cover, and the turret instance itself becomes its own cover. + qdel(cover) //deletes the cover, and the turret instance itself becomes its own cover. else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda)) //Behavior lock/unlock mangement @@ -333,13 +333,13 @@ if(lasercolor == "b" && disabled == 0) if(istype(Proj, /obj/item/projectile/lasertag/redtag)) disabled = 1 - del (Proj) + qdel(Proj) sleep(100) disabled = 0 if(lasercolor == "r" && disabled == 0) if(istype(Proj, /obj/item/projectile/lasertag/bluetag)) disabled = 1 - del (Proj) + qdel(Proj) sleep(100) disabled = 0 @@ -364,7 +364,7 @@ /obj/machinery/porta_turret/ex_act(severity) if(severity >= 3) //turret dies if an explosion touches it! - del(src) + qdel(src) else die() @@ -376,7 +376,7 @@ invisibility = 0 spark_system.start() //creates some sparks because they look cool density = 1 - del(cover) //deletes the cover - no need on keeping it there! + qdel(cover) //deletes the cover - no need on keeping it there! @@ -387,7 +387,7 @@ if(cover == null && anchored) //if it has no cover and is anchored if(stat & BROKEN) //if the turret is borked - del(cover) //delete its cover, assuming it has one. Workaround for a pesky little bug + qdel(cover) //delete its cover, assuming it has one. Workaround for a pesky little bug else cover = new /obj/machinery/porta_turret_cover(loc) //if the turret has no cover and is anchored, give it a cover @@ -646,7 +646,7 @@ playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) user << "You dismantle the turret construction." new /obj/item/stack/sheet/metal( loc, 5) - del(src) + qdel(src) return if(1) @@ -659,7 +659,7 @@ icon_state = "turret_frame2" if(M.amount <= 0) user.unEquip(M, 1) //We're deleting it anyway, so no point in having NODROP fuck shit up. - del(M) + qdel(M) else user << "You need two sheets of metal for that." return @@ -709,7 +709,7 @@ gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge user << "You add [I] to the turret." build_step = 4 - del(I) //delete the gun :( + qdel(I) //delete the gun :( return else if(istype(I, /obj/item/weapon/wrench)) @@ -725,7 +725,7 @@ user << "\the [I] is stuck to your hand, you cannot put it in \the [src]" return user << "You add the prox sensor to the turret." - del(I) + qdel(I) return //attack_hand() removes the gun @@ -748,7 +748,7 @@ M.amount -= 2 if(M.amount <= 0) user.unEquip(M, 1) //If we don't force-unequip, bugs happen because the item was deleted without updating the neccesary stuffs. - del(M) + qdel(M) else user << "You need two sheets of metal for that." return @@ -783,7 +783,7 @@ // Turret.cover=new/obj/machinery/porta_turret_cover(loc) // Turret.cover.Parent_Turret=Turret // Turret.cover.name = finish_name - del(src) + qdel(src) else if(istype(I, /obj/item/weapon/crowbar)) playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) @@ -981,7 +981,7 @@ Status: []
    "}, user << "You unsecure the exterior bolts on the turret." Parent_Turret.icon_state = "turretCover" Parent_Turret.invisibility = 0 - del(src) + qdel(src) else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda)) if(Parent_Turret.allowed(user)) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index d92af0da8c0..a476f19b843 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -1,157 +1,157 @@ -var/const/SAFETY_COOLDOWN = 100 - -/obj/machinery/recycler - name = "crusher" - desc = "A large crushing machine which is used to recycle small items ineffeciently; there are lights on the side of it." - icon = 'icons/obj/recycling.dmi' - icon_state = "grinder-o0" - layer = MOB_LAYER+1 // Overhead - anchored = 1 - density = 1 - var/safety_mode = 0 // Temporality stops the machine if it detects a mob - var/grinding = 0 - var/icon_name = "grinder-o" - var/blood = 0 - var/eat_dir = WEST - -/obj/machinery/recycler/New() - // On us - ..() - update_icon() - -/obj/machinery/recycler/examine() - set src in view() - ..() - usr << "The power light is [(stat & NOPOWER) ? "off" : "on"]." - usr << "The safety-mode light is [safety_mode ? "on" : "off"]." - usr << "The safety-sensors status light is [emagged ? "off" : "on"]." - -/obj/machinery/recycler/power_change() - ..() - update_icon() - - -/obj/machinery/recycler/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/weapon/card/emag) && !emagged) - emagged = 1 - if(safety_mode) - safety_mode = 0 - update_icon() - playsound(src.loc, "sparks", 75, 1, -1) - else if(istype(I, /obj/item/weapon/screwdriver) && emagged) - emagged = 0 - update_icon() - user << "You reset the crusher to its default factory settings." - else - ..() - return - add_fingerprint(user) - -/obj/machinery/recycler/update_icon() - ..() - var/is_powered = !(stat & (BROKEN|NOPOWER)) - if(safety_mode) - is_powered = 0 - icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end - -// This is purely for admin possession !FUN!. -/obj/machinery/recycler/Bump(var/atom/movable/AM) - ..() - if(AM) - Bumped(AM) - - -/obj/machinery/recycler/Bumped(var/atom/movable/AM) - - if(stat & (BROKEN|NOPOWER)) - return - if(safety_mode) - return - // If we're not already grinding something. - if(!grinding) - grinding = 1 - spawn(1) - grinding = 0 - else - return - - var/move_dir = get_dir(loc, AM.loc) - if(move_dir == eat_dir) - if(isliving(AM)) - if(emagged) - eat(AM) - else - stop(AM) - else if(istype(AM, /obj/item)) - recycle(AM) - else // Can't recycle - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) - AM.loc = src.loc - -/obj/machinery/recycler/proc/recycle(var/obj/item/I, var/sound = 1) - I.loc = src.loc - if(!istype(I, /obj/item/weapon/disk/nuclear)) - del(I) - if(prob(15)) - new /obj/item/stack/sheet/metal(loc) - if(prob(10)) - new /obj/item/stack/sheet/glass(loc) - if(prob(2)) - new /obj/item/stack/sheet/plasteel(loc) - if(prob(1)) - new /obj/item/stack/sheet/rglass(loc) - if(sound) - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - - -/obj/machinery/recycler/proc/stop(var/mob/living/L) - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) - safety_mode = 1 - update_icon() - L.loc = src.loc - - spawn(SAFETY_COOLDOWN) - playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) - safety_mode = 0 - update_icon() - -/obj/machinery/recycler/proc/eat(var/mob/living/L) - - L.loc = src.loc - - if(issilicon(L)) - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - else - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - - var/gib = 1 - // By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count) - if(iscarbon(L)) - gib = 0 - if(L.stat == CONSCIOUS) - L.say("ARRRRRRRRRRRGH!!!") - add_blood(L) - - if(!blood && !issilicon(L)) - blood = 1 - update_icon() - - // Remove and recycle the equipped items. - for(var/obj/item/I in L.get_equipped_items()) - if(L.unEquip(I)) - recycle(I, 0) - - // Instantly lie down, also go unconscious from the pain, before you die. - L.Paralyse(5) - - // For admin fun, var edit emagged to 2. - if(gib || emagged == 2) - L.gib() - else if(emagged == 1) - L.adjustBruteLoss(1000) - - - -/obj/item/weapon/paper/recycler - name = "paper - 'garbage duty instructions'" +var/const/SAFETY_COOLDOWN = 100 + +/obj/machinery/recycler + name = "crusher" + desc = "A large crushing machine which is used to recycle small items ineffeciently; there are lights on the side of it." + icon = 'icons/obj/recycling.dmi' + icon_state = "grinder-o0" + layer = MOB_LAYER+1 // Overhead + anchored = 1 + density = 1 + var/safety_mode = 0 // Temporality stops the machine if it detects a mob + var/grinding = 0 + var/icon_name = "grinder-o" + var/blood = 0 + var/eat_dir = WEST + +/obj/machinery/recycler/New() + // On us + ..() + update_icon() + +/obj/machinery/recycler/examine() + set src in view() + ..() + usr << "The power light is [(stat & NOPOWER) ? "off" : "on"]." + usr << "The safety-mode light is [safety_mode ? "on" : "off"]." + usr << "The safety-sensors status light is [emagged ? "off" : "on"]." + +/obj/machinery/recycler/power_change() + ..() + update_icon() + + +/obj/machinery/recycler/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/weapon/card/emag) && !emagged) + emagged = 1 + if(safety_mode) + safety_mode = 0 + update_icon() + playsound(src.loc, "sparks", 75, 1, -1) + else if(istype(I, /obj/item/weapon/screwdriver) && emagged) + emagged = 0 + update_icon() + user << "You reset the crusher to its default factory settings." + else + ..() + return + add_fingerprint(user) + +/obj/machinery/recycler/update_icon() + ..() + var/is_powered = !(stat & (BROKEN|NOPOWER)) + if(safety_mode) + is_powered = 0 + icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end + +// This is purely for admin possession !FUN!. +/obj/machinery/recycler/Bump(var/atom/movable/AM) + ..() + if(AM) + Bumped(AM) + + +/obj/machinery/recycler/Bumped(var/atom/movable/AM) + + if(stat & (BROKEN|NOPOWER)) + return + if(safety_mode) + return + // If we're not already grinding something. + if(!grinding) + grinding = 1 + spawn(1) + grinding = 0 + else + return + + var/move_dir = get_dir(loc, AM.loc) + if(move_dir == eat_dir) + if(isliving(AM)) + if(emagged) + eat(AM) + else + stop(AM) + else if(istype(AM, /obj/item)) + recycle(AM) + else // Can't recycle + playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + AM.loc = src.loc + +/obj/machinery/recycler/proc/recycle(var/obj/item/I, var/sound = 1) + I.loc = src.loc + if(!istype(I, /obj/item/weapon/disk/nuclear)) + qdel(I) + if(prob(15)) + new /obj/item/stack/sheet/metal(loc) + if(prob(10)) + new /obj/item/stack/sheet/glass(loc) + if(prob(2)) + new /obj/item/stack/sheet/plasteel(loc) + if(prob(1)) + new /obj/item/stack/sheet/rglass(loc) + if(sound) + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) + + +/obj/machinery/recycler/proc/stop(var/mob/living/L) + playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + safety_mode = 1 + update_icon() + L.loc = src.loc + + spawn(SAFETY_COOLDOWN) + playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) + safety_mode = 0 + update_icon() + +/obj/machinery/recycler/proc/eat(var/mob/living/L) + + L.loc = src.loc + + if(issilicon(L)) + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) + else + playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) + + var/gib = 1 + // By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count) + if(iscarbon(L)) + gib = 0 + if(L.stat == CONSCIOUS) + L.say("ARRRRRRRRRRRGH!!!") + add_blood(L) + + if(!blood && !issilicon(L)) + blood = 1 + update_icon() + + // Remove and recycle the equipped items. + for(var/obj/item/I in L.get_equipped_items()) + if(L.unEquip(I)) + recycle(I, 0) + + // Instantly lie down, also go unconscious from the pain, before you die. + L.Paralyse(5) + + // For admin fun, var edit emagged to 2. + if(gib || emagged == 2) + L.gib() + else if(emagged == 1) + L.adjustBruteLoss(1000) + + + +/obj/item/weapon/paper/recycler + name = "paper - 'garbage duty instructions'" info = "

    New Assignment

    You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.

    There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then deliver these minerals to cargo or engineering. You are our last hope for a clean station, do not screw this up!" \ No newline at end of file diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index 27c30156454..8ab48a31a60 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -26,7 +26,7 @@ count++ if (O:amount < 1) - del(O) + qdel(O) user << "You insert [count] metal sheet\s into \the [src]." src.overlays -= "fab-load-metal" diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index f1cd5d5ebae..855ca45dc7b 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -15,7 +15,7 @@ ..() air_update_turf(1) -/obj/machinery/shield/Del() +/obj/machinery/shield/Destroy() opacity = 0 density = 0 air_update_turf(1) @@ -47,7 +47,7 @@ if (src.health <= 0) visible_message("\blue The [src] dissapates") - del(src) + qdel(src) return opacity = 1 @@ -60,7 +60,7 @@ if(src.health <= 0) visible_message("\blue The [src] dissapates") - del(src) + qdel(src) return opacity = 1 @@ -72,7 +72,7 @@ ..() if(health <=0) visible_message("\blue The [src] dissapates") - del(src) + qdel(src) return opacity = 1 spawn(20) if(src) opacity = 0 @@ -81,25 +81,25 @@ switch(severity) if(1.0) if (prob(75)) - del(src) + qdel(src) if(2.0) if (prob(50)) - del(src) + qdel(src) if(3.0) if (prob(25)) - del(src) + qdel(src) return /obj/machinery/shield/emp_act(severity) switch(severity) if(1) - del(src) + qdel(src) if(2) if(prob(50)) - del(src) + qdel(src) /obj/machinery/shield/blob_act() - del(src) + qdel(src) /obj/machinery/shield/hitby(AM as mob|obj) @@ -121,7 +121,7 @@ //Handle the destruction of the shield if (src.health <= 0) visible_message("\blue The [src] dissapates") - del(src) + qdel(src) return //The shield becomes dense to absorb the blow.. purely asthetic. @@ -152,9 +152,9 @@ var/locked = 0 var/shield_range = 4 -/obj/machinery/shieldgen/Del() +/obj/machinery/shieldgen/Destroy() for(var/obj/machinery/shield/shield_tile in deployed_shields) - del(shield_tile) + qdel(shield_tile) ..() @@ -176,13 +176,13 @@ update_icon() for(var/obj/machinery/shield/shield_tile in deployed_shields) - del(shield_tile) + qdel(shield_tile) deployed_shields.Cut() /obj/machinery/shieldgen/process() if(malfunction && active) if(deployed_shields.len && prob(5)) - del(pick(deployed_shields)) + qdel(pick(deployed_shields)) return @@ -190,7 +190,7 @@ if(health <= 30) src.malfunction = 1 if(health <= 0) - del(src) + qdel(src) update_icon() return @@ -516,14 +516,14 @@ T2 = T if(locate(/obj/machinery/shieldwall) in T) F = (locate(/obj/machinery/shieldwall) in T) - del(F) + qdel(F) if(locate(/obj/machinery/shieldwallgen) in T) G = (locate(/obj/machinery/shieldwallgen) in T) if(!G.active) break -/obj/machinery/shieldwallgen/Del() +/obj/machinery/shieldwallgen/Destroy() src.cleanup(1) src.cleanup(2) src.cleanup(4) @@ -569,11 +569,11 @@ /obj/machinery/shieldwall/process() if(needs_power) if(isnull(gen_primary)||isnull(gen_secondary)) - del(src) + qdel(src) return if(!(gen_primary.active)||!(gen_secondary.active)) - del(src) + qdel(src) return // if(prob(50)) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index e096329c07e..d61307589bf 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -88,12 +88,12 @@ if(1.0) if(prob(50)) src.dump_everything() //So suits dont survive all the time - del(src) + qdel(src) return if(2.0) if(prob(50)) src.dump_everything() - del(src) + qdel(src) return else return @@ -482,7 +482,7 @@ src.update_icon() // for(var/obj/O in src) -// del(O) +// qdel(O) src.add_fingerprint(usr) src.updateUsrDialog() @@ -528,7 +528,7 @@ //for(var/obj/O in src) // O.loc = src.loc src.add_fingerprint(user) - del(G) + qdel(G) src.updateUsrDialog() src.update_icon() return diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index ddedae35197..d452688974f 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -118,7 +118,7 @@ user << "\blue Locked In" new droptype( user.loc ) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) - del(src) + qdel(src) return /obj/item/device/sbeacondrop/bomb @@ -203,7 +203,7 @@ return - Del() + Destroy() if(active) Deactivate() ..() diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index b97f7c5b030..d8d0b0c3e70 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -1,311 +1,311 @@ -/obj/machinery/syndicatebomb - icon = 'icons/obj/assemblies.dmi' - name = "syndicate bomb" - icon_state = "syndicate-bomb" - desc = "A large and menacing device. Can be bolted down with a wrench." - - anchored = 0 - density = 0 - layer = MOB_LAYER - 0.1 //so people can't hide it and it's REALLY OBVIOUS - unacidable = 1 - - var/datum/wires/syndicatebomb/wires = null - var/timer = 60 - var/open_panel = 0 //are the wires exposed? - var/active = 0 //is the bomb counting down? - var/defused = 0 //is the bomb capable of exploding? - var/obj/item/weapon/bombcore/payload = /obj/item/weapon/bombcore/ - var/beepsound = 'sound/items/timer.ogg' - -/obj/machinery/syndicatebomb/process() - if(active && !defused && (timer > 0)) //Tick Tock - var/volume = (timer <= 10 ? 30 : 5) // Tick louder when the bomb is closer to being detonated. - playsound(loc, beepsound, volume, 0) - timer-- - if(active && !defused && (timer <= 0)) //Boom - active = 0 - timer = 60 - update_icon() - if(payload in src) - payload.detonate() - return - if(!active || defused) //Counter terrorists win - if(defused && payload in src) - payload.defuse() - return - -/obj/machinery/syndicatebomb/New() - wires = new(src) - payload = new payload(src) - update_icon() - ..() - - -/obj/machinery/syndicatebomb/examine() - ..() - usr << "A digital display on it reads \"[timer]\"." - -/obj/machinery/syndicatebomb/update_icon() - icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]" - -/obj/machinery/syndicatebomb/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/weapon/wrench)) - if(!anchored) - if(!isturf(src.loc) || istype(src.loc, /turf/space)) - user << "The bomb must be placed on solid ground to attach it" - else - user << "You firmly wrench the bomb to the floor" - playsound(loc, 'sound/items/ratchet.ogg', 50, 1) - anchored = 1 - if(active) - user << "The bolts lock in place" - else - if(!active) - user << "You wrench the bomb from the floor" - playsound(loc, 'sound/items/ratchet.ogg', 50, 1) - anchored = 0 - else - user << "The bolts are locked down!" - - else if(istype(I, /obj/item/weapon/screwdriver)) - open_panel = !open_panel - update_icon() - user << "You [open_panel ? "open" : "close"] the wire panel." - - else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler )) - if(open_panel) - wires.Interact(user) - - else if(istype(I, /obj/item/weapon/crowbar)) - if(open_panel && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE)) - if(payload) - user << "You carefully pry out [payload]." - payload.loc = user.loc - payload = null - else - user << "There isn't anything in here to remove!" - else if (open_panel) - user << "The wires conneting the shell to the explosives are holding it down!" - else - user << "The cover is screwed on, it won't pry off!" - else if(istype(I, /obj/item/weapon/bombcore)) - if(!payload) - payload = I - user << "You place [payload] into [src]." - user.drop_item() - payload.loc = src - else - user << "[payload] is already loaded into [src], you'll have to remove it first." - else - ..() - -/obj/machinery/syndicatebomb/attack_hand(var/mob/user) - interact(user) - -/obj/machinery/syndicatebomb/attack_ai() - return - -/obj/machinery/syndicatebomb/interact(var/mob/user) - if(wires) - wires.Interact(user) - if(!open_panel) - if(!active) - settings(user) - return - else if(anchored) - user << "The bomb is bolted to the floor!" - return - -/obj/machinery/syndicatebomb/proc/settings(var/mob/user) - var/newtime = input(user, "Please set the timer.", "Timer", "[timer]") as num - newtime = Clamp(newtime, 60, 60000) - if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station - timer = newtime - src.loc.visible_message("\blue \icon[src] timer set for [timer] seconds.") - if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user)) - if(defused || active) - if(defused) - src.loc.visible_message("\blue \icon[src] Device error: User intervention required") - return - else - src.loc.visible_message("\red \icon[src] [timer] seconds until detonation, please clear the area.") - playsound(loc, 'sound/machines/click.ogg', 30, 1) - active = 1 - update_icon() - add_fingerprint(user) - - var/turf/bombturf = get_turf(src) - var/area/A = get_area(bombturf) - if(payload && !istype(payload, /obj/item/weapon/bombcore/training)) - message_admins("[key_name(user)]? has primed a [name] ([payload]) for detonation at [A.name] (JMP).") - log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") - payload.adminlog = "The [src.name] that [key_name(user)] had primed detonated!" - -/obj/machinery/syndicatebomb/proc/isWireCut(var/index) - return wires.IsIndexCut(index) - -///Bomb Subtypes/// - -/obj/machinery/syndicatebomb/training - name = "training bomb" - icon_state = "training-bomb" - desc = "A salvaged syndicate device gutted of its explosives to be used as a training aid for aspiring bomb defusers." - payload = /obj/item/weapon/bombcore/training/ - -/obj/machinery/syndicatebomb/badmin - name = "generic summoning badmin bomb" - desc = "Oh god what is in this thing?" - payload = /obj/item/weapon/bombcore/badmin/summon/ - -/obj/machinery/syndicatebomb/badmin/clown - name = "clown bomb" - icon_state = "clown-bomb" - desc = "HONK." - payload = /obj/item/weapon/bombcore/badmin/summon/clown - beepsound = 'sound/items/bikehorn.ogg' - -/obj/machinery/syndicatebomb/badmin/varplosion - payload = /obj/item/weapon/bombcore/badmin/explosion/ - -///Bomb Cores/// - -/obj/item/weapon/bombcore - name = "bomb payload" - desc = "A powerful secondary explosive of syndicate design and unknown composition, it should be stable under normal conditions..." - icon = 'icons/obj/assemblies.dmi' - icon_state = "bombcore" - item_state = "eshield0" - w_class = 3.0 - origin_tech = "syndicate=6;combat=5" - var/adminlog = null - -/obj/item/weapon/bombcore/ex_act(severity) //Little boom can chain a big boom - src.detonate() - -/obj/item/weapon/bombcore/proc/detonate() - if(adminlog) - message_admins(adminlog) - log_game(adminlog) - explosion(get_turf(src),2,5,11, flame_range = 11) - del(src) - -/obj/item/weapon/bombcore/proc/defuse() -//Note: Because of how var/defused is used you shouldn't override this UNLESS you intend to set the var to 0 or -// otherwise remove the core/reset the wires before the end of defuse(). It will repeatedly be called otherwise. - -///Bomb Core Subtypes/// - -/obj/item/weapon/bombcore/training - name = "dummy payload" - desc = "A nanotrasen replica of a syndicate payload. Its not intended to explode but to announce that it WOULD have exploded, then rewire itself to allow for more training." - origin_tech = null - var/defusals = 0 - var/attempts = 0 - -/obj/item/weapon/bombcore/training/proc/reset() - var/obj/machinery/syndicatebomb/holder = src.loc - if(istype(holder)) - holder.open_panel = 0 - if(holder.wires) - holder.wires.Shuffle() - holder.defused = 0 - holder.update_icon() - holder.updateDialog() - -/obj/item/weapon/bombcore/training/detonate() - var/obj/machinery/syndicatebomb/holder = src.loc - if(istype(holder)) - attempts++ - holder.loc.visible_message("\red \icon[holder] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") - reset() - else - del(src) - -/obj/item/weapon/bombcore/training/defuse() - var/obj/machinery/syndicatebomb/holder = src.loc - if(istype(holder)) - attempts++ - defusals++ - holder.loc.visible_message("\blue \icon[holder] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires...") - reset() - -/obj/item/weapon/bombcore/badmin - name = "badmin payload" - desc = "If you're seeing this someone has either made a mistake or gotten dangerously savvy with var editing!" - origin_tech = null - -/obj/item/weapon/bombcore/badmin/defuse() //because we wouldn't want them being harvested by players - var/obj/machinery/syndicatebomb/B = src.loc - del(B) - del(src) - -/obj/item/weapon/bombcore/badmin/summon/ - var/summon_path = /obj/item/weapon/reagent_containers/food/snacks/cookie - var/amt_summon = 1 - -/obj/item/weapon/bombcore/badmin/summon/detonate() - var/obj/machinery/syndicatebomb/B = src.loc - for(var/i = 0; i < amt_summon; i++) - var/atom/movable/X = new summon_path - X.loc = get_turf(src) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(X, pick(NORTH,SOUTH,EAST,WEST)) - del(B) - del(src) - -/obj/item/weapon/bombcore/badmin/summon/clown - summon_path = /mob/living/simple_animal/hostile/retaliate/clown - amt_summon = 100 - -/obj/item/weapon/bombcore/badmin/summon/clown/defuse() - playsound(src.loc, 'sound/misc/sadtrombone.ogg', 50) - ..() - -/obj/item/weapon/bombcore/badmin/explosion/ - var/HeavyExplosion = 2 - var/MediumExplosion = 5 - var/LightExplosion = 11 - var/Flames = 11 - -/obj/item/weapon/bombcore/badmin/explosion/detonate() - explosion(get_turf(src),HeavyExplosion,MediumExplosion,LightExplosion, flame_range = Flames) - -///Syndicate Detonator (aka the big red button)/// - -/obj/item/device/syndicatedetonator - name = "big red button" - desc = "Nothing good can come of pressing a button this garish..." - icon = 'icons/obj/assemblies.dmi' - icon_state = "bigred" - item_state = "electronic" - w_class = 1.0 - origin_tech = "syndicate=2" - var/cooldown = 0 - var/detonated = 0 - var/existant = 0 - -/obj/item/device/syndicatedetonator/attack_self(mob/user as mob) - if(!cooldown) - for(var/obj/machinery/syndicatebomb/B in machines) - if(B.active) - B.timer = 0 - detonated++ - existant++ - playsound(user, 'sound/machines/click.ogg', 20, 1) - user << "[existant] found, [detonated] triggered." - if(detonated) - var/turf/T = get_turf(src) - var/area/A = get_area(T) - detonated-- - var/log_str = "[key_name(user)]? has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name] (JMP)." - bombers += log_str - message_admins(log_str) - log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name]([T.x],[T.y],[T.z])") - detonated = 0 - existant = 0 - cooldown = 1 - spawn(30) cooldown = 0 - - - +/obj/machinery/syndicatebomb + icon = 'icons/obj/assemblies.dmi' + name = "syndicate bomb" + icon_state = "syndicate-bomb" + desc = "A large and menacing device. Can be bolted down with a wrench." + + anchored = 0 + density = 0 + layer = MOB_LAYER - 0.1 //so people can't hide it and it's REALLY OBVIOUS + unacidable = 1 + + var/datum/wires/syndicatebomb/wires = null + var/timer = 60 + var/open_panel = 0 //are the wires exposed? + var/active = 0 //is the bomb counting down? + var/defused = 0 //is the bomb capable of exploding? + var/obj/item/weapon/bombcore/payload = /obj/item/weapon/bombcore/ + var/beepsound = 'sound/items/timer.ogg' + +/obj/machinery/syndicatebomb/process() + if(active && !defused && (timer > 0)) //Tick Tock + var/volume = (timer <= 10 ? 30 : 5) // Tick louder when the bomb is closer to being detonated. + playsound(loc, beepsound, volume, 0) + timer-- + if(active && !defused && (timer <= 0)) //Boom + active = 0 + timer = 60 + update_icon() + if(payload in src) + payload.detonate() + return + if(!active || defused) //Counter terrorists win + if(defused && payload in src) + payload.defuse() + return + +/obj/machinery/syndicatebomb/New() + wires = new(src) + payload = new payload(src) + update_icon() + ..() + + +/obj/machinery/syndicatebomb/examine() + ..() + usr << "A digital display on it reads \"[timer]\"." + +/obj/machinery/syndicatebomb/update_icon() + icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]" + +/obj/machinery/syndicatebomb/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/weapon/wrench)) + if(!anchored) + if(!isturf(src.loc) || istype(src.loc, /turf/space)) + user << "The bomb must be placed on solid ground to attach it" + else + user << "You firmly wrench the bomb to the floor" + playsound(loc, 'sound/items/ratchet.ogg', 50, 1) + anchored = 1 + if(active) + user << "The bolts lock in place" + else + if(!active) + user << "You wrench the bomb from the floor" + playsound(loc, 'sound/items/ratchet.ogg', 50, 1) + anchored = 0 + else + user << "The bolts are locked down!" + + else if(istype(I, /obj/item/weapon/screwdriver)) + open_panel = !open_panel + update_icon() + user << "You [open_panel ? "open" : "close"] the wire panel." + + else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler )) + if(open_panel) + wires.Interact(user) + + else if(istype(I, /obj/item/weapon/crowbar)) + if(open_panel && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE)) + if(payload) + user << "You carefully pry out [payload]." + payload.loc = user.loc + payload = null + else + user << "There isn't anything in here to remove!" + else if (open_panel) + user << "The wires conneting the shell to the explosives are holding it down!" + else + user << "The cover is screwed on, it won't pry off!" + else if(istype(I, /obj/item/weapon/bombcore)) + if(!payload) + payload = I + user << "You place [payload] into [src]." + user.drop_item() + payload.loc = src + else + user << "[payload] is already loaded into [src], you'll have to remove it first." + else + ..() + +/obj/machinery/syndicatebomb/attack_hand(var/mob/user) + interact(user) + +/obj/machinery/syndicatebomb/attack_ai() + return + +/obj/machinery/syndicatebomb/interact(var/mob/user) + if(wires) + wires.Interact(user) + if(!open_panel) + if(!active) + settings(user) + return + else if(anchored) + user << "The bomb is bolted to the floor!" + return + +/obj/machinery/syndicatebomb/proc/settings(var/mob/user) + var/newtime = input(user, "Please set the timer.", "Timer", "[timer]") as num + newtime = Clamp(newtime, 60, 60000) + if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station + timer = newtime + src.loc.visible_message("\blue \icon[src] timer set for [timer] seconds.") + if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user)) + if(defused || active) + if(defused) + src.loc.visible_message("\blue \icon[src] Device error: User intervention required") + return + else + src.loc.visible_message("\red \icon[src] [timer] seconds until detonation, please clear the area.") + playsound(loc, 'sound/machines/click.ogg', 30, 1) + active = 1 + update_icon() + add_fingerprint(user) + + var/turf/bombturf = get_turf(src) + var/area/A = get_area(bombturf) + if(payload && !istype(payload, /obj/item/weapon/bombcore/training)) + message_admins("[key_name(user)]? has primed a [name] ([payload]) for detonation at [A.name] (JMP).") + log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") + payload.adminlog = "The [src.name] that [key_name(user)] had primed detonated!" + +/obj/machinery/syndicatebomb/proc/isWireCut(var/index) + return wires.IsIndexCut(index) + +///Bomb Subtypes/// + +/obj/machinery/syndicatebomb/training + name = "training bomb" + icon_state = "training-bomb" + desc = "A salvaged syndicate device gutted of its explosives to be used as a training aid for aspiring bomb defusers." + payload = /obj/item/weapon/bombcore/training/ + +/obj/machinery/syndicatebomb/badmin + name = "generic summoning badmin bomb" + desc = "Oh god what is in this thing?" + payload = /obj/item/weapon/bombcore/badmin/summon/ + +/obj/machinery/syndicatebomb/badmin/clown + name = "clown bomb" + icon_state = "clown-bomb" + desc = "HONK." + payload = /obj/item/weapon/bombcore/badmin/summon/clown + beepsound = 'sound/items/bikehorn.ogg' + +/obj/machinery/syndicatebomb/badmin/varplosion + payload = /obj/item/weapon/bombcore/badmin/explosion/ + +///Bomb Cores/// + +/obj/item/weapon/bombcore + name = "bomb payload" + desc = "A powerful secondary explosive of syndicate design and unknown composition, it should be stable under normal conditions..." + icon = 'icons/obj/assemblies.dmi' + icon_state = "bombcore" + item_state = "eshield0" + w_class = 3.0 + origin_tech = "syndicate=6;combat=5" + var/adminlog = null + +/obj/item/weapon/bombcore/ex_act(severity) //Little boom can chain a big boom + src.detonate() + +/obj/item/weapon/bombcore/proc/detonate() + if(adminlog) + message_admins(adminlog) + log_game(adminlog) + explosion(get_turf(src),2,5,11, flame_range = 11) + qdel(src) + +/obj/item/weapon/bombcore/proc/defuse() +//Note: Because of how var/defused is used you shouldn't override this UNLESS you intend to set the var to 0 or +// otherwise remove the core/reset the wires before the end of defuse(). It will repeatedly be called otherwise. + +///Bomb Core Subtypes/// + +/obj/item/weapon/bombcore/training + name = "dummy payload" + desc = "A nanotrasen replica of a syndicate payload. Its not intended to explode but to announce that it WOULD have exploded, then rewire itself to allow for more training." + origin_tech = null + var/defusals = 0 + var/attempts = 0 + +/obj/item/weapon/bombcore/training/proc/reset() + var/obj/machinery/syndicatebomb/holder = src.loc + if(istype(holder)) + holder.open_panel = 0 + if(holder.wires) + holder.wires.Shuffle() + holder.defused = 0 + holder.update_icon() + holder.updateDialog() + +/obj/item/weapon/bombcore/training/detonate() + var/obj/machinery/syndicatebomb/holder = src.loc + if(istype(holder)) + attempts++ + holder.loc.visible_message("\red \icon[holder] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") + reset() + else + qdel(src) + +/obj/item/weapon/bombcore/training/defuse() + var/obj/machinery/syndicatebomb/holder = src.loc + if(istype(holder)) + attempts++ + defusals++ + holder.loc.visible_message("\blue \icon[holder] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires...") + reset() + +/obj/item/weapon/bombcore/badmin + name = "badmin payload" + desc = "If you're seeing this someone has either made a mistake or gotten dangerously savvy with var editing!" + origin_tech = null + +/obj/item/weapon/bombcore/badmin/defuse() //because we wouldn't want them being harvested by players + var/obj/machinery/syndicatebomb/B = src.loc + qdel(B) + qdel(src) + +/obj/item/weapon/bombcore/badmin/summon/ + var/summon_path = /obj/item/weapon/reagent_containers/food/snacks/cookie + var/amt_summon = 1 + +/obj/item/weapon/bombcore/badmin/summon/detonate() + var/obj/machinery/syndicatebomb/B = src.loc + for(var/i = 0; i < amt_summon; i++) + var/atom/movable/X = new summon_path + X.loc = get_turf(src) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(X, pick(NORTH,SOUTH,EAST,WEST)) + qdel(B) + qdel(src) + +/obj/item/weapon/bombcore/badmin/summon/clown + summon_path = /mob/living/simple_animal/hostile/retaliate/clown + amt_summon = 100 + +/obj/item/weapon/bombcore/badmin/summon/clown/defuse() + playsound(src.loc, 'sound/misc/sadtrombone.ogg', 50) + ..() + +/obj/item/weapon/bombcore/badmin/explosion/ + var/HeavyExplosion = 2 + var/MediumExplosion = 5 + var/LightExplosion = 11 + var/Flames = 11 + +/obj/item/weapon/bombcore/badmin/explosion/detonate() + explosion(get_turf(src),HeavyExplosion,MediumExplosion,LightExplosion, flame_range = Flames) + +///Syndicate Detonator (aka the big red button)/// + +/obj/item/device/syndicatedetonator + name = "big red button" + desc = "Nothing good can come of pressing a button this garish..." + icon = 'icons/obj/assemblies.dmi' + icon_state = "bigred" + item_state = "electronic" + w_class = 1.0 + origin_tech = "syndicate=2" + var/cooldown = 0 + var/detonated = 0 + var/existant = 0 + +/obj/item/device/syndicatedetonator/attack_self(mob/user as mob) + if(!cooldown) + for(var/obj/machinery/syndicatebomb/B in machines) + if(B.active) + B.timer = 0 + detonated++ + existant++ + playsound(user, 'sound/machines/click.ogg', 20, 1) + user << "[existant] found, [detonated] triggered." + if(detonated) + var/turf/T = get_turf(src) + var/area/A = get_area(T) + detonated-- + var/log_str = "[key_name(user)]? has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name] (JMP)." + bombers += log_str + message_admins(log_str) + log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name]([T.x],[T.y],[T.z])") + detonated = 0 + existant = 0 + cooldown = 1 + spawn(30) cooldown = 0 + + + diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 4cd28043cb0..8bb964a7302 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -96,7 +96,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /* --- Do a snazzy animation! --- */ flick("broadcaster_send", src) -/obj/machinery/telecomms/broadcaster/Del() +/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 diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 5f3fd496d52..4098ed938c8 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -92,7 +92,7 @@ // Create a machine frame and delete the current machine var/obj/machinery/constructable_frame/machine_frame/F = new F.loc = src.loc - del(src) + qdel(src) /obj/machinery/telecomms/attack_ai(var/mob/user as mob) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 8b3c87dfcec..5919aa1abe8 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -158,7 +158,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() add_link(T) -/obj/machinery/telecomms/Del() +/obj/machinery/telecomms/Destroy() telecomms_list -= src ..() @@ -530,7 +530,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() Compiler.Holder = src server_radio = new() -/obj/machinery/telecomms/server/Del() +/obj/machinery/telecomms/server/Destroy() // Garbage collects all the NTSL datums. if(Compiler) Compiler.GC() diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 7d5f5bedfcf..e4a334f3398 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -303,7 +303,7 @@ return teleporter_hub && teleporter_console -/obj/machinery/teleport/station/Del() +/obj/machinery/teleport/station/Destroy() if(teleporter_hub) teleporter_hub.update_icon() ..() diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index c1f51893204..a035d061161 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -266,7 +266,7 @@ src.health -= Proj.damage ..() if(prob(45) && Proj.damage > 0) src.spark_system.start() - del (Proj) + qdel(Proj) if (src.health <= 0) src.die() return @@ -298,11 +298,11 @@ src.stat |= BROKEN src.icon_state = "destroyed_target_prism" if (cover!=null) - del(cover) + qdel(cover) sleep(3) flick("explosion", src) spawn(13) - del(src) + qdel(src) /obj/machinery/turretid name = "turret deactivation control" diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 9cc6fb0ef7e..ba2fb0a906c 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -73,11 +73,11 @@ /obj/machinery/vending/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if(prob(50)) - del(src) + qdel(src) return if(3.0) if(prob(25)) @@ -88,7 +88,7 @@ if(prob(75)) malfunction() else - del(src) + qdel(src) /obj/machinery/vending/proc/build_inventory(list/productlist, hidden=0, req_coin=0, start_empty = null) @@ -330,9 +330,9 @@ usr << "You successfully pull the coin out before [src] could swallow it." else usr << "You weren't able to pull the coin out fast enough, the machine ate it, string and all." - del(coin) + qdel(coin) else - del(coin) + qdel(coin) else if (!(R in product_records)) vend_ready = 1 message_admins("Vending machine exploit attempted by [key_name(usr, usr.client)]!") diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 5e66b5cd626..8ecd4881dac 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -44,7 +44,7 @@ for(var/obj/item/stack/sheet/hairlesshide/HH in contents) var/obj/item/stack/sheet/wetleather/WL = new(src) WL.amount = HH.amount - del(HH) + qdel(HH) if(crayon) @@ -77,10 +77,10 @@ new_jumpsuit_icon_state = J.icon_state new_jumpsuit_item_state = J.item_state new_jumpsuit_name = J.name - del(J) + qdel(J) //world << "DEBUG: YUP! [new_icon_state] and [new_item_state]" break - del(J) + qdel(J) for(var/T in typesof(/obj/item/clothing/gloves)) var/obj/item/clothing/gloves/G = new T //world << "DEBUG: [wash_color] == [J.item_color]" @@ -88,40 +88,40 @@ new_glove_icon_state = G.icon_state new_glove_item_state = G.item_state new_glove_name = G.name - del(G) + qdel(G) //world << "DEBUG: YUP! [new_icon_state] and [new_item_state]" break - del(G) + qdel(G) for(var/T in typesof(/obj/item/clothing/shoes)) var/obj/item/clothing/shoes/S = new T //world << "DEBUG: [wash_color] == [J.item_color]" if(wash_color == S.item_color) new_shoe_icon_state = S.icon_state new_shoe_name = S.name - del(S) + qdel(S) //world << "DEBUG: YUP! [new_icon_state] and [new_item_state]" break - del(S) + qdel(S) for(var/T in typesof(/obj/item/weapon/bedsheet)) var/obj/item/weapon/bedsheet/B = new T //world << "DEBUG: [wash_color] == [J.item_color]" if(wash_color == B.item_color) new_sheet_icon_state = B.icon_state new_sheet_name = B.name - del(B) + qdel(B) //world << "DEBUG: YUP! [new_icon_state] and [new_item_state]" break - del(B) + qdel(B) for(var/T in typesof(/obj/item/clothing/head/soft)) var/obj/item/clothing/head/soft/H = new T //world << "DEBUG: [wash_color] == [J.item_color]" if(wash_color == H.item_color) new_softcap_icon_state = H.icon_state new_softcap_name = H.name - del(H) + qdel(H) //world << "DEBUG: YUP! [new_icon_state] and [new_item_state]" break - del(H) + qdel(H) if(new_jumpsuit_icon_state && new_jumpsuit_item_state && new_jumpsuit_name) for(var/obj/item/clothing/under/J in contents) //world << "DEBUG: YUP! FOUND IT!" @@ -163,7 +163,7 @@ H.item_color = wash_color H.name = new_softcap_name H.desc = new_desc - del(crayon) + qdel(crayon) crayon = null @@ -206,7 +206,7 @@ var/obj/item/weapon/grab/G = W if(ishuman(G.assailant) && iscorgi(G.affecting)) G.affecting.loc = src - del(G) + qdel(G) state = 3 else ..() diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 2d2e2d83e91..218e8975358 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -76,7 +76,7 @@ if(equipment.len)//Now to remove it and equip anew. for(ME in equipment) equipment -= ME - del(ME) + qdel(ME) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src) ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src) diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm index cd77cbe6dfe..e7f1039c528 100644 --- a/code/game/mecha/combat/reticence.dm +++ b/code/game/mecha/combat/reticence.dm @@ -1,26 +1,26 @@ -/obj/mecha/combat/reticence - desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins." - name = "\improper reticence" - icon_state = "reticence" - step_in = 2 - dir_in = 1 //Facing North. - health = 100 - deflect_chance = 3 - damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1) - max_temperature = 15000 - wreckage = /obj/structure/mecha_wreckage/reticence - operation_req_access = list(access_theatre) - add_req_access = 0 - internal_damage_threshold = 25 - max_equip = 2 - step_energy_drain = 3 - color = "#87878715" - stepsound = null - -/obj/mecha/combat/reticence/loaded/New() - ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/tool/rcd //HAHA IT MAKES WALLS GET IT - ME.attach(src) +/obj/mecha/combat/reticence + desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins." + name = "\improper reticence" + icon_state = "reticence" + step_in = 2 + dir_in = 1 //Facing North. + health = 100 + deflect_chance = 3 + damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1) + max_temperature = 15000 + wreckage = /obj/structure/mecha_wreckage/reticence + operation_req_access = list(access_theatre) + add_req_access = 0 + internal_damage_threshold = 25 + max_equip = 2 + step_energy_drain = 3 + color = "#87878715" + stepsound = null + +/obj/mecha/combat/reticence/loaded/New() + ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/tool/rcd //HAHA IT MAKES WALLS GET IT + ME.attach(src) return \ No newline at end of file diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 4ca4d89acfb..8acdf01e5a9 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -57,8 +57,7 @@ chassis.occupant << sound('sound/mecha/weapdestr.ogg',volume=50) else chassis.occupant << sound('sound/mecha/critdestr.ogg',volume=50) - spawn - del src + qdel(src) return /obj/item/mecha_parts/mecha_equipment/proc/critfail() diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 45af1887d34..85bac58d1a2 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -303,7 +303,7 @@ if(do_after_cooldown(target)) if(disabled) return chassis.spark_system.start() - del(target) + qdel(target) playsound(target, 'sound/items/Deconstruct.ogg', 50, 1) chassis.use_power(energy_drain) if(1) @@ -429,7 +429,7 @@ do_after_cooldown() src = null spawn(rand(150,300)) - del(P) + qdel(P) return /obj/item/mecha_parts/mecha_equipment/gravcatapult diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index e96c1365c1d..3d990e77ddd 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -88,7 +88,7 @@ var/mob/M = A add_logs(firer, M, "shot", object="[src]") if(life <= 0) - del(src) + qdel(src) return /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser @@ -335,7 +335,7 @@ throw_impact(atom/hit_atom) if(primed) explosion(hit_atom, 0, 0, 2, 4, 0) - del(src) + qdel(src) else ..() return diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index b832b41212b..659544a14f2 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -147,4 +147,4 @@ icon_state = "recharge_comp_on" /obj/machinery/computer/mech_bay_power_console/initialize() - reconnect() + reconnect() diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 536cb0df164..d7c7771f4cc 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -177,9 +177,9 @@ if(time_coeff!=diff) time_coeff = diff -/obj/machinery/mecha_part_fabricator/Del() +/obj/machinery/mecha_part_fabricator/Destroy() for(var/atom/A in src) - del A + qdel(A) ..() return @@ -262,7 +262,7 @@ if(!istype(apart)) return 0 for(var/obj/O in part_set) if(O.type == apart.type) - del apart + qdel(apart) return 0 part_set[++part_set.len] = apart return 1 @@ -702,7 +702,7 @@ res.Move(src.loc) result = res.amount else - del res + qdel(res) return result @@ -793,7 +793,7 @@ if(src.resources[material] < res_max_amount) var/count = 0 src.overlays += "fab-load-[material]"//loading animation is now an overlay based on material type. No more spontaneous conversion of all ores to metal. -vey - while(src.resources[material] < res_max_amount && stack) + while(src.resources[material] < res_max_amount && stack && stack.amount > 0) src.resources[material] += MINERAL_MATERIAL_AMOUNT stack.use(1) count++ diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 3726706d5e9..f95760be264 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -91,11 +91,10 @@ mechas_list += src //global mech list return -/obj/mecha/Del() +/obj/mecha/Destroy() src.go_out() mechas_list -= src //global mech list ..() - return //////////////////////// ////// Helpers ///////// @@ -564,7 +563,7 @@ E.forceMove(T) E.destroy() spawn(0) - del(src) + qdel(src) return /obj/mecha/ex_act(severity) @@ -1632,7 +1631,7 @@ var/year_integer = text2num(year) // = 2013??? AI.bruteloss = O.getBruteLoss() AI.toxloss = O.toxloss AI.updatehealth() - del(O) + qdel(O) if (!AI.stat) AI.icon_state = "ai" else diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index d8ab135fdf6..24a42e5f774 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -80,7 +80,7 @@ custom_action(step, atom/used_atom, mob/user) user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" - del used_atom + qdel(used_atom) return 1 action(atom/used_atom,mob/user as mob) @@ -93,8 +93,7 @@ const_holder.icon_state = "ripley0" const_holder.density = 1 const_holder.overlays.len = 0 - spawn() - del src + qdel(src) return @@ -196,7 +195,7 @@ if(10) if(diff==FORWARD) user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "ripley5" else user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") @@ -212,7 +211,7 @@ if(8) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "ripley7" else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") @@ -291,7 +290,7 @@ custom_action(step, atom/used_atom, mob/user) user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" - del used_atom + qdel(used_atom) return 1 action(atom/used_atom,mob/user as mob) @@ -303,8 +302,7 @@ const_holder.icon = 'icons/mecha/mech_construction.dmi' const_holder.icon_state = "gygax0" const_holder.density = 1 - spawn() - del src + del(src) return @@ -430,7 +428,7 @@ if(16) if(diff==FORWARD) user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "gygax5" else user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") @@ -446,7 +444,7 @@ if(14) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "gygax7" else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") @@ -462,7 +460,7 @@ if(12) if(diff==FORWARD) user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "gygax9" else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") @@ -478,7 +476,7 @@ if(10) if(diff==FORWARD) user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "gygax11" else user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") @@ -494,7 +492,7 @@ if(8) if(diff==FORWARD) user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "gygax13" else user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.") @@ -533,7 +531,7 @@ if(3) if(diff==FORWARD) user.visible_message("[user] installs Gygax Armour Plates to [holder].", "You install Gygax Armour Plates to [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "gygax18" else user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") @@ -571,7 +569,7 @@ custom_action(step, atom/used_atom, mob/user) user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" - del used_atom + qdel(used_atom) return 1 action(atom/used_atom,mob/user as mob) @@ -583,8 +581,7 @@ const_holder.icon = 'icons/mecha/mech_construction.dmi' const_holder.icon_state = "fireripley0" const_holder.density = 1 - spawn() - del src + del(src) return @@ -691,7 +688,7 @@ if(11) if(diff==FORWARD) user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "fireripley5" else user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") @@ -707,7 +704,7 @@ if(9) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "fireripley7" else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") @@ -799,15 +796,14 @@ custom_action(step, atom/used_atom, mob/user) user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" - del used_atom + qdel(used_atom) return 1 spawn_result() var/obj/item/mecha_parts/chassis/const_holder = holder const_holder.construct = new /datum/construction/mecha/honker(const_holder) const_holder.density = 1 - spawn() - del src + del(src) return @@ -841,19 +837,19 @@ switch(step) if(10) user.visible_message("[user] installs the central control module into [holder].", "You install the central control module into [holder].") - del used_atom + qdel(used_atom) if(8) user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - del used_atom + qdel(used_atom) if(6) user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") - del used_atom + qdel(used_atom) if(4) user.visible_message("[user] puts clown wig and mask on [holder].", "You put clown wig and mask on [holder].") - del used_atom + qdel(used_atom) if(2) user.visible_message("[user] puts clown boots on [holder].", "You put clown boots on [holder].") - del used_atom + qdel(used_atom) return 1 spawn_result() @@ -873,7 +869,7 @@ custom_action(step, atom/used_atom, mob/user) user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" - del used_atom + qdel(used_atom) return 1 action(atom/used_atom,mob/user as mob) @@ -885,8 +881,7 @@ const_holder.icon = 'icons/mecha/mech_construction.dmi' const_holder.icon_state = "durand0" const_holder.density = 1 - spawn() - del src + del src return /datum/construction/reversible/mecha/durand @@ -1012,7 +1007,7 @@ if(16) if(diff==FORWARD) user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "durand5" else user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") @@ -1028,7 +1023,7 @@ if(14) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "durand7" else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") @@ -1044,7 +1039,7 @@ if(12) if(diff==FORWARD) user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "durand9" else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") @@ -1060,7 +1055,7 @@ if(10) if(diff==FORWARD) user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "durand11" else user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") @@ -1076,7 +1071,7 @@ if(8) if(diff==FORWARD) user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "durand13" else user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.") @@ -1115,7 +1110,7 @@ if(3) if(diff==FORWARD) user.visible_message("[user] installs Durand Armour Plates to [holder].", "You install Durand Armour Plates to [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "durand18" else user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") @@ -1155,7 +1150,7 @@ custom_action(step, atom/used_atom, mob/user) user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" - del used_atom + qdel(used_atom) return 1 action(atom/used_atom,mob/user as mob) @@ -1176,7 +1171,7 @@ custom_action(step, atom/used_atom, mob/user) user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" - del used_atom + qdel(used_atom) return 1 action(atom/used_atom,mob/user as mob) @@ -1188,8 +1183,7 @@ const_holder.icon = 'icons/mecha/mech_construction.dmi' const_holder.icon_state = "odysseus0" const_holder.density = 1 - spawn() - del src + del src return @@ -1291,7 +1285,7 @@ if(10) if(diff==FORWARD) user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "odysseus5" else user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") @@ -1307,7 +1301,7 @@ if(8) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "odysseus7" else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 0833013b96c..26e7e486082 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -87,11 +87,11 @@ return answer emp_act() - del src + qdel(src) return ex_act() - del src + qdel(src) return proc/in_mecha() @@ -103,7 +103,7 @@ var/obj/mecha/M = in_mecha() if(M) M.emp_act(2) - del(src) + qdel(src) proc/get_mecha_log() if(!src.in_mecha()) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 43eb498a660..a1a367abe7b 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -59,7 +59,7 @@ var/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/HC = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp HC.attach(src) for(var/obj/item/mecha_parts/mecha_tracking/B in src.contents)//Deletes the beacon so it can't be found easily - del (B) + qdel(B) /obj/mecha/working/ripley/Exit(atom/movable/O) if(O in cargo) @@ -93,7 +93,7 @@ output += "" return output -/obj/mecha/working/ripley/Del() +/obj/mecha/working/ripley/Destroy() for(var/mob/M in src) if(M==src.occupant) continue diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index df1fd7e4d91..79b77551cc7 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -28,7 +28,7 @@ air_update_turf(1) return -/obj/structure/alien/resin/Del() +/obj/structure/alien/resin/Destroy() density = 0 air_update_turf(1) ..() @@ -57,7 +57,7 @@ /obj/structure/alien/resin/proc/healthcheck() if(health <=0) - del(src) + qdel(src) /obj/structure/alien/resin/bullet_act(obj/item/projectile/Proj) @@ -153,7 +153,7 @@ ..() linked_node = node if(istype(loc, /turf/space)) - del(src) + qdel(src) return if(icon_state == "weeds") icon_state = pick("weeds", "weeds1", "weeds2") @@ -168,7 +168,7 @@ var/turf/U = get_turf(src) if(istype(U, /turf/space)) - del(src) + qdel(src) return direction_loop: @@ -189,7 +189,7 @@ /obj/structure/alien/weeds/ex_act(severity) - del(src) + qdel(src) /obj/structure/alien/weeds/attackby(obj/item/I, mob/user) @@ -211,7 +211,7 @@ /obj/structure/alien/weeds/proc/healthcheck() if(health <= 0) - del(src) + qdel(src) /obj/structure/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -270,7 +270,7 @@ if(BURST) user << "You clear the hatched egg." playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) - del(src) + qdel(src) return if(GROWING) user << "The child is not developed yet." @@ -344,7 +344,7 @@ if(status != BURST && status != BURSTING) Burst() else if(status == BURST && prob(50)) - del(src) //Remove the egg after it has been hit after bursting. + qdel(src) //Remove the egg after it has been hit after bursting. /obj/structure/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -407,7 +407,7 @@ /obj/effect/acid/proc/tick() if(!target) - del(src) + qdel(src) ticks++ @@ -418,9 +418,9 @@ var/turf/simulated/wall/W = target W.dismantle_wall(1) else - del(target) + qdel(target) - del(src) + qdel(src) return loc = target.loc diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 2ce2608891f..362b3eeb27b 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -1,179 +1,179 @@ -//Anomalies, used for events. Note that these DO NOT work by themselves; their procs are called by the event datum. - -/obj/effect/anomaly - name = "anomaly" - icon = 'icons/effects/effects.dmi' - desc = "A mysterious anomaly, seen commonly only in the region of space that the station orbits..." - icon_state = "bhole3" - unacidable = 1 - density = 0 - anchored = 1 - luminosity = 3 - var/obj/item/device/assembly/signaler/anomaly/aSignal = null - -/obj/effect/anomaly/New() - SetLuminosity(initial(luminosity)) - aSignal = new(src) - aSignal.code = rand(1,100) - - aSignal.frequency = rand(1200, 1599) - if(IsMultiple(aSignal.frequency, 2))//signaller frequencies are always uneven! - aSignal.frequency++ - - -/obj/effect/anomaly/proc/anomalyEffect() - if(prob(50)) - step(src,pick(alldirs)) - - -/obj/effect/anomaly/proc/anomalyNeutralize() - new /obj/effect/effect/bad_smoke(loc) - - for(var/atom/movable/O in src) - O.loc = src.loc - - del(src) - - -/obj/effect/anomaly/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/device/analyzer)) - user << "Analyzing... [src]'s unstable field is fluctuating along frequency [aSignal.code]:[format_frequency(aSignal.frequency)]." - -/////////////////////// - -/obj/effect/anomaly/grav - name = "gravitational anomaly" - icon_state = "shield2" - density = 1 - var/boing = 0 - -/obj/effect/anomaly/grav/New() - ..() - aSignal.origin_tech = "magnets=5;powerstorage=4" - -/obj/effect/anomaly/grav/anomalyEffect() - ..() - - boing = 1 - for(var/obj/O in orange(4, src)) - if(!O.anchored) - step_towards(O,src) - for(var/mob/living/M in orange(4, src)) - step_towards(M,src) - -/obj/effect/anomaly/grav/Bump(mob/A) - gravShock(A) - return - -/obj/effect/anomaly/grav/Bumped(mob/A) - gravShock(A) - return - -/obj/effect/anomaly/grav/proc/gravShock(var/mob/A) - if(boing && isliving(A) && !A.stat) - A.Weaken(2) - var/atom/target = get_edge_target_turf(A, get_dir(src, get_step_away(A, src))) - A.throw_at(target, 5, 1) - boing = 0 - return - -///////////////////// - -/obj/effect/anomaly/flux - name = "flux wave anomaly" - icon_state = "electricity2" - -/obj/effect/anomaly/flux/New() - ..() - aSignal.origin_tech = "powerstorage=5;programming=3;plasmatech=2" - -///////////////////// - -/obj/effect/anomaly/bluespace - name = "bluespace anomaly" - icon = 'icons/obj/projectiles.dmi' - icon_state = "bluespace" - density = 1 - -/obj/effect/anomaly/bluespace/New() - ..() - aSignal.origin_tech = "bluespace=5;magnets=3;powerstorage=2" - -/obj/effect/anomaly/bluespace/Bumped(atom/A) - if(isliving(A)) - do_teleport(A, locate(A.x, A.y, A.z), 10) - return - -///////////////////// - -/obj/effect/anomaly/pyro - name = "pyroclastic anomaly" - icon_state = "mustard" - -/obj/effect/anomaly/pyro/New() - ..() - aSignal.origin_tech = "plasmatech=5;powerstorage=3;biotech=3" - -/obj/effect/anomaly/pyro/anomalyEffect() - ..() - var/turf/simulated/T = get_turf(src) - if(istype(T)) - T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 3) - -///////////////////// - -/obj/effect/anomaly/bhole - name = "vortex anomaly" - icon_state = "bhole3" - desc = "That's a nice station you have there. It'd be a shame if something happened to it." - -/obj/effect/anomaly/bhole/New() - ..() - aSignal.origin_tech = "materials=5;combat=4;engineering=3" - -/obj/effect/anomaly/bhole/anomalyEffect() - ..() - if(!isturf(loc)) //blackhole cannot be contained inside anything. Weird stuff might happen - del(src) - return - - grav(rand(0,3), rand(2,3), 50, 25) - - //Throwing stuff around! - for(var/obj/O in orange(1,src)) - if(!O.anchored) - var/mob/living/target = locate() in view(5,src) - if(!target) - return - O.throw_at(target, 5, 10) - return - else - O.ex_act(2) - -/obj/effect/anomaly/bhole/proc/grav(var/r, var/ex_act_force, var/pull_chance, var/turf_removal_chance) - for(var/t = -r, t < r, t++) - affect_coord(x+t, y-r, ex_act_force, pull_chance, turf_removal_chance) - affect_coord(x-t, y+r, ex_act_force, pull_chance, turf_removal_chance) - affect_coord(x+r, y+t, ex_act_force, pull_chance, turf_removal_chance) - affect_coord(x-r, y-t, ex_act_force, pull_chance, turf_removal_chance) - return - -/obj/effect/anomaly/bhole/proc/affect_coord(var/x, var/y, var/ex_act_force, var/pull_chance, var/turf_removal_chance) - //Get turf at coordinate - var/turf/T = locate(x, y, z) - if(isnull(T)) return - - //Pulling and/or ex_act-ing movable atoms in that turf - if(prob(pull_chance)) - for(var/obj/O in T.contents) - if(O.anchored) - O.ex_act(ex_act_force) - else - step_towards(O,src) - for(var/mob/living/M in T.contents) - step_towards(M,src) - - //Damaging the turf - if( T && istype(T,/turf/simulated) && prob(turf_removal_chance) ) - T.ex_act(ex_act_force) +//Anomalies, used for events. Note that these DO NOT work by themselves; their procs are called by the event datum. + +/obj/effect/anomaly + name = "anomaly" + icon = 'icons/effects/effects.dmi' + desc = "A mysterious anomaly, seen commonly only in the region of space that the station orbits..." + icon_state = "bhole3" + unacidable = 1 + density = 0 + anchored = 1 + luminosity = 3 + var/obj/item/device/assembly/signaler/anomaly/aSignal = null + +/obj/effect/anomaly/New() + SetLuminosity(initial(luminosity)) + aSignal = new(src) + aSignal.code = rand(1,100) + + aSignal.frequency = rand(1200, 1599) + if(IsMultiple(aSignal.frequency, 2))//signaller frequencies are always uneven! + aSignal.frequency++ + + +/obj/effect/anomaly/proc/anomalyEffect() + if(prob(50)) + step(src,pick(alldirs)) + + +/obj/effect/anomaly/proc/anomalyNeutralize() + new /obj/effect/effect/bad_smoke(loc) + + for(var/atom/movable/O in src) + O.loc = src.loc + + qdel(src) + + +/obj/effect/anomaly/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/device/analyzer)) + user << "Analyzing... [src]'s unstable field is fluctuating along frequency [aSignal.code]:[format_frequency(aSignal.frequency)]." + +/////////////////////// + +/obj/effect/anomaly/grav + name = "gravitational anomaly" + icon_state = "shield2" + density = 1 + var/boing = 0 + +/obj/effect/anomaly/grav/New() + ..() + aSignal.origin_tech = "magnets=5;powerstorage=4" + +/obj/effect/anomaly/grav/anomalyEffect() + ..() + + boing = 1 + for(var/obj/O in orange(4, src)) + if(!O.anchored) + step_towards(O,src) + for(var/mob/living/M in orange(4, src)) + step_towards(M,src) + +/obj/effect/anomaly/grav/Bump(mob/A) + gravShock(A) + return + +/obj/effect/anomaly/grav/Bumped(mob/A) + gravShock(A) + return + +/obj/effect/anomaly/grav/proc/gravShock(var/mob/A) + if(boing && isliving(A) && !A.stat) + A.Weaken(2) + var/atom/target = get_edge_target_turf(A, get_dir(src, get_step_away(A, src))) + A.throw_at(target, 5, 1) + boing = 0 + return + +///////////////////// + +/obj/effect/anomaly/flux + name = "flux wave anomaly" + icon_state = "electricity2" + +/obj/effect/anomaly/flux/New() + ..() + aSignal.origin_tech = "powerstorage=5;programming=3;plasmatech=2" + +///////////////////// + +/obj/effect/anomaly/bluespace + name = "bluespace anomaly" + icon = 'icons/obj/projectiles.dmi' + icon_state = "bluespace" + density = 1 + +/obj/effect/anomaly/bluespace/New() + ..() + aSignal.origin_tech = "bluespace=5;magnets=3;powerstorage=2" + +/obj/effect/anomaly/bluespace/Bumped(atom/A) + if(isliving(A)) + do_teleport(A, locate(A.x, A.y, A.z), 10) + return + +///////////////////// + +/obj/effect/anomaly/pyro + name = "pyroclastic anomaly" + icon_state = "mustard" + +/obj/effect/anomaly/pyro/New() + ..() + aSignal.origin_tech = "plasmatech=5;powerstorage=3;biotech=3" + +/obj/effect/anomaly/pyro/anomalyEffect() + ..() + var/turf/simulated/T = get_turf(src) + if(istype(T)) + T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 3) + +///////////////////// + +/obj/effect/anomaly/bhole + name = "vortex anomaly" + icon_state = "bhole3" + desc = "That's a nice station you have there. It'd be a shame if something happened to it." + +/obj/effect/anomaly/bhole/New() + ..() + aSignal.origin_tech = "materials=5;combat=4;engineering=3" + +/obj/effect/anomaly/bhole/anomalyEffect() + ..() + if(!isturf(loc)) //blackhole cannot be contained inside anything. Weird stuff might happen + qdel(src) + return + + grav(rand(0,3), rand(2,3), 50, 25) + + //Throwing stuff around! + for(var/obj/O in orange(1,src)) + if(!O.anchored) + var/mob/living/target = locate() in view(5,src) + if(!target) + return + O.throw_at(target, 5, 10) + return + else + O.ex_act(2) + +/obj/effect/anomaly/bhole/proc/grav(var/r, var/ex_act_force, var/pull_chance, var/turf_removal_chance) + for(var/t = -r, t < r, t++) + affect_coord(x+t, y-r, ex_act_force, pull_chance, turf_removal_chance) + affect_coord(x-t, y+r, ex_act_force, pull_chance, turf_removal_chance) + affect_coord(x+r, y+t, ex_act_force, pull_chance, turf_removal_chance) + affect_coord(x-r, y-t, ex_act_force, pull_chance, turf_removal_chance) + return + +/obj/effect/anomaly/bhole/proc/affect_coord(var/x, var/y, var/ex_act_force, var/pull_chance, var/turf_removal_chance) + //Get turf at coordinate + var/turf/T = locate(x, y, z) + if(isnull(T)) return + + //Pulling and/or ex_act-ing movable atoms in that turf + if(prob(pull_chance)) + for(var/obj/O in T.contents) + if(O.anchored) + O.ex_act(ex_act_force) + else + step_towards(O,src) + for(var/mob/living/M in T.contents) + step_towards(M,src) + + //Damaging the turf + if( T && istype(T,/turf/simulated) && prob(turf_removal_chance) ) + T.ex_act(ex_act_force) return \ No newline at end of file diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm index 6d63e8140f2..a0005e515d5 100644 --- a/code/game/objects/effects/bump_teleporter.dm +++ b/code/game/objects/effects/bump_teleporter.dm @@ -15,7 +15,7 @@ var/list/obj/effect/bump_teleporter/BUMP_TELEPORTERS = list() ..() BUMP_TELEPORTERS += src -/obj/effect/bump_teleporter/Del() +/obj/effect/bump_teleporter/Destroy() BUMP_TELEPORTERS -= src ..() diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm index dd17d63d027..0f1e7fc712e 100644 --- a/code/game/objects/effects/decals/Cleanable/aliens.dm +++ b/code/game/objects/effects/decals/Cleanable/aliens.dm @@ -13,7 +13,7 @@ var/list/viruses = list() blood_DNA = list() - Del() + Destroy() for(var/datum/disease/D in viruses) D.cure(0) ..() diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 7ab32130ff7..cea1d7b2922 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -11,7 +11,7 @@ var/list/viruses = list() blood_DNA = list() -/obj/effect/decal/cleanable/blood/Del() +/obj/effect/decal/cleanable/blood/Destroy() for(var/datum/disease/D in viruses) D.cure(0) ..() @@ -24,7 +24,7 @@ if(src.loc && isturf(src.loc)) for(var/obj/effect/decal/cleanable/blood/B in src.loc) if(B != src) - del(B) + qdel(B) /obj/effect/decal/cleanable/blood/splatter random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 3d260fe3b05..2a1f13e2340 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -21,7 +21,7 @@ New() ..() spawn(1200)// 2 minutes - del(src) + qdel(src) /obj/effect/decal/cleanable/dirt name = "dirt" @@ -95,7 +95,7 @@ random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") var/list/viruses = list() - Del() + Destroy() for(var/datum/disease/D in viruses) D.cure(0) ..() diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index 7d00d3bc6dd..45f82994f3a 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -51,7 +51,7 @@ var/viruses = list() random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") - Del() + Destroy() for(var/datum/disease/D in viruses) D.cure(0) ..() diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 860156ba3e6..39dab97020d 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -59,7 +59,7 @@ resulting_poster.loc = W //Looks like it's uncluttered enough. Place the poster W.contents += resulting_poster - del(src)*/ + qdel(src)*/ @@ -156,7 +156,7 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user) playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1) if(ruined) user << "You remove the remnants of the poster." - del(src) + qdel(src) else user << "You carefully remove the poster from the wall." roll_and_drop(user.loc) @@ -210,7 +210,7 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user) var/temp_loc = user.loc flick("poster_being_set",D) D.loc = src - del(P) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway + qdel(P) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway playsound(D.loc, 'sound/items/poster_being_created.ogg', 100, 1) sleep(17) diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index a082e5246b8..77765bb8465 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -1,6 +1,6 @@ -/obj/effect/decal - name = "decal" - icon = 'icons/effects/effects.dmi' - -/obj/effect/decal/ex_act(severity) - del(src) \ No newline at end of file +/obj/effect/decal + name = "decal" + icon = 'icons/effects/effects.dmi' + +/obj/effect/decal/ex_act(severity) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index d629f0a27d2..aca35202268 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -45,13 +45,6 @@ would spawn and follow the beaker, even if it is carried or thrown. return return -/obj/effect/effect/water/Del() - //var/turf/T = src.loc - //if (istype(T, /turf)) - // T.firelevel = 0 //TODO: FIX - ..() - return - /obj/effect/effect/water/Move(turf/newloc) //var/turf/T = src.loc //if (istype(T, /turf)) @@ -162,7 +155,7 @@ steam.start() -- spawns the effect delete() return -/obj/effect/effect/sparks/Del() +/obj/effect/effect/sparks/Destroy() var/turf/T = src.loc if (istype(T, /turf)) T.hotspot_expose(1000,100) @@ -683,7 +676,7 @@ steam.start() -- spawns the effect src.processing = 0 var/turf/T = get_turf(src.holder) if(T != src.oldposition) - if(istype(T, /turf/space)) + if(!has_gravity(T)) var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition) src.oldposition = T I.dir = src.holder.dir @@ -794,7 +787,7 @@ steam.start() -- spawns the effect return // on delete, transfer any reagents to the floor -/obj/effect/effect/foam/Del() +/obj/effect/effect/foam/Destroy() if(!metal && reagents) for(var/atom/A in oview(0,src)) if(A == src) @@ -915,7 +908,7 @@ steam.start() -- spawns the effect - Del() + Destroy() density = 0 air_update_turf(1) @@ -934,15 +927,15 @@ steam.start() -- spawns the effect ex_act(severity) - del(src) + qdel(src) blob_act() - del(src) + qdel(src) bullet_act() ..() if(metal==1 || prob(50)) - del(src) + qdel(src) attack_paw(var/mob/user) attack_hand(user) @@ -955,7 +948,7 @@ steam.start() -- spawns the effect if ((O.client && !( O.blinded ))) O << "\red [user] smashes through the foamed metal." - del(src) + qdel(src) else user << "\blue You hit the metal foam but bounce off it." return @@ -969,8 +962,8 @@ steam.start() -- spawns the effect for(var/mob/O in viewers(src)) if (O.client) O << "\red [G.assailant] smashes [G.affecting] through the foamed metal wall." - del(I) - del(src) + qdel(I) + qdel(src) return if(prob(I.force*20 - metal*25)) @@ -978,7 +971,7 @@ steam.start() -- spawns the effect for(var/mob/O in oviewers(user)) if ((O.client && !( O.blinded ))) O << "\red [user] smashes through the foamed metal." - del(src) + qdel(src) else user << "\blue You hit the metal foam to no effect." diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index d65dc1811a4..cf337d71a7b 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -30,4 +30,4 @@ timeleft -= (world.time - last_process) if(timeleft <= 0) processing_objects.Remove(src) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index 18754297e12..5f0f77e17aa 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -65,4 +65,4 @@ if(directions.len) gib.streak(directions) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 06cef09fcd5..8e79d87bb6b 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -120,15 +120,15 @@ /obj/effect/glowshroom/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(5)) - del(src) + qdel(src) return else return @@ -140,4 +140,4 @@ /obj/effect/glowshroom/proc/CheckEndurance() if(endurance <= 0) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 02d91030150..1a163e0ece7 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -10,26 +10,33 @@ ..() tag = text("landmark*[]", name) invisibility = 101 + landmarks_list += src switch(name) //some of these are probably obsolete if("shuttle") shuttle_z = z - del(src) + qdel(src) + return if("monkey") monkeystart += loc - del(src) + qdel(src) + return if("start") newplayer_start += loc - del(src) + qdel(src) + return if("wizard") wizardstart += loc - del(src) + qdel(src) + return if("JoinLate") latejoin += loc - del(src) + qdel(src) + return if("prisonwarp") prisonwarp += loc - del(src) + qdel(src) + return if("Holding Facility") holdingfacility += loc if("tdome1") @@ -42,19 +49,21 @@ tdomeobserve += loc if("prisonsecuritywarp") prisonsecuritywarp += loc - del(src) + qdel(src) + return if("blobstart") blobstart += loc - del(src) + qdel(src) + return if("xeno_spawn") xeno_spawn += loc - del(src) + qdel(src) + return - landmarks_list += src return 1 -/obj/effect/landmark/Del() +/obj/effect/landmark/Destroy() landmarks_list -= src ..() @@ -78,52 +87,52 @@ var/list/options = typesof(/obj/effect/landmark/costume) var/PICK= options[rand(1,options.len)] new PICK(src.loc) - del(src) + qdel(src) //SUBCLASSES. Spawn a bunch of items and disappear likewise /obj/effect/landmark/costume/chicken/New() new /obj/item/clothing/suit/chickensuit(src.loc) new /obj/item/clothing/head/chicken(src.loc) new /obj/item/weapon/reagent_containers/food/snacks/egg(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/gladiator/New() new /obj/item/clothing/under/gladiator(src.loc) new /obj/item/clothing/head/helmet/gladiator(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/madscientist/New() new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc) new /obj/item/clothing/head/flatcap(src.loc) new /obj/item/clothing/suit/labcoat/mad(src.loc) new /obj/item/clothing/glasses/gglasses(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/elpresidente/New() new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc) new /obj/item/clothing/head/flatcap(src.loc) new /obj/item/clothing/mask/cigarette/cigar/havana(src.loc) new /obj/item/clothing/shoes/jackboots(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/nyangirl/New() new /obj/item/clothing/under/schoolgirl(src.loc) new /obj/item/clothing/head/kitty(src.loc) new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/maid/New() new /obj/item/clothing/under/blackskirt(src.loc) var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears ) new CHOICE(src.loc) new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/butler/New() new /obj/item/clothing/tie/waistcoat(src.loc) new /obj/item/clothing/under/suit_jacket(src.loc) new /obj/item/clothing/head/that(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/scratch/New() new /obj/item/clothing/gloves/white(src.loc) @@ -131,12 +140,12 @@ new /obj/item/clothing/under/scratch(src.loc) if (prob(30)) new /obj/item/clothing/head/cueball(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/highlander/New() new /obj/item/clothing/under/kilt(src.loc) new /obj/item/clothing/head/beret(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/prig/New() new /obj/item/clothing/tie/waistcoat(src.loc) @@ -147,25 +156,25 @@ new /obj/item/weapon/cane(src.loc) new /obj/item/clothing/under/sl_suit(src.loc) new /obj/item/clothing/mask/fakemoustache(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/plaguedoctor/New() new /obj/item/clothing/suit/bio_suit/plaguedoctorsuit(src.loc) new /obj/item/clothing/head/plaguedoctorhat(src.loc) new /obj/item/clothing/mask/gas/plaguedoctor(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/nightowl/New() new /obj/item/clothing/under/owl(src.loc) new /obj/item/clothing/mask/gas/owl_mask(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/waiter/New() new /obj/item/clothing/under/waiter(src.loc) var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears) new CHOICE(src.loc) new /obj/item/clothing/suit/apron(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/pirate/New() new /obj/item/clothing/under/pirate(src.loc) @@ -173,48 +182,48 @@ var/CHOICE = pick( /obj/item/clothing/head/pirate , /obj/item/clothing/head/bandana ) new CHOICE(src.loc) new /obj/item/clothing/glasses/eyepatch(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/commie/New() new /obj/item/clothing/under/soviet(src.loc) new /obj/item/clothing/head/ushanka(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/imperium_monk/New() new /obj/item/clothing/suit/imperium_monk(src.loc) if (prob(25)) new /obj/item/clothing/mask/gas/cyborg(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/holiday_priest/New() new /obj/item/clothing/suit/holidaypriest(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/marisawizard/fake/New() new /obj/item/clothing/shoes/sandal/marisa(src.loc) new /obj/item/clothing/head/wizard/marisa/fake(src.loc) new/obj/item/clothing/suit/wizrobe/marisa/fake(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/cutewitch/New() new /obj/item/clothing/under/sundress(src.loc) new /obj/item/clothing/head/witchwig(src.loc) new /obj/item/weapon/staff/broom(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/fakewizard/New() new /obj/item/clothing/shoes/sandal(src.loc) new /obj/item/clothing/suit/wizrobe/fake(src.loc) new /obj/item/clothing/head/wizard/fake(src.loc) new /obj/item/weapon/staff/(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/sexyclown/New() new /obj/item/clothing/mask/gas/sexyclown(src.loc) new /obj/item/clothing/under/sexyclown(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/sexymime/New() new /obj/item/clothing/mask/gas/sexymime(src.loc) new /obj/item/clothing/under/sexymime(src.loc) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm index b935e4c3aa8..4b5a2eebb7b 100644 --- a/code/game/objects/effects/manifest.dm +++ b/code/game/objects/effects/manifest.dm @@ -17,5 +17,5 @@ P.info = dat P.name = "paper- 'Crew Manifest'" //SN src = null - del(src) + qdel(src) return \ No newline at end of file diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 0e46105b06c..050fe2af20d 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -32,8 +32,7 @@ obj:radiation += 50 randmutb(obj) domutcheck(obj,null) - spawn(0) - del(src) + qdel(src) /obj/effect/mine/proc/triggerstun(obj) if(ismob(obj)) @@ -42,31 +41,26 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - spawn(0) - del(src) + qdel(src) /obj/effect/mine/proc/triggern2o(obj) atmos_spawn_air("n2o", 360) - spawn(0) - del(src) + qdel(src) /obj/effect/mine/proc/triggerplasma(obj) atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 360) - spawn(0) - del(src) + qdel(src) /obj/effect/mine/proc/triggerkick(obj) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() del(obj:client) - spawn(0) - del(src) + qdel(src) /obj/effect/mine/proc/explode(obj) explosion(loc, 0, 1, 2, 3) - spawn(0) - del(src) + qdel(src) /obj/effect/mine/dnascramble name = "radiation mine" diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index a1af754229a..3781ce200ce 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -7,10 +7,10 @@ name="beam" icon='icons/effects/beam.dmi' icon_state="b_beam" - var/tmp/atom/BeamSource + var/atom/BeamSource New() ..() - spawn(10) del src + spawn(10) qdel(src) /obj/effect/overlay/palmtree_r name = "Palm tree" diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index dc36b11e383..9ab7d961e07 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -31,10 +31,10 @@ src.teleport(M) if(lifespan > 0) spawn(lifespan) - del(src) + qdel(src) return -/obj/effect/portal/Del() +/obj/effect/portal/Destroy() portals -= src if(istype(creator, /obj/item/weapon/hand_tele)) var/obj/item/weapon/hand_tele/O = creator @@ -49,7 +49,7 @@ if(icon_state == "portal1") return if (!( target )) - del(src) + qdel(src) return if (istype(M, /atom/movable)) if(prob(failchance)) //oh dear a problem, put em in deep space diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index 035c036e531..02993d6d053 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -102,7 +102,7 @@ p4.air_contents.temperature = btemp + T0C p2.secured = 1 - del(src) + qdel(src) */ /obj/effect/spawner/newbomb @@ -201,4 +201,4 @@ OT.air_contents.temperature = btemp2 + T0C V.update_icon() - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/game/objects/effects/spawners/vaultspawner.dm b/code/game/objects/effects/spawners/vaultspawner.dm index d3a1e84acdd..8610a6ef298 100644 --- a/code/game/objects/effects/spawners/vaultspawner.dm +++ b/code/game/objects/effects/spawners/vaultspawner.dm @@ -25,4 +25,4 @@ T.ChangeTurf(/turf/simulated/floor/vault) T.icon_state = "[type]vault" - del(src) \ No newline at end of file + qdel(src) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index f4445f54cb8..fe249a1b72e 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -11,13 +11,13 @@ /obj/effect/spider/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) if(2.0) if (prob(50)) - del(src) + qdel(src) if(3.0) if (prob(5)) - del(src) + qdel(src) return /obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user) @@ -45,7 +45,7 @@ /obj/effect/spider/proc/healthcheck() if(health <= 0) - del(src) + qdel(src) /obj/effect/spider/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 300) @@ -86,7 +86,7 @@ var/num = rand(3,12) for(var/i=0, i[src] dies!") - del(src) + qdel(src) /obj/effect/spider/spiderling/healthcheck() if(health <= 0) @@ -183,7 +183,7 @@ if(!grow_as) grow_as = pick(typesof(/mob/living/simple_animal/hostile/giant_spider)) new grow_as(src.loc) - del(src) + qdel(src) /obj/effect/spider/cocoon name = "cocoon" @@ -204,11 +204,11 @@ if(do_after(user,(breakout_time*60*10))) if(!user || user.stat != CONSCIOUS || user.loc != src) return - Del() + qdel(src) -/obj/effect/spider/cocoon/Del() +/obj/effect/spider/cocoon/Destroy() src.visible_message("\red \The [src] splits open.") for(var/atom/movable/A in contents) A.loc = src.loc diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 9f440d4b4fa..7c61a05111e 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -86,9 +86,9 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa var/lighting_controller_was_processing = lighting_controller.processing //Pause the lighting updates for a bit lighting_controller.processing = 0 - var/powernet_rebuild_was_deferred_already = defer_powernet_rebuild - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 1 +// var/powernet_rebuild_was_deferred_already = defer_powernet_rebuild +// if(defer_powernet_rebuild != 2) +// defer_powernet_rebuild = 1 if(heavy_impact_range > 1) var/datum/effect/system/explosion/E = new/datum/effect/system/explosion() @@ -118,13 +118,11 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa if(T) if(flame_dist && prob(40) && !istype(T, /turf/space)) - spawn() - new/obj/effect/hotspot(T) //Mostly for ambience! + new/obj/effect/hotspot(T) //Mostly for ambience! hotspot_exists = 1 if(dist) - spawn() - if(T) - T.ex_act(dist) + if(T) + T.ex_act(dist) //------- THINGS IN TURFS FIRES ------- @@ -134,14 +132,12 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa if(AM) //Something is inside T (We have already checked T exists above) - RR if(flame_dist) //if it has flame distance, run this - RR if(isliving(AM) && !hotspot_exists && !istype(T, /turf/space)) - spawn() - if(AM && AM.loc!=null) - new /obj/effect/hotspot(AM.loc) + if(AM && AM.loc!=null) + new /obj/effect/hotspot(AM.loc) //Just in case we missed a mob while they were in flame_range, but a hotspot didn't spawn on them, otherwise it looks weird when you just burst into flame out of nowhere if(dist) //if no flame_dist, run this - RR - spawn() - if(AM) - AM.ex_act(dist) + if(AM) + AM.ex_act(dist) @@ -158,9 +154,9 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa sleep(8) if(!lighting_controller.processing) lighting_controller.processing = lighting_controller_was_processing - if(!powernet_rebuild_was_deferred_already) - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 0 +// if(!powernet_rebuild_was_deferred_already) +// if(defer_powernet_rebuild != 2) +// defer_powernet_rebuild = 0 return 1 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 8305f4c0a96..96a4a7a1ef2 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -35,24 +35,30 @@ /obj/item/device icon = 'icons/obj/device.dmi' +/obj/item/Destroy() + if(ismob(loc)) + var/mob/m = loc + m.unEquip(src, 1) + return ..() + /obj/item/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(5)) - del(src) + qdel(src) return else return /obj/item/blob_act() - del(src) + qdel(src) //user: The mob that is suiciding //damagetype: The type of damage the item will inflict on the user diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index a11b326e455..208a2111da1 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -11,7 +11,7 @@ ..() if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 ) - del(src) + qdel(src) /obj/item/apc_frame/proc/try_build(turf/on_wall) if (get_dist(on_wall,usr)>1) @@ -38,6 +38,6 @@ var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(loc) C.amount = 10 usr << "You cut the cables and disassemble the unused power terminal." - del(T) + qdel(T) new /obj/machinery/power/apc(loc, ndir, 1) - del(src) + qdel(src) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index f21832f87a0..35709d906ff 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -10,7 +10,7 @@ /obj/item/bodybag/attack_self(mob/user) var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc) R.add_fingerprint(user) - del(src) + qdel(src) /obj/item/weapon/storage/box/bodybags @@ -79,7 +79,7 @@ visible_message("[usr] folds up [src].") var/obj/item/bodybag/B = new /obj/item/bodybag(get_turf(src)) usr.put_in_hands(B) - del(src) + qdel(src) /obj/structure/closet/bodybag/update_icon() diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 7047a708465..3584b97b282 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -66,7 +66,7 @@ if(istype(src.loc, /mob)) var/mob/M = src.loc M.unEquip(src, 1) //src is being deleted anyway - del(src) + qdel(src) update_icon() if(istype(loc, /turf)) //start a fire if possible var/turf/T = loc diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 6456e670447..bed61da06e7 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -81,7 +81,7 @@ uses-- if(!uses) user << "\red You used up your crayon!" - del(src) + qdel(src) return /obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob) @@ -92,6 +92,6 @@ uses -= 5 if(uses <= 0) user << "\red You ate your crayon!" - del(src) + qdel(src) else ..() \ No newline at end of file diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 1083e4c1952..3d18e1a5f17 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -948,10 +948,10 @@ var/global/list/obj/item/device/pda/PDAs = list() explosion(T, -1, -1, 2, 3) - del(src) + qdel(src) return -/obj/item/device/pda/Del() +/obj/item/device/pda/Destroy() PDAs -= src if (src.id) src.id.loc = get_turf(src.loc) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 1d30c43ffb0..24c0d8f5af2 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -41,7 +41,7 @@ if(active_dummy) eject_all() playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) - del(active_dummy) + qdel(active_dummy) active_dummy = null usr << "\blue You deactivate the [src]." var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) @@ -54,7 +54,7 @@ if(!O) return var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(usr.loc) C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, src) - del(O) + qdel(O) usr << "\blue You activate the [src]." var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' @@ -69,7 +69,7 @@ spark_system.start() eject_all() if(delete_dummy) - del(active_dummy) + qdel(active_dummy) active_dummy = null can_use = 0 spawn(50) can_use = 1 @@ -140,6 +140,6 @@ step(src, direction) return -/obj/effect/dummy/chameleon/Del() +/obj/effect/dummy/chameleon/Destroy() master.disrupt(0) ..() \ No newline at end of file diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index a0d807b634c..df97a6ab825 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -111,7 +111,7 @@ animation.master = user flick("blspell", animation) sleep(5) - del(animation) + qdel(animation) if(!flashfail) flick(flashanim, src) @@ -158,7 +158,7 @@ animation.master = user flick("blspell", animation) sleep(5) - del(animation) + qdel(animation) for(var/mob/living/carbon/M in oviewers(3, null)) var/safety = M:eyecheck() @@ -211,4 +211,4 @@ icon_state = "memorizer" item_state = "nullrod" burnt = "memorizerburnt" - flashanim = "memorizer2" + flashanim = "memorizer2" diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 810b467142f..8993adf9cf3 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -229,7 +229,7 @@ ..() processing_objects.Add(src) -/obj/item/device/flashlight/emp/Del() +/obj/item/device/flashlight/emp/Destroy() processing_objects.Remove(src) ..() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 3f60c5402b1..3910f798064 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -1,207 +1,207 @@ -/obj/item/device/laser_pointer - name = "laser pointer" - desc = "Don't shine it in your eyes!" - icon = 'icons/obj/device.dmi' - icon_state = "pointer" - item_state = "pen" - var/pointer_icon_state - flags = CONDUCT - slot_flags = SLOT_BELT - m_amt = 500 - g_amt = 500 - w_class = 2 //Increased to 2, because diodes are w_class 2. Conservation of matter. - origin_tech = "combat=1;magnets=2" - var/turf/pointer_loc - var/energy = 5 - var/max_energy = 5 - var/effectchance = 33 - var/recharging = 0 - var/recharge_locked = 0 - var/obj/item/weapon/stock_parts/micro_laser/diode //used for upgrading! - - -/obj/item/device/laser_pointer/red - pointer_icon_state = "red_laser" -/obj/item/device/laser_pointer/green - pointer_icon_state = "green_laser" -/obj/item/device/laser_pointer/blue - pointer_icon_state = "blue_laser" -/obj/item/device/laser_pointer/purple - pointer_icon_state = "purple_laser" - -/obj/item/device/laser_pointer/New() - ..() - diode = new(src) - if(!pointer_icon_state) - pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser") - -/obj/item/device/laser_pointer/upgraded/New() - ..() - diode = new /obj/item/weapon/stock_parts/micro_laser/ultra - - - -/obj/item/device/laser_pointer/attack(mob/living/M, mob/user) - laser_act(M, user) - -/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/weapon/stock_parts/micro_laser)) - if(!diode) - user.drop_item() - W.loc = src - diode = W - user << "You install a [diode.name] in [src]." - else - user << "[src] already has a diode installed." - return - - else if(istype(W, /obj/item/weapon/screwdriver)) - if(diode) - user << "You remove the [diode.name] from the [src]." - diode.loc = get_turf(src.loc) - diode = null - return - ..() - return - -/obj/item/device/laser_pointer/afterattack(var/atom/target, var/mob/living/user, flag, params) - if(flag) //we're placing the object on a table or in backpack - return - laser_act(target, user) - -/obj/item/device/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user) - if( !(user in (viewers(7,target))) ) - return - if (!diode) - user << "You point [src] at [target], but nothing happens!" - return - if (!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" - return - if(user.has_mutation(HULK)) - user << "Your meaty finger is too large for the button!" - return - if(iscarbon(user)) - var/mob/living/carbon/C = user - if(C.is_mutantrace("adamantine")) - user << "Your metal fingers can't press the button!" - return - - add_fingerprint(user) - - //nothing happens if the battery is drained - if(recharge_locked) - user << "You point [src] at [target], but it's still charging." - return - - var/outmsg - var/turf/targloc = get_turf(target) - - //human/alien mobs - if(iscarbon(target)) - if(user.zone_sel.selecting == "eyes") - var/mob/living/carbon/C = target - - //20% chance to actually hit the eyes - if(prob(effectchance * diode.rating)) - add_logs(user, C, "shone in the eyes", object="laser pointer") - - //eye target check - outmsg = "You blind [C] by shining [src] in their eyes." - var/eye_prot = C.eyecheck() - if(C.blinded || eye_prot >= 2) - eye_prot = 4 - var/severity = 3 - eye_prot - if(prob(33)) - severity += 1 - else if(prob(50)) - severity -= 1 - severity = min(max(severity, 0), 4) - - switch(severity) - if(0) - //no effect - C << "A small, bright dot appears in your vision." - if(1) - //industrial grade eye protection - C.eye_stat += rand(0, 2) - C << "Something bright flashes in the corner of your vision!" - if(2) - //basic eye protection (sunglasses) - flick("flash", C.flash) - C.eye_stat += rand(1, 6) - C << "Your eyes were blinded!" - if(3) - //no eye protection - if(prob(2)) - C.Weaken(1) - flick("e_flash", C.flash) - C.eye_stat += rand(3, 7) - C << "Your eyes were blinded!" - if(4) - //the effect has been worsened by something - if(prob(5)) - C.Weaken(1) - flick("e_flash", C.flash) - C.eye_stat += rand(5, 10) - C << "Your eyes were blinded!" - else - outmsg = "You fail to blind [C] by shining [src] at their eyes." - - //robots and AI - else if(issilicon(target)) - var/mob/living/silicon/S = target - //20% chance to actually hit the sensors - if(prob(effectchance * diode.rating)) - S.Weaken(rand(5,10)) - S << "Your sensors were overloaded by a laser!" - outmsg = "You overload [S] by shining [src] at their sensors." - add_logs(user, S, "shone in the sensors", object="laser pointer") - else - outmsg = "You fail to overload [S] by shining [src] at their sensors." - - //cameras - else if(istype(target, /obj/machinery/camera)) - var/obj/machinery/camera/C = target - if(prob(effectchance * diode.rating)) - C.emp_act(1) - outmsg = "You hit the lens of [C] with [src], temporarily disabling the camera!" - add_logs(user, C, "EMPed", object="laser pointer") - else - outmsg = "You missed the lens of [C] with [src]." - - //laser pointer image - icon_state = "pointer_[pointer_icon_state]" - var/list/showto = list() - for(var/mob/M in range(7,targloc)) - if(M.client) - showto.Add(M.client) - var/image/I = image('icons/obj/projectiles.dmi',targloc,pointer_icon_state,10) - I.pixel_x = target.pixel_x + rand(-5,5) - I.pixel_y = target.pixel_y + rand(-5,5) - - if(outmsg) - user << outmsg - else - user << "You point [src] at [target]." - - energy -= 1 - if(energy <= max_energy) - if(!recharging) - recharging = 1 - processing_objects.Add(src) - if(energy <= 0) - user << "You've overused the battery of [src], now it needs time to recharge!" - recharge_locked = 1 - - flick_overlay(I, showto, 10) - icon_state = "pointer" - -/obj/item/device/laser_pointer/process() - if(prob(20 - recharge_locked*5)) - energy += 1 - if(energy >= max_energy) - energy = max_energy - recharging = 0 - recharge_locked = 0 - ..() +/obj/item/device/laser_pointer + name = "laser pointer" + desc = "Don't shine it in your eyes!" + icon = 'icons/obj/device.dmi' + icon_state = "pointer" + item_state = "pen" + var/pointer_icon_state + flags = CONDUCT + slot_flags = SLOT_BELT + m_amt = 500 + g_amt = 500 + w_class = 2 //Increased to 2, because diodes are w_class 2. Conservation of matter. + origin_tech = "combat=1;magnets=2" + var/turf/pointer_loc + var/energy = 5 + var/max_energy = 5 + var/effectchance = 33 + var/recharging = 0 + var/recharge_locked = 0 + var/obj/item/weapon/stock_parts/micro_laser/diode //used for upgrading! + + +/obj/item/device/laser_pointer/red + pointer_icon_state = "red_laser" +/obj/item/device/laser_pointer/green + pointer_icon_state = "green_laser" +/obj/item/device/laser_pointer/blue + pointer_icon_state = "blue_laser" +/obj/item/device/laser_pointer/purple + pointer_icon_state = "purple_laser" + +/obj/item/device/laser_pointer/New() + ..() + diode = new(src) + if(!pointer_icon_state) + pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser") + +/obj/item/device/laser_pointer/upgraded/New() + ..() + diode = new /obj/item/weapon/stock_parts/micro_laser/ultra + + + +/obj/item/device/laser_pointer/attack(mob/living/M, mob/user) + laser_act(M, user) + +/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/weapon/stock_parts/micro_laser)) + if(!diode) + user.drop_item() + W.loc = src + diode = W + user << "You install a [diode.name] in [src]." + else + user << "[src] already has a diode installed." + return + + else if(istype(W, /obj/item/weapon/screwdriver)) + if(diode) + user << "You remove the [diode.name] from the [src]." + diode.loc = get_turf(src.loc) + diode = null + return + ..() + return + +/obj/item/device/laser_pointer/afterattack(var/atom/target, var/mob/living/user, flag, params) + if(flag) //we're placing the object on a table or in backpack + return + laser_act(target, user) + +/obj/item/device/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user) + if( !(user in (viewers(7,target))) ) + return + if (!diode) + user << "You point [src] at [target], but nothing happens!" + return + if (!user.IsAdvancedToolUser()) + user << "You don't have the dexterity to do this!" + return + if(user.has_mutation(HULK)) + user << "Your meaty finger is too large for the button!" + return + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(C.is_mutantrace("adamantine")) + user << "Your metal fingers can't press the button!" + return + + add_fingerprint(user) + + //nothing happens if the battery is drained + if(recharge_locked) + user << "You point [src] at [target], but it's still charging." + return + + var/outmsg + var/turf/targloc = get_turf(target) + + //human/alien mobs + if(iscarbon(target)) + if(user.zone_sel.selecting == "eyes") + var/mob/living/carbon/C = target + + //20% chance to actually hit the eyes + if(prob(effectchance * diode.rating)) + add_logs(user, C, "shone in the eyes", object="laser pointer") + + //eye target check + outmsg = "You blind [C] by shining [src] in their eyes." + var/eye_prot = C.eyecheck() + if(C.blinded || eye_prot >= 2) + eye_prot = 4 + var/severity = 3 - eye_prot + if(prob(33)) + severity += 1 + else if(prob(50)) + severity -= 1 + severity = min(max(severity, 0), 4) + + switch(severity) + if(0) + //no effect + C << "A small, bright dot appears in your vision." + if(1) + //industrial grade eye protection + C.eye_stat += rand(0, 2) + C << "Something bright flashes in the corner of your vision!" + if(2) + //basic eye protection (sunglasses) + flick("flash", C.flash) + C.eye_stat += rand(1, 6) + C << "Your eyes were blinded!" + if(3) + //no eye protection + if(prob(2)) + C.Weaken(1) + flick("e_flash", C.flash) + C.eye_stat += rand(3, 7) + C << "Your eyes were blinded!" + if(4) + //the effect has been worsened by something + if(prob(5)) + C.Weaken(1) + flick("e_flash", C.flash) + C.eye_stat += rand(5, 10) + C << "Your eyes were blinded!" + else + outmsg = "You fail to blind [C] by shining [src] at their eyes." + + //robots and AI + else if(issilicon(target)) + var/mob/living/silicon/S = target + //20% chance to actually hit the sensors + if(prob(effectchance * diode.rating)) + S.Weaken(rand(5,10)) + S << "Your sensors were overloaded by a laser!" + outmsg = "You overload [S] by shining [src] at their sensors." + add_logs(user, S, "shone in the sensors", object="laser pointer") + else + outmsg = "You fail to overload [S] by shining [src] at their sensors." + + //cameras + else if(istype(target, /obj/machinery/camera)) + var/obj/machinery/camera/C = target + if(prob(effectchance * diode.rating)) + C.emp_act(1) + outmsg = "You hit the lens of [C] with [src], temporarily disabling the camera!" + add_logs(user, C, "EMPed", object="laser pointer") + else + outmsg = "You missed the lens of [C] with [src]." + + //laser pointer image + icon_state = "pointer_[pointer_icon_state]" + var/list/showto = list() + for(var/mob/M in range(7,targloc)) + if(M.client) + showto.Add(M.client) + var/image/I = image('icons/obj/projectiles.dmi',targloc,pointer_icon_state,10) + I.pixel_x = target.pixel_x + rand(-5,5) + I.pixel_y = target.pixel_y + rand(-5,5) + + if(outmsg) + user << outmsg + else + user << "You point [src] at [target]." + + energy -= 1 + if(energy <= max_energy) + if(!recharging) + recharging = 1 + processing_objects.Add(src) + if(energy <= 0) + user << "You've overused the battery of [src], now it needs time to recharge!" + recharge_locked = 1 + + flick_overlay(I, showto, 10) + icon_state = "pointer" + +/obj/item/device/laser_pointer/process() + if(prob(20 - recharge_locked*5)) + energy += 1 + if(energy >= max_energy) + energy = max_energy + recharging = 0 + recharge_locked = 0 + ..() diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 9cb72a9b928..9c6dbbdb37c 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -86,7 +86,7 @@ G.amount = remaining if(!G.amount) user.drop_item() - del(G) + qdel(G) AddUses(increment) user << "You insert a piece of glass into the [src.name]. You have [uses] lights remaining." return @@ -98,7 +98,7 @@ AddUses(1) user << "You insert the [L.name] into the [src.name]. You have [uses] lights remaining." user.drop_item() - del(L) + qdel(L) return else user << "You need a working light." @@ -164,7 +164,7 @@ target.brightness = L2.brightness target.on = target.has_power() target.update() - del(L2) + qdel(L2) if(target.on && target.rigged) target.explode() diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index a0436fa067d..88bec2edc50 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -17,6 +17,7 @@ g_amt = 20 origin_tech = "magnets=1;engineering=1" var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage + hitsound = 'sound/weapons/tap.ogg' // Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby. @@ -30,7 +31,7 @@ processing_objects += src -/obj/item/device/multitool/ai_detect/Del() +/obj/item/device/multitool/ai_detect/Destroy() processing_objects -= src ..() diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index c38169c621b..3fa8f1593f8 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -14,7 +14,7 @@ ..() overlays += "pai-off" -/obj/item/device/paicard/Del() +/obj/item/device/paicard/Destroy() //Will stop people throwing friend pAIs into the singularity so they can respawn if(!isnull(pai)) pai.death(0) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 1798038265e..868bd0133c1 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -139,4 +139,4 @@ if(power_drained >= max_power) processing_objects.Remove(src) explosion(src.loc, 3,6,9,12) - del(src) + qdel(src) diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 853890021fa..28f9936054a 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -30,4 +30,4 @@ /obj/item/device/radio/beacon/bacon //Probably a better way of doing this, I'm lazy. proc/digest_delay() spawn(600) - del(src)*/ //Bacon beacons are no more rip in peace \ No newline at end of file + qdel(src)*/ //Bacon beacons are no more rip in peace \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index ddf8238de04..463f17caf6d 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -36,7 +36,7 @@ origin_tech = "syndicate=3" /obj/item/device/radio/headset/syndicate/New() ..() - del(keyslot1) + qdel(keyslot1) keyslot1 = new /obj/item/device/encryptionkey/syndicate syndie = 1 recalculateChannels() @@ -45,7 +45,7 @@ origin_tech = "syndicate=3" /obj/item/device/radio/headset/binary/New() ..() - del(keyslot1) + qdel(keyslot1) keyslot1 = new /obj/item/device/encryptionkey/binary recalculateChannels() diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 8e03f22f48f..3e49179e76f 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -15,7 +15,7 @@ ..() processing_objects += src -/obj/item/device/radio/intercom/Del() +/obj/item/device/radio/intercom/Destroy() processing_objects -= src ..() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index edac441eae1..5bbed0fc93f 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -285,7 +285,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use // --- Cyborg --- else if (isrobot(M)) - jobname = "Cyborg" + var/mob/living/silicon/robot/B = M + jobname = "[B.designation] Cyborg" // --- Personal AI (pAI) --- else if (istype(M, /mob/living/silicon/pai)) diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 55dce9f1dac..770a1159de5 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -25,7 +25,7 @@ var/list/world_uplinks = list() welcome = ticker.mode.uplink_welcome uses = ticker.mode.uplink_uses -/obj/item/device/uplink/Del() +/obj/item/device/uplink/Destroy() world_uplinks-=src ..() @@ -179,7 +179,7 @@ var/list/world_uplinks = list() var/obj/item/weapon/antag_spawner/borg_tele/S = W if(!S.used) hidden_uplink.uses += S.TC_cost - del(S) + qdel(S) user << "Teleporter refunded." else user << "This teleporter is already used." diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index 53db3c8f280..54f19b659f3 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -30,10 +30,10 @@ burst() switch(severity) if (1) - del(src) + qdel(src) if (2) if (prob(50)) - del(src) + qdel(src) /obj/item/latexballon/bullet_act() burst() diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index bfaa13aacb1..c3ca0177b38 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -105,7 +105,7 @@ if (user.get_inactive_hand()==src) user.unEquip(src) user.put_in_inactive_hand(B) - del(src) + qdel(src) if(istype(W, /obj/item/robot_parts/l_leg)) if(src.l_leg) return user.drop_item() diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 8904cbbfc21..2a759774675 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -30,7 +30,7 @@ R.uneq_all() R.hands.icon_state = "nomod" R.icon_state = "robot" - del(R.module) + qdel(R.module) R.module = null R.modtype = "robot" R.updatename("Default") @@ -53,6 +53,7 @@ if(..()) return 0 R.name = heldname R.real_name = heldname + R.custom_name = heldname //Required or else if the cyborg's module changes, their name is lost. return 1 diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 45023c3f68f..68deaf91913 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -9,7 +9,7 @@ var/icon/virtualIcon var/list/bulletholes = list() - Del() + Destroy() // 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)) if(T.pinned_target == src) @@ -97,7 +97,7 @@ for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) O << "\red [src] breaks into tiny pieces and collapses!" - del(src) + qdel(src) // Create a temporary object to represent the damage var/obj/bmark = new diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 6faab9502a5..47d017a5c22 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -12,6 +12,7 @@ m_amt = 1000 max_amount = 60 attack_verb = list("hit", "bludgeoned", "whacked") + hitsound = 'sound/weapons/grenadelaunch.ogg' /obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob) ..() @@ -66,4 +67,4 @@ return /obj/item/stack/rods/cyborg/ - m_amt = 0 \ No newline at end of file + m_amt = 0 diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index b5e83448a79..7b09833e591 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -302,7 +302,7 @@ continue G.attackby(NG, user) user << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s." - del(src) + qdel(src) ..() /obj/item/weapon/shard/Crossed(var/mob/AM) diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index d3078ace97b..e00fe5da5e5 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -22,17 +22,17 @@ G.add_fingerprint(user) if(amount <= 0) user.unEquip(src, 1) - del(src) + qdel(src) if(istype(O,/obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/metal/M = O M.amount-- if(M.amount <= 0) user.unEquip(M, 1) - del(M) + qdel(M) amount-- var/obj/item/stack/tile/light/L = new (user.loc) L.add_fingerprint(user) if(amount <= 0) user.unEquip(src, 1) - del(src) + qdel(src) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index aab4060cdb3..f622413ce9c 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -21,8 +21,8 @@ src.amount=amount return -/obj/item/stack/Del() - if (src && usr && usr.machine==src) +/obj/item/stack/Destroy() + if (usr && usr.machine==src) usr << browse(null, "window=stack") ..() @@ -97,7 +97,7 @@ if ((usr.restrained() || usr.stat || usr.get_active_hand() != src)) return if (href_list["make"]) - if (src.amount < 1) del(src) //Never should happen + if (src.amount < 1) qdel(src) //Never should happen var/datum/stack_recipe/R = recipes[text2num(href_list["make"])] var/multiplier = text2num(href_list["multiplier"]) @@ -131,14 +131,14 @@ var/oldsrc = src src = null //dont kill proc after del() usr.unEquip(oldsrc, 1) - del(oldsrc) + qdel(oldsrc) if (istype(O,/obj/item)) usr.put_in_hands(O) O.add_fingerprint(usr) //BubbleWrap - so newly formed boxes are empty if ( istype(O, /obj/item/weapon/storage) ) for (var/obj/item/I in O) - del(I) + qdel(I) //BubbleWrap END if (src && usr.machine==src) //do not reopen closed window spawn( 0 ) @@ -153,7 +153,7 @@ src = null //dont kill proc after del() if(usr) usr.unEquip(oldsrc, 1) - del(oldsrc) + qdel(oldsrc) return /obj/item/stack/proc/add_to_stacks(mob/usr as mob) diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm index cc10e857caa..429829cc7fc 100644 --- a/code/game/objects/items/stacks/tiles/light.dm +++ b/code/game/objects/items/stacks/tiles/light.dm @@ -33,4 +33,4 @@ new/obj/item/stack/light_w(user.loc) if(amount <= 0) user.unEquip(src, 1) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ab0b7f032f2..71e978a4529 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -55,7 +55,7 @@ if(O.reagents.has_reagent("pacid", 1)) user << "The acid chews through the balloon!" O.reagents.reaction(user) - del(src) + qdel(src) else src.desc = "A translucent balloon with some form of liquid sloshing around in it." user << "\blue You fill the balloon with the contents of [O]." @@ -72,7 +72,7 @@ src.icon_state = "burst" spawn(5) if(src) - del(src) + qdel(src) return /obj/item/toy/balloon/update_icon() @@ -203,7 +203,7 @@ if(istype(I, /obj/item/toy/ammo/crossbow)) if(bullets <= 4) user.drop_item() - del(I) + qdel(I) bullets++ user << "\blue You load the foam dart into the crossbow." else @@ -235,21 +235,21 @@ for(var/mob/O in viewers(world.view, D)) O.show_message(text("\red [] was hit by the foam dart!", M), 1) new /obj/item/toy/ammo/crossbow(M.loc) - del(D) + qdel(D) return for(var/atom/A in D.loc) if(A == user) continue if(A.density) new /obj/item/toy/ammo/crossbow(A.loc) - del(D) + qdel(D) sleep(1) spawn(10) if(D) new /obj/item/toy/ammo/crossbow(D.loc) - del(D) + qdel(D) return else if (bullets == 0) @@ -349,8 +349,8 @@ newSaber.item_color = "rainbow" user.unEquip(W) user.unEquip(src) - del(W) - del(src) + qdel(W) + qdel(src) else if(istype(W, /obj/item/device/multitool)) if(hacked == 0) hacked = 1 @@ -442,7 +442,7 @@ new /obj/effect/decal/cleanable/ash(src.loc) src.visible_message("\red The [src.name] explodes!","\red You hear a snap!") playsound(src, 'sound/effects/snap.ogg', 50, 1) - del(src) + qdel(src) /obj/item/toy/snappop/Crossed(H as mob|obj) if((ishuman(H))) //i guess carp and shit shouldn't set them off @@ -456,7 +456,7 @@ new /obj/effect/decal/cleanable/ash(src.loc) src.visible_message("\red The [src.name] explodes!","\red You hear a snap!") playsound(src, 'sound/effects/snap.ogg', 50, 1) - del(src) + qdel(src) /* * Mech prizes @@ -660,7 +660,7 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/singlecard/C, mob/living/use return src.cards += C.cardname user.visible_message("[user] adds a card to the bottom of the deck.","You add the card to the bottom of the deck.") - del(C) + qdel(C) else user << "You can't mix cards from other decks." if(cards.len > 26) @@ -674,13 +674,13 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/singlecard/C, mob/living/use obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user) ..() if(istype(C)) - if(C.parentdeck == src) + if(C.parentdeck == src) if(!user.unEquip(C)) user << "The hand of cards is stuck to your hand, you can't add it to the deck!" return src.cards += C.currenthand user.visible_message("[user] puts their hand of cards in the deck.", "You put the hand of cards in the deck.") - del(C) + qdel(C) else user << "You can't mix cards from other decks." if(cards.len > 26) @@ -772,7 +772,7 @@ obj/item/toy/cards/cardhand/Topic(href, href_list) cardUser.put_in_any_hand_if_possible(N) cardUser << "You also take [currenthand[1]] and hold it." cardUser << browse(null, "window=cardhand") - del(src) + qdel(src) return obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living/user) @@ -788,7 +788,7 @@ obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living src.icon_state = "[deckstyle]_hand4" else if(currenthand.len > 2) src.icon_state = "[deckstyle]_hand3" - del(C) + qdel(C) else user << "You can't mix cards from other decks." @@ -859,8 +859,8 @@ obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user) H.pickup(user) user.put_in_active_hand(H) user << "You combine the [C.cardname] and the [src.cardname] into a hand." - del(C) - del(src) + qdel(C) + qdel(src) else user << "You can't mix cards from other decks." @@ -877,7 +877,7 @@ obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user) H.icon_state = "[deckstyle]_hand4" else if(H.currenthand.len > 2) H.icon_state = "[deckstyle]_hand3" - del(src) + qdel(src) else user << "You can't mix cards from other decks." diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 474eb156fad..cc6bcc0c9d5 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -293,7 +293,7 @@ AI MODULES if(!laws.len) //Failsafe if something goes wrong with silicon_laws.txt. warning("ERROR: empty custom board created, empty custom board deleted. Please check silicon_laws.txt.") - del(src) + qdel(src) /****************** T.Y.R.A.N.T. *****************/ diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 31c04716393..91f49882640 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -106,7 +106,7 @@ RCD user << "The RCD cant hold any more matter-units." return user.drop_item() - del(W) + qdel(W) matter += 10 playsound(src.loc, 'sound/machines/click.ogg', 50, 1) user << "The RCD now holds [matter]/30 matter-units." @@ -217,7 +217,7 @@ RCD if(do_after(user, 50)) if(!useResource(10, user)) return 0 activate() - del(A) + qdel(A) return 1 return 0 return 0 @@ -261,4 +261,4 @@ RCD anchored = 0.0 origin_tech = "materials=2" m_amt = 16000 - g_amt = 8000 \ No newline at end of file + g_amt = 8000 diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 1712f52d6f2..109284d9947 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -25,7 +25,7 @@ RSF if ((matter + 10) > 30) user << "The RSF cant hold any more matter." return - del(W) + qdel(W) matter += 10 playsound(src.loc, 'sound/machines/click.ogg', 10, 1) user << "The RSF now holds [matter]/30 fabrication-units." diff --git a/code/game/objects/items/weapons/airlock_painter.dm b/code/game/objects/items/weapons/airlock_painter.dm index 3c7156cc6e6..648ed2a7967 100644 --- a/code/game/objects/items/weapons/airlock_painter.dm +++ b/code/game/objects/items/weapons/airlock_painter.dm @@ -1,78 +1,78 @@ -/obj/item/weapon/airlock_painter - name = "airlock painter" - desc = "An advanced autopainter preprogrammed with several paintjobs for airlocks. Use it on an airlock during or after construction to change the paintjob." - icon = 'icons/obj/objects.dmi' - icon_state = "paint sprayer" - item_state = "paint sprayer" - - w_class = 2.0 - - m_amt = 50 - g_amt = 50 - origin_tech = "engineering=1" - - flags = CONDUCT - slot_flags = SLOT_BELT - - var/obj/item/device/toner/ink = null - - New() - ink = new /obj/item/device/toner(src) - - //This proc doesn't just check if the painter can be used, but also uses it. - //Only call this if you are certain that the painter will be used right after this check! - proc/use(mob/user as mob) - if(can_use(user)) - ink.charges-- - playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1) - return 1 - else - return 0 - - //This proc only checks if the painter can be used. - //Call this if you don't want the painter to be used right after this check, for example - //because you're expecting user input. - proc/can_use(mob/user as mob) - if(!ink) - user << "There is no toner cardridge installed installed in \the [name]!" - return 0 - else if(ink.charges < 1) - user << "\The [name] is out of ink!" - return 0 - else - return 1 - - examine() - ..() - if(!ink) - usr << "It doesn't have a toner cardridge installed." - return - var/ink_level = "high" - if(ink.charges < 1) - ink_level = "empty" - else if((ink.charges/ink.max_charges) <= 0.25) //25% - ink_level = "low" - else if((ink.charges/ink.max_charges) > 1) //Over 100% (admin var edit) - ink_level = "dangerously high" - usr << "Its ink levels look [ink_level]." - - attackby(obj/item/weapon/W, mob/user) - ..() - if(istype(W, /obj/item/device/toner)) - if(ink) - user << "\the [name] already contains \a [ink]." - return - user.drop_item() - W.loc = src - user << "You install \the [W] into \the [name]." - ink = W - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - - - attack_self(mob/user) - if(ink) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - ink.loc = user.loc - user.put_in_hands(ink) - user << "You remove \the [ink] from \the [name]." - ink = null +/obj/item/weapon/airlock_painter + name = "airlock painter" + desc = "An advanced autopainter preprogrammed with several paintjobs for airlocks. Use it on an airlock during or after construction to change the paintjob." + icon = 'icons/obj/objects.dmi' + icon_state = "paint sprayer" + item_state = "paint sprayer" + + w_class = 2.0 + + m_amt = 50 + g_amt = 50 + origin_tech = "engineering=1" + + flags = CONDUCT + slot_flags = SLOT_BELT + + var/obj/item/device/toner/ink = null + + New() + ink = new /obj/item/device/toner(src) + + //This proc doesn't just check if the painter can be used, but also uses it. + //Only call this if you are certain that the painter will be used right after this check! + proc/use(mob/user as mob) + if(can_use(user)) + ink.charges-- + playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1) + return 1 + else + return 0 + + //This proc only checks if the painter can be used. + //Call this if you don't want the painter to be used right after this check, for example + //because you're expecting user input. + proc/can_use(mob/user as mob) + if(!ink) + user << "There is no toner cardridge installed installed in \the [name]!" + return 0 + else if(ink.charges < 1) + user << "\The [name] is out of ink!" + return 0 + else + return 1 + + examine() + ..() + if(!ink) + usr << "It doesn't have a toner cardridge installed." + return + var/ink_level = "high" + if(ink.charges < 1) + ink_level = "empty" + else if((ink.charges/ink.max_charges) <= 0.25) //25% + ink_level = "low" + else if((ink.charges/ink.max_charges) > 1) //Over 100% (admin var edit) + ink_level = "dangerously high" + usr << "Its ink levels look [ink_level]." + + attackby(obj/item/weapon/W, mob/user) + ..() + if(istype(W, /obj/item/device/toner)) + if(ink) + user << "\the [name] already contains \a [ink]." + return + user.drop_item() + W.loc = src + user << "You install \the [W] into \the [name]." + ink = W + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + + + attack_self(mob/user) + if(ink) + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + ink.loc = user.loc + user.put_in_hands(ink) + user << "You remove \the [ink] from \the [name]." + ink = null diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index b0fe22debc3..35f0eadaa47 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -80,10 +80,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM flags |= NOREACT // so it doesn't react until you light it create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 -/obj/item/clothing/mask/cigarette/Del() - ..() - del(reagents) - /obj/item/clothing/mask/cigarette/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() if(istype(W, /obj/item/weapon/weldingtool)) @@ -154,7 +150,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(ismob(loc)) var/mob/M = loc M.unEquip(src, 1) - del(src) + qdel(src) return if(reagents.get_reagent_amount("fuel")) // the fuel explodes, too, but much less violently var/datum/effect/effect/system/reagents_explosion/e = new() @@ -163,7 +159,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(ismob(loc)) var/mob/M = loc M.unEquip(src, 1) - del(src) + qdel(src) return flags &= ~NOREACT // allowing reagents to react after being lit reagents.handle_reactions() @@ -204,7 +200,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(ismob(loc)) M << "Your [name] goes out." M.unEquip(src, 1) //un-equip it so the overlays can update //Force the un-equip so the overlays update - del(src) + qdel(src) return if(location) location.hotspot_expose(700, 5) @@ -220,7 +216,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM new type_butt(T) new /obj/effect/decal/cleanable/ash(T) processing_objects.Remove(src) - del(src) + qdel(src) return ..() /obj/item/clothing/mask/cigarette/attack(mob/living/carbon/M, mob/living/carbon/user) @@ -356,7 +352,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM name = "[O.name]-packed [initial(name)]" if(O.reagents) O.reagents.trans_to(src, O.reagents.total_volume) - del(O) + qdel(O) else user << "It has to be dried first." else @@ -534,8 +530,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM user.put_in_active_hand(R) user << "You roll the [target.name] into a rolling paper." R.desc = "Dried [target.name] rolled up in a thin piece of paper." - del(target) - del(src) + qdel(target) + qdel(src) else user << "You need to dry this first." else @@ -559,7 +555,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/obj/item/weapon/rollingpaper/P = new /obj/item/weapon/rollingpaper(user.loc) user.put_in_inactive_hand(P) user << "You take the last paper out of the pack, and throw the pack away." - del(src) + qdel(src) /obj/item/weapon/rollingpaperpack/examine() ..() diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 2160d7967b4..ef8daeb6791 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -30,11 +30,11 @@ user << "You need to take that [target.name] off before cleaning it." else if(istype(target,/obj/effect/decal/cleanable)) user << "You scrub \the [target.name] out." - del(target) + qdel(target) else user << "You clean \the [target.name]." var/obj/effect/decal/cleanable/C = locate() in target - del(C) + qdel(C) target.clean_blood() return diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index dd76b434ea5..244c67a54fb 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -14,9 +14,11 @@ var/timer = 10 var/atom/target = null var/open_panel = 0 + var/image_overlay = null /obj/item/weapon/plastique/New() wires = new(src) + image_overlay = image('icons/obj/assemblies.dmi', "plastic-explosive2") ..() /obj/item/weapon/plastique/suicide_act(var/mob/user) @@ -80,7 +82,7 @@ message_admins("[key_name(user, user.client)](?) planted C4 on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [timer] second fuse",0,1) log_game("[key_name(user)] planted C4 on [target.name] at ([target.x],[target.y],[target.z]) with [timer] second fuse") - target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2") + target.overlays += image_overlay user << "Bomb has been planted. Timer counting down from [timer]." spawn(timer*10) explode(get_turf(target)) @@ -100,10 +102,9 @@ target:dismantle_wall(1) else target.ex_act(1) - if (isobj(target)) - if (target) - del(target) - del(src) + if(target) + target.overlays -= image_overlay + qdel(src) /obj/item/weapon/plastique/attack(mob/M as mob, mob/user as mob, def_zone) return diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 8c94845baf9..8713c39b2ce 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -124,7 +124,7 @@ if(W.loc == my_target) break sleep(2) - if((istype(usr.loc, /turf/space)) || (usr.lastarea && usr.lastarea.has_gravity == 0)) + if(!has_gravity(user)) user.inertia_dir = get_dir(target, user) step(user, user.inertia_dir) else diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index bb81c9e81cf..e1a034ab16f 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -21,15 +21,14 @@ var/obj/item/weapon/tank/plasma/ptank = null -/obj/item/weapon/flamethrower/Del() +/obj/item/weapon/flamethrower/Destroy() if(weldtool) - del(weldtool) + qdel(weldtool) if(igniter) - del(igniter) + qdel(igniter) if(ptank) - del(ptank) + qdel(ptank) ..() - return /obj/item/weapon/flamethrower/process() @@ -82,7 +81,7 @@ ptank.loc = T ptank = null new /obj/item/stack/rods(T) - del(src) + qdel(src) return if(istype(W, /obj/item/weapon/screwdriver) && igniter && !lit) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index fb509f15dde..4338f63ed1f 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -72,7 +72,7 @@ M.unEquip(src, 1) M.put_in_hands(I) I.add_fingerprint(M) - del(src) + qdel(src) return diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index b890e43133b..a75c08fecf2 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -174,7 +174,7 @@ invisibility = INVISIBILITY_MAXIMUM //Why am i doing this? spawn(50) //To make sure all reagents can work - del(src) //correctly before deleting the grenade. + qdel(src) //correctly before deleting the grenade. @@ -236,7 +236,7 @@ invisibility = INVISIBILITY_MAXIMUM //Why am i doing this? spawn(50) //To make sure all reagents can work - del(src) //correctly before deleting the grenade. + qdel(src) //correctly before deleting the grenade. //I tried to just put it in the allowed_containers list but diff --git a/code/game/objects/items/weapons/grenades/emgrenade.dm b/code/game/objects/items/weapons/grenades/emgrenade.dm index bce8a055e71..990fc09d374 100644 --- a/code/game/objects/items/weapons/grenades/emgrenade.dm +++ b/code/game/objects/items/weapons/grenades/emgrenade.dm @@ -8,5 +8,5 @@ /obj/item/weapon/grenade/empgrenade/prime() update_mob() empulse(src, 4, 10) - del(src) + qdel(src) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 52e2ee146e8..ff92bf3ab64 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -19,7 +19,7 @@ var/damage = round(30/(get_dist(B,get_turf(src))+1)) B.health -= damage B.update_icon() - del(src) + qdel(src) /obj/item/weapon/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/M) M << "BANG" @@ -99,8 +99,7 @@ spawn(0) new /obj/item/weapon/grenade/flashbang/clusterbang/segment(src.loc)//Creates a 'segment' that launches a few more flashbangs playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn(0) - del(src) + qdel(src) /obj/item/weapon/grenade/flashbang/clusterbang/segment desc = "A smaller segment of a clusterbang. Better run." @@ -130,8 +129,7 @@ spawn(0) new /obj/item/weapon/grenade/flashbang/cluster(src.loc) playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn(0) - del(src) + qdel(src) /obj/item/weapon/grenade/flashbang/cluster/New()//Same concept as the segments, so that all of the parts don't become reliant on the clusterbang ..() diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index ed05c8a7d7b..df3e801863f 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -1,93 +1,93 @@ -//improvised explosives// - -//iedcasing assembly crafting// -/obj/item/weapon/reagent_containers/food/drinks/soda_cans/attackby(var/obj/item/I, mob/user as mob) - if(istype(I, /obj/item/device/assembly/igniter)) - var/obj/item/device/assembly/igniter/G = I - var/obj/item/weapon/grenade/iedcasing/W = new /obj/item/weapon/grenade/iedcasing - user.unEquip(G) - user.unEquip(src) - user.put_in_hands(W) - user << "You stuff the [I] in the [src], emptying the contents beforehand." - W.underlays += image(src.icon, icon_state = src.icon_state) - del(I) - del(src) - - -/obj/item/weapon/grenade/iedcasing - name = "improvised explosive assembly" - desc = "An igniter stuffed into an aluminium shell." - w_class = 2.0 - icon = 'icons/obj/grenade.dmi' - icon_state = "improvised_grenade" - item_state = "flashbang" - throw_speed = 3 - throw_range = 7 - flags = CONDUCT - slot_flags = SLOT_BELT - var/assembled = 0 - active = 1 - det_time = 50 - display_timer = 0 - - - -/obj/item/weapon/grenade/iedcasing/afterattack(atom/target, mob/user , flag) //Filling up the can - if(assembled == 0) - if(istype(target, /obj/structure/reagent_dispensers/fueltank) && in_range(src, target)) - if(target.reagents.total_volume < 50) - user << "There's not enough fuel left to work with." - return - var/obj/structure/reagent_dispensers/fueltank/F = target - F.reagents.remove_reagent("fuel", 50, 1)//Deleting 50 fuel from the welding fuel tank, - assembled = 1 - user << "You've filled the makeshift explosive with welding fuel." - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) - desc = "An improvised explosive assembly. Filled to the brim with 'Explosive flavor'" - overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") - return - - -/obj/item/weapon/grenade/iedcasing/attackby(var/obj/item/I, mob/user as mob) //Wiring the can for ignition - if(istype(I, /obj/item/stack/cable_coil)) - if(assembled == 1) - var/obj/item/stack/cable_coil/C = I - C.use(1) - assembled = 2 - user << "You wire the igniter to detonate the fuel." - desc = "A weak, improvised explosive." - overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_wired") - name = "improvised explosive" - active = 0 - det_time = rand(30,80) - -/obj/item/weapon/grenade/iedcasing/attack_self(mob/user as mob) // - if(!active) - if(clown_check(user)) - user << "You light the [name]!" - active = 1 - overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") - icon_state = initial(icon_state) + "_active" - assembled = 3 - add_fingerprint(user) - var/turf/bombturf = get_turf(src) - var/area/A = get_area(bombturf) - - message_admins("[key_name(usr)]? has primed a [name] for detonation at [A.name] (JMP).") - log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).") - if(iscarbon(user)) - var/mob/living/carbon/C = user - C.throw_mode_on() - spawn(det_time) - prime() - -/obj/item/weapon/grenade/iedcasing/prime() //Blowing that can up - update_mob() - explosion(src.loc,-1,0,2) - del(src) - -/obj/item/weapon/grenade/iedcasing/examine() - set src in usr - ..() - if(assembled == 3) - usr << "You can't tell when it will explode!" +//improvised explosives// + +//iedcasing assembly crafting// +/obj/item/weapon/reagent_containers/food/drinks/soda_cans/attackby(var/obj/item/I, mob/user as mob) + if(istype(I, /obj/item/device/assembly/igniter)) + var/obj/item/device/assembly/igniter/G = I + var/obj/item/weapon/grenade/iedcasing/W = new /obj/item/weapon/grenade/iedcasing + user.unEquip(G) + user.unEquip(src) + user.put_in_hands(W) + user << "You stuff the [I] in the [src], emptying the contents beforehand." + W.underlays += image(src.icon, icon_state = src.icon_state) + qdel(I) + qdel(src) + + +/obj/item/weapon/grenade/iedcasing + name = "improvised explosive assembly" + desc = "An igniter stuffed into an aluminium shell." + w_class = 2.0 + icon = 'icons/obj/grenade.dmi' + icon_state = "improvised_grenade" + item_state = "flashbang" + throw_speed = 3 + throw_range = 7 + flags = CONDUCT + slot_flags = SLOT_BELT + var/assembled = 0 + active = 1 + det_time = 50 + display_timer = 0 + + + +/obj/item/weapon/grenade/iedcasing/afterattack(atom/target, mob/user , flag) //Filling up the can + if(assembled == 0) + if(istype(target, /obj/structure/reagent_dispensers/fueltank) && in_range(src, target)) + if(target.reagents.total_volume < 50) + user << "There's not enough fuel left to work with." + return + var/obj/structure/reagent_dispensers/fueltank/F = target + F.reagents.remove_reagent("fuel", 50, 1)//Deleting 50 fuel from the welding fuel tank, + assembled = 1 + user << "You've filled the makeshift explosive with welding fuel." + playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) + desc = "An improvised explosive assembly. Filled to the brim with 'Explosive flavor'" + overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") + return + + +/obj/item/weapon/grenade/iedcasing/attackby(var/obj/item/I, mob/user as mob) //Wiring the can for ignition + if(istype(I, /obj/item/stack/cable_coil)) + if(assembled == 1) + var/obj/item/stack/cable_coil/C = I + C.use(1) + assembled = 2 + user << "You wire the igniter to detonate the fuel." + desc = "A weak, improvised explosive." + overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_wired") + name = "improvised explosive" + active = 0 + det_time = rand(30,80) + +/obj/item/weapon/grenade/iedcasing/attack_self(mob/user as mob) // + if(!active) + if(clown_check(user)) + user << "You light the [name]!" + active = 1 + overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") + icon_state = initial(icon_state) + "_active" + assembled = 3 + add_fingerprint(user) + var/turf/bombturf = get_turf(src) + var/area/A = get_area(bombturf) + + message_admins("[key_name(usr)]? has primed a [name] for detonation at [A.name] (JMP).") + log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).") + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.throw_mode_on() + spawn(det_time) + prime() + +/obj/item/weapon/grenade/iedcasing/prime() //Blowing that can up + update_mob() + explosion(src.loc,-1,0,2) + qdel(src) + +/obj/item/weapon/grenade/iedcasing/examine() + set src in usr + ..() + if(assembled == 3) + usr << "You can't tell when it will explode!" diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index 508d3e6f7c9..1a4226b70a3 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -30,4 +30,4 @@ B.health -= damage B.update_icon() sleep(80) - del(src) + qdel(src) diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 889f03dfdc0..c104bfd9c73 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -28,7 +28,7 @@ // Spawn some hostile syndicate critters - del(src) + qdel(src) /obj/item/weapon/grenade/spawnergrenade/manhacks name = "viscerator delivery grenade" diff --git a/code/game/objects/items/weapons/grenades/syndieminibomb.dm b/code/game/objects/items/weapons/grenades/syndieminibomb.dm index bf2e74a0d14..cc26f378c46 100644 --- a/code/game/objects/items/weapons/grenades/syndieminibomb.dm +++ b/code/game/objects/items/weapons/grenades/syndieminibomb.dm @@ -1,12 +1,12 @@ -/obj/item/weapon/grenade/syndieminibomb - desc = "A syndicate manufactured explosive used to sow destruction and chaos" - name = "syndicate minibomb" - icon = 'icons/obj/grenade.dmi' - icon_state = "syndicate" - item_state = "flashbang" - origin_tech = "materials=3;magnets=4;syndicate=4" - -/obj/item/weapon/grenade/syndieminibomb/prime() - update_mob() - explosion(src.loc,1,2,4,flame_range = 2) - del(src) \ No newline at end of file +/obj/item/weapon/grenade/syndieminibomb + desc = "A syndicate manufactured explosive used to sow destruction and chaos" + name = "syndicate minibomb" + icon = 'icons/obj/grenade.dmi' + icon_state = "syndicate" + item_state = "flashbang" + origin_tech = "materials=3;magnets=4;syndicate=4" + +/obj/item/weapon/grenade/syndieminibomb/prime() + update_mob() + explosion(src.loc,1,2,4,flame_range = 2) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index d7cab0a8be1..799b5e57d52 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -99,7 +99,7 @@ user.put_in_hands(W) user << "You wrap the cable restraint around the top of the rod." - del(src) + qdel(src) /obj/item/weapon/handcuffs/cyborg/attack(mob/living/carbon/C, mob/user) if(isrobot(user)) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 02f92f287d3..e576db99e45 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -28,7 +28,7 @@ /obj/item/weapon/implant/dropped(mob/user as mob) . = 1 - del src + qdel(src) return . /obj/item/weapon/implant/tracking @@ -119,7 +119,7 @@ R << "You hear a faint *beep*." if(!reagents.total_volume) R << "You hear a faint click from your chest." - del(src) + qdel(src) /obj/item/weapon/implant/loyalty diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 8d9009f707b..b2c4534d2cc 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -83,7 +83,7 @@ return var/mob/M = G:affecting if(put_mob(M)) - del(G) + qdel(G) src.updateUsrDialog() return diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index f3d581475b7..7273118ca18 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -412,7 +412,7 @@ viewers(3,user) << "[user] takes a piece of omelette with his fork!" reagents.remove_reagent("nutriment", 1) if (reagents.total_volume <= 0) - del(src)*/ + qdel(src)*/ /* if (prob(33)) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 0dbae0b2152..6683467952a 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -113,8 +113,8 @@ newSaber.item_color = "rainbow" user.unEquip(W) user.unEquip(src) - del(W) - del(src) + qdel(W) + qdel(src) else if(istype(W, /obj/item/device/multitool)) if(hacked == 0) hacked = 1 @@ -180,7 +180,7 @@ spark_system.attach(src) /obj/item/weapon/melee/energy/blade/dropped() - del(src) + qdel(src) /obj/item/weapon/melee/energy/blade/proc/throw() - del(src) + qdel(src) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 98c3391877a..d4a64ac9155 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -22,7 +22,7 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A) A.clean_blood() for(var/obj/effect/O in A) if(istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) - del(O) + qdel(O) reagents.reaction(A, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. reagents.remove_any(1) //reaction() doesn't use up the reagents diff --git a/code/game/objects/items/weapons/singularityhammer.dm b/code/game/objects/items/weapons/singularityhammer.dm index 74dce232bbb..ddde0ba93e6 100644 --- a/code/game/objects/items/weapons/singularityhammer.dm +++ b/code/game/objects/items/weapons/singularityhammer.dm @@ -20,7 +20,7 @@ processing_objects.Add(src) - Del() + Destroy() processing_objects.Remove(src) ..() @@ -85,23 +85,6 @@ //var/charged = 5 origin_tech = "combat=5;powerstorage=5" - -/* - New() - ..() - processing_objects.Add(src) - - - Del() - processing_objects.Remove(src) - ..() - - - process() - if(charged < 5) - charged++ - return -*/ /obj/item/weapon/twohanded/mjollnir/proc/shock(mob/living/target as mob) var/datum/effect/effect/system/lightning_spread/s = new /datum/effect/effect/system/lightning_spread s.set_up(5, 1, target.loc) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 0d84580ddae..53dab7a754a 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -46,12 +46,12 @@ if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail) investigate_log("has become a singularity. Caused by [user.key]","singulo") user << "\red The Bluespace interfaces of the two devices catastrophically malfunction!" - del(W) + qdel(W) var/obj/machinery/singularity/singulo = new /obj/machinery/singularity (get_turf(src)) singulo.energy = 300 //should make it a bit bigger~ message_admins("[key_name_admin(user)] detonated a bag of holding") log_game("[key_name(user)] detonated a bag of holding") - del(src) + qdel(src) return ..() @@ -62,7 +62,7 @@ else user << "\red The Bluespace generator malfunctions!" for (var/obj/O in src.contents) //it broke, delete what was in it - del(O) + qdel(O) crit_fail = 1 icon_state = "brokenpack" diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 744d8df3677..fccc32f140d 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -169,7 +169,7 @@ usr.client.screen -= S S.dropped(usr) if(!S.amount) - del S + qdel(S) else S.loc = src @@ -214,7 +214,7 @@ N.amount = stacksize S.amount -= stacksize if(!S.amount) - del S // todo: there's probably something missing here + qdel(S)// todo: there's probably something missing here orient2hud(usr) if(usr.s_active) usr.s_active.show_to(usr) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 0d145f54a2c..a36e5770eee 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -152,3 +152,26 @@ desc = "A syndicate belt designed to be used by boarding parties. Its style is modeled after the hardsuits they wear." icon_state = "militarybelt" item_state = "military" + +/obj/item/weapon/storage/belt/wands + name = "wand belt" + desc = "A belt designed to hold various rods of power. A veritable fanny pack of exotic magic." + icon_state = "soulstonebelt" + item_state = "soulstonebelt" + storage_slots = 6 + can_hold = list( + "/obj/item/weapon/gun/magic/wand" + ) + +/obj/item/weapon/storage/belt/wands/full/New() + ..() + new /obj/item/weapon/gun/magic/wand/death(src) + new /obj/item/weapon/gun/magic/wand/resurrection(src) + new /obj/item/weapon/gun/magic/wand/polymorph(src) + new /obj/item/weapon/gun/magic/wand/teleport(src) + new /obj/item/weapon/gun/magic/wand/door(src) + new /obj/item/weapon/gun/magic/wand/fireball(src) + + for(var/obj/item/weapon/gun/magic/wand/W in contents) //All wands in this pack come in the best possible condition + W.max_charges = initial(W.max_charges) + W.charges = W.max_charges \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 1ae1f4cc538..bf7cdbe88d4 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -47,7 +47,7 @@ user.put_in_hands(I) user.update_inv_l_hand() user.update_inv_r_hand() - del(src) + qdel(src) /obj/item/weapon/storage/box/survival diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index f7ea7bc7789..96375165496 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -163,11 +163,6 @@ new /obj/item/clothing/mask/cigarette(src) create_reagents(15 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one -/obj/item/weapon/storage/fancy/cigarettes/Del() - del(reagents) - ..() - - /obj/item/weapon/storage/fancy/cigarettes/update_icon() icon_state = "[initial(icon_state)][contents.len]" desc = "There are [contents.len] cig\s left!" diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index e9a53f9f5bf..9f8b5b62832 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -1,434 +1,434 @@ -// To clarify: -// For use_to_pickup and allow_quick_gather functionality, -// see item/attackby() (/game/objects/items.dm) -// Do not remove this functionality without good reason, cough reagent_containers cough. -// -Sayu - - -/obj/item/weapon/storage - name = "storage" - icon = 'icons/obj/storage.dmi' - w_class = 3.0 - var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else) - var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set) - var/max_w_class = 2 //Max size of objects that this object can store (in effect only if can_hold isn't set) - var/max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item. - var/storage_slots = 7 //The number of storage slots in this container. - var/obj/screen/storage/boxes = null - var/obj/screen/close/closer = null - var/use_to_pickup //Set this to make it possible to use this item in an inverse way, so you can have the item in your hand and click items on the floor to pick them up. - var/display_contents_with_number //Set this to make the storage item group contents of the same type and display them as a number. - var/allow_quick_empty //Set this variable to allow the object to have the 'empty' verb, which dumps all the contents on the floor. - var/allow_quick_gather //Set this variable to allow the object to have the 'toggle mode' verb, which quickly collects all items from a tile. - var/collection_mode = 1; //0 = pick one at a time, 1 = pick all on tile, 2 = pick all of a type - - -/obj/item/weapon/storage/MouseDrop(obj/over_object) - if(ismob(usr)) //all the check for item manipulation are in other places, you can safely open any storages as anything and its not buggy, i checked - var/mob/M = usr - - if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech - return - - if(over_object == M && Adjacent(M)) // this must come before the screen objects only block - orient2hud(M) // dunno why it wasn't before - if(M.s_active) - M.s_active.close(M) - show_to(M) - return - - if(!( istype(over_object, /obj/screen) )) - return ..() - - if(!(loc == usr) || (loc && loc.loc == usr)) - return - playsound(loc, "rustle", 50, 1, -5) - if(!( M.restrained() ) && !( M.stat )) - switch(over_object.name) - if("r_hand") - if(!M.unEquip(src)) - return - M.put_in_r_hand(src) - if("l_hand") - if(!M.unEquip(src)) - return - M.put_in_l_hand(src) - add_fingerprint(usr) - return - - -/obj/item/weapon/storage/proc/return_inv() - var/list/L = list() - L += contents - - for(var/obj/item/weapon/storage/S in src) - L += S.return_inv() - return L - - -/obj/item/weapon/storage/proc/show_to(mob/user) - if(user.s_active != src) - for(var/obj/item/I in src) - if(I.on_found(user)) - return - if(user.s_active) - user.s_active.hide_from(user) - user.client.screen -= boxes - user.client.screen -= closer - user.client.screen -= contents - user.client.screen += boxes - user.client.screen += closer - user.client.screen += contents - user.s_active = src - - -/obj/item/weapon/storage/proc/hide_from(mob/user) - if(!user.client) - return - user.client.screen -= boxes - user.client.screen -= closer - user.client.screen -= contents - if(user.s_active == src) - user.s_active = null - - -/obj/item/weapon/storage/proc/close(mob/user) - hide_from(user) - user.s_active = null - - -/obj/item/weapon/storage/proc/close_all() //returns 1 if any mobs actually got a close(M) call - var/actually_closed = 0 - for(var/mob/M in range(1)) - if(M.s_active == src) - close(M) - actually_closed = 1 - return actually_closed - -//This proc draws out the inventory and places the items on it. tx and ty are the upper left tile and mx, my are the bottm right. -//The numbers are calculated from the bottom-left The bottom-left slot being 1,1. -/obj/item/weapon/storage/proc/orient_objs(tx, ty, mx, my) - var/cx = tx - var/cy = ty - boxes.screen_loc = "[tx]:,[ty] to [mx],[my]" - for(var/obj/O in contents) - O.screen_loc = "[cx],[cy]" - O.layer = 20 - cx++ - if(cx > mx) - cx = tx - cy-- - closer.screen_loc = "[mx+1],[my]" - - -//This proc draws out the inventory and places the items on it. It uses the standard position. -/obj/item/weapon/storage/proc/standard_orient_objs(rows, cols, list/obj/item/display_contents) - var/cx = 4 - var/cy = 2+rows - boxes.screen_loc = "4:16,2:16 to [4+cols]:16,[2+rows]:16" - - if(display_contents_with_number) - for(var/datum/numbered_display/ND in display_contents) - ND.sample_object.screen_loc = "[cx]:16,[cy]:16" - ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" - ND.sample_object.layer = 20 - cx++ - if(cx > (4+cols)) - cx = 4 - cy-- - else - for(var/obj/O in contents) - O.screen_loc = "[cx]:16,[cy]:16" - O.maptext = "" - O.layer = 20 - cx++ - if(cx > (4+cols)) - cx = 4 - cy-- - closer.screen_loc = "[4+cols+1]:16,2:16" - - -/datum/numbered_display - var/obj/item/sample_object - var/number - - New(obj/item/sample) - if(!istype(sample)) - del(src) - sample_object = sample - number = 1 - - -//This proc determins the size of the inventory to be displayed. Please touch it only if you know what you're doing. -/obj/item/weapon/storage/proc/orient2hud(mob/user) - var/adjusted_contents = contents.len - - //Numbered contents display - var/list/datum/numbered_display/numbered_contents - if(display_contents_with_number) - numbered_contents = list() - adjusted_contents = 0 - for(var/obj/item/I in contents) - var/found = 0 - for(var/datum/numbered_display/ND in numbered_contents) - if(ND.sample_object.type == I.type) - ND.number++ - found = 1 - break - if(!found) - adjusted_contents++ - numbered_contents.Add( new/datum/numbered_display(I) ) - - //var/mob/living/carbon/human/H = user - var/row_num = 0 - var/col_count = min(7,storage_slots) -1 - if(adjusted_contents > 7) - row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. - standard_orient_objs(row_num, col_count, numbered_contents) - - -//This proc return 1 if the item can be picked up and 0 if it can't. -//Set the stop_messages to stop it from printing messages -/obj/item/weapon/storage/proc/can_be_inserted(obj/item/W, stop_messages = 0) - if(!istype(W) || (W.flags & ABSTRACT)) return //Not an item - - if(loc == W) - return 0 //Means the item is already in the storage item - if(contents.len >= storage_slots) - if(!stop_messages) - usr << "[src] is full, make some space." - return 0 //Storage item is full - - if(can_hold.len) - var/ok = 0 - for(var/A in can_hold) - if(istype(W, text2path(A) )) - ok = 1 - break - if(!ok) - if(!stop_messages) - usr << "[src] cannot hold [W]." - return 0 - - for(var/A in cant_hold) //Check for specific items which this container can't hold. - if(istype(W, text2path(A) )) - if(!stop_messages) - usr << "[src] cannot hold [W]." - return 0 - - if(W.w_class > max_w_class) - if(!stop_messages) - usr << "[W] is too big for this [src]." - return 0 - - var/sum_w_class = W.w_class - for(var/obj/item/I in contents) - sum_w_class += I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it. - - if(sum_w_class > max_combined_w_class) - if(!stop_messages) - usr << "[src] is full, make some space." - return 0 - - if(W.w_class >= w_class && (istype(W, /obj/item/weapon/storage))) - if(!istype(src, /obj/item/weapon/storage/backpack/holding)) //bohs should be able to hold backpacks again. The override for putting a boh in a boh is in backpack.dm. - if(!stop_messages) - usr << "[src] cannot hold [W] as it's a storage item of the same size." - return 0 //To prevent the stacking of same sized storage items. - - if(W.flags & NODROP) //SHOULD be handled in unEquip, but better safe than sorry. - usr << "\the [W] is stuck to your hand, you can't put it in \the [src]" - return 0 - - return 1 - - -//This proc handles items being inserted. It does not perform any checks of whether an item can or can't be inserted. That's done by can_be_inserted() -//The stop_warning parameter will stop the insertion message from being displayed. It is intended for cases where you are inserting multiple items at once, -//such as when picking up all the items on a tile with one click. -/obj/item/weapon/storage/proc/handle_item_insertion(obj/item/W, prevent_warning = 0) - if(!istype(W)) return 0 - if(usr) - if(!usr.unEquip(W)) - return 0 - W.loc = src - W.on_enter_storage(src) - if(usr) - if(usr.client && usr.s_active != src) - usr.client.screen -= W - - add_fingerprint(usr) - - if(!prevent_warning && !istype(W, /obj/item/weapon/gun/energy/crossbow)) - for(var/mob/M in viewers(usr, null)) - if(M == usr) - usr << "You put [W] into [src]." - else if(in_range(M, usr)) //If someone is standing close enough, they can tell what it is... - M.show_message("[usr] puts [W] into [src].") - else if(W && W.w_class >= 3.0) //Otherwise they can only see large or normal items from a distance... - M.show_message("[usr] puts [W] into [src].") - - orient2hud(usr) - if(usr.s_active) - usr.s_active.show_to(usr) - update_icon() - return 1 - - -//Call this proc to handle the removal of an item from the storage item. The item will be moved to the atom sent as new_target -/obj/item/weapon/storage/proc/remove_from_storage(obj/item/W, atom/new_location) - if(!istype(W)) return 0 - - if(istype(src, /obj/item/weapon/storage/fancy)) - var/obj/item/weapon/storage/fancy/F = src - F.update_icon(1) - - for(var/mob/M in range(1, loc)) - if(M.s_active == src) - if(M.client) - M.client.screen -= W - - if(new_location) - if(ismob(loc)) - W.dropped(usr) - if(ismob(new_location)) - W.layer = 20 - else - W.layer = initial(W.layer) - W.loc = new_location - else - W.loc = get_turf(src) - - if(usr) - orient2hud(usr) - if(usr.s_active) - usr.s_active.show_to(usr) - if(W.maptext) - W.maptext = "" - W.on_exit_storage(src) - update_icon() - return 1 - - -//This proc is called when you want to place an item into the storage item. -/obj/item/weapon/storage/attackby(obj/item/W, mob/user) - ..() - - if(isrobot(user)) - user << "You're a robot. No." - return 0 //Robots can't interact with storage items. - - if(!can_be_inserted(W)) - return 0 - - if(istype(W, /obj/item/weapon/tray)) //THIS ISN'T HOW OOP WORKS - var/obj/item/weapon/tray/T = W - if(T.calc_carry() > 0) - user << "[T] won't fit in [src]." - return 1 - - handle_item_insertion(W) - return 1 - - -/obj/item/weapon/storage/dropped(mob/user) - return - -/obj/item/weapon/storage/attack_hand(mob/user) - playsound(loc, "rustle", 50, 1, -5) - - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.l_store == src && !H.get_active_hand()) //Prevents opening if it's in a pocket. - H.put_in_hands(src) - H.l_store = null - return - if(H.r_store == src && !H.get_active_hand()) - H.put_in_hands(src) - H.r_store = null - return - - orient2hud(user) - if(loc == user) - if(user.s_active) - user.s_active.close(user) - show_to(user) - else - ..() - for(var/mob/M in range(1)) - if(M.s_active == src) - close(M) - add_fingerprint(user) - -/obj/item/weapon/storage/attack_paw(mob/user) - return attack_hand(user) - -/obj/item/weapon/storage/verb/toggle_gathering_mode() - set name = "Switch Gathering Method" - set category = "Object" - - collection_mode = (collection_mode+1)%3 - switch (collection_mode) - if(2) - usr << "[src] now picks up all items of a single type at once." - if(1) - usr << "[src] now picks up all items in a tile at once." - if(0) - usr << "[src] now picks up one item at a time." - - -/obj/item/weapon/storage/verb/quick_empty() - set name = "Empty Contents" - set category = "Object" - - if((!ishuman(usr) && (loc != usr)) || usr.stat || usr.restrained()) - return - - var/turf/T = get_turf(src) - hide_from(usr) - for(var/obj/item/I in contents) - remove_from_storage(I, T) - - -/obj/item/weapon/storage/New() - - if(allow_quick_empty) - verbs += /obj/item/weapon/storage/verb/quick_empty - else - verbs -= /obj/item/weapon/storage/verb/quick_empty - - if(allow_quick_gather) - verbs += /obj/item/weapon/storage/verb/toggle_gathering_mode - else - verbs -= /obj/item/weapon/storage/verb/toggle_gathering_mode - - boxes = new /obj/screen/storage() - boxes.name = "storage" - boxes.master = src - boxes.icon_state = "block" - boxes.screen_loc = "7,7 to 10,8" - boxes.layer = 19 - closer = new /obj/screen/close() - closer.master = src - closer.icon_state = "x" - closer.layer = 20 - orient2hud() - - -/obj/item/weapon/storage/Del() - close_all() - ..() - - -/obj/item/weapon/storage/emp_act(severity) - if(!istype(loc, /mob/living)) - for(var/obj/O in contents) - O.emp_act(severity) - ..() - - -/obj/item/weapon/storage/attack_self(mob/user) - //Clicking on itself will empty it, if it has the verb to do that. - if(user.get_active_hand() == src) - if(verbs.Find(/obj/item/weapon/storage/verb/quick_empty)) - quick_empty() +// To clarify: +// For use_to_pickup and allow_quick_gather functionality, +// see item/attackby() (/game/objects/items.dm) +// Do not remove this functionality without good reason, cough reagent_containers cough. +// -Sayu + + +/obj/item/weapon/storage + name = "storage" + icon = 'icons/obj/storage.dmi' + w_class = 3.0 + var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else) + var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set) + var/max_w_class = 2 //Max size of objects that this object can store (in effect only if can_hold isn't set) + var/max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item. + var/storage_slots = 7 //The number of storage slots in this container. + var/obj/screen/storage/boxes = null + var/obj/screen/close/closer = null + var/use_to_pickup //Set this to make it possible to use this item in an inverse way, so you can have the item in your hand and click items on the floor to pick them up. + var/display_contents_with_number //Set this to make the storage item group contents of the same type and display them as a number. + var/allow_quick_empty //Set this variable to allow the object to have the 'empty' verb, which dumps all the contents on the floor. + var/allow_quick_gather //Set this variable to allow the object to have the 'toggle mode' verb, which quickly collects all items from a tile. + var/collection_mode = 1; //0 = pick one at a time, 1 = pick all on tile, 2 = pick all of a type + + +/obj/item/weapon/storage/MouseDrop(obj/over_object) + if(ismob(usr)) //all the check for item manipulation are in other places, you can safely open any storages as anything and its not buggy, i checked + var/mob/M = usr + + if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech + return + + if(over_object == M && Adjacent(M)) // this must come before the screen objects only block + orient2hud(M) // dunno why it wasn't before + if(M.s_active) + M.s_active.close(M) + show_to(M) + return + + if(!( istype(over_object, /obj/screen) )) + return ..() + + if(!(loc == usr) || (loc && loc.loc == usr)) + return + playsound(loc, "rustle", 50, 1, -5) + if(!( M.restrained() ) && !( M.stat )) + switch(over_object.name) + if("r_hand") + if(!M.unEquip(src)) + return + M.put_in_r_hand(src) + if("l_hand") + if(!M.unEquip(src)) + return + M.put_in_l_hand(src) + add_fingerprint(usr) + return + + +/obj/item/weapon/storage/proc/return_inv() + var/list/L = list() + L += contents + + for(var/obj/item/weapon/storage/S in src) + L += S.return_inv() + return L + + +/obj/item/weapon/storage/proc/show_to(mob/user) + if(user.s_active != src) + for(var/obj/item/I in src) + if(I.on_found(user)) + return + if(user.s_active) + user.s_active.hide_from(user) + user.client.screen -= boxes + user.client.screen -= closer + user.client.screen -= contents + user.client.screen += boxes + user.client.screen += closer + user.client.screen += contents + user.s_active = src + + +/obj/item/weapon/storage/proc/hide_from(mob/user) + if(!user.client) + return + user.client.screen -= boxes + user.client.screen -= closer + user.client.screen -= contents + if(user.s_active == src) + user.s_active = null + + +/obj/item/weapon/storage/proc/close(mob/user) + hide_from(user) + user.s_active = null + + +/obj/item/weapon/storage/proc/close_all() //returns 1 if any mobs actually got a close(M) call + var/actually_closed = 0 + for(var/mob/M in range(1)) + if(M.s_active == src) + close(M) + actually_closed = 1 + return actually_closed + +//This proc draws out the inventory and places the items on it. tx and ty are the upper left tile and mx, my are the bottm right. +//The numbers are calculated from the bottom-left The bottom-left slot being 1,1. +/obj/item/weapon/storage/proc/orient_objs(tx, ty, mx, my) + var/cx = tx + var/cy = ty + boxes.screen_loc = "[tx]:,[ty] to [mx],[my]" + for(var/obj/O in contents) + O.screen_loc = "[cx],[cy]" + O.layer = 20 + cx++ + if(cx > mx) + cx = tx + cy-- + closer.screen_loc = "[mx+1],[my]" + + +//This proc draws out the inventory and places the items on it. It uses the standard position. +/obj/item/weapon/storage/proc/standard_orient_objs(rows, cols, list/obj/item/display_contents) + var/cx = 4 + var/cy = 2+rows + boxes.screen_loc = "4:16,2:16 to [4+cols]:16,[2+rows]:16" + + if(display_contents_with_number) + for(var/datum/numbered_display/ND in display_contents) + ND.sample_object.screen_loc = "[cx]:16,[cy]:16" + ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" + ND.sample_object.layer = 20 + cx++ + if(cx > (4+cols)) + cx = 4 + cy-- + else + for(var/obj/O in contents) + O.screen_loc = "[cx]:16,[cy]:16" + O.maptext = "" + O.layer = 20 + cx++ + if(cx > (4+cols)) + cx = 4 + cy-- + closer.screen_loc = "[4+cols+1]:16,2:16" + + +/datum/numbered_display + var/obj/item/sample_object + var/number + + New(obj/item/sample) + if(!istype(sample)) + del(src) + sample_object = sample + number = 1 + + +//This proc determins the size of the inventory to be displayed. Please touch it only if you know what you're doing. +/obj/item/weapon/storage/proc/orient2hud(mob/user) + var/adjusted_contents = contents.len + + //Numbered contents display + var/list/datum/numbered_display/numbered_contents + if(display_contents_with_number) + numbered_contents = list() + adjusted_contents = 0 + for(var/obj/item/I in contents) + var/found = 0 + for(var/datum/numbered_display/ND in numbered_contents) + if(ND.sample_object.type == I.type) + ND.number++ + found = 1 + break + if(!found) + adjusted_contents++ + numbered_contents.Add( new/datum/numbered_display(I) ) + + //var/mob/living/carbon/human/H = user + var/row_num = 0 + var/col_count = min(7,storage_slots) -1 + if(adjusted_contents > 7) + row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. + standard_orient_objs(row_num, col_count, numbered_contents) + + +//This proc return 1 if the item can be picked up and 0 if it can't. +//Set the stop_messages to stop it from printing messages +/obj/item/weapon/storage/proc/can_be_inserted(obj/item/W, stop_messages = 0) + if(!istype(W) || (W.flags & ABSTRACT)) return //Not an item + + if(loc == W) + return 0 //Means the item is already in the storage item + if(contents.len >= storage_slots) + if(!stop_messages) + usr << "[src] is full, make some space." + return 0 //Storage item is full + + if(can_hold.len) + var/ok = 0 + for(var/A in can_hold) + if(istype(W, text2path(A) )) + ok = 1 + break + if(!ok) + if(!stop_messages) + usr << "[src] cannot hold [W]." + return 0 + + for(var/A in cant_hold) //Check for specific items which this container can't hold. + if(istype(W, text2path(A) )) + if(!stop_messages) + usr << "[src] cannot hold [W]." + return 0 + + if(W.w_class > max_w_class) + if(!stop_messages) + usr << "[W] is too big for this [src]." + return 0 + + var/sum_w_class = W.w_class + for(var/obj/item/I in contents) + sum_w_class += I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it. + + if(sum_w_class > max_combined_w_class) + if(!stop_messages) + usr << "[src] is full, make some space." + return 0 + + if(W.w_class >= w_class && (istype(W, /obj/item/weapon/storage))) + if(!istype(src, /obj/item/weapon/storage/backpack/holding)) //bohs should be able to hold backpacks again. The override for putting a boh in a boh is in backpack.dm. + if(!stop_messages) + usr << "[src] cannot hold [W] as it's a storage item of the same size." + return 0 //To prevent the stacking of same sized storage items. + + if(W.flags & NODROP) //SHOULD be handled in unEquip, but better safe than sorry. + usr << "\the [W] is stuck to your hand, you can't put it in \the [src]" + return 0 + + return 1 + + +//This proc handles items being inserted. It does not perform any checks of whether an item can or can't be inserted. That's done by can_be_inserted() +//The stop_warning parameter will stop the insertion message from being displayed. It is intended for cases where you are inserting multiple items at once, +//such as when picking up all the items on a tile with one click. +/obj/item/weapon/storage/proc/handle_item_insertion(obj/item/W, prevent_warning = 0) + if(!istype(W)) return 0 + if(usr) + if(!usr.unEquip(W)) + return 0 + W.loc = src + W.on_enter_storage(src) + if(usr) + if(usr.client && usr.s_active != src) + usr.client.screen -= W + + add_fingerprint(usr) + + if(!prevent_warning && !istype(W, /obj/item/weapon/gun/energy/crossbow)) + for(var/mob/M in viewers(usr, null)) + if(M == usr) + usr << "You put [W] into [src]." + else if(in_range(M, usr)) //If someone is standing close enough, they can tell what it is... + M.show_message("[usr] puts [W] into [src].") + else if(W && W.w_class >= 3.0) //Otherwise they can only see large or normal items from a distance... + M.show_message("[usr] puts [W] into [src].") + + orient2hud(usr) + if(usr.s_active) + usr.s_active.show_to(usr) + update_icon() + return 1 + + +//Call this proc to handle the removal of an item from the storage item. The item will be moved to the atom sent as new_target +/obj/item/weapon/storage/proc/remove_from_storage(obj/item/W, atom/new_location) + if(!istype(W)) return 0 + + if(istype(src, /obj/item/weapon/storage/fancy)) + var/obj/item/weapon/storage/fancy/F = src + F.update_icon(1) + + for(var/mob/M in range(1, loc)) + if(M.s_active == src) + if(M.client) + M.client.screen -= W + + if(new_location) + if(ismob(loc)) + W.dropped(usr) + if(ismob(new_location)) + W.layer = 20 + else + W.layer = initial(W.layer) + W.loc = new_location + else + W.loc = get_turf(src) + + if(usr) + orient2hud(usr) + if(usr.s_active) + usr.s_active.show_to(usr) + if(W.maptext) + W.maptext = "" + W.on_exit_storage(src) + update_icon() + return 1 + + +//This proc is called when you want to place an item into the storage item. +/obj/item/weapon/storage/attackby(obj/item/W, mob/user) + ..() + + if(isrobot(user)) + user << "You're a robot. No." + return 0 //Robots can't interact with storage items. + + if(!can_be_inserted(W)) + return 0 + + if(istype(W, /obj/item/weapon/tray)) //THIS ISN'T HOW OOP WORKS + var/obj/item/weapon/tray/T = W + if(T.calc_carry() > 0) + user << "[T] won't fit in [src]." + return 1 + + handle_item_insertion(W) + return 1 + + +/obj/item/weapon/storage/dropped(mob/user) + return + +/obj/item/weapon/storage/attack_hand(mob/user) + playsound(loc, "rustle", 50, 1, -5) + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.l_store == src && !H.get_active_hand()) //Prevents opening if it's in a pocket. + H.put_in_hands(src) + H.l_store = null + return + if(H.r_store == src && !H.get_active_hand()) + H.put_in_hands(src) + H.r_store = null + return + + orient2hud(user) + if(loc == user) + if(user.s_active) + user.s_active.close(user) + show_to(user) + else + ..() + for(var/mob/M in range(1)) + if(M.s_active == src) + close(M) + add_fingerprint(user) + +/obj/item/weapon/storage/attack_paw(mob/user) + return attack_hand(user) + +/obj/item/weapon/storage/verb/toggle_gathering_mode() + set name = "Switch Gathering Method" + set category = "Object" + + collection_mode = (collection_mode+1)%3 + switch (collection_mode) + if(2) + usr << "[src] now picks up all items of a single type at once." + if(1) + usr << "[src] now picks up all items in a tile at once." + if(0) + usr << "[src] now picks up one item at a time." + + +/obj/item/weapon/storage/verb/quick_empty() + set name = "Empty Contents" + set category = "Object" + + if((!ishuman(usr) && (loc != usr)) || usr.stat || usr.restrained()) + return + + var/turf/T = get_turf(src) + hide_from(usr) + for(var/obj/item/I in contents) + remove_from_storage(I, T) + + +/obj/item/weapon/storage/New() + + if(allow_quick_empty) + verbs += /obj/item/weapon/storage/verb/quick_empty + else + verbs -= /obj/item/weapon/storage/verb/quick_empty + + if(allow_quick_gather) + verbs += /obj/item/weapon/storage/verb/toggle_gathering_mode + else + verbs -= /obj/item/weapon/storage/verb/toggle_gathering_mode + + boxes = new /obj/screen/storage() + boxes.name = "storage" + boxes.master = src + boxes.icon_state = "block" + boxes.screen_loc = "7,7 to 10,8" + boxes.layer = 19 + closer = new /obj/screen/close() + closer.master = src + closer.icon_state = "x" + closer.layer = 20 + orient2hud() + + +/obj/item/weapon/storage/Destroy() + close_all() + ..() + + +/obj/item/weapon/storage/emp_act(severity) + if(!istype(loc, /mob/living)) + for(var/obj/O in contents) + O.emp_act(severity) + ..() + + +/obj/item/weapon/storage/attack_self(mob/user) + //Clicking on itself will empty it, if it has the verb to do that. + if(user.get_active_hand() == src) + if(verbs.Find(/obj/item/weapon/storage/verb/quick_empty)) + quick_empty() diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index 7c3e70420fd..28f202b226e 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -1,89 +1,89 @@ -/obj/item/weapon/storage/wallet - name = "wallet" - desc = "It can hold a few small and personal things." - storage_slots = 4 - icon_state = "wallet" - w_class = 2 - can_hold = list( - "/obj/item/weapon/spacecash", - "/obj/item/weapon/card", - "/obj/item/clothing/mask/cigarette", - "/obj/item/device/flashlight/pen", - "/obj/item/seeds", - "/obj/item/stack/medical", - "/obj/item/toy/crayon", - "/obj/item/weapon/coin", - "/obj/item/weapon/dice", - "/obj/item/weapon/disk", - "/obj/item/weapon/implanter", - "/obj/item/weapon/lighter", - "/obj/item/weapon/match", - "/obj/item/weapon/paper", - "/obj/item/weapon/pen", - "/obj/item/weapon/photo", - "/obj/item/weapon/reagent_containers/dropper", - "/obj/item/weapon/screwdriver", - "/obj/item/weapon/stamp") - slot_flags = SLOT_ID - - var/obj/item/weapon/card/id/front_id = null - - -/obj/item/weapon/storage/wallet/remove_from_storage(obj/item/W as obj, atom/new_location) - . = ..(W, new_location) - if(.) - if(W == front_id) - front_id = null - update_icon() - -/obj/item/weapon/storage/wallet/handle_item_insertion(obj/item/W as obj, prevent_warning = 0) - . = ..(W, prevent_warning) - if(.) - if(!front_id && istype(W, /obj/item/weapon/card/id)) - front_id = W - update_icon() - -/obj/item/weapon/storage/wallet/update_icon() - - if(front_id) - switch(front_id.icon_state) - if("id") - icon_state = "walletid" - return - if("silver") - icon_state = "walletid_silver" - return - if("gold") - icon_state = "walletid_gold" - return - if("centcom") - icon_state = "walletid_centcom" - return - icon_state = "wallet" - - -/obj/item/weapon/storage/wallet/GetID() - return front_id - -/obj/item/weapon/storage/wallet/GetAccess() - var/obj/item/I = GetID() - if(I) - return I.GetAccess() - else - return ..() - -/obj/item/weapon/storage/wallet/random/New() - ..() - var/item1_type = pick( /obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c100,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c20,/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50, /obj/item/weapon/spacecash/c500) - var/item2_type - if(prob(50)) - item2_type = pick( /obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c100,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c20,/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50, /obj/item/weapon/spacecash/c500) - var/item3_type = pick( /obj/item/weapon/coin/silver, /obj/item/weapon/coin/silver, /obj/item/weapon/coin/gold, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron ) - - spawn(2) - if(item1_type) - new item1_type(src) - if(item2_type) - new item2_type(src) - if(item3_type) +/obj/item/weapon/storage/wallet + name = "wallet" + desc = "It can hold a few small and personal things." + storage_slots = 4 + icon_state = "wallet" + w_class = 2 + can_hold = list( + "/obj/item/weapon/spacecash", + "/obj/item/weapon/card", + "/obj/item/clothing/mask/cigarette", + "/obj/item/device/flashlight/pen", + "/obj/item/seeds", + "/obj/item/stack/medical", + "/obj/item/toy/crayon", + "/obj/item/weapon/coin", + "/obj/item/weapon/dice", + "/obj/item/weapon/disk", + "/obj/item/weapon/implanter", + "/obj/item/weapon/lighter", + "/obj/item/weapon/match", + "/obj/item/weapon/paper", + "/obj/item/weapon/pen", + "/obj/item/weapon/photo", + "/obj/item/weapon/reagent_containers/dropper", + "/obj/item/weapon/screwdriver", + "/obj/item/weapon/stamp") + slot_flags = SLOT_ID + + var/obj/item/weapon/card/id/front_id = null + + +/obj/item/weapon/storage/wallet/remove_from_storage(obj/item/W as obj, atom/new_location) + . = ..(W, new_location) + if(.) + if(W == front_id) + front_id = null + update_icon() + +/obj/item/weapon/storage/wallet/handle_item_insertion(obj/item/W as obj, prevent_warning = 0) + . = ..(W, prevent_warning) + if(.) + if(!front_id && istype(W, /obj/item/weapon/card/id)) + front_id = W + update_icon() + +/obj/item/weapon/storage/wallet/update_icon() + + if(front_id) + switch(front_id.icon_state) + if("id") + icon_state = "walletid" + return + if("silver") + icon_state = "walletid_silver" + return + if("gold") + icon_state = "walletid_gold" + return + if("centcom") + icon_state = "walletid_centcom" + return + icon_state = "wallet" + + +/obj/item/weapon/storage/wallet/GetID() + return front_id + +/obj/item/weapon/storage/wallet/GetAccess() + var/obj/item/I = GetID() + if(I) + return I.GetAccess() + else + return ..() + +/obj/item/weapon/storage/wallet/random/New() + ..() + var/item1_type = pick( /obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c100,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c20,/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50, /obj/item/weapon/spacecash/c500) + var/item2_type + if(prob(50)) + item2_type = pick( /obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c100,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c20,/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50, /obj/item/weapon/spacecash/c500) + var/item3_type = pick( /obj/item/weapon/coin/silver, /obj/item/weapon/coin/silver, /obj/item/weapon/coin/gold, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron ) + + spawn(2) + if(item1_type) + new item1_type(src) + if(item2_type) + new item2_type(src) + if(item3_type) new item3_type(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm index e12c641f46d..0dd98f20695 100644 --- a/code/game/objects/items/weapons/table_rack_parts.dm +++ b/code/game/objects/items/weapons/table_rack_parts.dm @@ -16,20 +16,20 @@ if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/metal( user.loc ) //SN src = null - del(src) + qdel(src) if (istype(W, /obj/item/stack/rods)) if (W:amount >= 4) new /obj/item/weapon/table_parts/reinforced( user.loc ) user << "\blue You reinforce the [name]." W:use(4) - del(src) + qdel(src) else if (W:amount < 4) user << "\red You need at least four rods to do this." /obj/item/weapon/table_parts/attack_self(mob/user as mob) new /obj/structure/table( user.loc ) user.drop_item() - del(src) + qdel(src) return @@ -40,12 +40,12 @@ if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/metal( user.loc ) new /obj/item/stack/rods( user.loc ) - del(src) + qdel(src) /obj/item/weapon/table_parts/reinforced/attack_self(mob/user as mob) new /obj/structure/table/reinforced( user.loc ) user.drop_item() - del(src) + qdel(src) return /* @@ -54,22 +54,22 @@ /obj/item/weapon/table_parts/wood/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/wood( user.loc ) - del(src) + qdel(src) if (istype(W, /obj/item/stack/tile/grass)) var/obj/item/stack/tile/grass/Grass = W if(Grass.amount > 1) Grass.amount -= 1 else - del(Grass) + qdel(Grass) new /obj/item/weapon/table_parts/wood/poker( src.loc ) visible_message("[user] adds grass to the wooden table parts") - del(src) + qdel(src) /obj/item/weapon/table_parts/wood/attack_self(mob/user as mob) new /obj/structure/table/woodentable( user.loc ) user.drop_item() - del(src) + qdel(src) return @@ -81,12 +81,12 @@ if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/wood( user.loc ) new /obj/item/stack/tile/grass( user.loc ) - del(src) + qdel(src) /obj/item/weapon/table_parts/wood/poker/attack_self(mob/user as mob) new /obj/structure/table/woodentable/poker( user.loc ) user.drop_item() - del(src) + qdel(src) return @@ -97,7 +97,7 @@ ..() if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/metal( user.loc ) - del(src) + qdel(src) return return @@ -105,5 +105,5 @@ var/obj/structure/rack/R = new /obj/structure/rack( user.loc ) R.add_fingerprint(user) user.drop_item() - del(src) + qdel(src) return \ No newline at end of file diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 33b3ce06b0a..617e1dd7444 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -53,7 +53,7 @@ if(allgases >= 0.005) return 1 - del(G) + qdel(G) return ui_action_click() diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index a7a2c812ade..74393eafbe3 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -28,7 +28,7 @@ return -/obj/item/weapon/tank/Del() +/obj/item/weapon/tank/Destroy() if(air_contents) del(air_contents) @@ -69,12 +69,12 @@ if(prob(50)) var/turf/location = src.loc if (!( istype(location, /turf) )) - del(src) + qdel(src) if(src.air_contents) location.assume_air(air_contents) - del(src) + qdel(src) /obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() @@ -211,7 +211,7 @@ //world << "\blue Exploding Pressure: [pressure] kPa, intensity: [range]" explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5)) - del(src) + qdel(src) else if(pressure > TANK_RUPTURE_PRESSURE) //world << "\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]" @@ -221,7 +221,7 @@ return T.assume_air(air_contents) playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) - del(src) + qdel(src) else integrity-- diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 9c3d335464e..2544876e0ba 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -1,177 +1,177 @@ -//Hydroponics tank and base code -/obj/item/weapon/watertank - name = "backpack water tank" - desc = "A S.U.N.S.H.I.N.E. brand watertank backpack with nozzle to water plants." - icon = 'icons/obj/hydroponics.dmi' - icon_state = "waterbackpack" - item_state = "waterbackpack" - w_class = 4.0 - slot_flags = SLOT_BACK - slowdown = 1 - action_button_name = "Toggle Mister" - - var/obj/item/weapon/noz - var/on = 0 - var/volume = 500 - -/obj/item/weapon/watertank/New() - ..() - create_reagents(volume) - return - -/obj/item/weapon/watertank/examine() - set src in usr - ..() - for(var/datum/reagent/R in reagents.reagent_list) - usr << "[round(R.volume)] units of [R.name] left." - return - -/obj/item/weapon/watertank/ui_action_click() - if (usr.get_item_by_slot(slot_back) == src) - toggle_mister() - else - usr << "The watertank needs to be on your back to use!" - return - -/obj/item/weapon/watertank/verb/toggle_mister() - set name = "Toggle Mister" - set category = "Object" - on = !on - - var/mob/living/carbon/human/user = usr - if(on) - //Detach the nozzle into the user's hands - make_noz() - var/list/L = list("left hand" = slot_l_hand,"right hand" = slot_r_hand) - if(!user.equip_in_one_of_slots(noz, L)) - on = 0 - user << "You need a free hand to hold the mister!" - else - //Remove from their hands and put back "into" the tank - remove_noz(user) - return - -/obj/item/weapon/watertank/proc/make_noz() - noz = new /obj/item/weapon/reagent_containers/spray/mister(src) - return - -/obj/item/weapon/watertank/equipped(mob/user, slot) - if (slot != slot_back) - remove_noz(user) - -/obj/item/weapon/watertank/proc/remove_noz(mob/user) - if (noz != null) - var/mob/living/carbon/human/M = user - M.unEquip(noz) - return - -/obj/item/weapon/watertank/Del() - if (noz) - var/M = get(noz, /mob) - remove_noz(M) - ..() - return - -// This mister item is intended as an extension of the watertank and always attached to it. -// Therefore, it's designed to be "locked" to the player's hands or extended back onto -// the watertank backpack. Allowing it to be placed elsewhere or created without a parent -// watertank object will likely lead to weird behaviour or runtimes. -/obj/item/weapon/reagent_containers/spray/mister - name = "water mister" - desc = "A mister nozzle attached to a water tank." - icon = 'icons/obj/hydroponics.dmi' - icon_state = "mister" - item_state = "mister" - w_class = 4.0 - amount_per_transfer_from_this = 50 - possible_transfer_amounts = list(25,50,100) - volume = 500 - - var/obj/item/weapon/watertank/tank - -/obj/item/weapon/reagent_containers/spray/mister/New(parent_tank) - ..() - if(check_tank_exists(parent_tank, usr, src)) - tank = parent_tank - reagents = tank.reagents //This mister is really just a proxy for the tank's reagents - return - -/obj/item/weapon/reagent_containers/spray/mister/dropped(mob/user as mob) - user << "The mister snaps back onto the watertank!" - tank.on = 0 - Del() - -/obj/item/weapon/reagent_containers/spray/mister/attack_self() - return - -/proc/check_tank_exists(parent_tank, var/mob/living/carbon/human/M, var/obj/O) - if (!parent_tank || !istype(parent_tank, /obj/item/weapon/watertank) || !M || !istype(M)) //To avoid weird issues from admin spawns - M.unEquip(O) - O.Del() - return 0 - else - return 1 - -//Janitor tank -/obj/item/weapon/watertank/janitor - name = "backpack water tank" - desc = "A janitorial watertank backpack with nozzle to clean dirt and graffiti." - icon_state = "waterbackpackjani" - item_state = "waterbackpackjani" - -/obj/item/weapon/watertank/janitor/New() - ..() - reagents.add_reagent("cleaner", 250) - - -/obj/item/weapon/reagent_containers/spray/mister/janitor - name = "janitor spray nozzle" - desc = "A janitorial spray nozzle attached to a watertank, designed to clean up large messes." - icon = 'icons/obj/hydroponics.dmi' - icon_state = "misterjani" - item_state = "misterjani" - amount_per_transfer_from_this = 5 - possible_transfer_amounts = null - -/obj/item/weapon/watertank/janitor/make_noz() - noz = new /obj/item/weapon/reagent_containers/spray/mister/janitor(src) - return - -/obj/item/weapon/reagent_containers/spray/mister/janitor/attack_self(var/mob/user) - amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10) - user << "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray." - -//Atmos tank -/obj/item/weapon/watertank/atmos - name = "backpack water tank" - desc = "A backpack watertank with fire extinguisher nozzle, intended to fight fires. Shouldn't toxins have one of these?" - icon_state = "waterbackpackatmos" - item_state = "waterbackpackatmos" - volume = 100 - -/obj/item/weapon/watertank/atmos/make_noz() - noz = new /obj/item/weapon/extinguisher/mini/nozzle(src) - -/obj/item/weapon/extinguisher/mini/nozzle - name = "fire extinguisher nozzle" - desc = "A fire extinguisher nozzle attached to a water tank." - icon = 'icons/obj/hydroponics.dmi' - icon_state = "misteratmos" - item_state = "misteratmos" - safety = 0 - var/obj/item/weapon/watertank/tank - -/obj/item/weapon/extinguisher/mini/nozzle/New(parent_tank) - if(check_tank_exists(parent_tank, usr, src)) - tank = parent_tank - reagents = tank.reagents - max_water = tank.volume - return - -/obj/item/weapon/extinguisher/mini/nozzle/dropped(mob/user as mob) - user << "The nozzle snaps back onto the watertank!" - tank.on = 0 - Del() - -/obj/item/weapon/extinguisher/mini/nozzle/attack_self() +//Hydroponics tank and base code +/obj/item/weapon/watertank + name = "backpack water tank" + desc = "A S.U.N.S.H.I.N.E. brand watertank backpack with nozzle to water plants." + icon = 'icons/obj/hydroponics.dmi' + icon_state = "waterbackpack" + item_state = "waterbackpack" + w_class = 4.0 + slot_flags = SLOT_BACK + slowdown = 1 + action_button_name = "Toggle Mister" + + var/obj/item/weapon/noz + var/on = 0 + var/volume = 500 + +/obj/item/weapon/watertank/New() + ..() + create_reagents(volume) + return + +/obj/item/weapon/watertank/examine() + set src in usr + ..() + for(var/datum/reagent/R in reagents.reagent_list) + usr << "[round(R.volume)] units of [R.name] left." + return + +/obj/item/weapon/watertank/ui_action_click() + if (usr.get_item_by_slot(slot_back) == src) + toggle_mister() + else + usr << "The watertank needs to be on your back to use!" + return + +/obj/item/weapon/watertank/verb/toggle_mister() + set name = "Toggle Mister" + set category = "Object" + on = !on + + var/mob/living/carbon/human/user = usr + if(on) + //Detach the nozzle into the user's hands + make_noz() + var/list/L = list("left hand" = slot_l_hand,"right hand" = slot_r_hand) + if(!user.equip_in_one_of_slots(noz, L)) + on = 0 + user << "You need a free hand to hold the mister!" + else + //Remove from their hands and put back "into" the tank + remove_noz(user) + return + +/obj/item/weapon/watertank/proc/make_noz() + noz = new /obj/item/weapon/reagent_containers/spray/mister(src) + return + +/obj/item/weapon/watertank/equipped(mob/user, slot) + if (slot != slot_back) + remove_noz(user) + +/obj/item/weapon/watertank/proc/remove_noz(mob/user) + if (noz != null) + var/mob/living/carbon/human/M = user + M.unEquip(noz) + return + +/obj/item/weapon/watertank/Destroy() + if (noz) + var/M = get(noz, /mob) + remove_noz(M) + ..() + return + +// This mister item is intended as an extension of the watertank and always attached to it. +// Therefore, it's designed to be "locked" to the player's hands or extended back onto +// the watertank backpack. Allowing it to be placed elsewhere or created without a parent +// watertank object will likely lead to weird behaviour or runtimes. +/obj/item/weapon/reagent_containers/spray/mister + name = "water mister" + desc = "A mister nozzle attached to a water tank." + icon = 'icons/obj/hydroponics.dmi' + icon_state = "mister" + item_state = "mister" + w_class = 4.0 + amount_per_transfer_from_this = 50 + possible_transfer_amounts = list(25,50,100) + volume = 500 + + var/obj/item/weapon/watertank/tank + +/obj/item/weapon/reagent_containers/spray/mister/New(parent_tank) + ..() + if(check_tank_exists(parent_tank, usr, src)) + tank = parent_tank + reagents = tank.reagents //This mister is really just a proxy for the tank's reagents + return + +/obj/item/weapon/reagent_containers/spray/mister/dropped(mob/user as mob) + user << "The mister snaps back onto the watertank!" + tank.on = 0 + qdel(src) + +/obj/item/weapon/reagent_containers/spray/mister/attack_self() + return + +/proc/check_tank_exists(parent_tank, var/mob/living/carbon/human/M, var/obj/O) + if (!parent_tank || !istype(parent_tank, /obj/item/weapon/watertank) || !M || !istype(M)) //To avoid weird issues from admin spawns + M.unEquip(O) + qdel(O) + return 0 + else + return 1 + +//Janitor tank +/obj/item/weapon/watertank/janitor + name = "backpack water tank" + desc = "A janitorial watertank backpack with nozzle to clean dirt and graffiti." + icon_state = "waterbackpackjani" + item_state = "waterbackpackjani" + +/obj/item/weapon/watertank/janitor/New() + ..() + reagents.add_reagent("cleaner", 250) + + +/obj/item/weapon/reagent_containers/spray/mister/janitor + name = "janitor spray nozzle" + desc = "A janitorial spray nozzle attached to a watertank, designed to clean up large messes." + icon = 'icons/obj/hydroponics.dmi' + icon_state = "misterjani" + item_state = "misterjani" + amount_per_transfer_from_this = 5 + possible_transfer_amounts = null + +/obj/item/weapon/watertank/janitor/make_noz() + noz = new /obj/item/weapon/reagent_containers/spray/mister/janitor(src) + return + +/obj/item/weapon/reagent_containers/spray/mister/janitor/attack_self(var/mob/user) + amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10) + user << "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray." + +//Atmos tank +/obj/item/weapon/watertank/atmos + name = "backpack water tank" + desc = "A backpack watertank with fire extinguisher nozzle, intended to fight fires. Shouldn't toxins have one of these?" + icon_state = "waterbackpackatmos" + item_state = "waterbackpackatmos" + volume = 100 + +/obj/item/weapon/watertank/atmos/make_noz() + noz = new /obj/item/weapon/extinguisher/mini/nozzle(src) + +/obj/item/weapon/extinguisher/mini/nozzle + name = "fire extinguisher nozzle" + desc = "A fire extinguisher nozzle attached to a water tank." + icon = 'icons/obj/hydroponics.dmi' + icon_state = "misteratmos" + item_state = "misteratmos" + safety = 0 + var/obj/item/weapon/watertank/tank + +/obj/item/weapon/extinguisher/mini/nozzle/New(parent_tank) + if(check_tank_exists(parent_tank, usr, src)) + tank = parent_tank + reagents = tank.reagents + max_water = tank.volume + return + +/obj/item/weapon/extinguisher/mini/nozzle/dropped(mob/user as mob) + user << "The nozzle snaps back onto the watertank!" + tank.on = 0 + qdel(src) + +/obj/item/weapon/extinguisher/mini/nozzle/attack_self() return \ No newline at end of file diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index c28baff315c..07c08f3f4f2 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -107,6 +107,7 @@ m_amt = 80 origin_tech = "materials=1;engineering=1" attack_verb = list("pinched", "nipped") + hitsound = 'sound/items/Wirecutter.ogg' /obj/item/weapon/wirecutters/New() if(prob(50)) @@ -223,7 +224,7 @@ user << "That was stupid of you." explosion(O.loc, -1, 0, 2, flame_range = 2) if(O) - del(O) + qdel(O) return if(welding) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index de707e9ebdb..e0c2b78c927 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -102,10 +102,10 @@ flags = ABSTRACT /obj/item/weapon/twohanded/offhand/unwield() - del(src) + qdel(src) /obj/item/weapon/twohanded/offhand/wield() - del(src) + qdel(src) /obj/item/weapon/twohanded/offhand/IsShield()//if the actual twohanded weapon is a shield, we count as a shield too! var/mob/user = loc @@ -174,7 +174,7 @@ obj/item/weapon/twohanded/ if (W.dir == SOUTHWEST) new /obj/item/weapon/shard( W.loc ) if(W.reinf) new /obj/item/stack/rods( W.loc) - del(A) + qdel(A) /* diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm index 4e64b78611c..b78713e389f 100644 --- a/code/game/objects/items/weapons/vending_items.dm +++ b/code/game/objects/items/weapons/vending_items.dm @@ -1,60 +1,60 @@ -/obj/item/weapon/vending_refill - name = "resupply canister" - var/machine_name = "Generic" - - icon = 'icons/obj/vending_restock.dmi' - icon_state = "refill_snack" - item_state = "restock_unit" - flags = CONDUCT - force = 7.0 - throwforce = 10.0 - throw_speed = 1 - throw_range = 7 - w_class = 4.0 - - var/charges = 0 //how many restocking "charges" the refill has - -/obj/item/weapon/vending_refill/New(amt = -1) - ..() - name = "\improper [machine_name] restocking unit" - if(isnum(amt) && amt > -1) - charges = amt - -/obj/item/weapon/vending_refill/examine() - set src in usr - ..() - if(charges) - usr << "It can restock [charges] item(s)." - else - usr << "It's empty!" - -//NOTE I decided to go for about 1/3 of a machine's capacity - -/obj/item/weapon/vending_refill/boozeomat - machine_name = "Booze-O-Mat" - icon_state = "refill_booze" - charges = 46//of 138 - -/obj/item/weapon/vending_refill/coffee - machine_name = "hot drinks" - icon_state = "refill_joe" - charges = 28//of 85 - -/obj/item/weapon/vending_refill/snack - machine_name = "Getmore Chocolate Corp" - charges = 16//of 48 - -/obj/item/weapon/vending_refill/cola - machine_name = "Robust Softdrinks" - icon_state = "refill_cola" - charges = 21//of 65 - -/obj/item/weapon/vending_refill/cigarette - machine_name = "cigarette" - icon_state = "refill_smoke" - charges = 9// of 29 - -/obj/item/weapon/vending_refill/autodrobe - machine_name = "AutoDrobe" - icon_state = "refill_costume" - charges = 19// of 58 +/obj/item/weapon/vending_refill + name = "resupply canister" + var/machine_name = "Generic" + + icon = 'icons/obj/vending_restock.dmi' + icon_state = "refill_snack" + item_state = "restock_unit" + flags = CONDUCT + force = 7.0 + throwforce = 10.0 + throw_speed = 1 + throw_range = 7 + w_class = 4.0 + + var/charges = 0 //how many restocking "charges" the refill has + +/obj/item/weapon/vending_refill/New(amt = -1) + ..() + name = "\improper [machine_name] restocking unit" + if(isnum(amt) && amt > -1) + charges = amt + +/obj/item/weapon/vending_refill/examine() + set src in usr + ..() + if(charges) + usr << "It can restock [charges] item(s)." + else + usr << "It's empty!" + +//NOTE I decided to go for about 1/3 of a machine's capacity + +/obj/item/weapon/vending_refill/boozeomat + machine_name = "Booze-O-Mat" + icon_state = "refill_booze" + charges = 46//of 138 + +/obj/item/weapon/vending_refill/coffee + machine_name = "hot drinks" + icon_state = "refill_joe" + charges = 28//of 85 + +/obj/item/weapon/vending_refill/snack + machine_name = "Getmore Chocolate Corp" + charges = 16//of 48 + +/obj/item/weapon/vending_refill/cola + machine_name = "Robust Softdrinks" + icon_state = "refill_cola" + charges = 21//of 65 + +/obj/item/weapon/vending_refill/cigarette + machine_name = "cigarette" + icon_state = "refill_smoke" + charges = 9// of 29 + +/obj/item/weapon/vending_refill/autodrobe + machine_name = "AutoDrobe" + icon_state = "refill_costume" + charges = 19// of 58 diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index cf578c56383..da07f221a55 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -114,8 +114,8 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob) user.put_in_hands(S) user << "You fasten the glass shard to the top of the rod with the cable." - del(I) - del(src) + qdel(I) + qdel(src) else if(istype(I, /obj/item/weapon/wirecutters)) var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod @@ -125,5 +125,5 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob) user.put_in_hands(P) user << "You fasten the wirecutters to the top of the rod with the cable, prongs outward." - del(I) - del(src) \ No newline at end of file + qdel(I) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index a0792eba0de..dac4c8ba93b 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -18,6 +18,11 @@ processing_objects.Remove(src) return 0 +/obj/Destroy() + if(!istype(src, /obj/machinery)) + processing_objects.Remove(src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists + ..() + /obj/assume_air(datum/gas_mixture/giver) if(loc) return loc.assume_air(giver) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 594c95b6c80..dc81ffab22d 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -3,22 +3,22 @@ obj/structure obj/structure/blob_act() if(prob(50)) - del(src) + qdel(src) obj/structure/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if(prob(50)) - del(src) + qdel(src) return if(3.0) return obj/structure/meteorhit(obj/O as obj) - del(src) + qdel(src) diff --git a/code/game/objects/structures/OpTable.dm b/code/game/objects/structures/OpTable.dm index d0284309419..e186ed03c5c 100644 --- a/code/game/objects/structures/OpTable.dm +++ b/code/game/objects/structures/OpTable.dm @@ -40,5 +40,5 @@ visible_message("[M] has been laid on [src] by [user].") patient = M check_patient() - del(W) + qdel(W) return \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/bins.dm b/code/game/objects/structures/crates_lockers/bins.dm index fbc9650ecb4..5f0e04a3325 100644 --- a/code/game/objects/structures/crates_lockers/bins.dm +++ b/code/game/objects/structures/crates_lockers/bins.dm @@ -1,95 +1,95 @@ -/obj/structure/closet/crate/bin - desc = "A trash bin, place your trash here for the janitor to collect." - name = "trash bin" - icon = 'icons/obj/storage.dmi' - icon_state = "largebins" - density = 1 - anchored = 1 - icon_opened = "largebinsopen" - icon_closed = "largebins" - sound_effect_open = 'sound/effects/bin_open.ogg' - sound_effect_close = 'sound/effects/bin_close.ogg' - var/animation = "animate_largebins" - var/redlight = "largebinr" - var/greenlight = "largebing" - var/orangelight = "largebino" - - -/obj/structure/closet/crate/bin/New() - ..() - update_icon() - -/obj/structure/closet/crate/bin/update_icon() - ..() - overlays.Cut() - if(contents.len == 0) - overlays += greenlight - else if(contents.len >= storage_capacity) - overlays += redlight - else - overlays += orangelight - -/obj/structure/closet/crate/bin/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/storage/bag/trash)) - var/obj/item/weapon/storage/bag/trash/T = W - user << "\blue You fill the bag." - for(var/obj/item/O in src) - if(T.can_be_inserted(O, 1)) - O.loc = T - T.update_icon() - do_animate() - else if(istype(W, /obj/item/weapon/wrench)) - anchored = !anchored - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - else if(istype(W, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = W - src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet - else - ..() - -/obj/structure/closet/crate/bin/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) - . = ..(O, user, 0, 0, 0) - if(.) - if(O != user) - user.visible_message("[user] tries to stuff [O] into the [src].", \ - "You try to stuff [O] into the [src].", \ - "You hear clanging.") - if (!do_after(user, 40)) - return - if(!..(O, user, 0, 0)) - return - user.visible_message("[user] stuffs [O] into the [src].", \ - "You stuff [O] into the [src].", \ - "You hear a loud metal bang.") - insert(O, 1, !opened) - if(opened) - close() - -/obj/structure/closet/crate/bin/open() - . = ..() - update_icon() - -/obj/structure/closet/crate/bin/close() - . = ..() - update_icon() - -/obj/structure/closet/crate/bin/proc/do_animate() - playsound(src.loc, sound_effect_open, 15, 1, -3) - flick(animation, src) - spawn(13) - playsound(src.loc, sound_effect_close, 15, 1, -3) - update_icon() - -/obj/structure/closet/crate/bin/insert(var/obj/item/I, var/include_mobs = 0, var/animate = 0) - . = ..(I, include_mobs) - if(animate && .) - do_animate() - -/obj/structure/closet/crate/bin/place(var/mob/user, var/obj/item/I) - if(contents.len >= storage_capacity) - return 1 - if(!opened) - user.drop_item() - insert(I, 0, 1) - return 1 +/obj/structure/closet/crate/bin + desc = "A trash bin, place your trash here for the janitor to collect." + name = "trash bin" + icon = 'icons/obj/storage.dmi' + icon_state = "largebins" + density = 1 + anchored = 1 + icon_opened = "largebinsopen" + icon_closed = "largebins" + sound_effect_open = 'sound/effects/bin_open.ogg' + sound_effect_close = 'sound/effects/bin_close.ogg' + var/animation = "animate_largebins" + var/redlight = "largebinr" + var/greenlight = "largebing" + var/orangelight = "largebino" + + +/obj/structure/closet/crate/bin/New() + ..() + update_icon() + +/obj/structure/closet/crate/bin/update_icon() + ..() + overlays.Cut() + if(contents.len == 0) + overlays += greenlight + else if(contents.len >= storage_capacity) + overlays += redlight + else + overlays += orangelight + +/obj/structure/closet/crate/bin/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/storage/bag/trash)) + var/obj/item/weapon/storage/bag/trash/T = W + user << "\blue You fill the bag." + for(var/obj/item/O in src) + if(T.can_be_inserted(O, 1)) + O.loc = T + T.update_icon() + do_animate() + else if(istype(W, /obj/item/weapon/wrench)) + anchored = !anchored + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + else if(istype(W, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = W + src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet + else + ..() + +/obj/structure/closet/crate/bin/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) + . = ..(O, user, 0, 0, 0) + if(.) + if(O != user) + user.visible_message("[user] tries to stuff [O] into the [src].", \ + "You try to stuff [O] into the [src].", \ + "You hear clanging.") + if (!do_after(user, 40)) + return + if(!..(O, user, 0, 0)) + return + user.visible_message("[user] stuffs [O] into the [src].", \ + "You stuff [O] into the [src].", \ + "You hear a loud metal bang.") + insert(O, 1, !opened) + if(opened) + close() + +/obj/structure/closet/crate/bin/open() + . = ..() + update_icon() + +/obj/structure/closet/crate/bin/close() + . = ..() + update_icon() + +/obj/structure/closet/crate/bin/proc/do_animate() + playsound(src.loc, sound_effect_open, 15, 1, -3) + flick(animation, src) + spawn(13) + playsound(src.loc, sound_effect_close, 15, 1, -3) + update_icon() + +/obj/structure/closet/crate/bin/insert(var/obj/item/I, var/include_mobs = 0, var/animate = 0) + . = ..(I, include_mobs) + if(animate && .) + do_animate() + +/obj/structure/closet/crate/bin/place(var/mob/user, var/obj/item/I) + if(contents.len >= storage_capacity) + return 1 + if(!opened) + user.drop_item() + insert(I, 0, 1) + return 1 return 0 \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index de469014078..ca7e061a4e8 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -125,19 +125,19 @@ for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion A.loc = src.loc A.ex_act(severity++) - del(src) + qdel(src) if(2) if(prob(50)) for (var/atom/movable/A as mob|obj in src) A.loc = src.loc A.ex_act(severity++) - del(src) + qdel(src) if(3) if(prob(5)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc A.ex_act(severity++) - del(src) + qdel(src) /obj/structure/closet/bullet_act(var/obj/item/projectile/Proj) ..() @@ -146,7 +146,7 @@ if(health <= 0) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc - del(src) + qdel(src) return /obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob) @@ -154,21 +154,21 @@ visible_message("\red [user] destroys the [src]. ") for(var/atom/movable/A as mob|obj in src) A.loc = src.loc - del(src) + qdel(src) // this should probably use dump_contents() /obj/structure/closet/blob_act() if(prob(75)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc - del(src) + qdel(src) /obj/structure/closet/meteorhit(obj/O as obj) if(O.icon_state == "flaming") for(var/mob/M in src) M.meteorhit(O) src.dump_contents() - del(src) + qdel(src) /obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob) if(src.opened) @@ -191,7 +191,7 @@ new /obj/item/stack/sheet/metal(src.loc) for(var/mob/M in viewers(src)) M.show_message("\The [src] has been cut apart by [user] with \the [WT].", 3, "You hear welding.", 2) - del(src) + qdel(src) return if(isrobot(user)) 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 92c9a4ee7ea..3a07a5d2bba 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -16,6 +16,7 @@ else new /obj/item/weapon/storage/backpack/satchel_cap(src) new /obj/item/clothing/suit/captunic(src) + new /obj/item/clothing/under/captainformal(src) new /obj/item/clothing/head/helmet/cap(src) new /obj/item/clothing/under/rank/captain(src) new /obj/item/clothing/suit/armor/vest/capcarapace(src) @@ -25,8 +26,6 @@ new /obj/item/device/radio/headset/heads/captain(src) new /obj/item/clothing/gloves/captain(src) new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/clothing/under/captainformal(src) - new /obj/item/clothing/head/helmet/HoS/dermal(src) return @@ -73,19 +72,12 @@ New() ..() sleep(2) - if(prob(50)) - new /obj/item/weapon/storage/backpack/security(src) - else - new /obj/item/weapon/storage/backpack/satchel_sec(src) new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/under/rank/head_of_security/jensen(src) new /obj/item/clothing/suit/armor/hos/jensen(src) - new /obj/item/clothing/head/helmet/HoS/dermal(src) new /obj/item/weapon/cartridge/hos(src) new /obj/item/device/radio/headset/heads/hos(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/weapon/shield/riot(src) - new /obj/item/clothing/mask/gas/sechailer(src) new /obj/item/clothing/mask/gas/sechailer/hos(src) new /obj/item/weapon/storage/lockbox/loyalty(src) new /obj/item/weapon/storage/box/flashbangs(src) @@ -93,12 +85,9 @@ new /obj/item/weapon/melee/baton/loaded(src) new /obj/item/weapon/gun/energy/gun(src) new /obj/item/weapon/storage/belt/security(src) - new /obj/item/clothing/under/hosformalfem(src) - new /obj/item/clothing/under/hosformalmale(src) return - /obj/structure/closet/secure_closet/warden name = "warden's locker" req_access = list(access_armory) @@ -113,10 +102,6 @@ New() ..() sleep(2) - if(prob(50)) - new /obj/item/weapon/storage/backpack/security(src) - else - new /obj/item/weapon/storage/backpack/satchel_sec(src) new /obj/item/clothing/suit/armor/vest(src) new /obj/item/clothing/under/rank/warden(src) new /obj/item/clothing/suit/armor/vest/warden(src) @@ -147,10 +132,6 @@ New() ..() sleep(2) - if(prob(50)) - new /obj/item/weapon/storage/backpack/security(src) - else - new /obj/item/weapon/storage/backpack/satchel_sec(src) new /obj/item/clothing/suit/armor/vest(src) new /obj/item/clothing/head/helmet(src) new /obj/item/device/radio/headset/headset_sec(src) @@ -198,7 +179,7 @@ /obj/structure/closet/secure_closet/security/med New() - new /obj/item/clothing/tie/armband/medgreen(src) + new /obj/item/clothing/tie/armband/medblue(src) new /obj/item/device/encryptionkey/headset_med(src) ..() return diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index fc5ba425f09..31aff82fff5 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -41,7 +41,7 @@ desc = "If it takes forever, I will wait for you..." if(health == 0) //meaning if the statue didn't find a valid target - del(src) + qdel(src) return processing_objects.Add(src) @@ -57,10 +57,21 @@ if (timer <= 0) dump_contents() processing_objects.Remove(src) - del(src) + qdel(src) /obj/structure/closet/statue/dump_contents() + if(istype(src.loc, /mob/living/simple_animal/hostile/statue)) + var/mob/living/simple_animal/hostile/statue/S = src.loc + src.loc = S.loc + if(S.mind) + for(var/mob/M in contents) + S.mind.transfer_to(M) + M << "As the animating magic wears off you feel yourself coming back to your senses. You are yourself again!" + break + qdel(S) + + for(var/obj/O in src) O.loc = src.loc @@ -146,7 +157,7 @@ user.dust() dump_contents() visible_message("\red [src] shatters!. ") - del(src) + qdel(src) /obj/structure/closet/statue/container_resist() return diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index cb64e20cde8..4e0462c63f3 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -46,12 +46,12 @@ // teehee if ("delete") - del(src) + qdel(src) //If you want to re-add fire, just add "fire" = 15 to the pick list. /*if ("fire") new /obj/structure/closet/firecloset(src.loc) - del(src)*/ + qdel(src)*/ /obj/structure/closet/emcloset/legacy/New() new /obj/item/weapon/tank/oxygen(src) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index b355ad88802..f95afb54509 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -20,6 +20,10 @@ icon_closed = "red" /obj/structure/closet/wardrobe/red/New() + new /obj/item/weapon/storage/backpack/security(src) + new /obj/item/weapon/storage/backpack/security(src) + new /obj/item/weapon/storage/backpack/satchel_sec(src) + new /obj/item/weapon/storage/backpack/satchel_sec(src) new /obj/item/clothing/under/rank/security(src) new /obj/item/clothing/under/rank/security(src) new /obj/item/clothing/under/rank/security(src) @@ -34,6 +38,16 @@ new /obj/item/clothing/head/beret/sec(src) return +/obj/structure/closet/wardrobe/hos + name = "head of security wardrobe" + icon_state = "red" + icon_closed = "red" + +/obj/structure/closet/wardrobe/hos/New() + new /obj/item/clothing/under/hosformalfem(src) + new /obj/item/clothing/under/hosformalmale(src) + new /obj/item/clothing/under/rank/head_of_security/jensen(src) + return /obj/structure/closet/wardrobe/pink name = "pink wardrobe" diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index ebd0f321bb9..fe863181e82 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -336,7 +336,7 @@ return user << "You rig [src]." user.drop_item() - del(W) + qdel(W) rigged = 1 return else if(istype(W, /obj/item/device/radio/electropack)) diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 0df0d40e6d8..f61e3bcab19 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -18,7 +18,7 @@ user.visible_message("[user] pries \the [src] open.", \ "You pry open \the [src].", \ "You hear splitting wood.") - del(src) + qdel(src) else return attack_hand(user) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 1c30c8556fc..74f79c2a49c 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -17,7 +17,7 @@ if (occupied) new /obj/item/weapon/gun/energy/laser/captain( src.loc ) occupied = 0 - del(src) + qdel(src) if (2) if (prob(50)) src.health -= 15 @@ -42,13 +42,13 @@ if (occupied) new /obj/item/weapon/gun/energy/laser/captain( src.loc ) occupied = 0 - del(src) + qdel(src) /obj/structure/displaycase/meteorhit(obj/O as obj) new /obj/item/weapon/shard( src.loc ) new /obj/item/weapon/gun/energy/laser/captain( src.loc ) - del(src) + qdel(src) /obj/structure/displaycase/proc/healthcheck() diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index d4c0910eea7..29da87da396 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -414,7 +414,7 @@ obj/structure/door_assembly var/M = text2path("/obj/item/stack/sheet/mineral/[mineral]") new M(get_turf(src)) new M(get_turf(src)) - del(src) + qdel(src) else user << "\blue You need more welding fuel to dissassemble the airlock assembly." return @@ -474,7 +474,7 @@ obj/structure/door_assembly else W.loc = src.loc - //del(W) + //qdel(W) else if(istype(W, /obj/item/weapon/crowbar) && state == 2 ) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) @@ -549,7 +549,7 @@ obj/structure/door_assembly if(created_name) door.name = created_name src.electronics.loc = door - del(src) + qdel(src) else ..() if(mineral == "glass") diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 5daadc94866..3029dae5487 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -1,22 +1,22 @@ -/obj/structure/dresser - name = "dresser" - desc = "A nicely-crafted wooden dresser. It's filled with lots of undies." - icon = 'icons/obj/stationobjs.dmi' - icon_state = "dresser" - density = 1 - anchored = 1 - -/obj/structure/dresser/attack_hand(mob/user as mob) - if(!Adjacent(user))//no tele-grooming - return - if(ishuman(user)) - var/mob/living/carbon/human/H = user - - var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_all - if(!Adjacent(user))//no tele-grooming - return - if(new_undies) - H.underwear = new_undies - - add_fingerprint(H) +/obj/structure/dresser + name = "dresser" + desc = "A nicely-crafted wooden dresser. It's filled with lots of undies." + icon = 'icons/obj/stationobjs.dmi' + icon_state = "dresser" + density = 1 + anchored = 1 + +/obj/structure/dresser/attack_hand(mob/user as mob) + if(!Adjacent(user))//no tele-grooming + return + if(ishuman(user)) + var/mob/living/carbon/human/H = user + + var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_all + if(!Adjacent(user))//no tele-grooming + return + if(new_undies) + H.underwear = new_undies + + add_fingerprint(H) H.update_body() \ No newline at end of file diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index b617121fb5f..1a0c2441907 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -19,7 +19,7 @@ part.loc = src.loc part.master = null part = null - del(src) + qdel(src) return return diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 61a292400b7..552a72812da 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -13,7 +13,7 @@ relativewall_neighbours() ..() -/obj/structure/falsewall/Del() +/obj/structure/falsewall/Destroy() var/temploc = src.loc @@ -89,7 +89,7 @@ else T.ChangeTurf(text2path("/turf/simulated/wall/mineral/[mineral]")) if(delete) - del(src) + qdel(src) return T /obj/structure/falsewall/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -113,7 +113,7 @@ if(mineral != "plasma")//Stupid shit keeps me from pushing the attackby() to plasma walls -Sieve T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) else user << "\blue You can't reach, close it first!" @@ -122,7 +122,7 @@ if(mineral != "plasma") var/turf/T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) /obj/structure/falsewall/update_icon()//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open @@ -210,7 +210,7 @@ var/turf/T = get_turf(src) user.visible_message("[user] tightens some bolts on the r wall.", "You tighten the bolts on the wall.") T.ChangeTurf(/turf/simulated/wall) //Intentionally makes a regular wall instead of an r-wall (no cheap r-walls for you). - del(src) + qdel(src) if( istype(W, /obj/item/weapon/weldingtool) ) var/obj/item/weapon/weldingtool/WT = W @@ -219,14 +219,14 @@ T.ChangeTurf(/turf/simulated/wall) T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) else if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) ) var/turf/T = get_turf(src) T.ChangeTurf(/turf/simulated/wall) T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) //DRILLING else if (istype(W, /obj/item/weapon/pickaxe/diamonddrill)) @@ -234,14 +234,14 @@ T.ChangeTurf(/turf/simulated/wall) T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) else if( istype(W, /obj/item/weapon/melee/energy/blade) ) var/turf/T = get_turf(src) T.ChangeTurf(/turf/simulated/wall) T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) /* diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index f9cd7e59526..414c10e4974 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -15,7 +15,7 @@ if(!src) return user << "You dissasembled the girder!" new /obj/item/stack/sheet/metal(get_turf(src)) - del(src) + qdel(src) else if(!anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) user << "Now securing the girder..." @@ -23,7 +23,7 @@ user << "You secured the girder!" var/obj/structure/girder/G = new (loc) transfer_fingerprints_to(G) - del(src) + qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) user << "Now slicing apart the girder..." @@ -31,12 +31,12 @@ if(!src) return user << "You slice apart the girder!" new /obj/item/stack/sheet/metal(get_turf(src)) - del(src) + qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) user << "You drill through the girder!" new /obj/item/stack/sheet/metal(get_turf(src)) - del(src) + qdel(src) else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) @@ -54,7 +54,7 @@ user << "You removed the support struts!" var/obj/structure/girder/G = new (loc) transfer_fingerprints_to(G) - del(src) + qdel(src) else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored ) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) @@ -64,7 +64,7 @@ user << "You dislodged the girder!" var/obj/structure/girder/displaced/D = new (loc) transfer_fingerprints_to(D) - del(src) + qdel(src) else if(istype(W, /obj/item/stack/sheet)) @@ -78,7 +78,7 @@ user << "You create a false wall! Push on it to open or close the passage." var/obj/structure/falsewall/F = new (loc) transfer_fingerprints_to(F) - del(src) + qdel(src) else if(S.amount < 2) return ..() user << "Now adding plating..." @@ -90,7 +90,7 @@ Tsrc.ChangeTurf(/turf/simulated/wall) for(var/turf/simulated/wall/X in Tsrc.loc) if(X) transfer_fingerprints_to(X) - del(src) + qdel(src) return if(/obj/item/stack/sheet/plasteel) @@ -100,7 +100,7 @@ user << "You create a false wall! Push on it to open or close the passage." var/obj/structure/falserwall/FW = new (loc) transfer_fingerprints_to(FW) - del(src) + qdel(src) else if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code... if(S.amount < 1) return ..() @@ -113,7 +113,7 @@ Tsrc.ChangeTurf(/turf/simulated/wall/r_wall) for(var/turf/simulated/wall/r_wall/X in Tsrc.loc) if(X) transfer_fingerprints_to(X) - del(src) + qdel(src) return else if(S.amount < 1) return ..() @@ -124,7 +124,7 @@ user << "Girders reinforced!" var/obj/structure/girder/reinforced/R = new (loc) transfer_fingerprints_to(R) - del(src) + qdel(src) return if(S.sheettype) @@ -136,7 +136,7 @@ var/F = text2path("/obj/structure/falsewall/[M]") var/obj/structure/FW = new F (loc) transfer_fingerprints_to(FW) - del(src) + qdel(src) else if(S.amount < 2) return ..() user << "Now adding plating..." @@ -148,7 +148,7 @@ Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]")) for(var/turf/simulated/wall/mineral/X in Tsrc.loc) if(X) transfer_fingerprints_to(X) - del(src) + qdel(src) return add_hiddenprint(usr) @@ -165,25 +165,25 @@ blob_act() if(prob(40)) - del(src) + qdel(src) ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(30)) var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) new remains(loc) - del(src) + qdel(src) return if(3.0) if (prob(5)) var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) new remains(loc) - del(src) + qdel(src) return else return @@ -211,7 +211,7 @@ user << "You dissasembled the girder!" var/obj/effect/decal/remains/human/R = new (get_turf(src)) transfer_fingerprints_to(R) - del(src) + qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) user << "Now slicing apart the girder..." @@ -219,34 +219,34 @@ user << "You slice apart the girder!" var/obj/effect/decal/remains/human/R = new (get_turf(src)) transfer_fingerprints_to(R) - del(src) + qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) user << "You drill through the girder!" if(do_after(user, 5)) var/obj/effect/decal/remains/human/R = new (get_turf(src)) transfer_fingerprints_to(R) - del(src) + qdel(src) blob_act() if(prob(40)) - del(src) + qdel(src) ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(30)) new /obj/effect/decal/remains/human(loc) - del(src) + qdel(src) return if(3.0) if (prob(5)) new /obj/effect/decal/remains/human(loc) - del(src) + qdel(src) return else return \ No newline at end of file diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 3534264b8a2..cb41a309e97 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -12,17 +12,14 @@ var/health = 10 var/destroyed = 0 -/obj/structure/grille/Del() - loc = null //garbage collect - /obj/structure/grille/ex_act(severity) - del(src) + qdel(src) /obj/structure/grille/blob_act() - del(src) + qdel(src) /obj/structure/grille/meteorhit(var/obj/M) - del(src) + qdel(src) /obj/structure/grille/Bumped(atom/user) @@ -112,7 +109,7 @@ else new /obj/item/stack/rods(loc) new /obj/item/stack/rods(loc) - del(src) + qdel(src) else if((istype(W, /obj/item/weapon/screwdriver)) && (istype(loc, /turf/simulated) || anchored)) if(!shock(user, 90)) playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) @@ -193,7 +190,7 @@ else if(health <= -6) new /obj/item/stack/rods(loc) - del(src) + qdel(src) return return diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index f0060dfe935..5a9a6225387 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -26,8 +26,8 @@ src.meattype = 1 for(var/mob/O in viewers(src, null)) O.show_message(text("\red [user] has forced [G.affecting] onto the spike, killing them instantly!")) - del(G.affecting) - del(G) + qdel(G.affecting) + qdel(G) else user << "\red The spike already has something on it, finish collecting its meat first!" @@ -39,8 +39,8 @@ src.meattype = 2 for(var/mob/O in viewers(src, null)) O.show_message(text("\red [user] has forced [G.affecting] onto the spike, killing them instantly!")) - del(G.affecting) - del(G) + qdel(G.affecting) + qdel(G) else user << "\red The spike already has something on it, finish collecting its meat first!" else diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm index eebe9fb343c..8c136774de3 100644 --- a/code/game/objects/structures/lamarr_cage.dm +++ b/code/game/objects/structures/lamarr_cage.dm @@ -15,7 +15,7 @@ if (1) new /obj/item/weapon/shard( src.loc ) Break() - del(src) + qdel(src) if (2) if (prob(50)) src.health -= 15 @@ -37,13 +37,13 @@ if (prob(75)) new /obj/item/weapon/shard( src.loc ) Break() - del(src) + qdel(src) /obj/structure/lamarr/meteorhit(obj/O as obj) new /obj/item/weapon/shard( src.loc ) Break() - del(src) + qdel(src) /obj/structure/lamarr/proc/healthcheck() diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 12ce9e0b5ff..aa5dda732da 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -11,10 +11,10 @@ /obj/structure/lattice/New() ..() if(!(istype(src.loc, /turf/space))) - del(src) + qdel(src) for(var/obj/structure/lattice/LAT in src.loc) if(LAT != src) - del(LAT) + qdel(LAT) icon = 'icons/obj/smoothlattice.dmi' icon_state = "latticeblank" updateOverlays() @@ -24,7 +24,7 @@ L = locate(/obj/structure/lattice, get_step(src, dir)) L.updateOverlays() -/obj/structure/lattice/Del() +/obj/structure/lattice/Destroy() for (var/dir in cardinal) var/obj/structure/lattice/L if(locate(/obj/structure/lattice, get_step(src, dir))) @@ -33,16 +33,16 @@ ..() /obj/structure/lattice/blob_act() - del(src) + qdel(src) return /obj/structure/lattice/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) - del(src) + qdel(src) return if(3.0) return @@ -60,24 +60,23 @@ if(WT.remove_fuel(0, user)) user << "\blue Slicing lattice joints ..." new /obj/item/stack/rods(src.loc) - del(src) + qdel(src) return /obj/structure/lattice/proc/updateOverlays() //if(!(istype(src.loc, /turf/space))) - // del(src) - spawn(1) - overlays = list() + // qdel(src) + overlays.Cut() - var/dir_sum = 0 + var/dir_sum = 0 - for (var/direction in cardinal) - if(locate(/obj/structure/lattice, get_step(src, direction))) + for (var/direction in cardinal) + if(locate(/obj/structure/lattice, get_step(src, direction))) + dir_sum += direction + else + if(!(istype(get_step(src, direction), /turf/space))) dir_sum += direction - else - if(!(istype(get_step(src, direction), /turf/space))) - dir_sum += direction - icon_state = "lattice[dir_sum]" - return \ No newline at end of file + icon_state = "lattice[dir_sum]" + return \ No newline at end of file diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index c6fcb117c68..b4feb3ef208 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -26,11 +26,10 @@ air_update_turf(1) return - Del() + Destroy() density = 0 air_update_turf(1) ..() - return Move() var/turf/T = loc @@ -170,7 +169,7 @@ var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]") for(var/i = 3, i <= oreAmount, i++) new ore(get_turf(src)) - del(src) + qdel(src) ex_act(severity = 1) switch(severity) @@ -249,7 +248,7 @@ if(!devastated) for(var/i = 1, i <= oreAmount, i++) new/obj/item/stack/sheet/wood(get_turf(src)) - del(src) + qdel(src) /obj/structure/mineral_door/resin mineralType = "resin" @@ -263,7 +262,7 @@ return ..() Dismantle(devastated = 0) - del(src) + qdel(src) CheckHardness() playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 274b3e2a56f..e66e228e64f 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -12,21 +12,33 @@ /obj/structure/morgue name = "morgue" - desc = "Used to keep bodies in untill someone fetches them." + desc = "Used to keep bodies in until someone fetches them." icon = 'icons/obj/stationobjs.dmi' icon_state = "morgue1" density = 1 var/obj/structure/m_tray/connected = null anchored = 1.0 -/obj/structure/morgue/on_log() - update() +/obj/structure/morgue/New() + connected = new(src) + connected.connected = src + ..() -/obj/structure/morgue/proc/update() - if (src.connected) +/obj/structure/morgue/Destroy() + open() + if(connected) + qdel(connected) + connected = null + ..() + +/obj/structure/morgue/on_log() + update_icon() + +/obj/structure/morgue/update_icon() + if (!connected || connected.loc != src) //open or the tray broke off somehow src.icon_state = "morgue0" else - if(!src.contents.len) + if(src.contents.len == 1) //empty except for the tray src.icon_state = "morgue1" else @@ -43,31 +55,6 @@ src.icon_state = "morgue4"//clone that mofo break - -/obj/structure/morgue/ex_act(severity) - switch(severity) - if(1.0) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - return - if(2.0) - if (prob(50)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - return - if(3.0) - if (prob(5)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - return - return - /obj/structure/morgue/alter_health() return src.loc @@ -75,31 +62,14 @@ return src.attack_hand(user) /obj/structure/morgue/attack_hand(mob/user as mob) - if (src.connected) - for(var/atom/movable/A as mob|obj in src.connected.loc) - if (!( A.anchored )) - A.loc = src - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - //src.connected = null - del(src.connected) + if(!connected) + user << "That doesn't appear to have a tray." + return + if(connected.loc == src) + open() else - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - src.connected = new /obj/structure/m_tray( src.loc ) - step(src.connected, EAST) - src.connected.layer = OBJ_LAYER - var/turf/T = get_step(src, EAST) - if (T.contents.Find(src.connected)) - src.connected.connected = src - src.icon_state = "morgue0" - for(var/atom/movable/A as mob|obj in src) - A.loc = src.connected.loc - src.connected.icon_state = "morguet" - else - //src.connected = null - del(src.connected) - src.add_fingerprint(user) - update() - return + close() + add_fingerprint(user) /obj/structure/morgue/attackby(P as obj, mob/user as mob) if (istype(P, /obj/item/weapon/pen)) @@ -113,25 +83,24 @@ src.name = text("Morgue- '[]'", t) else src.name = "Morgue" - src.add_fingerprint(user) - return + add_fingerprint(user) /obj/structure/morgue/container_resist() - src.connected = new /obj/structure/m_tray( src.loc ) - step(src.connected, EAST) - src.connected.layer = OBJ_LAYER + open() + +/obj/structure/morgue/proc/open() + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) var/turf/T = get_step(src, EAST) - if (T.contents.Find(src.connected)) - src.connected.connected = src - src.icon_state = "morgue0" - for(var/atom/movable/A as mob|obj in src) - A.loc = src.connected.loc - //Foreach goto(106) - src.connected.icon_state = "morguet" - else - //src.connected = null - del(src.connected) - return + for(var/atom/movable/A in src) + A.loc = T + update_icon() + +/obj/structure/morgue/proc/close() + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + for(var/atom/movable/A in connected.loc) + if(!A.anchored || A == connected) + A.loc = src + update_icon() /* @@ -148,22 +117,22 @@ anchored = 1.0 throwpass = 1 +/obj/structure/m_tray/Destroy() + if(connected) + connected.connected = null + connected.update_icon() + connected = null + ..() + /obj/structure/m_tray/attack_paw(mob/user as mob) return src.attack_hand(user) /obj/structure/m_tray/attack_hand(mob/user as mob) if (src.connected) - for(var/atom/movable/A as mob|obj in src.loc) - if (!( A.anchored )) - A.loc = src.connected - //Foreach goto(26) - src.connected.connected = null - src.connected.update() + connected.close() add_fingerprint(user) - //SN src = null - del(src) - return - return + else + user << "That's not connected to anything." /obj/structure/m_tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) if ((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O))) @@ -196,12 +165,24 @@ var/id = 1 var/locked = 0 -/obj/structure/crematorium/proc/update() - if (src.connected) - src.icon_state = "crema0" +/obj/structure/crematorium/New() + connected = new(src) + connected.connected = src + ..() + +/obj/structure/crematorium/Destroy() + open() + if(connected) + qdel(connected) + connected = null + ..() + +/obj/structure/crematorium/update_icon() + if(!connected || connected.loc != src) + icon_state = "crema0" else - if(src.contents.len) + if(src.contents.len > 1) src.icon_state = "crema2" else src.icon_state = "crema1" @@ -212,31 +193,6 @@ return - -/obj/structure/crematorium/ex_act(severity) - switch(severity) - if(1.0) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - return - if(2.0) - if (prob(50)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - return - if(3.0) - if (prob(5)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - return - return - /obj/structure/crematorium/alter_health() return src.loc @@ -244,39 +200,17 @@ return src.attack_hand(user) /obj/structure/crematorium/attack_hand(mob/user as mob) -// if (cremating) AWW MAN! THIS WOULD BE SO MUCH MORE FUN ... TO WATCH -// user.show_message("\red Uh-oh, that was a bad idea.", 1) -// //usr << "Uh-oh, that was a bad idea." -// src:loc:poison += 20000000 -// src:loc:firelevel = src:loc:poison -// return - if (cremating) - usr << "\red It's locked." + if (cremating || locked) + user << "\red It's locked." return - if ((src.connected) && (src.locked == 0)) - for(var/atom/movable/A as mob|obj in src.connected.loc) - if (!( A.anchored )) - A.loc = src - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - //src.connected = null - del(src.connected) - else if (src.locked == 0) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - src.connected = new /obj/structure/c_tray( src.loc ) - step(src.connected, SOUTH) - src.connected.layer = OBJ_LAYER - var/turf/T = get_step(src, SOUTH) - if (T.contents.Find(src.connected)) - src.connected.connected = src - src.icon_state = "crema0" - for(var/atom/movable/A as mob|obj in src) - A.loc = src.connected.loc - src.connected.icon_state = "cremat" - else - //src.connected = null - del(src.connected) - src.add_fingerprint(user) - update() + if (!connected) + user << "That doesn't appear to have a tray." + return + if(connected.loc == src) + open() + else + close() + add_fingerprint(user) /obj/structure/crematorium/attackby(P as obj, mob/user as mob) if (istype(P, /obj/item/weapon/pen)) @@ -294,30 +228,13 @@ return /obj/structure/crematorium/container_resist() - src.connected = new /obj/structure/c_tray( src.loc ) - step(src.connected, SOUTH) - src.connected.layer = OBJ_LAYER - var/turf/T = get_step(src, SOUTH) - if (T.contents.Find(src.connected)) - src.connected.connected = src - src.icon_state = "crema0" - for(var/atom/movable/A as mob|obj in src) - A.loc = src.connected.loc - //Foreach goto(106) - src.connected.icon_state = "cremat" - else - //src.connected = null - del(src.connected) - return + open() -/obj/structure/crematorium/proc/cremate(atom/A, mob/user as mob) -// for(var/obj/machinery/crema_switch/O in src) //trying to figure a way to call the switch, too drunk to sort it out atm -// if(var/on == 1) -// return +/obj/structure/crematorium/proc/cremate(mob/user as mob) if(cremating) return //don't let you cremate something twice or w/e - if(contents.len <= 0) + if(contents.len <= 1) for (var/mob/M in viewers(src)) M.show_message("\red You hear a hollow crackle.", 1) return @@ -332,30 +249,43 @@ cremating = 1 locked = 1 - update() + update_icon() for(var/mob/living/M in contents) if (M.stat!=2) M.emote("scream") //Logging for this causes runtimes resulting in the cremator locking up. Commenting it out until that's figured out. //M.attack_log += "\[[time_stamp()]\] Has been cremated by [user]/[user.ckey]" //No point in this when the mob's about to be deleted - //user.attack_log +="\[[time_stamp()]\] Cremated [M]/[M.ckey]" - //log_attack("\[[time_stamp()]\] [user]/[user.ckey] cremated [M]/[M.ckey]") + user.attack_log +="\[[time_stamp()]\] Cremated [M]/[M.ckey]" + log_attack("\[[time_stamp()]\] [user]/[user.ckey] cremated [M]/[M.ckey]") M.death(1) M.ghostize() - del(M) + qdel(M) for(var/obj/O in contents) //obj instead of obj/item so that bodybags and ashes get destroyed. We dont want tons and tons of ash piling up - del(O) + if(O != connected) //Creamtorium does not burn hot enough to destroy the tray + qdel(O) new /obj/effect/decal/cleanable/ash(src) sleep(30) cremating = 0 locked = 0 - update() + update_icon() playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - return +/obj/structure/crematorium/proc/open() + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + var/turf/T = get_step(src, SOUTH) + for(var/atom/movable/A in src) + A.loc = T + update_icon() + +/obj/structure/crematorium/proc/close() + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + for(var/atom/movable/A in connected.loc) + if(!A.anchored || A == connected) + A.loc = src + update_icon() /* * Crematorium tray @@ -371,22 +301,22 @@ anchored = 1.0 throwpass = 1 +/obj/structure/c_tray/Destroy() + if(connected) + connected.connected = null + connected.update_icon() + connected = null + ..() + /obj/structure/c_tray/attack_paw(mob/user as mob) return src.attack_hand(user) /obj/structure/c_tray/attack_hand(mob/user as mob) if (src.connected) - for(var/atom/movable/A as mob|obj in src.loc) - if (!( A.anchored )) - A.loc = src.connected - //Foreach goto(26) - src.connected.connected = null - src.connected.update() + connected.close() add_fingerprint(user) - //SN src = null - del(src) - return - return + else + user << "That's not connected to anything." /obj/structure/c_tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) if ((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O))) diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index fadd53408d5..a0c6e32b451 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -8,20 +8,20 @@ /obj/structure/sign/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) - del(src) + qdel(src) return if(3.0) - del(src) + qdel(src) return else return /obj/structure/sign/blob_act() - del(src) + qdel(src) return @@ -87,15 +87,15 @@ desc = "A warning sign which reads 'NO SMOKING'" icon_state = "nosmoking2" -/obj/structure/sign/redcross +/obj/structure/sign/bluecross name = "medbay" desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here.'" - icon_state = "redcross" + icon_state = "bluecross" -/obj/structure/sign/greencross +/obj/structure/sign/bluecross_2 name = "medbay" desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here.'" - icon_state = "greencross" + icon_state = "bluecross2" /obj/structure/sign/goldenplaque name = "The Most Robust Men Award for Robustness" diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index d1676f3fee6..4512e2b45cc 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -63,5 +63,5 @@ /obj/structure/stool/bed/nest/proc/healthcheck() if(health <=0) density = 0 - del(src) + qdel(src) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 233dc121911..924c0fa7864 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -18,10 +18,9 @@ desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?" icon_state = "abed" -/obj/structure/stool/bed/Del() +/obj/structure/stool/bed/Destroy() unbuckle() ..() - return /obj/structure/stool/bed/attack_paw(mob/user as mob) return src.attack_hand(user) @@ -33,7 +32,7 @@ /obj/structure/stool/bed/attack_animal(var/mob/living/simple_animal/M)//No more buckling hostile mobs to chairs to render them immobile forever if(M.environment_smash) new /obj/item/stack/sheet/metal(src.loc) - del(src) + qdel(src) /obj/structure/stool/bed/MouseDrop_T(mob/M as mob, mob/user as mob) if(!istype(M)) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index c68305a7b28..66e23e3518a 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -25,7 +25,7 @@ E.part = SK SK.loc = E SK.master = E - del(src) + qdel(src) /obj/structure/stool/bed/chair/attack_tk(mob/user as mob) if(buckled_mob) ..() @@ -89,7 +89,7 @@ if(istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) new /obj/item/stack/sheet/wood(src.loc) - del(src) + qdel(src) else ..() diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index f0a46e0ce2f..efbff04cfed 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -9,26 +9,26 @@ /obj/structure/stool/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(5)) - del(src) + qdel(src) return return /obj/structure/stool/blob_act() if(prob(75)) new /obj/item/stack/sheet/metal(src.loc) - del(src) + qdel(src) /obj/structure/stool/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) new /obj/item/stack/sheet/metal(src.loc) - del(src) + qdel(src) return \ No newline at end of file diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index f842bc6bd22..63769110c8f 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -121,14 +121,14 @@ ..() for(var/obj/structure/table/T in src.loc) if(T != src) - del(T) + qdel(T) update_icon() for(var/direction in list(1,2,4,8,5,6,9,10)) if(locate(/obj/structure/table,get_step(src,direction))) var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,direction)) T.update_icon() -/obj/structure/table/Del() +/obj/structure/table/Destroy() for(var/direction in list(1,2,4,8,5,6,9,10)) if(locate(/obj/structure/table,get_step(src,direction))) var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,direction)) @@ -227,7 +227,7 @@ break stack_loop else amt -= S.amount - del(S) + qdel(S) else if(ispath(A, /obj/item)) var/obj/item/I item_loop: @@ -259,7 +259,7 @@ for(var/B in Deletion) if(!istype(B, A)) Deletion.Remove(B) - del(B) + qdel(B) return Deletion /obj/structure/table/interact(mob/user) @@ -434,11 +434,11 @@ /obj/structure/table/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(25)) @@ -451,10 +451,10 @@ if(prob(75)) if(istype(src, /obj/structure/table/woodentable)) new /obj/item/weapon/table_parts/wood( src.loc ) - del(src) + qdel(src) return new /obj/item/weapon/table_parts( src.loc ) - del(src) + qdel(src) return /obj/structure/table/attack_paw(mob/user) @@ -468,7 +468,7 @@ else new /obj/item/weapon/table_parts(loc) density = 0 - del(src) + qdel(src) /obj/structure/table/attack_alien(mob/user) @@ -480,7 +480,7 @@ else new /obj/item/weapon/table_parts(loc) density = 0 - del(src) + qdel(src) /obj/structure/table/attack_animal(mob/living/simple_animal/user) @@ -493,7 +493,7 @@ else new /obj/item/weapon/table_parts(loc) density = 0 - del(src) + qdel(src) @@ -509,7 +509,7 @@ else new /obj/item/weapon/table_parts(loc) density = 0 - del(src) + qdel(src) else ..() @@ -553,7 +553,7 @@ G.affecting.Weaken(5) G.affecting.visible_message("[G.assailant] pushes [G.affecting] onto [src].", \ "[G.assailant] pushes [G.affecting] onto [src].") - del(I) + qdel(I) return if (istype(I, /obj/item/weapon/wrench)) @@ -585,7 +585,7 @@ Destroy type values: if(destroy_type == 1) user.visible_message("The table was sliced apart by [user]!") new parts( src.loc ) - del(src) + qdel(src) return if(destroy_type == 2) @@ -597,7 +597,7 @@ Destroy type values: if (do_after(user, 50)) new parts( src.loc ) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - del(src) + qdel(src) return else user << "Now disassembling table" @@ -605,7 +605,7 @@ Destroy type values: if (do_after(user, 50)) new parts( src.loc ) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - del(src) + qdel(src) return @@ -673,23 +673,23 @@ Destroy type values: /obj/structure/rack/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) if(2.0) - del(src) + qdel(src) if(prob(50)) new /obj/item/weapon/rack_parts(src.loc) if(3.0) if(prob(25)) - del(src) + qdel(src) new /obj/item/weapon/rack_parts(src.loc) /obj/structure/rack/blob_act() if(prob(75)) - del(src) + qdel(src) return else if(prob(50)) new /obj/item/weapon/rack_parts(src.loc) - del(src) + qdel(src) return /obj/structure/rack/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -715,7 +715,7 @@ Destroy type values: if (istype(W, /obj/item/weapon/wrench)) new /obj/item/weapon/rack_parts( src.loc ) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - del(src) + qdel(src) return if(isrobot(user)) @@ -725,7 +725,7 @@ Destroy type values: return 1 /obj/structure/rack/meteorhit(obj/O as obj) - del(src) + qdel(src) /obj/structure/rack/attack_hand(mob/user) @@ -734,7 +734,7 @@ Destroy type values: user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) new /obj/item/weapon/rack_parts(loc) density = 0 - del(src) + qdel(src) /obj/structure/rack/attack_paw(mob/user) @@ -743,14 +743,14 @@ Destroy type values: visible_message("[user] smashes [src] apart!") new /obj/item/weapon/rack_parts(loc) density = 0 - del(src) + qdel(src) /obj/structure/rack/attack_alien(mob/user) visible_message("[user] slices [src] apart!") new /obj/item/weapon/rack_parts(loc) density = 0 - del(src) + qdel(src) /obj/structure/rack/attack_animal(mob/living/simple_animal/user) @@ -758,7 +758,7 @@ Destroy type values: visible_message("[user] smashes [src] apart!") new /obj/item/weapon/rack_parts(loc) density = 0 - del(src) + qdel(src) /obj/structure/rack/attack_tk() // no telehulk sorry return diff --git a/code/game/objects/structures/transit_tubes.dm b/code/game/objects/structures/transit_tubes.dm index 9b93774b6ed..42db1ee0757 100644 --- a/code/game/objects/structures/transit_tubes.dm +++ b/code/game/objects/structures/transit_tubes.dm @@ -1,658 +1,658 @@ - -// Basic transit tubes. Straight pieces, curved sections, -// and basic splits/joins (no routing logic). -// Mappers: you can use "Generate Instances from Icon-states" -// to get the different pieces. -/obj/structure/transit_tube - icon = 'icons/obj/pipes/transit_tube.dmi' - icon_state = "E-W" - density = 1 - layer = 3.1 - anchored = 1.0 - var/list/tube_dirs = null - var/exit_delay = 2 - var/enter_delay = 1 - - // alldirs in global.dm is the same list of directions, but since - // the specific order matters to get a usable icon_state, it is - // copied here so that, in the unlikely case that alldirs is changed, - // this continues to work. - var/global/list/tube_dir_list = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) - - -// A place where tube pods stop, and people can get in or out. -// Mappers: use "Generate Instances from Directions" for this -// one. -/obj/structure/transit_tube/station - name = "station tube station" - icon = 'icons/obj/pipes/transit_tube_station.dmi' - icon_state = "closed" - exit_delay = 2 - enter_delay = 3 - var/pod_moving = 0 - var/automatic_launch_time = 100 - var/cooldown_delay = 30 - var/launch_cooldown = 0 - var/reverse_launch = 0 - - var/const/OPEN_DURATION = 6 - var/const/CLOSE_DURATION = 6 - -// Stations which will send the tube in the opposite direction after their stop. -/obj/structure/transit_tube/station/reverse - reverse_launch = 1 - - - -/obj/structure/transit_tube_pod - icon = 'icons/obj/pipes/transit_tube_pod.dmi' - icon_state = "pod" - animate_movement = FORWARD_STEPS - anchored = 1.0 - density = 1 - var/moving = 0 - var/datum/gas_mixture/air_contents = new() - - - -/obj/structure/transit_tube_pod/Del() - for(var/atom/movable/AM in contents) - AM.loc = loc - - ..() - - - -// When destroyed by explosions, properly handle contents. -obj/structure/ex_act(severity) - switch(severity) - if(1.0) - for(var/atom/movable/AM in contents) - AM.loc = loc - AM.ex_act(severity++) - - del(src) - return - if(2.0) - if(prob(50)) - for(var/atom/movable/AM in contents) - AM.loc = loc - AM.ex_act(severity++) - - del(src) - return - if(3.0) - return - - - -/obj/structure/transit_tube_pod/New(loc) - ..(loc) - - air_contents.oxygen = MOLES_O2STANDARD * 2 - air_contents.nitrogen = MOLES_N2STANDARD - air_contents.temperature = T20C - - // Give auto tubes time to align before trying to start moving - spawn(5) - follow_tube() - - - -/obj/structure/transit_tube/New(loc) - ..(loc) - - if(tube_dirs == null) - init_dirs() - - - -/obj/structure/transit_tube/station/New(loc) - ..(loc) - - - -/obj/structure/transit_tube/station/Bumped(mob/AM as mob|obj) - if(!pod_moving && icon_state == "open" && istype(AM, /mob)) - for(var/obj/structure/transit_tube_pod/pod in loc) - if(!pod.moving && pod.dir in directions()) - AM.loc = pod - return - - - -/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(icon_state == "closed") - open_animation() - - else if(icon_state == "open") - if(pod.contents.len && user.loc != pod) - user.visible_message("[user] starts emptying [pod]'s contents onto the floor!") - if(do_after(user, 40)) //So it doesn't default to close_animation() on fail - if(pod.loc == loc) - for(var/atom/movable/AM in pod) - AM.loc = get_turf(user) - if(ismob(AM)) - var/mob/M = AM - M.Weaken(5) - - else - close_animation() - break - - -/obj/structure/transit_tube/station/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/weapon/grab) && icon_state == "open") - var/obj/item/weapon/grab/G = W - if(ismob(G.affecting) && G.state >= GRAB_AGGRESSIVE) - var/mob/GM = G.affecting - for(var/obj/structure/transit_tube_pod/pod in loc) - pod.visible_message("[user] starts putting [GM] into the [pod]!") - if(do_after(user, 60) && GM && G && G.affecting == GM) - GM.Weaken(5) - src.Bumped(GM) - del(G) - break - -/obj/structure/transit_tube/station/proc/open_animation() - if(icon_state == "closed") - icon_state = "opening" - spawn(OPEN_DURATION) - if(icon_state == "opening") - icon_state = "open" - - - -/obj/structure/transit_tube/station/proc/close_animation() - if(icon_state == "open") - icon_state = "closing" - spawn(CLOSE_DURATION) - if(icon_state == "closing") - icon_state = "closed" - - - -/obj/structure/transit_tube/station/proc/launch_pod() - for(var/obj/structure/transit_tube_pod/pod in loc) - if(!pod.moving && turn(pod.dir, (reverse_launch ? 180 : 0)) in directions()) - spawn(5) - pod_moving = 1 - close_animation() - sleep(CLOSE_DURATION + 2) - if(icon_state == "closed" && pod && launch_cooldown < world.time) - pod.follow_tube(reverse_launch) - - pod_moving = 0 - - return - - - -// Called to check if a pod should stop upon entering this tube. -/obj/structure/transit_tube/proc/should_stop_pod(pod, from_dir) - return 0 - - - -/obj/structure/transit_tube/station/should_stop_pod(pod, from_dir) - return 1 - - - -// Called when a pod stops in this tube section. -/obj/structure/transit_tube/proc/pod_stopped(pod, from_dir) - return - - - -/obj/structure/transit_tube/station/pod_stopped(obj/structure/transit_tube_pod/pod, from_dir) - pod_moving = 1 - spawn(5) - launch_cooldown = world.time + min(cooldown_delay, automatic_launch_time) - open_animation() - sleep(OPEN_DURATION + 2) - pod_moving = 0 - pod.mix_air() - - if(automatic_launch_time) - var/const/wait_step = 5 - var/i = 0 - while(i < automatic_launch_time) - sleep(wait_step) - i += wait_step - - if(pod_moving || icon_state != "open") - return - - launch_pod() - - - -// Returns a /list of directions this tube section can connect to. -// Tubes that have some sort of logic or changing direction might -// override it with additional logic. -/obj/structure/transit_tube/proc/directions() - return tube_dirs - - - -/obj/structure/transit_tube/proc/has_entrance(from_dir) - from_dir = turn(from_dir, 180) - - for(var/direction in directions()) - if(direction == from_dir) - return 1 - - return 0 - - - -/obj/structure/transit_tube/proc/has_exit(in_dir) - for(var/direction in directions()) - if(direction == in_dir) - return 1 - - return 0 - - - -// Searches for an exit direction within 45 degrees of the -// specified dir. Returns that direction, or 0 if none match. -/obj/structure/transit_tube/proc/get_exit(in_dir) - var/near_dir = 0 - var/in_dir_cw = turn(in_dir, -45) - var/in_dir_ccw = turn(in_dir, 45) - - for(var/direction in directions()) - if(direction == in_dir) - return direction - - else if(direction == in_dir_cw) - near_dir = direction - - else if(direction == in_dir_ccw) - near_dir = direction - - return near_dir - - - -// Return how many BYOND ticks to wait before entering/exiting -// the tube section. Default action is to return the value of -// a var, which wouldn't need a proc, but it makes it possible -// for later tube types to interact in more interesting ways -// such as being very fast in one direction, but slow in others -/obj/structure/transit_tube/proc/exit_delay(pod, to_dir) - return exit_delay - -/obj/structure/transit_tube/proc/enter_delay(pod, to_dir) - return enter_delay - - - -/obj/structure/transit_tube_pod/proc/follow_tube(var/reverse_launch) - if(moving) - return - - moving = 1 - - spawn() - var/obj/structure/transit_tube/current_tube = null - var/next_dir - var/next_loc - var/last_delay = 0 - var/exit_delay - - if(reverse_launch) - dir = turn(dir, 180) // Back it up - - for(var/obj/structure/transit_tube/tube in loc) - if(tube.has_exit(dir)) - current_tube = tube - break - - while(current_tube) - next_dir = current_tube.get_exit(dir) - - if(!next_dir) - break - - exit_delay = current_tube.exit_delay(src, dir) - last_delay += exit_delay - - sleep(exit_delay) - - next_loc = get_step(loc, next_dir) - - current_tube = null - for(var/obj/structure/transit_tube/tube in next_loc) - if(tube.has_entrance(next_dir)) - current_tube = tube - break - - if(current_tube == null) - dir = next_dir - Move(get_step(loc, dir)) // Allow collisions when leaving the tubes. - break - - last_delay = current_tube.enter_delay(src, next_dir) - sleep(last_delay) - dir = next_dir - loc = next_loc // When moving from one tube to another, skip collision and such. - density = current_tube.density - - if(current_tube && current_tube.should_stop_pod(src, next_dir)) - current_tube.pod_stopped(src, dir) - break - - density = 1 - - // If the pod is no longer in a tube, move in a line until stopped or slowed to a halt. - // /turf/inertial_drift appears to only work on mobs, and re-implementing some of the - // logic allows a gradual slowdown and eventual stop when passing over non-space turfs. - if(!current_tube && last_delay <= 10) - do - sleep(last_delay) - - if(!istype(loc, /turf/space)) - last_delay++ - - if(last_delay > 10) - break - - while(isturf(loc) && Move(get_step(loc, dir))) - - moving = 0 - - -// Should I return a copy here? If the caller edits or del()s the returned -// datum, there might be problems if I don't... -/obj/structure/transit_tube_pod/return_air() - var/datum/gas_mixture/GM = new() - GM.oxygen = air_contents.oxygen - GM.carbon_dioxide = air_contents.carbon_dioxide - GM.nitrogen = air_contents.nitrogen - GM.toxins = air_contents.toxins - GM.temperature = air_contents.temperature - return GM - -// For now, copying what I found in an unused FEA file (and almost identical in a -// used ZAS file). Means that assume_air and remove_air don't actually alter the -// air contents. -/obj/structure/transit_tube_pod/assume_air(datum/gas_mixture/giver) - return air_contents.merge(giver) - -/obj/structure/transit_tube_pod/remove_air(amount) - return air_contents.remove(amount) - - - -// Called when a pod arrives at, and before a pod departs from a station, -// giving it a chance to mix its internal air supply with the turf it is -// currently on. -/obj/structure/transit_tube_pod/proc/mix_air() - var/datum/gas_mixture/environment = loc.return_air() - var/env_pressure = environment.return_pressure() - var/int_pressure = air_contents.return_pressure() - var/total_pressure = env_pressure + int_pressure - - if(total_pressure == 0) - return - - // Math here: Completely made up, not based on realistic equasions. - // Goal is to balance towards equal pressure, but ensure some gas - // transfer in both directions regardless. - // Feel free to rip this out and replace it with something better, - // I don't really know muhch about how gas transfer rates work in - // SS13. - var/transfer_in = max(0.1, 0.5 * (env_pressure - int_pressure) / total_pressure) - var/transfer_out = max(0.1, 0.3 * (int_pressure - env_pressure) / total_pressure) - - var/datum/gas_mixture/from_env = loc.remove_air(environment.total_moles() * transfer_in) - var/datum/gas_mixture/from_int = air_contents.remove(air_contents.total_moles() * transfer_out) - - loc.assume_air(from_int) - air_contents.merge(from_env) - - - -// When the player moves, check if the pos is currently stopped at a station. -// if it is, check the direction. If the direction matches the direction of -// the station, try to exit. If the direction matches one of the station's -// tube directions, launch the pod in that direction. -/obj/structure/transit_tube_pod/relaymove(mob/mob, direction) - 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_view(null) - - //if(moving && istype(loc, /turf/space)) - // Todo: If you get out of a moving pod in space, you should move as well. - // Same direction as pod? Direcion you moved? Halfway between? - - if(!moving) - for(var/obj/structure/transit_tube/station/station in loc) - if(dir in station.directions()) - 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_view(null) - - else - station.open_animation() - - else if(direction in station.directions()) - dir = direction - station.launch_pod() - return - - for(var/obj/structure/transit_tube/tube in loc) - if(dir in tube.directions()) - if(tube.has_exit(direction)) - dir = direction - return - - -// Parse the icon_state into a list of directions. -// This means that mappers can use Dream Maker's built in -// "Generate Instances from Icon-states" option to get all -// variations. Additionally, as a separate proc, sub-types -// can handle it more intelligently. -/obj/structure/transit_tube/proc/init_dirs() - if(icon_state == "auto") - // Additional delay, for map loading. - spawn(1) - init_dirs_automatic() - - else - tube_dirs = parse_dirs(icon_state) - - if(copytext(icon_state, 1, 3) == "D-" || findtextEx(icon_state, "Pass")) - density = 0 - - - -// Tube station directions are simply 90 to either side of -// the exit. -/obj/structure/transit_tube/station/init_dirs() - tube_dirs = list(turn(dir, 90), turn(dir, -90)) - - - -// Initialize dirs by searching for tubes that do/might connect -// on nearby turfs. Create corner pieces if nessecary. -// Pick two directions, preferring tubes that already connect -// to loc, or other auto tubes if there aren't enough connections. -/obj/structure/transit_tube/proc/init_dirs_automatic() - var/list/connected = list() - var/list/connected_auto = list() - - for(var/direction in tube_dir_list) - var/location = get_step(loc, direction) - for(var/obj/structure/transit_tube/tube in location) - if(tube.directions() == null && tube.icon_state == "auto") - connected_auto += direction - break - - else if(turn(direction, 180) in tube.directions()) - connected += direction - break - - connected += connected_auto - - tube_dirs = select_automatic_dirs(connected) - - if(length(tube_dirs) == 2 && tube_dir_list.Find(tube_dirs[1]) > tube_dir_list.Find(tube_dirs[2])) - tube_dirs.Swap(1, 2) - - generate_automatic_corners(tube_dirs) - select_automatic_icon_state(tube_dirs) - - - -// Given a list of directions, look a pair that forms a 180 or -// 135 degree angle, and return a list containing the pair. -// If none exist, return list(connected[1], turn(connected[1], 180) -/obj/structure/transit_tube/proc/select_automatic_dirs(connected) - if(length(connected) < 1) - return list() - - for(var/i = 1, i <= length(connected), i++) - for(var/j = i + 1, j <= length(connected), j++) - var/d1 = connected[i] - var/d2 = connected[j] - - if(d1 == turn(d2, 135) || d1 == turn(d2, 180) || d1 == turn(d2, 225)) - return list(d1, d2) - - return list(connected[1], turn(connected[1], 180)) - - - -/obj/structure/transit_tube/proc/select_automatic_icon_state(directions) - if(length(directions) == 2) - icon_state = "[dir2text_short(directions[1])]-[dir2text_short(directions[2])]" - - - -// Look for diagonal directions, generate the decorative corners in each. -/obj/structure/transit_tube/proc/generate_automatic_corners(directions) - for(var/direction in directions) - if(direction == 5 || direction == 6 || direction == 9 || direction == 10) - if(direction & NORTH) - create_automatic_decorative_corner(get_step(loc, NORTH), direction ^ 3) - - else - create_automatic_decorative_corner(get_step(loc, SOUTH), direction ^ 3) - - if(direction & EAST) - create_automatic_decorative_corner(get_step(loc, EAST), direction ^ 12) - - else - create_automatic_decorative_corner(get_step(loc, WEST), direction ^ 12) - - - -// Generate a corner, if one doesn't exist for the direction on the turf. -/obj/structure/transit_tube/proc/create_automatic_decorative_corner(location, direction) - var/state = "D-[dir2text_short(direction)]" - - for(var/obj/structure/transit_tube/tube in location) - if(tube.icon_state == state) - return - - var/obj/structure/transit_tube/tube = new(location) - tube.icon_state = state - tube.init_dirs() - - - -// Uses a list() to cache return values. Since they should -// never be edited directly, all tubes with a certain -// icon_state can just reference the same list. In theory, -// reduces memory usage, and improves CPU cache usage. -// In reality, I don't know if that is quite how BYOND works, -// but it is probably safer to assume the existence of, and -// rely on, a sufficiently smart compiler/optimizer. -/obj/structure/transit_tube/proc/parse_dirs(text) - var/global/list/direction_table = list() - - if(text in direction_table) - return direction_table[text] - - var/list/split_text = text2list(text, "-") - - // If the first token is D, the icon_state represents - // a purely decorative tube, and doesn't actually - // connect to anything. - if(split_text[1] == "D") - direction_table[text] = list() - return null - - var/list/directions = list() - - for(var/text_part in split_text) - var/direction = text2dir_extended(text_part) - - if(direction > 0) - directions += direction - - direction_table[text] = directions - return directions - - - -// A copy of text2dir, extended to accept one and two letter -// directions, and to clearly return 0 otherwise. -/obj/structure/transit_tube/proc/text2dir_extended(direction) - switch(uppertext(direction)) - if("NORTH", "N") - return 1 - if("SOUTH", "S") - return 2 - if("EAST", "E") - return 4 - if("WEST", "W") - return 8 - if("NORTHEAST", "NE") - return 5 - if("NORTHWEST", "NW") - return 9 - if("SOUTHEAST", "SE") - return 6 - if("SOUTHWEST", "SW") - return 10 - else - return 0 - - - -// A copy of dir2text, which returns the short one or two letter -// directions used in tube icon states. -/obj/structure/transit_tube/proc/dir2text_short(direction) - switch(direction) - if(1) - return "N" - if(2) - return "S" - if(4) - return "E" - if(8) - return "W" - if(5) - return "NE" - if(6) - return "SE" - if(9) - return "NW" - if(10) - return "SW" - else - return + +// Basic transit tubes. Straight pieces, curved sections, +// and basic splits/joins (no routing logic). +// Mappers: you can use "Generate Instances from Icon-states" +// to get the different pieces. +/obj/structure/transit_tube + icon = 'icons/obj/pipes/transit_tube.dmi' + icon_state = "E-W" + density = 1 + layer = 3.1 + anchored = 1.0 + var/list/tube_dirs = null + var/exit_delay = 2 + var/enter_delay = 1 + + // alldirs in global.dm is the same list of directions, but since + // the specific order matters to get a usable icon_state, it is + // copied here so that, in the unlikely case that alldirs is changed, + // this continues to work. + var/global/list/tube_dir_list = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) + + +// A place where tube pods stop, and people can get in or out. +// Mappers: use "Generate Instances from Directions" for this +// one. +/obj/structure/transit_tube/station + name = "station tube station" + icon = 'icons/obj/pipes/transit_tube_station.dmi' + icon_state = "closed" + exit_delay = 2 + enter_delay = 3 + var/pod_moving = 0 + var/automatic_launch_time = 100 + var/cooldown_delay = 30 + var/launch_cooldown = 0 + var/reverse_launch = 0 + + var/const/OPEN_DURATION = 6 + var/const/CLOSE_DURATION = 6 + +// Stations which will send the tube in the opposite direction after their stop. +/obj/structure/transit_tube/station/reverse + reverse_launch = 1 + + + +/obj/structure/transit_tube_pod + icon = 'icons/obj/pipes/transit_tube_pod.dmi' + icon_state = "pod" + animate_movement = FORWARD_STEPS + anchored = 1.0 + density = 1 + var/moving = 0 + var/datum/gas_mixture/air_contents = new() + + + +/obj/structure/transit_tube_pod/Destroy() + for(var/atom/movable/AM in contents) + AM.loc = loc + + ..() + + + +// When destroyed by explosions, properly handle contents. +obj/structure/ex_act(severity) + switch(severity) + if(1.0) + for(var/atom/movable/AM in contents) + AM.loc = loc + AM.ex_act(severity++) + + qdel(src) + return + if(2.0) + if(prob(50)) + for(var/atom/movable/AM in contents) + AM.loc = loc + AM.ex_act(severity++) + + qdel(src) + return + if(3.0) + return + + + +/obj/structure/transit_tube_pod/New(loc) + ..(loc) + + air_contents.oxygen = MOLES_O2STANDARD * 2 + air_contents.nitrogen = MOLES_N2STANDARD + air_contents.temperature = T20C + + // Give auto tubes time to align before trying to start moving + spawn(5) + follow_tube() + + + +/obj/structure/transit_tube/New(loc) + ..(loc) + + if(tube_dirs == null) + init_dirs() + + + +/obj/structure/transit_tube/station/New(loc) + ..(loc) + + + +/obj/structure/transit_tube/station/Bumped(mob/AM as mob|obj) + if(!pod_moving && icon_state == "open" && istype(AM, /mob)) + for(var/obj/structure/transit_tube_pod/pod in loc) + if(!pod.moving && pod.dir in directions()) + AM.loc = pod + return + + + +/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(icon_state == "closed") + open_animation() + + else if(icon_state == "open") + if(pod.contents.len && user.loc != pod) + user.visible_message("[user] starts emptying [pod]'s contents onto the floor!") + if(do_after(user, 40)) //So it doesn't default to close_animation() on fail + if(pod.loc == loc) + for(var/atom/movable/AM in pod) + AM.loc = get_turf(user) + if(ismob(AM)) + var/mob/M = AM + M.Weaken(5) + + else + close_animation() + break + + +/obj/structure/transit_tube/station/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/weapon/grab) && icon_state == "open") + var/obj/item/weapon/grab/G = W + if(ismob(G.affecting) && G.state >= GRAB_AGGRESSIVE) + var/mob/GM = G.affecting + for(var/obj/structure/transit_tube_pod/pod in loc) + pod.visible_message("[user] starts putting [GM] into the [pod]!") + if(do_after(user, 60) && GM && G && G.affecting == GM) + GM.Weaken(5) + src.Bumped(GM) + qdel(G) + break + +/obj/structure/transit_tube/station/proc/open_animation() + if(icon_state == "closed") + icon_state = "opening" + spawn(OPEN_DURATION) + if(icon_state == "opening") + icon_state = "open" + + + +/obj/structure/transit_tube/station/proc/close_animation() + if(icon_state == "open") + icon_state = "closing" + spawn(CLOSE_DURATION) + if(icon_state == "closing") + icon_state = "closed" + + + +/obj/structure/transit_tube/station/proc/launch_pod() + for(var/obj/structure/transit_tube_pod/pod in loc) + if(!pod.moving && turn(pod.dir, (reverse_launch ? 180 : 0)) in directions()) + spawn(5) + pod_moving = 1 + close_animation() + sleep(CLOSE_DURATION + 2) + if(icon_state == "closed" && pod && launch_cooldown < world.time) + pod.follow_tube(reverse_launch) + + pod_moving = 0 + + return + + + +// Called to check if a pod should stop upon entering this tube. +/obj/structure/transit_tube/proc/should_stop_pod(pod, from_dir) + return 0 + + + +/obj/structure/transit_tube/station/should_stop_pod(pod, from_dir) + return 1 + + + +// Called when a pod stops in this tube section. +/obj/structure/transit_tube/proc/pod_stopped(pod, from_dir) + return + + + +/obj/structure/transit_tube/station/pod_stopped(obj/structure/transit_tube_pod/pod, from_dir) + pod_moving = 1 + spawn(5) + launch_cooldown = world.time + min(cooldown_delay, automatic_launch_time) + open_animation() + sleep(OPEN_DURATION + 2) + pod_moving = 0 + pod.mix_air() + + if(automatic_launch_time) + var/const/wait_step = 5 + var/i = 0 + while(i < automatic_launch_time) + sleep(wait_step) + i += wait_step + + if(pod_moving || icon_state != "open") + return + + launch_pod() + + + +// Returns a /list of directions this tube section can connect to. +// Tubes that have some sort of logic or changing direction might +// override it with additional logic. +/obj/structure/transit_tube/proc/directions() + return tube_dirs + + + +/obj/structure/transit_tube/proc/has_entrance(from_dir) + from_dir = turn(from_dir, 180) + + for(var/direction in directions()) + if(direction == from_dir) + return 1 + + return 0 + + + +/obj/structure/transit_tube/proc/has_exit(in_dir) + for(var/direction in directions()) + if(direction == in_dir) + return 1 + + return 0 + + + +// Searches for an exit direction within 45 degrees of the +// specified dir. Returns that direction, or 0 if none match. +/obj/structure/transit_tube/proc/get_exit(in_dir) + var/near_dir = 0 + var/in_dir_cw = turn(in_dir, -45) + var/in_dir_ccw = turn(in_dir, 45) + + for(var/direction in directions()) + if(direction == in_dir) + return direction + + else if(direction == in_dir_cw) + near_dir = direction + + else if(direction == in_dir_ccw) + near_dir = direction + + return near_dir + + + +// Return how many BYOND ticks to wait before entering/exiting +// the tube section. Default action is to return the value of +// a var, which wouldn't need a proc, but it makes it possible +// for later tube types to interact in more interesting ways +// such as being very fast in one direction, but slow in others +/obj/structure/transit_tube/proc/exit_delay(pod, to_dir) + return exit_delay + +/obj/structure/transit_tube/proc/enter_delay(pod, to_dir) + return enter_delay + + + +/obj/structure/transit_tube_pod/proc/follow_tube(var/reverse_launch) + if(moving) + return + + moving = 1 + + spawn() + var/obj/structure/transit_tube/current_tube = null + var/next_dir + var/next_loc + var/last_delay = 0 + var/exit_delay + + if(reverse_launch) + dir = turn(dir, 180) // Back it up + + for(var/obj/structure/transit_tube/tube in loc) + if(tube.has_exit(dir)) + current_tube = tube + break + + while(current_tube) + next_dir = current_tube.get_exit(dir) + + if(!next_dir) + break + + exit_delay = current_tube.exit_delay(src, dir) + last_delay += exit_delay + + sleep(exit_delay) + + next_loc = get_step(loc, next_dir) + + current_tube = null + for(var/obj/structure/transit_tube/tube in next_loc) + if(tube.has_entrance(next_dir)) + current_tube = tube + break + + if(current_tube == null) + dir = next_dir + Move(get_step(loc, dir)) // Allow collisions when leaving the tubes. + break + + last_delay = current_tube.enter_delay(src, next_dir) + sleep(last_delay) + dir = next_dir + loc = next_loc // When moving from one tube to another, skip collision and such. + density = current_tube.density + + if(current_tube && current_tube.should_stop_pod(src, next_dir)) + current_tube.pod_stopped(src, dir) + break + + density = 1 + + // If the pod is no longer in a tube, move in a line until stopped or slowed to a halt. + // /turf/inertial_drift appears to only work on mobs, and re-implementing some of the + // logic allows a gradual slowdown and eventual stop when passing over non-space turfs. + if(!current_tube && last_delay <= 10) + do + sleep(last_delay) + + if(!istype(loc, /turf/space)) + last_delay++ + + if(last_delay > 10) + break + + while(isturf(loc) && Move(get_step(loc, dir))) + + moving = 0 + + +// Should I return a copy here? If the caller edits or del()s the returned +// datum, there might be problems if I don't... +/obj/structure/transit_tube_pod/return_air() + var/datum/gas_mixture/GM = new() + GM.oxygen = air_contents.oxygen + GM.carbon_dioxide = air_contents.carbon_dioxide + GM.nitrogen = air_contents.nitrogen + GM.toxins = air_contents.toxins + GM.temperature = air_contents.temperature + return GM + +// For now, copying what I found in an unused FEA file (and almost identical in a +// used ZAS file). Means that assume_air and remove_air don't actually alter the +// air contents. +/obj/structure/transit_tube_pod/assume_air(datum/gas_mixture/giver) + return air_contents.merge(giver) + +/obj/structure/transit_tube_pod/remove_air(amount) + return air_contents.remove(amount) + + + +// Called when a pod arrives at, and before a pod departs from a station, +// giving it a chance to mix its internal air supply with the turf it is +// currently on. +/obj/structure/transit_tube_pod/proc/mix_air() + var/datum/gas_mixture/environment = loc.return_air() + var/env_pressure = environment.return_pressure() + var/int_pressure = air_contents.return_pressure() + var/total_pressure = env_pressure + int_pressure + + if(total_pressure == 0) + return + + // Math here: Completely made up, not based on realistic equasions. + // Goal is to balance towards equal pressure, but ensure some gas + // transfer in both directions regardless. + // Feel free to rip this out and replace it with something better, + // I don't really know muhch about how gas transfer rates work in + // SS13. + var/transfer_in = max(0.1, 0.5 * (env_pressure - int_pressure) / total_pressure) + var/transfer_out = max(0.1, 0.3 * (int_pressure - env_pressure) / total_pressure) + + var/datum/gas_mixture/from_env = loc.remove_air(environment.total_moles() * transfer_in) + var/datum/gas_mixture/from_int = air_contents.remove(air_contents.total_moles() * transfer_out) + + loc.assume_air(from_int) + air_contents.merge(from_env) + + + +// When the player moves, check if the pos is currently stopped at a station. +// if it is, check the direction. If the direction matches the direction of +// the station, try to exit. If the direction matches one of the station's +// tube directions, launch the pod in that direction. +/obj/structure/transit_tube_pod/relaymove(mob/mob, direction) + 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_view(null) + + //if(moving && istype(loc, /turf/space)) + // Todo: If you get out of a moving pod in space, you should move as well. + // Same direction as pod? Direcion you moved? Halfway between? + + if(!moving) + for(var/obj/structure/transit_tube/station/station in loc) + if(dir in station.directions()) + 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_view(null) + + else + station.open_animation() + + else if(direction in station.directions()) + dir = direction + station.launch_pod() + return + + for(var/obj/structure/transit_tube/tube in loc) + if(dir in tube.directions()) + if(tube.has_exit(direction)) + dir = direction + return + + +// Parse the icon_state into a list of directions. +// This means that mappers can use Dream Maker's built in +// "Generate Instances from Icon-states" option to get all +// variations. Additionally, as a separate proc, sub-types +// can handle it more intelligently. +/obj/structure/transit_tube/proc/init_dirs() + if(icon_state == "auto") + // Additional delay, for map loading. + spawn(1) + init_dirs_automatic() + + else + tube_dirs = parse_dirs(icon_state) + + if(copytext(icon_state, 1, 3) == "D-" || findtextEx(icon_state, "Pass")) + density = 0 + + + +// Tube station directions are simply 90 to either side of +// the exit. +/obj/structure/transit_tube/station/init_dirs() + tube_dirs = list(turn(dir, 90), turn(dir, -90)) + + + +// Initialize dirs by searching for tubes that do/might connect +// on nearby turfs. Create corner pieces if nessecary. +// Pick two directions, preferring tubes that already connect +// to loc, or other auto tubes if there aren't enough connections. +/obj/structure/transit_tube/proc/init_dirs_automatic() + var/list/connected = list() + var/list/connected_auto = list() + + for(var/direction in tube_dir_list) + var/location = get_step(loc, direction) + for(var/obj/structure/transit_tube/tube in location) + if(tube.directions() == null && tube.icon_state == "auto") + connected_auto += direction + break + + else if(turn(direction, 180) in tube.directions()) + connected += direction + break + + connected += connected_auto + + tube_dirs = select_automatic_dirs(connected) + + if(length(tube_dirs) == 2 && tube_dir_list.Find(tube_dirs[1]) > tube_dir_list.Find(tube_dirs[2])) + tube_dirs.Swap(1, 2) + + generate_automatic_corners(tube_dirs) + select_automatic_icon_state(tube_dirs) + + + +// Given a list of directions, look a pair that forms a 180 or +// 135 degree angle, and return a list containing the pair. +// If none exist, return list(connected[1], turn(connected[1], 180) +/obj/structure/transit_tube/proc/select_automatic_dirs(connected) + if(length(connected) < 1) + return list() + + for(var/i = 1, i <= length(connected), i++) + for(var/j = i + 1, j <= length(connected), j++) + var/d1 = connected[i] + var/d2 = connected[j] + + if(d1 == turn(d2, 135) || d1 == turn(d2, 180) || d1 == turn(d2, 225)) + return list(d1, d2) + + return list(connected[1], turn(connected[1], 180)) + + + +/obj/structure/transit_tube/proc/select_automatic_icon_state(directions) + if(length(directions) == 2) + icon_state = "[dir2text_short(directions[1])]-[dir2text_short(directions[2])]" + + + +// Look for diagonal directions, generate the decorative corners in each. +/obj/structure/transit_tube/proc/generate_automatic_corners(directions) + for(var/direction in directions) + if(direction == 5 || direction == 6 || direction == 9 || direction == 10) + if(direction & NORTH) + create_automatic_decorative_corner(get_step(loc, NORTH), direction ^ 3) + + else + create_automatic_decorative_corner(get_step(loc, SOUTH), direction ^ 3) + + if(direction & EAST) + create_automatic_decorative_corner(get_step(loc, EAST), direction ^ 12) + + else + create_automatic_decorative_corner(get_step(loc, WEST), direction ^ 12) + + + +// Generate a corner, if one doesn't exist for the direction on the turf. +/obj/structure/transit_tube/proc/create_automatic_decorative_corner(location, direction) + var/state = "D-[dir2text_short(direction)]" + + for(var/obj/structure/transit_tube/tube in location) + if(tube.icon_state == state) + return + + var/obj/structure/transit_tube/tube = new(location) + tube.icon_state = state + tube.init_dirs() + + + +// Uses a list() to cache return values. Since they should +// never be edited directly, all tubes with a certain +// icon_state can just reference the same list. In theory, +// reduces memory usage, and improves CPU cache usage. +// In reality, I don't know if that is quite how BYOND works, +// but it is probably safer to assume the existence of, and +// rely on, a sufficiently smart compiler/optimizer. +/obj/structure/transit_tube/proc/parse_dirs(text) + var/global/list/direction_table = list() + + if(text in direction_table) + return direction_table[text] + + var/list/split_text = text2list(text, "-") + + // If the first token is D, the icon_state represents + // a purely decorative tube, and doesn't actually + // connect to anything. + if(split_text[1] == "D") + direction_table[text] = list() + return null + + var/list/directions = list() + + for(var/text_part in split_text) + var/direction = text2dir_extended(text_part) + + if(direction > 0) + directions += direction + + direction_table[text] = directions + return directions + + + +// A copy of text2dir, extended to accept one and two letter +// directions, and to clearly return 0 otherwise. +/obj/structure/transit_tube/proc/text2dir_extended(direction) + switch(uppertext(direction)) + if("NORTH", "N") + return 1 + if("SOUTH", "S") + return 2 + if("EAST", "E") + return 4 + if("WEST", "W") + return 8 + if("NORTHEAST", "NE") + return 5 + if("NORTHWEST", "NW") + return 9 + if("SOUTHEAST", "SE") + return 6 + if("SOUTHWEST", "SW") + return 10 + else + return 0 + + + +// A copy of dir2text, which returns the short one or two letter +// directions used in tube icon states. +/obj/structure/transit_tube/proc/dir2text_short(direction) + switch(direction) + if(1) + return "N" + if(2) + return "S" + if(4) + return "E" + if(8) + return "W" + if(5) + return "NE" + if(6) + return "SE" + if(9) + return "NW" + if(10) + return "SW" + else + return diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 303d1ad81f4..5c9900c3c5c 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -178,7 +178,7 @@ /obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up overlays.Cut() //once it's been on for a while, in addition to handling the water overlay. if(mymist) - del(mymist) + qdel(mymist) if(on) overlays += image('icons/obj/watercloset.dmi', src, "water", MOB_LAYER + 1, dir) @@ -196,8 +196,8 @@ ismist = 1 mymist = new /obj/effect/mist(loc) spawn(250) - if(src && !on) - del(mymist) + if(src && !on && mymist) + qdel(mymist) ismist = 0 @@ -295,7 +295,7 @@ loc.clean_blood() for(var/obj/effect/E in tile) if(istype(E,/obj/effect/rune) || istype(E,/obj/effect/decal/cleanable) || istype(E,/obj/effect/overlay)) - del(E) + qdel(E) /obj/machinery/shower/process() @@ -369,7 +369,7 @@ if(istype(O, /obj/item/trash)) user.drop_item() user << "You wash up [O]." //sims!!! - del(O) + qdel(O) if(istype(O, /obj/item/weapon/reagent_containers)) var/obj/item/weapon/reagent_containers/RG = O diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index eb161a4775b..af17d680569 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -31,7 +31,7 @@ obj/structure/windoor_assembly/New(dir=NORTH) src.ini_dir = src.dir air_update_turf(1) -obj/structure/windoor_assembly/Del() +obj/structure/windoor_assembly/Destroy() density = 0 air_update_turf(1) ..() @@ -87,7 +87,7 @@ obj/structure/windoor_assembly/Del() if(secure) var/obj/item/stack/rods/R = new (get_turf(src), 4) R.add_fingerprint(user) - del(src) + qdel(src) else user << "You need more welding fuel to dissassemble the windoor assembly." return @@ -258,7 +258,7 @@ obj/structure/windoor_assembly/Del() src.electronics.loc = windoor windoor.close() - del(src) + qdel(src) else diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 72fda7d649e..f4e1f28739b 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -22,39 +22,39 @@ if(health <= 0) new /obj/item/weapon/shard(loc) new /obj/item/stack/rods(loc) - del(src) + qdel(src) return /obj/structure/window/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) new /obj/item/weapon/shard(loc) if(reinf) new /obj/item/stack/rods(loc) - del(src) + qdel(src) return if(3.0) if(prob(50)) new /obj/item/weapon/shard(loc) if(reinf) new /obj/item/stack/rods(loc) - del(src) + qdel(src) return /obj/structure/window/blob_act() new /obj/item/weapon/shard(loc) if(reinf) new /obj/item/stack/rods(loc) - del(src) + qdel(src) /obj/structure/window/meteorhit() //world << "glass at [x],[y],[z] Mhit" new /obj/item/weapon/shard( loc ) if(reinf) new /obj/item/stack/rods( loc) - del(src) + qdel(src) /obj/structure/window/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(istype(mover) && mover.checkpass(PASSGLASS)) @@ -94,7 +94,7 @@ if(health <= 0) new /obj/item/weapon/shard(loc) if(reinf) new /obj/item/stack/rods(loc) - del(src) + qdel(src) /obj/structure/window/attack_tk(mob/user as mob) user.visible_message("Something knocks on [src].") @@ -112,7 +112,7 @@ if(reinf) var/obj/item/stack/rods/R = new (loc) R.add_fingerprint(user) - del(src) + qdel(src) else user.visible_message("[user] knocks on [src].") add_fingerprint(user) @@ -131,7 +131,7 @@ user.visible_message("[user] smashes through [src]!") new /obj/item/weapon/shard(loc) if(reinf) new /obj/item/stack/rods(loc) - del(src) + qdel(src) else //for nicer text~ user.visible_message("[user] smashes into [src]!") playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) @@ -190,7 +190,7 @@ G = new (user.loc) G.add_fingerprint(user) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - src.Del(1) + qdel(src) else if(I.damtype == BRUTE || I.damtype == BURN) hit(I.force) @@ -227,7 +227,7 @@ else new /obj/item/weapon/shard(loc) if(reinf) new /obj/item/stack/rods(loc) - del(src) + qdel(src) return @@ -304,12 +304,12 @@ return -/obj/structure/window/Del(quiet) +/obj/structure/window/Destroy() density = 0 air_update_turf(1) - if(!quiet)playsound(src, "shatter", 70, 1) + if(anchored)playsound(src, "shatter", 70, 1) update_nearby_icons() - loc = null //garbage collect + ..() /obj/structure/window/Move() diff --git a/code/game/sound.dm b/code/game/sound.dm index 3cec0739a61..59ff419701f 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -1,78 +1,78 @@ -/proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff, surround = 1) - - soundin = get_sfx(soundin) // same sound for everyone - - if(isarea(source)) - error("[source] is an area and is trying to make the sound: [soundin]") - return - - var/frequency = get_rand_frequency() // Same frequency for everybody - var/turf/turf_source = get_turf(source) - - // Looping through the player list has the added bonus of working for mobs inside containers - for (var/P in player_list) - var/mob/M = P - if(!M || !M.client) - continue - if(get_dist(M, turf_source) <= world.view + extrarange) - var/turf/T = get_turf(M) - if(T && T.z == turf_source.z) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, surround) - -var/const/FALLOFF_SOUNDS = 1 -var/const/SURROUND_CAP = 7 - -/mob/proc/playsound_local(var/turf/turf_source, soundin, vol as num, vary, frequency, falloff, surround = 1) - if(!src.client || ear_deaf > 0) return - soundin = get_sfx(soundin) - - var/sound/S = sound(soundin) - S.wait = 0 //No queue - S.channel = 0 //Any channel - S.volume = vol - - if (vary) - if(frequency) - S.frequency = frequency - else - S.frequency = get_rand_frequency() - - if(isturf(turf_source)) - // 3D sounds, the technology is here! - var/turf/T = get_turf(src) - if (surround) - var/dx = turf_source.x - T.x // Hearing from the right/left - S.x = round(max(-SURROUND_CAP, min(SURROUND_CAP, dx)), 1) - - var/dz = turf_source.y - T.y // Hearing from infront/behind - S.z = round(max(-SURROUND_CAP, min(SURROUND_CAP, dz)), 1) - - // The y value is for above your head, but there is no ceiling in 2d spessmens. - S.y = 1 - S.falloff = (falloff ? falloff : FALLOFF_SOUNDS) - - src << S - -/client/proc/playtitlemusic() - if(!ticker || !ticker.login_music) return - if(prefs.toggles & SOUND_LOBBY) - src << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS - -/proc/get_rand_frequency() - return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs. - -/proc/get_sfx(soundin) - if(istext(soundin)) - switch(soundin) - if ("shatter") soundin = pick('sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg') - if ("explosion") soundin = pick('sound/effects/Explosion1.ogg','sound/effects/Explosion2.ogg') - if ("sparks") soundin = pick('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks4.ogg') - if ("rustle") soundin = pick('sound/effects/rustle1.ogg','sound/effects/rustle2.ogg','sound/effects/rustle3.ogg','sound/effects/rustle4.ogg','sound/effects/rustle5.ogg') - if ("bodyfall") soundin = pick('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg') - if ("punch") soundin = pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg') - if ("clownstep") soundin = pick('sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg') - if ("swing_hit") soundin = pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg') - if ("hiss") soundin = pick('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg') - if ("pageturn") soundin = pick('sound/effects/pageturn1.ogg', 'sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg') - if ("gunshot") soundin = pick('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg') +/proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff, surround = 1) + + soundin = get_sfx(soundin) // same sound for everyone + + if(isarea(source)) + error("[source] is an area and is trying to make the sound: [soundin]") + return + + var/frequency = get_rand_frequency() // Same frequency for everybody + var/turf/turf_source = get_turf(source) + + // Looping through the player list has the added bonus of working for mobs inside containers + for (var/P in player_list) + var/mob/M = P + if(!M || !M.client) + continue + if(get_dist(M, turf_source) <= world.view + extrarange) + var/turf/T = get_turf(M) + if(T && T.z == turf_source.z) + M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, surround) + +var/const/FALLOFF_SOUNDS = 1 +var/const/SURROUND_CAP = 7 + +/mob/proc/playsound_local(var/turf/turf_source, soundin, vol as num, vary, frequency, falloff, surround = 1) + if(!src.client || ear_deaf > 0) return + soundin = get_sfx(soundin) + + var/sound/S = sound(soundin) + S.wait = 0 //No queue + S.channel = 0 //Any channel + S.volume = vol + + if (vary) + if(frequency) + S.frequency = frequency + else + S.frequency = get_rand_frequency() + + if(isturf(turf_source)) + // 3D sounds, the technology is here! + var/turf/T = get_turf(src) + if (surround) + var/dx = turf_source.x - T.x // Hearing from the right/left + S.x = round(max(-SURROUND_CAP, min(SURROUND_CAP, dx)), 1) + + var/dz = turf_source.y - T.y // Hearing from infront/behind + S.z = round(max(-SURROUND_CAP, min(SURROUND_CAP, dz)), 1) + + // The y value is for above your head, but there is no ceiling in 2d spessmens. + S.y = 1 + S.falloff = (falloff ? falloff : FALLOFF_SOUNDS) + + src << S + +/client/proc/playtitlemusic() + if(!ticker || !ticker.login_music) return + if(prefs.toggles & SOUND_LOBBY) + src << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS + +/proc/get_rand_frequency() + return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs. + +/proc/get_sfx(soundin) + if(istext(soundin)) + switch(soundin) + if ("shatter") soundin = pick('sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg') + if ("explosion") soundin = pick('sound/effects/Explosion1.ogg','sound/effects/Explosion2.ogg') + if ("sparks") soundin = pick('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks4.ogg') + if ("rustle") soundin = pick('sound/effects/rustle1.ogg','sound/effects/rustle2.ogg','sound/effects/rustle3.ogg','sound/effects/rustle4.ogg','sound/effects/rustle5.ogg') + if ("bodyfall") soundin = pick('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg') + if ("punch") soundin = pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg') + if ("clownstep") soundin = pick('sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg') + if ("swing_hit") soundin = pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg') + if ("hiss") soundin = pick('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg') + if ("pageturn") soundin = pick('sound/effects/pageturn1.ogg', 'sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg') + if ("gunshot") soundin = pick('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg') return soundin \ No newline at end of file diff --git a/code/game/turfs/simulated/dirtystation.dm b/code/game/turfs/simulated/dirtystation.dm index 4516bf9fb77..a9c7e18f082 100644 --- a/code/game/turfs/simulated/dirtystation.dm +++ b/code/game/turfs/simulated/dirtystation.dm @@ -1,144 +1,144 @@ -//Janitors! Janitors, janitors, janitors! -Sayu - - -//Conspicuously not-recent versions of suspicious cleanables - -/obj/effect/decal/cleanable/blood/old - name = "dried blood" - desc = "Looks like it's been here a while. Eew." - New() - ..() - icon_state += "-old" - -/obj/effect/decal/cleanable/blood/gibs/old - name = "old rotting gibs" - desc = "Oh god, why didn't anyone clean this up? It smells terrible." - New() - ..() - icon_state += "-old" - dir = pick(1,2,4,8) - -/obj/effect/decal/cleanable/vomit/old - name = "crusty dried vomit" - desc = "You try not to look at the chunks, and fail." - New() - ..() - icon_state += "-old" - -/obj/effect/decal/cleanable/robot_debris/old - name = "dusty robot debris" - desc = "Looks like nobody has touched this in a while." - - -//Making the station dirty, one tile at a time. Called by master controller's setup_objects - -/turf/simulated/floor/proc/MakeDirty() - if(prob(66)) //fastest possible exit 2/3 of the time - return - - // These look weird if you make them dirty - if(istype(src, /turf/simulated/floor/carpet) || istype(src, /turf/simulated/floor/grass) || istype(src, /turf/simulated/floor/beach) || istype(src, /turf/simulated/floor/holofloor) || istype(src, /turf/simulated/floor/plating/snow) || istype(src, /turf/simulated/floor/plating/ironsand)) - return - - if(locate(/obj/structure/grille) in contents) - return - - var/area/A = loc - - //zero dirt - if(!istype(A) || istype(A, /area/centcom) || istype(A, /area/holodeck) || istype(A, /area/library) || istype(A, /area/janitor) || istype(A, /area/chapel) || istype(A, /area/mine/explored) || istype(A, /area/mine/unexplored) || istype(A, /area/solar) || istype(A, /area/atmos) || istype(A, /area/medical/virology)) - return - - //high dirt - 1/3 - if(istype(A, /area/toxins/test_area) || istype(A, /area/mine/production) || istype(A, /area/mine/living_quarters) || istype(A, /area/mine/north_outpost) || istype(A, /area/mine/west_outpost) || istype(A, /area/wreck) || istype(A, /area/derelict) || istype(A, /area/djstation)) - new /obj/effect/decal/cleanable/dirt(src) //vanilla, but it works - return - - - if(prob(80)) //mid dirt - 1/15 - return - - - if(istype(A, /area/engine) || istype(A,/area/assembly) || istype(A,/area/maintenance) || istype(A,/area/construction)) - //Blood, sweat, and oil. Oh, and dirt. - if(prob(3)) - new /obj/effect/decal/cleanable/blood/old(src) - else - if(prob(35)) - if(prob(4)) - new /obj/effect/decal/cleanable/robot_debris/old(src) - else - new /obj/effect/decal/cleanable/oil(src) - else - new /obj/effect/decal/cleanable/dirt(src) - return - - if(istype(A, /area/crew_quarters/toilet) || istype(A, /area/crew_quarters/locker/locker_toilet) || istype(A, /area/crew_quarters/bar)) - if(prob(40)) - if(prob(90)) - new /obj/effect/decal/cleanable/vomit/old(src) - else - new /obj/effect/decal/cleanable/blood/old(src) - else - new /obj/effect/decal/cleanable/dirt(src) - return - - if(istype(A, /area/quartermaster)) - if(prob(75)) - new /obj/effect/decal/cleanable/dirt(src) - else - new /obj/effect/decal/cleanable/oil(src) - return - - - - if(prob(75)) //low dirt - 1/60 - return - - - - if(istype(A, /area/turret_protected) || istype(A, /area/security)) //chance of incident - if(prob(20)) - if(prob(5)) - new /obj/effect/decal/cleanable/blood/gibs/old(src) - else - new /obj/effect/decal/cleanable/blood/old(src) - else - new /obj/effect/decal/cleanable/dirt(src) - return - - - if(istype(A, /area/crew_quarters/kitchen)) //Kitchen messes - if(prob(60)) - if(prob(50)) - new /obj/effect/decal/cleanable/egg_smudge(src) - else - new /obj/effect/decal/cleanable/flour(src) - else if(prob(33)) - new /obj/effect/decal/cleanable/dirt(src) - return - - if(istype(A, /area/medical)) //Kept clean, but chance of blood - if(prob(66)) - if(prob(5)) - new /obj/effect/decal/cleanable/blood/gibs/old(src) - else - new /obj/effect/decal/cleanable/blood/old(src) - else - if(prob(30)) - if(istype(A, /area/medical/morgue)) - new /obj/item/weapon/ectoplasm(src) - else - new /obj/effect/decal/cleanable/vomit/old(src) - return - - if(istype(A, /area/toxins)) - if(prob(80)) - new /obj/effect/decal/cleanable/dirt(src) - else - new /obj/effect/decal/cleanable/greenglow(src) //this cleans itself up but it might startle you when you see it. - return - - //default - new /obj/effect/decal/cleanable/dirt(src) +//Janitors! Janitors, janitors, janitors! -Sayu + + +//Conspicuously not-recent versions of suspicious cleanables + +/obj/effect/decal/cleanable/blood/old + name = "dried blood" + desc = "Looks like it's been here a while. Eew." + New() + ..() + icon_state += "-old" + +/obj/effect/decal/cleanable/blood/gibs/old + name = "old rotting gibs" + desc = "Oh god, why didn't anyone clean this up? It smells terrible." + New() + ..() + icon_state += "-old" + dir = pick(1,2,4,8) + +/obj/effect/decal/cleanable/vomit/old + name = "crusty dried vomit" + desc = "You try not to look at the chunks, and fail." + New() + ..() + icon_state += "-old" + +/obj/effect/decal/cleanable/robot_debris/old + name = "dusty robot debris" + desc = "Looks like nobody has touched this in a while." + + +//Making the station dirty, one tile at a time. Called by master controller's setup_objects + +/turf/simulated/floor/proc/MakeDirty() + if(prob(66)) //fastest possible exit 2/3 of the time + return + + // These look weird if you make them dirty + if(istype(src, /turf/simulated/floor/carpet) || istype(src, /turf/simulated/floor/grass) || istype(src, /turf/simulated/floor/beach) || istype(src, /turf/simulated/floor/holofloor) || istype(src, /turf/simulated/floor/plating/snow) || istype(src, /turf/simulated/floor/plating/ironsand)) + return + + if(locate(/obj/structure/grille) in contents) + return + + var/area/A = loc + + //zero dirt + if(!istype(A) || istype(A, /area/centcom) || istype(A, /area/holodeck) || istype(A, /area/library) || istype(A, /area/janitor) || istype(A, /area/chapel) || istype(A, /area/mine/explored) || istype(A, /area/mine/unexplored) || istype(A, /area/solar) || istype(A, /area/atmos) || istype(A, /area/medical/virology)) + return + + //high dirt - 1/3 + if(istype(A, /area/toxins/test_area) || istype(A, /area/mine/production) || istype(A, /area/mine/living_quarters) || istype(A, /area/mine/north_outpost) || istype(A, /area/mine/west_outpost) || istype(A, /area/wreck) || istype(A, /area/derelict) || istype(A, /area/djstation)) + new /obj/effect/decal/cleanable/dirt(src) //vanilla, but it works + return + + + if(prob(80)) //mid dirt - 1/15 + return + + + if(istype(A, /area/engine) || istype(A,/area/assembly) || istype(A,/area/maintenance) || istype(A,/area/construction)) + //Blood, sweat, and oil. Oh, and dirt. + if(prob(3)) + new /obj/effect/decal/cleanable/blood/old(src) + else + if(prob(35)) + if(prob(4)) + new /obj/effect/decal/cleanable/robot_debris/old(src) + else + new /obj/effect/decal/cleanable/oil(src) + else + new /obj/effect/decal/cleanable/dirt(src) + return + + if(istype(A, /area/crew_quarters/toilet) || istype(A, /area/crew_quarters/locker/locker_toilet) || istype(A, /area/crew_quarters/bar)) + if(prob(40)) + if(prob(90)) + new /obj/effect/decal/cleanable/vomit/old(src) + else + new /obj/effect/decal/cleanable/blood/old(src) + else + new /obj/effect/decal/cleanable/dirt(src) + return + + if(istype(A, /area/quartermaster)) + if(prob(75)) + new /obj/effect/decal/cleanable/dirt(src) + else + new /obj/effect/decal/cleanable/oil(src) + return + + + + if(prob(75)) //low dirt - 1/60 + return + + + + if(istype(A, /area/turret_protected) || istype(A, /area/security)) //chance of incident + if(prob(20)) + if(prob(5)) + new /obj/effect/decal/cleanable/blood/gibs/old(src) + else + new /obj/effect/decal/cleanable/blood/old(src) + else + new /obj/effect/decal/cleanable/dirt(src) + return + + + if(istype(A, /area/crew_quarters/kitchen)) //Kitchen messes + if(prob(60)) + if(prob(50)) + new /obj/effect/decal/cleanable/egg_smudge(src) + else + new /obj/effect/decal/cleanable/flour(src) + else if(prob(33)) + new /obj/effect/decal/cleanable/dirt(src) + return + + if(istype(A, /area/medical)) //Kept clean, but chance of blood + if(prob(66)) + if(prob(5)) + new /obj/effect/decal/cleanable/blood/gibs/old(src) + else + new /obj/effect/decal/cleanable/blood/old(src) + else + if(prob(30)) + if(istype(A, /area/medical/morgue)) + new /obj/item/weapon/ectoplasm(src) + else + new /obj/effect/decal/cleanable/vomit/old(src) + return + + if(istype(A, /area/toxins)) + if(prob(80)) + new /obj/effect/decal/cleanable/dirt(src) + else + new /obj/effect/decal/cleanable/greenglow(src) //this cleans itself up but it might startle you when you see it. + return + + //default + new /obj/effect/decal/cleanable/dirt(src) return \ No newline at end of file diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 589cbbe622d..a578458d2b1 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -302,7 +302,7 @@ turf/simulated/floor/proc/update_icon() icon_state = "plating" //Nothing is defined, so just make it plating icon_plating = "plating" if(floor_tile) - del(floor_tile) + qdel(floor_tile) SetLuminosity(0) floor_tile = null @@ -423,7 +423,7 @@ turf/simulated/floor/proc/update_icon() var/obj/item/stack/tile/light/T = floor_tile if(T.state) user.drop_item() - del(C) + qdel(C) T.state = C //fixing it by bashing it with a light bulb, fun eh? update_icon() user << "\blue You replace the light bulb." diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 4af37aacc69..3fffc37ea3e 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -294,7 +294,7 @@ user << "The thermite melts through the wall." spawn(100) - if(O) del(O) + if(O) qdel(O) // F.sd_LumReset() //TODO: ~Carn return diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 403feb5ed34..6caaf020001 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -84,7 +84,7 @@ if (O.amount > 1) O.amount-- else - del(O) + qdel(O) return if(2) @@ -230,7 +230,7 @@ if (MS.amount > 1) MS.amount-- else - del(MS) + qdel(MS) //APC else if( istype(W,/obj/item/apc_frame) ) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 1f72827af24..c26bc1e88c9 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -31,7 +31,7 @@ var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) if(L) var/obj/item/stack/tile/plasteel/S = C - del(L) + qdel(L) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) S.build(src) S.use(1) @@ -59,11 +59,11 @@ if(A.z > 6) return if (A.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE - 1) || A.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE - 1)) if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) + qdel(A) return if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels ... And moving this shit down here so it only fires when they're actually trying to change z-level. - del(A) //The disk's Del() proc ensures a new one is created + qdel(A) //The disk's Del() proc ensures a new one is created return var/list/disk_search = A.search_contents_for(/obj/item/weapon/disk/nuclear) @@ -82,10 +82,10 @@ MM.inertia_dir = 2 else for(var/obj/item/weapon/disk/nuclear/N in disk_search) - del(N)//Make the disk respawn it is on a clientless mob or corpse + qdel(N)//Make the disk respawn it is on a clientless mob or corpse else for(var/obj/item/weapon/disk/nuclear/N in disk_search) - del(N)//Make the disk respawn if it is floating on its own + qdel(N)//Make the disk respawn if it is floating on its own return var/move_to_z = src.z @@ -136,7 +136,7 @@ if(src.x <= 1) if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) + qdel(A) return var/list/cur_pos = src.get_global_map_pos() @@ -161,7 +161,7 @@ A.loc.Entered(A) else if (src.x >= world.maxx) if(istype(A, /obj/effect/meteor)) - del(A) + qdel(A) return var/list/cur_pos = src.get_global_map_pos() @@ -186,7 +186,7 @@ A.loc.Entered(A) else if (src.y <= 1) if(istype(A, /obj/effect/meteor)) - del(A) + qdel(A) return var/list/cur_pos = src.get_global_map_pos() if(!cur_pos) return @@ -211,7 +211,7 @@ else if (src.y >= world.maxy) if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) + qdel(A) return var/list/cur_pos = src.get_global_map_pos() if(!cur_pos) return @@ -235,8 +235,5 @@ A.loc.Entered(A) return -turf/space/handle_fall() - return - /turf/space/handle_slip() return \ No newline at end of file diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 3f3e538b816..c27b4893cc2 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -107,7 +107,7 @@ if(ismob(M)) if(!M:lastarea) M:lastarea = get_area(M.loc) - if(M:lastarea.has_gravity == 0) + if(!has_gravity(M)) inertial_drift(M) /* @@ -178,7 +178,7 @@ /turf/proc/RemoveLattice() var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) if(L) - del L + qdel(L) //Creates a new turf /turf/proc/ChangeTurf(var/path) @@ -293,28 +293,30 @@ faller.lying = pick(90, 270) if(!forced) return - playsound(src, "bodyfall", 50, 1) + if(has_gravity(src)) + playsound(src, "bodyfall", 50, 1) /turf/handle_slip(mob/slipper, s_amount, w_amount, obj/O, lube) - var/mob/living/carbon/M = slipper - if (M.m_intent=="walk" && (lube&NO_SLIP_WHEN_WALKING)) - return 0 - if(!M.lying) - M.stop_pulling() - if(lube&STEP) - step(M, M.dir) - if(lube&SLIDE) - for(var/i=1, i<5, i++) - spawn (i) - step(M, M.dir) - if(M.lying) //did I fall over? - M.adjustBruteLoss(2) - if(O) - M << "You slipped on the [O.name]!" - else - M << "You slipped!" - playsound(M.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(s_amount) - M.Weaken(w_amount) - return 1 + if(has_gravity(src)) + var/mob/living/carbon/M = slipper + if (M.m_intent=="walk" && (lube&NO_SLIP_WHEN_WALKING)) + return 0 + if(!M.lying) + M.stop_pulling() + if(lube&STEP) + step(M, M.dir) + if(lube&SLIDE) + for(var/i=1, i<5, i++) + spawn (i) + step(M, M.dir) + if(M.lying) //did I fall over? + M.adjustBruteLoss(2) + if(O) + M << "You slipped on the [O.name]!" + else + M << "You slipped!" + playsound(M.loc, 'sound/misc/slip.ogg', 50, 1, -3) + M.Stun(s_amount) + M.Weaken(w_amount) + return 1 return 0 // no success. Used in clown pda and wet floors diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index a0ef8fe00ea..5af2ebb0d14 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -22,12 +22,12 @@ F << "[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z]) || [src] [message]
    " //ADMINVERBS -/client/proc/investigate_show( subject in list("hrefs","notes","ntsl","singulo","wires","telesci") ) +/client/proc/investigate_show( subject in list("hrefs","notes","ntsl","singulo","wires","telesci", "gravity") ) set name = "Investigate" set category = "Admin" if(!holder) return switch(subject) - if("singulo", "ntsl", "wires", "telesci") //general one-round-only stuff + if("singulo", "ntsl", "wires", "telesci", "gravity") //general one-round-only stuff var/F = investigate_subject2file(subject) if(!F) src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." diff --git a/code/modules/admin/banappearance.dm b/code/modules/admin/banappearance.dm index af867a27a62..829ffee38e5 100644 --- a/code/modules/admin/banappearance.dm +++ b/code/modules/admin/banappearance.dm @@ -1,109 +1,109 @@ -//ban people from using custom names and appearances. that'll show 'em. - -var/appearanceban_runonce //Updates legacy bans with new info -var/appearance_keylist[0] //to store the keys - -/proc/appearance_fullban(mob/M, reason) - if (!M || !M.key) return - appearance_keylist.Add(text("[M.ckey] ## [reason]")) - appearance_savebanfile() - -/proc/appearance_client_fullban(ckey) - if (!ckey) return - appearance_keylist.Add(text("[ckey]")) - appearance_savebanfile() - -//returns a reason if M is banned, returns 0 otherwise -/proc/appearance_isbanned(mob/M) - if(M) - for(var/s in appearance_keylist) - if(findtext(s, "[M.ckey]") == 1) - var/startpos = findtext(s, "## ") + 3 - if(startpos && startpos < length(s)) - var/text = copytext(s, startpos, 0) - if(text) - return text - return "Reason Unspecified" - return 0 - -/* -DEBUG -/mob/verb/list_all_appearances() - set name = "list all appearances" - - for(var/s in appearance_keylist) - world << s - -/mob/verb/reload_appearances() - set name = "reload appearances" - - appearance_loadbanfile() -*/ - -/proc/appearance_loadbanfile() - if(config.ban_legacy_system) - var/savefile/S=new("data/appearance_full.ban") - S["keys[0]"] >> appearance_keylist - log_admin("Loading appearance_rank") - S["runonce"] >> appearanceban_runonce - - if (!length(appearance_keylist)) - appearance_keylist=list() - log_admin("appearance_keylist was empty") - else - if(!establish_db_connection()) - world.log << "Database connection failed. Reverting to the legacy ban system." - diary << "Database connection failed. Reverting to the legacy ban system." - config.ban_legacy_system = 1 - appearance_loadbanfile() - return - - //appearance bans - var/DBQuery/query = dbcon.NewQuery("SELECT ckey FROM erro_ban WHERE bantype = 'APPEARANCE_PERMABAN' AND NOT unbanned = 1") - query.Execute() - - while(query.NextRow()) - var/ckey = query.item[1] - - appearance_keylist.Add("[ckey]") - -/proc/appearance_savebanfile() - var/savefile/S=new("data/appearance_full.ban") - S["keys[0]"] << appearance_keylist - -/proc/appearance_unban(mob/M) - appearance_remove("[M.ckey]") - appearance_savebanfile() - - -/proc/appearance_updatelegacybans() - if(!appearanceban_runonce) - log_admin("Updating appearancefile!") - // Updates bans.. Or fixes them. Either way. - for(var/T in appearance_keylist) - if(!T) continue - appearanceban_runonce++ //don't run this update again - - -/proc/appearance_remove(X) - for (var/i = 1; i <= length(appearance_keylist); i++) - if( findtext(appearance_keylist[i], "[X]") ) - appearance_keylist.Remove(appearance_keylist[i]) - appearance_savebanfile() - return 1 - return 0 - -/* -proc/DB_ban_isappearancebanned(var/playerckey) - establish_db_connection() - if(!dbcon.IsConnected()) - return - - var/sqlplayerckey = sql_sanitize_text(ckey(playerckey)) - - var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_ban WHERE CKEY = '[sqlplayerckey]' AND ((bantype = 'APPEARANCE_PERMABAN') OR (bantype = 'APPEARANCE_TEMPBAN' AND expiration_time > Now())) AND unbanned != 1") - query.Execute() - while(query.NextRow()) - return 1 - return 0 +//ban people from using custom names and appearances. that'll show 'em. + +var/appearanceban_runonce //Updates legacy bans with new info +var/appearance_keylist[0] //to store the keys + +/proc/appearance_fullban(mob/M, reason) + if (!M || !M.key) return + appearance_keylist.Add(text("[M.ckey] ## [reason]")) + appearance_savebanfile() + +/proc/appearance_client_fullban(ckey) + if (!ckey) return + appearance_keylist.Add(text("[ckey]")) + appearance_savebanfile() + +//returns a reason if M is banned, returns 0 otherwise +/proc/appearance_isbanned(mob/M) + if(M) + for(var/s in appearance_keylist) + if(findtext(s, "[M.ckey]") == 1) + var/startpos = findtext(s, "## ") + 3 + if(startpos && startpos < length(s)) + var/text = copytext(s, startpos, 0) + if(text) + return text + return "Reason Unspecified" + return 0 + +/* +DEBUG +/mob/verb/list_all_appearances() + set name = "list all appearances" + + for(var/s in appearance_keylist) + world << s + +/mob/verb/reload_appearances() + set name = "reload appearances" + + appearance_loadbanfile() +*/ + +/proc/appearance_loadbanfile() + if(config.ban_legacy_system) + var/savefile/S=new("data/appearance_full.ban") + S["keys[0]"] >> appearance_keylist + log_admin("Loading appearance_rank") + S["runonce"] >> appearanceban_runonce + + if (!length(appearance_keylist)) + appearance_keylist=list() + log_admin("appearance_keylist was empty") + else + if(!establish_db_connection()) + world.log << "Database connection failed. Reverting to the legacy ban system." + diary << "Database connection failed. Reverting to the legacy ban system." + config.ban_legacy_system = 1 + appearance_loadbanfile() + return + + //appearance bans + var/DBQuery/query = dbcon.NewQuery("SELECT ckey FROM erro_ban WHERE bantype = 'APPEARANCE_PERMABAN' AND NOT unbanned = 1") + query.Execute() + + while(query.NextRow()) + var/ckey = query.item[1] + + appearance_keylist.Add("[ckey]") + +/proc/appearance_savebanfile() + var/savefile/S=new("data/appearance_full.ban") + S["keys[0]"] << appearance_keylist + +/proc/appearance_unban(mob/M) + appearance_remove("[M.ckey]") + appearance_savebanfile() + + +/proc/appearance_updatelegacybans() + if(!appearanceban_runonce) + log_admin("Updating appearancefile!") + // Updates bans.. Or fixes them. Either way. + for(var/T in appearance_keylist) + if(!T) continue + appearanceban_runonce++ //don't run this update again + + +/proc/appearance_remove(X) + for (var/i = 1; i <= length(appearance_keylist); i++) + if( findtext(appearance_keylist[i], "[X]") ) + appearance_keylist.Remove(appearance_keylist[i]) + appearance_savebanfile() + return 1 + return 0 + +/* +proc/DB_ban_isappearancebanned(var/playerckey) + establish_db_connection() + if(!dbcon.IsConnected()) + return + + var/sqlplayerckey = sql_sanitize_text(ckey(playerckey)) + + var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_ban WHERE CKEY = '[sqlplayerckey]' AND ((bantype = 'APPEARANCE_PERMABAN') OR (bantype = 'APPEARANCE_TEMPBAN' AND expiration_time > Now())) AND unbanned != 1") + query.Execute() + while(query.NextRow()) + return 1 + return 0 */ \ No newline at end of file diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index f7a1f5bef03..dc40120c7f5 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -823,7 +823,7 @@ message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") del(M.client) - //del(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends. + //qdel(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends. if("No") var/reason = input(usr,"Reason?","reason","Griefer") as text|null if(!reason) @@ -847,7 +847,7 @@ DB_ban_record(BANTYPE_PERMA, M, -1, reason) del(M.client) - //del(M) + //qdel(M) if("Cancel") return diff --git a/code/modules/admin/verbs/BrokenInhands.dm b/code/modules/admin/verbs/BrokenInhands.dm index 6339d3c0113..533ac210102 100644 --- a/code/modules/admin/verbs/BrokenInhands.dm +++ b/code/modules/admin/verbs/BrokenInhands.dm @@ -26,7 +26,7 @@ if(!istates.Find(O.item_state)) text += "[O.type] MISSING NORMAL ICON CALLED\n\"[O.item_state]\" IN \"[O.icon]\"\n" text+="\n" - del(O) + qdel(O) if(text) var/F = file("broken_icons.txt") fdel(F) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm new file mode 100644 index 00000000000..c6771a1ef0d --- /dev/null +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -0,0 +1,454 @@ +// Code taken from /bay/station. + +// Examples +/* + -- Will call the proc for all computers in the world, thats dir is 2. + CALL ex_act(1) ON /obj/machinery/computer IN world WHERE dir == 2 + -- Will open a window with a list of all the closets in the world, with a link to VV them. + SELECT /obj/structure/closet/secure_closet/security/cargo IN world WHERE icon_off == "secoff" + -- Will change all the tube lights to green + UPDATE /obj/machinery/light IN world SET color = "#0F0" WHERE icon_state == "tube1" + -- Will delete all pickaxes. "IN world" is not required. + DELETE /obj/item/weapon/pickaxe + + --You can use operators other than ==, such as >, <=, != and etc.. + +*/ + +/client/proc/SDQL2_query(query_text as message) + set category = "Debug" + if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe. + message_admins("\red ERROR: Non-admin [usr.key] attempted to execute a SDQL query!") + log_admin("Non-admin [usr.key] attempted to execute a SDQL query!") + + if(!query_text || length(query_text) < 1) + return + + //world << query_text + + var/list/query_list = SDQL2_tokenize(query_text) + + if(!query_list || query_list.len < 1) + return + + var/list/query_tree = SDQL_parse(query_list) + + if(query_tree.len < 1) + return + + var/list/from_objs = list() + var/list/select_types = list() + + switch(query_tree[1]) + if("explain") + SDQL_testout(query_tree["explain"]) + return + + if("call") + if("on" in query_tree) + select_types = query_tree["on"] + else + return + + if("select", "delete", "update") + select_types = query_tree[query_tree[1]] + + from_objs = SDQL_from_objs(query_tree["from"]) + + var/list/objs = list() + + for(var/type in select_types) + var/char = copytext(type, 1, 2) + + if(char == "/" || char == "*") + for(var/from in from_objs) + objs += SDQL_get_all(type, from) + + else if(char == "'" || char == "\"") + objs += locate(copytext(type, 2, length(type))) + + if("where" in query_tree) + var/objs_temp = objs + objs = list() + for(var/datum/d in objs_temp) + if(SDQL_expression(d, query_tree["where"])) + objs += d + + var/query_log = "[usr] executed SDQL query: \"[query_text]\"." + world.log << query_log + message_admins(query_log) + log_game(query_log) + + switch(query_tree[1]) + if("call") + var/list/call_list = query_tree["call"] + var/list/args_list = query_tree["args"] + + for(var/datum/d in objs) + for(var/v in call_list) + // To stop any procs which sleep from executing slowly. + if(d) + if(hascall(d, v)) + spawn() call(d, v)(arglist(args_list)) // Spawn in case the function sleeps. + + if("delete") + for(var/datum/d in objs) + del d + + if("select") + var/text = "" + for(var/datum/t in objs) + text += "\ref[t]" + if(istype(t, /atom)) + var/atom/a = t + + if(a.x) + text += ": [t] at ([a.x], [a.y], [a.z])
    " + + else if(a.loc && a.loc.x) + text += ": [t] in [a.loc] at ([a.loc.x], [a.loc.y], [a.loc.z])
    " + + else + text += ": [t]
    " + + else + text += ": [t]
    " + + usr << browse(text, "window=SDQL-result") + + if("update") + if("set" in query_tree) + var/list/set_list = query_tree["set"] + for(var/datum/d in objs) + var/list/vals = list() + for(var/v in set_list) + if(v in d.vars) + vals += v + vals[v] = SDQL_expression(d, set_list[v]) + + if(istype(d, /turf)) + for(var/v in vals) + if(v == "x" || v == "y" || v == "z") + continue + + d.vars[v] = vals[v] + + else + for(var/v in vals) + d.vars[v] = vals[v] + + + + + +/proc/SDQL_parse(list/query_list) + var/datum/SDQL_parser/parser = new(query_list) + var/list/query_tree = parser.parse() + + del(parser) + + return query_tree + + + +/proc/SDQL_testout(list/query_tree, indent = 0) + var/spaces = "" + for(var/s = 0, s < indent, s++) + spaces += " " + + for(var/item in query_tree) + if(istype(item, /list)) + usr << "[spaces](" + SDQL_testout(item, indent + 1) + usr << "[spaces])" + + else + usr << "[spaces][item]" + + if(!isnum(item) && query_tree[item]) + + if(istype(query_tree[item], /list)) + usr << "[spaces] (" + SDQL_testout(query_tree[item], indent + 2) + usr << "[spaces] )" + + else + usr << "[spaces] [query_tree[item]]" + + + +/proc/SDQL_from_objs(list/tree) + if("world" in tree) + return list(world) + + var/list/out = list() + + for(var/type in tree) + var/char = copytext(type, 1, 2) + + if(char == "/") + out += SDQL_get_all(type, world) + + else if(char == "'" || char == "\"") + out += locate(copytext(type, 2, length(type))) + + return out + + +/proc/SDQL_get_all(type, location) + var/list/out = list() + + if(type == "*") + for(var/datum/d in location) + out += d + + return out + + type = text2path(type) + + if(ispath(type, /mob)) + for(var/mob/d in location) + if(istype(d, type)) + out += d + + else if(ispath(type, /turf)) + for(var/turf/d in location) + if(istype(d, type)) + out += d + + else if(ispath(type, /obj)) + for(var/obj/d in location) + if(istype(d, type)) + out += d + + else if(ispath(type, /area)) + for(var/area/d in location) + if(istype(d, type)) + out += d + + else if(ispath(type, /atom)) + for(var/atom/d in location) + if(istype(d, type)) + out += d + + else + for(var/datum/d in location) + if(istype(d, type)) + out += d + + return out + + +/proc/SDQL_expression(datum/object, list/expression, start = 1) + var/result = 0 + var/val + + for(var/i = start, i <= expression.len, i++) + var/op = "" + + if(i > start) + op = expression[i] + i++ + + var/list/ret = SDQL_value(object, expression, i) + val = ret["val"] + i = ret["i"] + + if(op != "") + switch(op) + if("+") + result += val + if("-") + result -= val + if("*") + result *= val + if("/") + result /= val + if("&") + result &= val + if("|") + result |= val + if("^") + result ^= val + if("=", "==") + result = (result == val) + if("!=", "<>") + result = (result != val) + if("<") + result = (result < val) + if("<=") + result = (result <= val) + if(">") + result = (result > val) + if(">=") + result = (result >= val) + if("and", "&&") + result = (result && val) + if("or", "||") + result = (result || val) + else + usr << "\red SDQL2: Unknown op [op]" + result = null + else + result = val + + return result + +/proc/SDQL_value(datum/object, list/expression, start = 1) + var/i = start + var/val = null + + if(i > expression.len) + return list("val" = null, "i" = i) + + if(istype(expression[i], /list)) + val = SDQL_expression(object, expression[i]) + + else if(expression[i] == "!") + var/list/ret = SDQL_value(object, expression, i + 1) + val = !ret["val"] + i = ret["i"] + + else if(expression[i] == "~") + var/list/ret = SDQL_value(object, expression, i + 1) + val = ~ret["val"] + i = ret["i"] + + else if(expression[i] == "-") + var/list/ret = SDQL_value(object, expression, i + 1) + val = -ret["val"] + i = ret["i"] + + else if(expression[i] == "null") + val = null + + else if(isnum(expression[i])) + val = expression[i] + + else if(copytext(expression[i], 1, 2) in list("'", "\"")) + val = copytext(expression[i], 2, length(expression[i])) + + else + val = SDQL_var(object, expression, i) + i = expression.len + + return list("val" = val, "i" = i) + +/proc/SDQL_var(datum/object, list/expression, start = 1) + + if(expression[start] in object.vars) + + if(start < expression.len && expression[start + 1] == ".") + return SDQL_var(object.vars[expression[start]], expression[start + 2]) + + else + return object.vars[expression[start]] + + else + return null + +/proc/SDQL2_tokenize(query_text) + + var/list/whitespace = list(" ", "\n", "\t") + var/list/single = list("(", ")", ",", "+", "-", ".") + var/list/multi = list( + "=" = list("", "="), + "<" = list("", "=", ">"), + ">" = list("", "="), + "!" = list("", "=")) + + var/word = "" + var/list/query_list = list() + var/len = length(query_text) + + for(var/i = 1, i <= len, i++) + var/char = copytext(query_text, i, i + 1) + + if(char in whitespace) + if(word != "") + query_list += word + word = "" + + else if(char in single) + if(word != "") + query_list += word + word = "" + + query_list += char + + else if(char in multi) + if(word != "") + query_list += word + word = "" + + var/char2 = copytext(query_text, i + 1, i + 2) + + if(char2 in multi[char]) + query_list += "[char][char2]" + i++ + + else + query_list += char + + else if(char == "'") + if(word != "") + usr << "\red SDQL2: You have an error in your SDQL syntax, unexpected ' in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again." + return null + + word = "'" + + for(i++, i <= len, i++) + char = copytext(query_text, i, i + 1) + + if(char == "'") + if(copytext(query_text, i + 1, i + 2) == "'") + word += "'" + i++ + + else + break + + else + word += char + + if(i > len) + usr << "\red SDQL2: You have an error in your SDQL syntax, unmatched ' in query: \"[query_text]\". Please check your syntax, and try again." + return null + + query_list += "[word]'" + word = "" + + else if(char == "\"") + if(word != "") + usr << "\red SDQL2: You have an error in your SDQL syntax, unexpected \" in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again." + return null + + word = "\"" + + for(i++, i <= len, i++) + char = copytext(query_text, i, i + 1) + + if(char == "\"") + if(copytext(query_text, i + 1, i + 2) == "'") + word += "\"" + i++ + + else + break + + else + word += char + + if(i > len) + usr << "\red SDQL2: You have an error in your SDQL syntax, unmatched \" in query: \"[query_text]\". Please check your syntax, and try again." + return null + + query_list += "[word]\"" + word = "" + + else + word += char + + if(word != "") + query_list += word + return query_list \ No newline at end of file diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm new file mode 100644 index 00000000000..c3f96072ba3 --- /dev/null +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm @@ -0,0 +1,543 @@ +//I'm pretty sure that this is a recursive [s]descent[/s] ascent parser. + + +//Spec + +////////// +// +// query : select_query | delete_query | update_query | call_query | explain +// explain : 'EXPLAIN' query +// +// select_query : 'SELECT' select_list [('FROM' | 'IN') from_list] ['WHERE' bool_expression] +// delete_query : 'DELETE' select_list [('FROM' | 'IN') from_list] ['WHERE' bool_expression] +// update_query : 'UPDATE' select_list [('FROM' | 'IN') from_list] 'SET' assignments ['WHERE' bool_expression] +// call_query : 'CALL' call_function ['ON' select_list [('FROM' | 'IN') from_list] ['WHERE' bool_expression]] +// +// select_list : select_item [',' select_list] +// select_item : '*' | select_function | object_type +// select_function : count_function +// count_function : 'COUNT' '(' '*' ')' | 'COUNT' '(' object_types ')' +// +// from_list : from_item [',' from_list] +// from_item : 'world' | object_type +// +// call_function : ['(' [arguments] ')'] +// arguments : expression [',' arguments] +// +// object_type : | string +// +// assignments : assignment, [',' assignments] +// assignment : '=' expression +// variable : | '.' variable +// +// bool_expression : expression comparitor expression [bool_operator bool_expression] +// expression : ( unary_expression | '(' expression ')' | value ) [binary_operator expression] +// unary_expression : unary_operator ( unary_expression | value | '(' expression ')' ) +// comparitor : '=' | '==' | '!=' | '<>' | '<' | '<=' | '>' | '>=' +// value : variable | string | number | 'null' +// unary_operator : '!' | '-' | '~' +// binary_operator : comparitor | '+' | '-' | '/' | '*' | '&' | '|' | '^' +// bool_operator : 'AND' | '&&' | 'OR' | '||' +// +// string : ''' ''' | '"' '"' +// number : +// +////////// + +/datum/SDQL_parser + var/query_type + var/error = 0 + + var/list/query + var/list/tree + + var/list/select_functions = list("count") + var/list/boolean_operators = list("and", "or", "&&", "||") + var/list/unary_operators = list("!", "-", "~") + var/list/binary_operators = list("+", "-", "/", "*", "&", "|", "^") + var/list/comparitors = list("=", "==", "!=", "<>", "<", "<=", ">", ">=") + + + +/datum/SDQL_parser/New(query_list) + query = query_list + + + +/datum/SDQL_parser/proc/parse_error(error_message) + error = 1 + usr << "\red SQDL2 Parsing Error: [error_message]" + return query.len + 1 + +/datum/SDQL_parser/proc/parse() + tree = list() + query(1, tree) + + if(error) + return list() + else + return tree + +/datum/SDQL_parser/proc/token(i) + if(i <= query.len) + return query[i] + + else + return null + +/datum/SDQL_parser/proc/tokens(i, num) + if(i + num <= query.len) + return query.Copy(i, i + num) + + else + return null + +/datum/SDQL_parser/proc/tokenl(i) + return lowertext(token(i)) + + + +/datum/SDQL_parser/proc + +//query: select_query | delete_query | update_query + query(i, list/node) + query_type = tokenl(i) + + switch(query_type) + if("select") + select_query(i, node) + + if("delete") + delete_query(i, node) + + if("update") + update_query(i, node) + + if("call") + call_query(i, node) + + if("explain") + node += "explain" + node["explain"] = list() + query(i + 1, node["explain"]) + + +// select_query: 'SELECT' select_list [('FROM' | 'IN') from_list] ['WHERE' bool_expression] + select_query(i, list/node) + var/list/select = list() + i = select_list(i + 1, select) + + node += "select" + node["select"] = select + + var/list/from = list() + if(tokenl(i) in list("from", "in")) + i = from_list(i + 1, from) + else + from += "world" + + node += "from" + node["from"] = from + + if(tokenl(i) == "where") + var/list/where = list() + i = bool_expression(i + 1, where) + + node += "where" + node["where"] = where + + return i + + +//delete_query: 'DELETE' select_list [('FROM' | 'IN') from_list] ['WHERE' bool_expression] + delete_query(i, list/node) + var/list/select = list() + i = select_list(i + 1, select) + + node += "delete" + node["delete"] = select + + var/list/from = list() + if(tokenl(i) in list("from", "in")) + i = from_list(i + 1, from) + else + from += "world" + + node += "from" + node["from"] = from + + if(tokenl(i) == "where") + var/list/where = list() + i = bool_expression(i + 1, where) + + node += "where" + node["where"] = where + + return i + + +//update_query: 'UPDATE' select_list [('FROM' | 'IN') from_list] 'SET' assignments ['WHERE' bool_expression] + update_query(i, list/node) + var/list/select = list() + i = select_list(i + 1, select) + + node += "update" + node["update"] = select + + var/list/from = list() + if(tokenl(i) in list("from", "in")) + i = from_list(i + 1, from) + else + from += "world" + + node += "from" + node["from"] = from + + if(tokenl(i) != "set") + i = parse_error("UPDATE has misplaced SET") + + var/list/set_assignments = list() + i = assignments(i + 1, set_assignments) + + node += "set" + node["set"] = set_assignments + + if(tokenl(i) == "where") + var/list/where = list() + i = bool_expression(i + 1, where) + + node += "where" + node["where"] = where + + return i + + +//call_query: 'CALL' call_function ['ON' select_list [('FROM' | 'IN') from_list] ['WHERE' bool_expression]] + call_query(i, list/node) + var/list/func = list() + var/list/arguments = list() + i = call_function(i + 1, func, arguments) + + node += "call" + node["call"] = func + node["args"] = arguments + + if(tokenl(i) != "on") + return i + + var/list/select = list() + i = select_list(i + 1, select) + + node += "on" + node["on"] = select + + var/list/from = list() + if(tokenl(i) in list("from", "in")) + i = from_list(i + 1, from) + else + from += "world" + + node += "from" + node["from"] = from + + if(tokenl(i) == "where") + var/list/where = list() + i = bool_expression(i + 1, where) + + node += "where" + node["where"] = where + + return i + + +//select_list: select_item [',' select_list] + select_list(i, list/node) + i = select_item(i, node) + + if(token(i) == ",") + i = select_list(i + 1, node) + + return i + + +//from_list: from_item [',' from_list] + from_list(i, list/node) + i = from_item(i, node) + + if(token(i) == ",") + i = from_list(i + 1, node) + + return i + + +//assignments: assignment, [',' assignments] + assignments(i, list/node) + i = assignment(i, node) + + if(token(i) == ",") + i = assignments(i + 1, node) + + return i + + +//select_item: '*' | select_function | object_type + select_item(i, list/node) + + if(token(i) == "*") + node += "*" + i++ + + else if(tokenl(i) in select_functions) + i = select_function(i, node) + + else + i = object_type(i, node) + + return i + + +//from_item: 'world' | object_type + from_item(i, list/node) + + if(token(i) == "world") + node += "world" + i++ + + else + i = object_type(i, node) + + return i + + +//bool_expression: expression [bool_operator bool_expression] + bool_expression(i, list/node) + + var/list/bool = list() + i = expression(i, bool) + + node[++node.len] = bool + + if(tokenl(i) in boolean_operators) + i = bool_operator(i, node) + i = bool_expression(i, node) + + return i + + +//assignment: '=' expression + assignment(i, list/node) + + node += token(i) + + if(token(i + 1) == "=") + var/varname = token(i) + node[varname] = list() + + i = expression(i + 2, node[varname]) + + else + parse_error("Assignment expected, but no = found") + + return i + + +//variable: | '.' variable + variable(i, list/node) + var/list/L = list(token(i)) + node[++node.len] = L + + if(token(i + 1) == ".") + L += "." + i = variable(i + 2, L) + + else + i++ + + return i + + +//object_type: | string + object_type(i, list/node) + + if(copytext(token(i), 1, 2) == "/") + node += token(i) + + else + i = string(i, node) + + return i + 1 + + +//comparitor: '=' | '==' | '!=' | '<>' | '<' | '<=' | '>' | '>=' + comparitor(i, list/node) + + if(token(i) in list("=", "==", "!=", "<>", "<", "<=", ">", ">=")) + node += token(i) + + else + parse_error("Unknown comparitor [token(i)]") + + return i + 1 + + +//bool_operator: 'AND' | '&&' | 'OR' | '||' + bool_operator(i, list/node) + + if(tokenl(i) in list("and", "or", "&&", "||")) + node += token(i) + + else + parse_error("Unknown comparitor [token(i)]") + + return i + 1 + + +//string: ''' ''' | '"' '"' + string(i, list/node) + + if(copytext(token(i), 1, 2) in list("'", "\"")) + node += token(i) + + else + parse_error("Expected string but found '[token(i)]'") + + return i + 1 + + +//call_function: ['(' [arguments] ')'] + call_function(i, list/node, list/arguments) + if(length(tokenl(i))) + node += token(i++) + if(token(i) != "(") + parse_error("Expected ( but found '[token(i)]'") + else if(token(i + 1) != ")") + do + i = expression(i + 1, arguments) + if(token(i) == ",") + continue + while(token(i) && token(i) != ")") + else + i++ + else + parse_error("Expected a function but found nothing") + return i + 1 + + +//select_function: count_function + select_function(i, list/node) + + parse_error("Sorry, function calls aren't available yet") + + return i + + +//expression: ( unary_expression | '(' expression ')' | value ) [binary_operator expression] + expression(i, list/node) + + if(token(i) in unary_operators) + i = unary_expression(i, node) + + else if(token(i) == "(") + var/list/expr = list() + + i = expression(i + 1, expr) + + if(token(i) != ")") + parse_error("Missing ) at end of expression.") + + else + i++ + + node[++node.len] = expr + + else + i = value(i, node) + + if(token(i) in binary_operators) + i = binary_operator(i, node) + i = expression(i, node) + + else if(token(i) in comparitors) + i = binary_operator(i, node) + + var/list/rhs = list() + i = expression(i, rhs) + + node[++node.len] = rhs + + + return i + + +//unary_expression: unary_operator ( unary_expression | value | '(' expression ')' ) + unary_expression(i, list/node) + + if(token(i) in unary_operators) + var/list/unary_exp = list() + + unary_exp += token(i) + i++ + + if(token(i) in unary_operators) + i = unary_expression(i, unary_exp) + + else if(token(i) == "(") + var/list/expr = list() + + i = expression(i + 1, expr) + + if(token(i) != ")") + parse_error("Missing ) at end of expression.") + + else + i++ + + unary_exp[++unary_exp.len] = expr + + else + i = value(i, unary_exp) + + node[++node.len] = unary_exp + + + else + parse_error("Expected unary operator but found '[token(i)]'") + + return i + + +//binary_operator: comparitor | '+' | '-' | '/' | '*' | '&' | '|' | '^' + binary_operator(i, list/node) + + if(token(i) in (binary_operators + comparitors)) + node += token(i) + + else + parse_error("Unknown binary operator [token(i)]") + + return i + 1 + + +//value: variable | string | number | 'null' + value(i, list/node) + + if(token(i) == "null") + node += "null" + i++ + + else if(isnum(text2num(token(i)))) + node += text2num(token(i)) + i++ + + else if(copytext(token(i), 1, 2) in list("'", "\"")) + i = string(i, node) + + else + i = variable(i, node) + + return i + + + + +/*EXPLAIN SELECT * WHERE 42 = 6 * 9 OR val = - 5 == 7*/ \ No newline at end of file diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 20b435ff945..28298f91b90 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -435,7 +435,7 @@ var/global/list/g_fancy_list_of_safe_types = null for(var/atom/O in world) if(istype(O, hsbitem)) counter++ - del(O) + qdel(O) log_admin("[key_name(src)] has deleted all ([counter]) instances of [hsbitem].") message_admins("[key_name_admin(src)] has deleted all ([counter]) instances of [hsbitem].", 0) feedback_add_details("admin_verb","DELA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -505,7 +505,7 @@ var/global/list/g_fancy_list_of_safe_types = null var/mob/adminmob = src.mob M.ckey = src.ckey if( isobserver(adminmob) ) - del(adminmob) + qdel(adminmob) feedback_add_details("admin_verb","ADC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -649,7 +649,7 @@ var/global/list/g_fancy_list_of_safe_types = null for (var/obj/item/I in M) if (istype(I, /obj/item/weapon/implant)) continue - del(I) + qdel(I) switch(dresscode) if ("naked") //do nothing @@ -727,7 +727,7 @@ var/global/list/g_fancy_list_of_safe_types = null M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) var/obj/item/weapon/storage/backpack/backpack = new(M) for(var/obj/item/I in backpack) - del(I) + qdel(I) M.equip_to_slot_or_del(backpack, slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/mop(M), slot_r_hand) @@ -820,7 +820,7 @@ var/global/list/g_fancy_list_of_safe_types = null var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M) for(var/obj/item/briefcase_item in sec_briefcase) - del(briefcase_item) + qdel(briefcase_item) for(var/i=3, i>0, i--) sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000 sec_briefcase.contents += new /obj/item/weapon/gun/energy/crossbow @@ -1058,8 +1058,7 @@ var/global/list/g_fancy_list_of_safe_types = null for(var/obj/machinery/the_singularitygen/G in world) if(G.anchored) var/obj/machinery/singularity/S = new /obj/machinery/singularity(get_turf(G), 50) - spawn(0) - del(G) +// qdel(G) S.energy = 1750 S.current_size = 7 S.icon = 'icons/effects/224x224.dmi' diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 8ac539f6c79..8745247f96e 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -104,14 +104,14 @@ var/intercom_range_display_status = 0 intercom_range_display_status = 1 for(var/obj/effect/debugging/marker/M in world) - del(M) + qdel(M) if(intercom_range_display_status) for(var/obj/item/device/radio/intercom/I in world) for(var/turf/T in orange(7,I)) var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T) if (!(F in view(7,I.loc))) - del(F) + qdel(F) feedback_add_details("admin_verb","mIRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/enable_debug_verbs() @@ -147,6 +147,7 @@ var/intercom_range_display_status = 0 src.verbs += /client/proc/disable_movement src.verbs += /client/proc/print_pointers src.verbs += /client/proc/count_movable_instances + src.verbs += /client/proc/SDQL2_query //src.verbs += /client/proc/cmd_admin_rejuvenate feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index e3a54db7ddb..63b10dede5b 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -277,12 +277,12 @@ client/proc/one_click_antag() for (var/obj/effect/landmark/A in /area/syndicate_station/start)//Because that's the only place it can BE -Sieve if (A.name == "Syndicate-Gear-Closet") new /obj/structure/closet/syndicate/personal(A.loc) - del(A) + qdel(A) continue if (A.name == "Syndicate-Bomb") new /obj/effect/spawner/newbomb/timer/syndicate(A.loc) - del(A) + qdel(A) continue for(var/datum/mind/synd_mind in ticker.mode.syndicates) @@ -363,7 +363,7 @@ client/proc/one_click_antag() candidates.Remove(theghost) if(!theghost) - del(new_syndicate_commando) + qdel(new_syndicate_commando) break new_syndicate_commando.key = theghost.key diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index 009daac93fb..1a3d1ea3748 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -28,7 +28,7 @@ for (var/obj/item/I in H) if (istype(I, /obj/item/weapon/implant)) continue - del(I) + qdel(I) H.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_ears) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index c9e439e7e78..6191f79fa22 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -458,7 +458,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])") message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])", 1) feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - del(O) + qdel(O) /client/proc/cmd_admin_list_open_jobs() set category = "Admin" @@ -602,7 +602,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") world.Export("http://216.38.134.132/adminlog.php?type=ban&key=[usr.client.key]&key2=[M.key]&msg=[html_decode(reason)]&time=[mins]&server=[replacetext(config.server_name, "#", "")]") del(M.client) - del(M) + qdel(M) else if("No") @@ -617,7 +617,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") world.Export("http://216.38.134.132/adminlog.php?type=ban&key=[usr.client.key]&key2=[M.key]&msg=[html_decode(reason)]&time=perma&server=[replacetext(config.server_name, "#", "")]") del(M.client) - del(M) + qdel(M) */ /client/proc/update_world() diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index ed66e22a18f..f17048048f6 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -39,7 +39,7 @@ bombtank.master = null bombtank = null - del(src) + qdel(src) return if((istype(W, /obj/item/weapon/weldingtool) && W:welding)) if(!status) @@ -158,8 +158,8 @@ air_update_turf() if(master) - del(master) - del(src) + qdel(master) + qdel(src) /obj/item/weapon/tank/proc/release() //This happens when the bomb is not welded. Tank contents are just spat out. var/datum/gas_mixture/removed = air_contents.remove(air_contents.total_moles()) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index bc306f77c65..795ca471f84 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -152,8 +152,7 @@ if(a_right) a_right:holder = null a_right.loc = T - spawn(0) - del(src) + qdel(src) return diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 516e63d2c43..25d00b4e386 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -33,7 +33,7 @@ processing_objects.Add(src) else on = 0 - if(first) del(first) + if(first) qdel(first) processing_objects.Remove(src) update_icon() return secured @@ -54,7 +54,7 @@ process()//Old code if(!on) if(first) - del(first) + qdel(first) return if(first || !secured) return var/turf/T = null @@ -88,7 +88,7 @@ attack_hand() - del(first) + qdel(first) ..() return @@ -97,14 +97,14 @@ var/t = dir ..() dir = t - del(first) + qdel(first) return holder_movement() if(!holder) return 0 // dir = holder.dir - del(first) + qdel(first) return 1 @@ -185,7 +185,7 @@ if(master) //world << "beam hit \ref[src]: calling master \ref[master].hit" master.trigger_beam() - del(src) + qdel(src) return /obj/effect/beam/i_beam/proc/vis_spread(v) @@ -203,7 +203,7 @@ if((loc.density || !(master))) // world << "beam hit loc [loc] or no master [master], deleting" - del(src) + qdel(src) return //world << "proccess: [src.left] left" @@ -243,17 +243,17 @@ return else //world << "is a next: \ref[next], deleting beam \ref[I]" - del(I) + qdel(I) else //world << "step failed, deleting \ref[next]" - del(next) + qdel(next) spawn(10) process() return return /obj/effect/beam/i_beam/Bump() - del(src) + qdel(src) return /obj/effect/beam/i_beam/Bumped() @@ -268,7 +268,6 @@ return return -/obj/effect/beam/i_beam/Del() - del(next) +/obj/effect/beam/i_beam/Destroy() + qdel(next) ..() - return diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index 69f596a0138..84825acd7e3 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -9,9 +9,9 @@ w_class = 5.0 flags = CONDUCT -/obj/item/assembly/shock_kit/Del() - del(part1) - del(part2) +/obj/item/assembly/shock_kit/Destroy() + qdel(part1) + qdel(part2) ..() return @@ -26,7 +26,7 @@ part2.master = null part1 = null part2 = null - del(src) + qdel(src) return if(istype(W, /obj/item/weapon/screwdriver)) status = !status diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 0f2a0a73aa3..4eb06965fa0 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -1,37 +1,37 @@ -/obj/item/device/assembly/voice - name = "voice analyzer" - desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated." - icon_state = "voice" - m_amt = 500 - g_amt = 50 - origin_tech = "magnets=1" - var/listening = 0 - var/recorded //the activation message - - hear_talk(mob/living/M as mob, msg) - if(listening) - recorded = msg - listening = 0 - var/turf/T = get_turf(src) //otherwise it won't work in hand - T.visible_message("\icon[src] beeps, \"Activation message is '[recorded]'.\"") - else - if(findtext(msg, recorded)) - pulse(0) - - activate() - if(secured) - if(!holder) - listening = !listening - var/turf/T = get_turf(src) - T.visible_message("\icon[src] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") - - - attack_self(mob/user) - if(!user) return 0 - activate() - return 1 - - - toggle_secure() - . = ..() +/obj/item/device/assembly/voice + name = "voice analyzer" + desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated." + icon_state = "voice" + m_amt = 500 + g_amt = 50 + origin_tech = "magnets=1" + var/listening = 0 + var/recorded //the activation message + + hear_talk(mob/living/M as mob, msg) + if(listening) + recorded = msg + listening = 0 + var/turf/T = get_turf(src) //otherwise it won't work in hand + T.visible_message("\icon[src] beeps, \"Activation message is '[recorded]'.\"") + else + if(findtext(msg, recorded)) + pulse(0) + + activate() + if(secured) + if(!holder) + listening = !listening + var/turf/T = get_turf(src) + T.visible_message("\icon[src] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") + + + attack_self(mob/user) + if(!user) return 0 + activate() + return 1 + + + toggle_secure() + . = ..() listening = 0 \ No newline at end of file diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 4c3025b0d2f..71c8b782a3b 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -84,7 +84,7 @@ W.assignment = corpseidjob W.registered_name = M.real_name M.equip_to_slot_or_del(W, slot_wear_id) - del(src) + qdel(src) /obj/effect/landmark/corpse/AICorpse/createCorpse() //Creates a corrupted AI var/A = locate(/mob/living/silicon/ai) in loc //variable A looks for an AI at the location of the landmark @@ -97,7 +97,7 @@ M.real_name = src.name M.aiPDA.toff = 1 //turns the AI's PDA messenger off, stopping it showing up on player PDAs M.death() //call the AI's death proc - del(src) + qdel(src) /obj/effect/landmark/corpse/slimeCorpse var/mobcolour = "grey" @@ -111,13 +111,13 @@ var/mob/living/carbon/slime/M = new(src.loc) //variable M is a new slime at the location of the landmark M.colour = src.mobcolour //slime colour is set by landmark's mobcolour var M.adjustToxLoss(9001) //kills the slime, death() doesn't update its icon correctly - del(src) + qdel(src) /obj/effect/landmark/corpse/facehugCorpse/createCorpse() //Creates a squashed facehugger var/obj/item/clothing/mask/facehugger/O = new(src.loc) //variable O is a new facehugger at the location of the landmark O.name = src.name O.Die() //call the facehugger's death proc - del(src) + qdel(src) // I'll work on making a list of corpses people request for maps, or that I think will be commonly used. Syndicate operatives for example. diff --git a/code/modules/awaymissions/loot.dm b/code/modules/awaymissions/loot.dm index 65e78dd968b..d67610f4525 100644 --- a/code/modules/awaymissions/loot.dm +++ b/code/modules/awaymissions/loot.dm @@ -14,4 +14,4 @@ loot.Remove(lootspawn) new lootspawn(get_turf(src)) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/modules/awaymissions/maploader/swapmaps.dm b/code/modules/awaymissions/maploader/swapmaps.dm index 8f79b6b117e..6c2cba1d0be 100644 --- a/code/modules/awaymissions/maploader/swapmaps.dm +++ b/code/modules/awaymissions/maploader/swapmaps.dm @@ -174,9 +174,9 @@ swapmap x2>swapmaps_compiled_maxx) var/list/areas=new for(var/atom/A in block(locate(x1,y1,z1),locate(x2,y2,z2))) - for(var/obj/O in A) del(O) + for(var/obj/O in A) qdel(O) for(var/mob/M in A) - if(!M.key) del(M) + if(!M.key) qdel(M) else M.loc=null areas[A.loc]=null del(A) @@ -286,9 +286,9 @@ swapmap A.contents+=T else defarea.contents+=T // clear the turf - for(var/obj/O in T) del(O) + for(var/obj/O in T) qdel(O) for(var/mob/M in T) - if(!M.key) del(M) + if(!M.key) qdel(M) else M.loc=null // finish the read T.Read(S) diff --git a/code/modules/awaymissions/mission_code/blackmarketpackers.dm b/code/modules/awaymissions/mission_code/blackmarketpackers.dm index d2d215053af..b6496fe4718 100644 --- a/code/modules/awaymissions/mission_code/blackmarketpackers.dm +++ b/code/modules/awaymissions/mission_code/blackmarketpackers.dm @@ -1,22 +1,22 @@ -//Packer Ship Areas - -/area/awaymission/BMPship - name = "\improper BMP Asteroids" - icon_state = "away" - luminosity = 0 - - -/area/awaymission/BMPship/Aft - name = "\improper Aft Block" - icon_state = "away1" - requires_power = 1 - -/area/awaymission/BMPship/Midship - name = "\improper Midship Block" - icon_state = "away2" - requires_power = 1 - -/area/awaymission/BMPship/Fore - name = "\improper Fore Block" - icon_state = "away3" +//Packer Ship Areas + +/area/awaymission/BMPship + name = "\improper BMP Asteroids" + icon_state = "away" + luminosity = 0 + + +/area/awaymission/BMPship/Aft + name = "\improper Aft Block" + icon_state = "away1" + requires_power = 1 + +/area/awaymission/BMPship/Midship + name = "\improper Midship Block" + icon_state = "away2" + requires_power = 1 + +/area/awaymission/BMPship/Fore + name = "\improper Fore Block" + icon_state = "away3" requires_power = 1 \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/box2550Away.dm b/code/modules/awaymissions/mission_code/box2550Away.dm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/code/modules/awaymissions/mission_code/centcomAway.dm b/code/modules/awaymissions/mission_code/centcomAway.dm index 70be2fa7202..f4e92cf800a 100644 --- a/code/modules/awaymissions/mission_code/centcomAway.dm +++ b/code/modules/awaymissions/mission_code/centcomAway.dm @@ -1,63 +1,63 @@ -//centcomAway areas - -/area/awaymission/centcomAway - name = "XCC-P5831" - icon_state = "away" - requires_power = 0 - -/area/awaymission/centcomAway/general - name = "XCC-P5831" - music = "music/ambigen3.ogg" - -/area/awaymission/centcomAway/maint - name = "XCC-P5831 Maintenance" - icon_state = "away1" - music = "music/ambisin1.ogg" - -/area/awaymission/centcomAway/thunderdome - name = "XCC-P5831 Thunderdome" - icon_state = "away2" - music = "music/ambisin2.ogg" - -/area/awaymission/centcomAway/cafe - name = "XCC-P5831 Kitchen Arena" - icon_state = "away3" - music = "music/ambisin3.ogg" - -/area/awaymission/centcomAway/courtroom - name = "XCC-P5831 Courtroom" - icon_state = "away4" - music = "music/ambisin4.ogg" - -/area/awaymission/centcomAway/hangar - name = "XCC-P5831 Hangars" - icon_state = "away4" - music = "music/ambigen5.ogg" - -//centcomAway items - -/obj/item/weapon/paper/pamphlet/ccaInfo - name = "Visitor Info Pamphlet" - info = " XCC-P5831 Visitor Information
    \ - Greetings, visitor, to XCC-P5831! As you may know, this outpost was once \ - used as Nanotrasen's CENTRAL COMMAND STATION, organizing and coordinating company \ - projects across the vastness of space.
    \ - Since the completion of the much more efficient CC-A5831 on March 8, 2553, XCC-P5831 no longer \ - acts as NT's base of operations but still plays a very important role its corporate affairs; \ - serving as a supply and repair depot, as well as being host to its most important legal proceedings\ - and the thrilling pay-per-view broadcasts of PLASTEEL CHEF and THUNDERDOME LIVE.
    \ - We hope you enjoy your stay!" - -/obj/item/weapon/paper/ccaMemo - name = "Memo to XCC-P5831 QM" - info = "From: XCC-P5831 Management Office
    \ - To: Rolf Ingram, XCC-P5831 Quartermaster
    \ - Hey, Rolf, once you pack that gateway into the ferry hangar, make absolutely sure \ - to deactivate it! As you may know, SS13 has recently got its network up and running, \ - which means that until we get this gate shipped off to the next colonization staging \ - area, they'll be able to hop straight in here if its hooked up on our end.
    \ - Obviously, that's something I'd very much rather avoid. Our forensics and medical \ - teams never did figure out what happened that last time... and I can't wrap my head \ - around it myself. Why would a shuttle full of evacuees all snap and beat each other \ - to death the moment they reached safety?
    \ +//centcomAway areas + +/area/awaymission/centcomAway + name = "XCC-P5831" + icon_state = "away" + requires_power = 0 + +/area/awaymission/centcomAway/general + name = "XCC-P5831" + music = "music/ambigen3.ogg" + +/area/awaymission/centcomAway/maint + name = "XCC-P5831 Maintenance" + icon_state = "away1" + music = "music/ambisin1.ogg" + +/area/awaymission/centcomAway/thunderdome + name = "XCC-P5831 Thunderdome" + icon_state = "away2" + music = "music/ambisin2.ogg" + +/area/awaymission/centcomAway/cafe + name = "XCC-P5831 Kitchen Arena" + icon_state = "away3" + music = "music/ambisin3.ogg" + +/area/awaymission/centcomAway/courtroom + name = "XCC-P5831 Courtroom" + icon_state = "away4" + music = "music/ambisin4.ogg" + +/area/awaymission/centcomAway/hangar + name = "XCC-P5831 Hangars" + icon_state = "away4" + music = "music/ambigen5.ogg" + +//centcomAway items + +/obj/item/weapon/paper/pamphlet/ccaInfo + name = "Visitor Info Pamphlet" + info = " XCC-P5831 Visitor Information
    \ + Greetings, visitor, to XCC-P5831! As you may know, this outpost was once \ + used as Nanotrasen's CENTRAL COMMAND STATION, organizing and coordinating company \ + projects across the vastness of space.
    \ + Since the completion of the much more efficient CC-A5831 on March 8, 2553, XCC-P5831 no longer \ + acts as NT's base of operations but still plays a very important role its corporate affairs; \ + serving as a supply and repair depot, as well as being host to its most important legal proceedings\ + and the thrilling pay-per-view broadcasts of PLASTEEL CHEF and THUNDERDOME LIVE.
    \ + We hope you enjoy your stay!" + +/obj/item/weapon/paper/ccaMemo + name = "Memo to XCC-P5831 QM" + info = "From: XCC-P5831 Management Office
    \ + To: Rolf Ingram, XCC-P5831 Quartermaster
    \ + Hey, Rolf, once you pack that gateway into the ferry hangar, make absolutely sure \ + to deactivate it! As you may know, SS13 has recently got its network up and running, \ + which means that until we get this gate shipped off to the next colonization staging \ + area, they'll be able to hop straight in here if its hooked up on our end.
    \ + Obviously, that's something I'd very much rather avoid. Our forensics and medical \ + teams never did figure out what happened that last time... and I can't wrap my head \ + around it myself. Why would a shuttle full of evacuees all snap and beat each other \ + to death the moment they reached safety?
    \ - D. Cereza" \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/spacebattle.dm b/code/modules/awaymissions/mission_code/spacebattle.dm index dc86365f4ee..9b9a70d220a 100644 --- a/code/modules/awaymissions/mission_code/spacebattle.dm +++ b/code/modules/awaymissions/mission_code/spacebattle.dm @@ -1,33 +1,33 @@ -//Spacebattle Areas - -/area/awaymission/spacebattle - name = "\improper Space Battle" - icon_state = "away" - requires_power = 0 - -/area/awaymission/spacebattle/cruiser - name = "\improper Nanotrasen Cruiser" - -/area/awaymission/spacebattle/syndicate1 - name = "\improper Syndicate Assault Ship 1" - -/area/awaymission/spacebattle/syndicate2 - name = "\improper Syndicate Assault Ship 2" - -/area/awaymission/spacebattle/syndicate3 - name = "\improper Syndicate Assault Ship 3" - -/area/awaymission/spacebattle/syndicate4 - name = "\improper Syndicate War Sphere 1" - -/area/awaymission/spacebattle/syndicate5 - name = "\improper Syndicate War Sphere 2" - -/area/awaymission/spacebattle/syndicate6 - name = "\improper Syndicate War Sphere 3" - -/area/awaymission/spacebattle/syndicate7 - name = "\improper Syndicate Fighter" - -/area/awaymission/spacebattle/secret +//Spacebattle Areas + +/area/awaymission/spacebattle + name = "\improper Space Battle" + icon_state = "away" + requires_power = 0 + +/area/awaymission/spacebattle/cruiser + name = "\improper Nanotrasen Cruiser" + +/area/awaymission/spacebattle/syndicate1 + name = "\improper Syndicate Assault Ship 1" + +/area/awaymission/spacebattle/syndicate2 + name = "\improper Syndicate Assault Ship 2" + +/area/awaymission/spacebattle/syndicate3 + name = "\improper Syndicate Assault Ship 3" + +/area/awaymission/spacebattle/syndicate4 + name = "\improper Syndicate War Sphere 1" + +/area/awaymission/spacebattle/syndicate5 + name = "\improper Syndicate War Sphere 2" + +/area/awaymission/spacebattle/syndicate6 + name = "\improper Syndicate War Sphere 3" + +/area/awaymission/spacebattle/syndicate7 + name = "\improper Syndicate Fighter" + +/area/awaymission/spacebattle/secret name = "\improper Hidden Chamber" \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index 938b73a1d06..2f4cdfb57ac 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -54,7 +54,7 @@ B.item_state = "melted" new /obj/item/weapon/paper/sc_safehint_paper_bible(B) new /obj/item/weapon/pen(B) - del(src) + qdel(src) /* * Guns - I'm making these specifically so that I dont spawn a pile of fully loaded weapons on the map. @@ -191,7 +191,7 @@ var/sc_safecode5 = "[rand(0,9)]" else if(istype(A,/obj/)) var/obj/O = A O.ex_act(1.0) - if(O) del(O) + if(O) qdel(O) else if(isturf(A)) var/turf/T = A if(T.intact) diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index dd9015d1714..9a2d6c758b4 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -163,8 +163,7 @@ s.set_up(3, 1, src) s.start() explosion(mob, 1, 0, 0, 0) - spawn(0) - del(src) + qdel(src) /*/obj/effect/meatgrinder name = "Meat Grinder" diff --git a/code/modules/awaymissions/trigger.dm b/code/modules/awaymissions/trigger.dm index 7080179b9a6..c31b37fbd8b 100644 --- a/code/modules/awaymissions/trigger.dm +++ b/code/modules/awaymissions/trigger.dm @@ -6,7 +6,7 @@ if(M.client) M << "[message]" if(once) - del(src) + qdel(src) /obj/effect/step_trigger/teleport_fancy var/locationx @@ -41,4 +41,4 @@ uses-- if(uses == 0) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 3c1dd2ccb6f..7467f12ad97 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -38,4 +38,4 @@ var/related_accounts_ip = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip var/related_accounts_cid = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id - preload_rsc = PRELOAD_RSC + preload_rsc = PRELOAD_RSC diff --git a/code/modules/clothing/gloves/ninja.dm b/code/modules/clothing/gloves/ninja.dm index 870324f7159..6fe92f5d346 100644 --- a/code/modules/clothing/gloves/ninja.dm +++ b/code/modules/clothing/gloves/ninja.dm @@ -1,117 +1,117 @@ -/* - Dear ninja gloves - - This isn't because I like you - this is because your father is a bastard - - ... - I guess you're a little cool. - -Sayu -*/ - -/obj/item/clothing/gloves/space_ninja - desc = "These nano-enhanced gloves insulate from electricity and provide fire resistance." - name = "ninja gloves" - icon_state = "s-ninja" - item_state = "s-ninja" - siemens_coefficient = 0 - cold_protection = HANDS - min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT - heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - var/draining = 0 - var/candrain = 0 - var/mindrain = 200 - var/maxdrain = 400 - -/* - This runs the gamut of what ninja gloves can do - The other option would be a dedicated ninja touch bullshit proc on everything - which would probably more efficient, but ninjas are pretty rare. - This was mostly introduced to keep ninja code from contaminating other code; - with this in place it would be easier to untangle the rest of it. - - For the drain proc, see events/ninja.dm -*/ -/obj/item/clothing/gloves/space_ninja/Touch(var/atom/A,var/proximity) - if(!candrain || draining) return 0 - - var/mob/living/carbon/human/H = loc - if(!istype(H)) return 0 // what - var/obj/item/clothing/suit/space/space_ninja/suit = H.wear_suit - if(!istype(suit)) return 0 - if(isturf(A)) return 0 - - if(!proximity) // todo: you could add ninja stars or computer hacking here - return 0 - - // Move an AI into and out of things - if(istype(A,/mob/living/silicon/ai)) - if(suit.s_control) - A.add_fingerprint(H) - suit.transfer_ai("AICORE", "NINJASUIT", A, H) - return 1 - else - H << "\red ERROR: \black Remote access channel disabled." - return 0 - - if(istype(A,/obj/structure/AIcore/deactivated)) - if(suit.s_control) - A.add_fingerprint(H) - suit.transfer_ai("INACTIVE","NINJASUIT",A, H) - return 1 - else - H << "\red ERROR: \black Remote access channel disabled." - return 0 - if(istype(A,/obj/machinery/computer/aifixer)) - if(suit.s_control) - A.add_fingerprint(H) - suit.transfer_ai("AIFIXER","NINJASUIT",A, H) - return 1 - else - H << "\red ERROR: \black Remote access channel disabled." - return 0 - - // steal energy from powered things - if(istype(A,/mob/living/silicon/robot)) - A.add_fingerprint(H) - drain("CYBORG",A,suit) - return 1 - if(istype(A,/obj/machinery/power/apc)) - A.add_fingerprint(H) - drain("APC",A,suit) - return 1 - if(istype(A,/obj/structure/cable)) - A.add_fingerprint(H) - drain("WIRE",A,suit) - return 1 - if(istype(A,/obj/structure/grille)) - var/obj/structure/cable/C = locate() in A.loc - if(C) - drain("WIRE",C,suit) - return 1 - if(istype(A,/obj/machinery/power/smes)) - A.add_fingerprint(H) - drain("SMES",A,suit) - return 1 - if(istype(A,/obj/mecha)) - A.add_fingerprint(H) - drain("MECHA",A,suit) - return 1 - - // download research - if(istype(A,/obj/machinery/computer/rdconsole)) - A.add_fingerprint(H) - drain("RESEARCH",A,suit) - return 1 - if(istype(A,/obj/machinery/r_n_d/server)) - A.add_fingerprint(H) - var/obj/machinery/r_n_d/server/S = A - if(S.disabled) - return 1 - if(S.shocked) - S.shock(H,50) - return 1 - drain("RESEARCH",A,suit) - return 1 - +/* + Dear ninja gloves + + This isn't because I like you + this is because your father is a bastard + + ... + I guess you're a little cool. + -Sayu +*/ + +/obj/item/clothing/gloves/space_ninja + desc = "These nano-enhanced gloves insulate from electricity and provide fire resistance." + name = "ninja gloves" + icon_state = "s-ninja" + item_state = "s-ninja" + siemens_coefficient = 0 + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + var/draining = 0 + var/candrain = 0 + var/mindrain = 200 + var/maxdrain = 400 + +/* + This runs the gamut of what ninja gloves can do + The other option would be a dedicated ninja touch bullshit proc on everything + which would probably more efficient, but ninjas are pretty rare. + This was mostly introduced to keep ninja code from contaminating other code; + with this in place it would be easier to untangle the rest of it. + + For the drain proc, see events/ninja.dm +*/ +/obj/item/clothing/gloves/space_ninja/Touch(var/atom/A,var/proximity) + if(!candrain || draining) return 0 + + var/mob/living/carbon/human/H = loc + if(!istype(H)) return 0 // what + var/obj/item/clothing/suit/space/space_ninja/suit = H.wear_suit + if(!istype(suit)) return 0 + if(isturf(A)) return 0 + + if(!proximity) // todo: you could add ninja stars or computer hacking here + return 0 + + // Move an AI into and out of things + if(istype(A,/mob/living/silicon/ai)) + if(suit.s_control) + A.add_fingerprint(H) + suit.transfer_ai("AICORE", "NINJASUIT", A, H) + return 1 + else + H << "\red ERROR: \black Remote access channel disabled." + return 0 + + if(istype(A,/obj/structure/AIcore/deactivated)) + if(suit.s_control) + A.add_fingerprint(H) + suit.transfer_ai("INACTIVE","NINJASUIT",A, H) + return 1 + else + H << "\red ERROR: \black Remote access channel disabled." + return 0 + if(istype(A,/obj/machinery/computer/aifixer)) + if(suit.s_control) + A.add_fingerprint(H) + suit.transfer_ai("AIFIXER","NINJASUIT",A, H) + return 1 + else + H << "\red ERROR: \black Remote access channel disabled." + return 0 + + // steal energy from powered things + if(istype(A,/mob/living/silicon/robot)) + A.add_fingerprint(H) + drain("CYBORG",A,suit) + return 1 + if(istype(A,/obj/machinery/power/apc)) + A.add_fingerprint(H) + drain("APC",A,suit) + return 1 + if(istype(A,/obj/structure/cable)) + A.add_fingerprint(H) + drain("WIRE",A,suit) + return 1 + if(istype(A,/obj/structure/grille)) + var/obj/structure/cable/C = locate() in A.loc + if(C) + drain("WIRE",C,suit) + return 1 + if(istype(A,/obj/machinery/power/smes)) + A.add_fingerprint(H) + drain("SMES",A,suit) + return 1 + if(istype(A,/obj/mecha)) + A.add_fingerprint(H) + drain("MECHA",A,suit) + return 1 + + // download research + if(istype(A,/obj/machinery/computer/rdconsole)) + A.add_fingerprint(H) + drain("RESEARCH",A,suit) + return 1 + if(istype(A,/obj/machinery/r_n_d/server)) + A.add_fingerprint(H) + var/obj/machinery/r_n_d/server/S = A + if(S.disabled) + return 1 + if(S.shocked) + S.shock(H,50) + return 1 + drain("RESEARCH",A,suit) + return 1 + diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 5136b123598..012b4872c18 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -55,4 +55,4 @@ if(voicechange) if(!(copytext(message, 1, 2) == "*" || (usr.mind && usr.mind.changeling && (copytext(message, 1, 3) == ":g" || copytext(message, 1, 3) == ":G" || copytext(message, 1, 3) == ":ï")))) message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") - return message + return message diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 7c14bd2ffc1..94827daf93c 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -92,7 +92,7 @@ if ((istype(H, /obj/item/weapon/handcuffs) && !( src.chained ))) //H = null if (src.icon_state != "orange") return - del(H) + qdel(H) src.chained = 1 src.slowdown = 15 src.icon_state = "orange1" @@ -104,4 +104,4 @@ if(C.shoes == src && src.chained == 1) user << "You need help taking these off!" return - ..() \ No newline at end of file + ..() diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm index b1f1c924178..f934d1a1277 100644 --- a/code/modules/clothing/under/ties.dm +++ b/code/modules/clothing/under/ties.dm @@ -194,8 +194,8 @@ icon_state = "med" item_color = "med" -/obj/item/clothing/tie/armband/medgreen +/obj/item/clothing/tie/armband/medblue name = "medical guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white and green." - icon_state = "medgreen" - item_color = "medgreen" \ No newline at end of file + desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white and blue." + icon_state = "medblue" + item_color = "medblue" \ No newline at end of file diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index 61a199eb674..f1f3cc44185 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -1,40 +1,40 @@ -/datum/round_event_control/anomaly - name = "Energetic Flux" - typepath = /datum/round_event/anomaly - max_occurrences = 0 //This one probably shouldn't occur! It'd work, but it wouldn't be very fun. - weight = 15 - -/datum/round_event/anomaly - var/area/impact_area - var/obj/effect/anomaly/newAnomaly - - -/datum/round_event/anomaly/setup(loop=0) - var/safety_loop = loop + 1 - if(safety_loop > 50) - kill() - end() - impact_area = findEventArea() - if(!impact_area) - setup(safety_loop) - var/list/turf_test = get_area_turfs(impact_area) - if(!turf_test.len) - setup(safety_loop) - -/datum/round_event/anomaly/announce() - command_alert("Localized hyper-energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert") - -/datum/round_event/anomaly/start() - var/turf/T = pick(get_area_turfs(impact_area)) - if(T) - newAnomaly = new /obj/effect/anomaly/flux(T.loc) - -/datum/round_event/anomaly/tick() - if(!newAnomaly) - kill() - return - newAnomaly.anomalyEffect() - -/datum/round_event/anomaly/end() - if(newAnomaly)//Kill the anomaly if it still exists at the end. - del(newAnomaly) \ No newline at end of file +/datum/round_event_control/anomaly + name = "Energetic Flux" + typepath = /datum/round_event/anomaly + max_occurrences = 0 //This one probably shouldn't occur! It'd work, but it wouldn't be very fun. + weight = 15 + +/datum/round_event/anomaly + var/area/impact_area + var/obj/effect/anomaly/newAnomaly + + +/datum/round_event/anomaly/setup(loop=0) + var/safety_loop = loop + 1 + if(safety_loop > 50) + kill() + end() + impact_area = findEventArea() + if(!impact_area) + setup(safety_loop) + var/list/turf_test = get_area_turfs(impact_area) + if(!turf_test.len) + setup(safety_loop) + +/datum/round_event/anomaly/announce() + command_alert("Localized hyper-energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert") + +/datum/round_event/anomaly/start() + var/turf/T = pick(get_area_turfs(impact_area)) + if(T) + newAnomaly = new /obj/effect/anomaly/flux(T.loc) + +/datum/round_event/anomaly/tick() + if(!newAnomaly) + kill() + return + newAnomaly.anomalyEffect() + +/datum/round_event/anomaly/end() + if(newAnomaly)//Kill the anomaly if it still exists at the end. + qdel(newAnomaly) \ No newline at end of file diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index 2974ce6bd8b..8adc6d88713 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -73,5 +73,5 @@ M.client.screen += blueeffect sleep(20) M.client.screen -= blueeffect - del(blueeffect) - del(newAnomaly) \ No newline at end of file + qdel(blueeffect) + qdel(newAnomaly) \ No newline at end of file diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm index eeb61e90ac0..2c84d7fc70b 100644 --- a/code/modules/events/anomaly_flux.dm +++ b/code/modules/events/anomaly_flux.dm @@ -23,4 +23,4 @@ /datum/round_event/anomaly/anomaly_flux/end() if(newAnomaly)//If it hasn't been neutralized, it's time to blow up. explosion(newAnomaly, -1, 3, 5, 5) - del(newAnomaly) \ No newline at end of file + qdel(newAnomaly) \ No newline at end of file diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm index 45e80c6d733..9d7ada2d60d 100644 --- a/code/modules/events/anomaly_grav.dm +++ b/code/modules/events/anomaly_grav.dm @@ -1,19 +1,19 @@ -/datum/round_event_control/anomaly/anomaly_grav - name = "Gravitational Anomaly" - typepath = /datum/round_event/anomaly/anomaly_grav - max_occurrences = 2 - weight = 15 - -/datum/round_event/anomaly/anomaly_grav - startWhen = 3 - announceWhen = 20 - endWhen = 50 - - -/datum/round_event/anomaly/anomaly_grav/announce() - command_alert("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") - -/datum/round_event/anomaly/anomaly_grav/start() - var/turf/T = pick(get_area_turfs(impact_area)) - if(T) +/datum/round_event_control/anomaly/anomaly_grav + name = "Gravitational Anomaly" + typepath = /datum/round_event/anomaly/anomaly_grav + max_occurrences = 2 + weight = 15 + +/datum/round_event/anomaly/anomaly_grav + startWhen = 3 + announceWhen = 20 + endWhen = 50 + + +/datum/round_event/anomaly/anomaly_grav/announce() + command_alert("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") + +/datum/round_event/anomaly/anomaly_grav/start() + var/turf/T = pick(get_area_turfs(impact_area)) + if(T) newAnomaly = new /obj/effect/anomaly/grav(T.loc) \ No newline at end of file diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm index c258cff6c8b..270ebed2aed 100644 --- a/code/modules/events/anomaly_pyro.dm +++ b/code/modules/events/anomaly_pyro.dm @@ -1,26 +1,26 @@ -/datum/round_event_control/anomaly/anomaly_pyro - name = "Pyroclastic Anomaly" - typepath = /datum/round_event/anomaly/anomaly_pyro - max_occurrences = 2 - weight = 15 - -/datum/round_event/anomaly/anomaly_pyro - startWhen = 10 - announceWhen = 3 - endWhen = 70 - - -/datum/round_event/anomaly/anomaly_pyro/announce() - command_alert("Atmospheric anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") - -/datum/round_event/anomaly/anomaly_pyro/start() - var/turf/T = pick(get_area_turfs(impact_area)) - if(T) - newAnomaly = new /obj/effect/anomaly/pyro(T.loc) - -/datum/round_event/anomaly/anomaly_pyro/tick() - if(!newAnomaly) - kill() - return - if(IsMultiple(activeFor, 5)) +/datum/round_event_control/anomaly/anomaly_pyro + name = "Pyroclastic Anomaly" + typepath = /datum/round_event/anomaly/anomaly_pyro + max_occurrences = 2 + weight = 15 + +/datum/round_event/anomaly/anomaly_pyro + startWhen = 10 + announceWhen = 3 + endWhen = 70 + + +/datum/round_event/anomaly/anomaly_pyro/announce() + command_alert("Atmospheric anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") + +/datum/round_event/anomaly/anomaly_pyro/start() + var/turf/T = pick(get_area_turfs(impact_area)) + if(T) + newAnomaly = new /obj/effect/anomaly/pyro(T.loc) + +/datum/round_event/anomaly/anomaly_pyro/tick() + if(!newAnomaly) + kill() + return + if(IsMultiple(activeFor, 5)) newAnomaly.anomalyEffect() \ No newline at end of file diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm index 4fe6d440691..b97310c4ece 100644 --- a/code/modules/events/anomaly_vortex.dm +++ b/code/modules/events/anomaly_vortex.dm @@ -1,19 +1,19 @@ -/datum/round_event_control/anomaly/anomaly_vortex - name = "Vortex Anomaly" - typepath = /datum/round_event/anomaly/anomaly_vortex - max_occurrences = 5 - weight = 2 - -/datum/round_event/anomaly/anomaly_vortex - startWhen = 10 - announceWhen = 3 - endWhen = 80 - - -/datum/round_event/anomaly/anomaly_vortex/announce() - command_alert("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert") - -/datum/round_event/anomaly/anomaly_vortex/start() - var/turf/T = pick(get_area_turfs(impact_area)) - if(T) +/datum/round_event_control/anomaly/anomaly_vortex + name = "Vortex Anomaly" + typepath = /datum/round_event/anomaly/anomaly_vortex + max_occurrences = 5 + weight = 2 + +/datum/round_event/anomaly/anomaly_vortex + startWhen = 10 + announceWhen = 3 + endWhen = 80 + + +/datum/round_event/anomaly/anomaly_vortex/announce() + command_alert("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert") + +/datum/round_event/anomaly/anomaly_vortex/start() + var/turf/T = pick(get_area_turfs(impact_area)) + if(T) newAnomaly = new /obj/effect/anomaly/bhole(T.loc) \ No newline at end of file diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index c0d3531c8ea..d90b575acfc 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -58,7 +58,7 @@ M.speak_chance = 15 else explosion(upriser.loc, -1, 1, 2, 4, 0) - del(upriser) + qdel(upriser) kill() return diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index aeda5356dfa..cde70335756 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -24,7 +24,7 @@ density = 1 anchored = 1 var/strength = 2 //ex_act severity number - var/life = 2 //how many things we hit before del(src) + var/life = 2 //how many things we hit before qdel(src) weak strength = 3 @@ -93,8 +93,7 @@ life-- if(life <= 0) walk(src,0) - spawn(1) - del(src) + qdel(src) return 0 return @@ -105,5 +104,5 @@ ex_act(severity) - del(src) + qdel(src) return diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index 4ecc8db3cb0..2fb4b050b48 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -1,16 +1,16 @@ -/datum/round_event_control/falsealarm - name = "False Alarm" - typepath = /datum/round_event/falsealarm - weight = 9 - max_occurrences = 5 - -/datum/round_event/falsealarm - announceWhen = 0 - endWhen = 1 - -/datum/round_event/falsealarm/announce() - var/datum/round_event_control/E = pick(events.control) - var/datum/round_event/Event = new E.typepath() - message_admins("False Alarm: [Event]") - Event.kill() //do not process this event - no starts, no ticks, no ends +/datum/round_event_control/falsealarm + name = "False Alarm" + typepath = /datum/round_event/falsealarm + weight = 9 + max_occurrences = 5 + +/datum/round_event/falsealarm + announceWhen = 0 + endWhen = 1 + +/datum/round_event/falsealarm/announce() + var/datum/round_event_control/E = pick(events.control) + var/datum/round_event/Event = new E.typepath() + message_admins("False Alarm: [Event]") + Event.kill() //do not process this event - no starts, no ticks, no ends Event.announce() //just announce it like it's happening \ No newline at end of file diff --git a/code/modules/events/holiday/friday13th.dm b/code/modules/events/holiday/friday13th.dm index ac28aed256d..a227cb6f611 100644 --- a/code/modules/events/holiday/friday13th.dm +++ b/code/modules/events/holiday/friday13th.dm @@ -1,18 +1,18 @@ -// Basically, cut the event frequency in half to simulate unluckiness. - -/datum/round_event_control/fridaythethirteen - name = "Friday the 13th" - holidayID = "Friday the 13th" - typepath = /datum/round_event/fridaythethirteen - weight = -1 - max_occurrences = 1 - earliest_start = 0 - -/datum/round_event/fridaythethirteen/start() - //Very unlucky, cut the frequency of events in half. - events.frequency_lower /= 2 - events.frequency_upper /= 2 - -/datum/round_event/fridaythethirteen/announce() - for(var/mob/living/L in player_list) +// Basically, cut the event frequency in half to simulate unluckiness. + +/datum/round_event_control/fridaythethirteen + name = "Friday the 13th" + holidayID = "Friday the 13th" + typepath = /datum/round_event/fridaythethirteen + weight = -1 + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/fridaythethirteen/start() + //Very unlucky, cut the frequency of events in half. + events.frequency_lower /= 2 + events.frequency_upper /= 2 + +/datum/round_event/fridaythethirteen/announce() + for(var/mob/living/L in player_list) L << "You are feeling unlucky today." \ No newline at end of file diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 4de36c08ca4..56b5458ca8f 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -1,17 +1,17 @@ -/datum/round_event_control/spooky - name = "2 SPOOKY!" - holidayID = "Halloween" - typepath = /datum/round_event/spooky - weight = -1 //forces it to be called, regardless of weight - max_occurrences = 1 - earliest_start = 0 - -/datum/round_event/spooky/start() - for(var/mob/living/carbon/human/H in mob_list) - if(H.dna) - hardset_dna(H, null, null, null, "skeleton") - for(var/mob/living/simple_animal/corgi/Ian/Ian in mob_list) - Ian.place_on_head(new /obj/item/weapon/bedsheet(Ian)) - -/datum/round_event/spooky/announce() +/datum/round_event_control/spooky + name = "2 SPOOKY!" + holidayID = "Halloween" + typepath = /datum/round_event/spooky + weight = -1 //forces it to be called, regardless of weight + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/spooky/start() + for(var/mob/living/carbon/human/H in mob_list) + if(H.dna) + hardset_dna(H, null, null, null, "skeleton") + for(var/mob/living/simple_animal/corgi/Ian/Ian in mob_list) + Ian.place_on_head(new /obj/item/weapon/bedsheet(Ian)) + +/datum/round_event/spooky/announce() command_alert(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") \ No newline at end of file diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index dcd7eccb03b..a5fd2bad884 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -12,7 +12,7 @@ evil_tree.icon_living = evil_tree.icon_state evil_tree.icon_dead = evil_tree.icon_state evil_tree.icon_gib = evil_tree.icon_state - del(xmas) + qdel(xmas) //b-but I don't want to delete xmas... //this is an example of a possible round-start event /datum/round_event_control/presents diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index 9c7e6fc961b..c418e498812 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -71,7 +71,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 Move() if(z != z_original || loc == destination) - spawn(0) del(src) + qdel(src) return ..() Bump(atom/clong) @@ -91,7 +91,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 if(clong.density || prob(10)) clong.meteorhit(src) else - del(src) + qdel(src) if(clong && prob(25)) src.loc = clong.loc diff --git a/code/modules/events/ninja.dm b/code/modules/events/ninja.dm index 4fd06ae3dee..89c02dce671 100644 --- a/code/modules/events/ninja.dm +++ b/code/modules/events/ninja.dm @@ -353,12 +353,12 @@ ________________________________________________________________________________ /mob/living/carbon/human/proc/equip_space_ninja(safety=0)//Safety in case you need to unequip stuff for existing characters. if(safety) - del(w_uniform) - del(wear_suit) - del(wear_mask) - del(head) - del(shoes) - del(gloves) + qdel(w_uniform) + qdel(wear_suit) + qdel(wear_mask) + qdel(head) + qdel(shoes) + qdel(gloves) var/obj/item/device/radio/R = new /obj/item/device/radio/headset(src) equip_to_slot_or_del(R, slot_ears) @@ -655,10 +655,10 @@ BYOND fixed the verb bugs so this is no longer necessary. I prefer verb panels. var/obj/effect/proc_holder/ai_hack_ninja/B_C = locate() in AI var/obj/effect/proc_holder/ai_instruction/C_C = locate() in AI var/obj/effect/proc_holder/ai_holo_clear/D_C = locate() in AI - del(A_C) - del(B_C) - del(C_C) - del(D_C) + qdel(A_C) + qdel(B_C) + qdel(C_C) + qdel(D_C) AI.proc_holder_list = list() verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros @@ -677,8 +677,8 @@ BYOND fixed the verb bugs so this is no longer necessary. I prefer verb panels. /obj/effect/proc_holder/ai_holo_clear/Click() var/obj/item/clothing/suit/space/space_ninja/S = loc.loc//This is so stupid but makes sure certain things work. AI.SUIT - del(S.hologram.i_attached) - del(S.hologram) + qdel(S.hologram.i_attached) + qdel(S.hologram) var/obj/effect/proc_holder/ai_holo_clear/D_C = locate() in S.AI S.AI.proc_holder_list -= D_C return @@ -750,8 +750,8 @@ mob/verb/remove_object_panel() var/obj/effect/proc_holder/ai_hack_ninja/B = locate() in src usr:proc_holder_list -= A usr:proc_holder_list -= B - del(A)//First. - del(B)//Second, to keep the proc going. + qdel(A)//First. + qdel(B)//Second, to keep the proc going. return /client/verb/grant_verb_ninja_debug1(var/mob/M in view()) @@ -868,7 +868,7 @@ That is why you attached them to objects. spawn(0) src << current_clone spawn(300) - del(current_clone) + qdel(current_clone) spawn while(!isnull(current_clone)) step_to(current_clone,src,1) sleep(5) @@ -1376,23 +1376,22 @@ ________________________________________________________________________________ cell = new/obj/item/weapon/stock_parts/cell/high//The suit should *always* have a battery because so many things rely on it. cell.charge = 9000//Starting charge should not be higher than maximum charge. It leads to problems with recharging. -/obj/item/clothing/suit/space/space_ninja/Del() +/obj/item/clothing/suit/space/space_ninja/Destroy() if(affecting)//To make sure the window is closed. affecting << browse(null, "window=hack spideros") if(AI)//If there are AIs present when the ninja kicks the bucket. killai() if(hologram)//If there is a hologram - del(hologram.i_attached)//Delete it and the attached image. - del(hologram) + qdel(hologram.i_attached)//Delete it and the attached image. + qdel(hologram) ..() - return //Simply deletes all the attachments and self, killing all related procs. /obj/item/clothing/suit/space/space_ninja/proc/terminate() - del(n_hood) - del(n_gloves) - del(n_shoes) - del(src) + qdel(n_hood) + qdel(n_gloves) + qdel(n_shoes) + qdel(src) /obj/item/clothing/suit/space/space_ninja/proc/killai(mob/living/silicon/ai/A = AI) if(A.client) @@ -1400,7 +1399,7 @@ ________________________________________________________________________________ A << browse(null, "window=hack spideros") AI = null A.death(1)//Kill, deleting mob. - del(A) + qdel(A) return //=======//SUIT VERBS//=======// @@ -2078,8 +2077,8 @@ ________________________________________________________________________________ spawn while(hologram&&s_initialized&&AI)//Suit on and there is an AI present. if(!s_initialized||get_dist(affecting,hologram.loc)>3)//Once suit is de-initialized or hologram reaches out of bounds. - del(hologram.i_attached) - del(hologram) + qdel(hologram.i_attached) + qdel(hologram) verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_holo_clear return @@ -2099,8 +2098,8 @@ ________________________________________________________________________________ set category = "AI Ninja Equip" set src = usr.loc - del(hologram.i_attached) - del(hologram) + qdel(hologram.i_attached) + qdel(hologram) verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_holo_clear return @@ -2663,7 +2662,7 @@ It is possible to destroy the net by the occupant or someone else. O.show_message(text("[] was recovered from the energy net!", M.name), 1, text("You hear a grunt."), 2) if(!isnull(master))//As long as they still exist. master << "\red ERROR: \black unable to initiate transport protocol. Procedure terminated." - del(src) + qdel(src) return process(var/mob/living/carbon/M as mob) @@ -2677,7 +2676,7 @@ It is possible to destroy the net by the occupant or someone else. if(isnull(M)||M.loc!=loc)//If mob is gone or not at the location. if(!isnull(master))//As long as they still exist. master << "\red ERROR: \black unable to locate \the [mob_name]. Procedure terminated." - del(src)//Get rid of the net. + qdel(src)//Get rid of the net. return if(!isnull(src))//As long as both net and person exist. @@ -2706,7 +2705,7 @@ It is possible to destroy the net by the occupant or someone else. playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1) playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1) anim(M.loc,M,'icons/mob/mob.dmi',,"phasein",,M.dir) - del(src)//Wait for everything to finish, delete the net. Else it will stop everything once net is deleted, including the spawn(0). + qdel(src)//Wait for everything to finish, delete the net. Else it will stop everything once net is deleted, including the spawn(0). for(var/mob/O in viewers(src, 3)) O.show_message(text("[] vanished!", M), 1, text("You hear sparks flying!"), 2) diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index 50393dab127..ef47bc8df91 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -1,206 +1,206 @@ -#define HIJACK_SYNDIE 1 -#define RUSKY_PARTY 2 -#define SPIDER_GIFT 3 -#define DEPARTMENT_RESUPPLY 4 - -/datum/round_event_control/shuttle_loan - name = "Shuttle loan" - typepath = /datum/round_event/shuttle_loan - max_occurrences = 1 - earliest_start = 0 - -/datum/round_event/shuttle_loan - endWhen = 500 - var/dispatch_type = 4 - var/bonus_points = 100 - var/thanks_msg = "Have some supply points as thanks (the shuttle will be returned in 5 minutes)." - var/dispatched = 0 - -/datum/round_event/shuttle_loan/start() - dispatch_type = pick(HIJACK_SYNDIE, RUSKY_PARTY, SPIDER_GIFT, DEPARTMENT_RESUPPLY) - -/datum/round_event/shuttle_loan/announce() - supply_shuttle.shuttle_loan = src - switch(dispatch_type) - if(HIJACK_SYNDIE) - command_alert("The syndicate are trying to infiltrate your station. If you let them hijack your shuttle, you'll save us a headache.","Centcom Counter Intelligence") - if(RUSKY_PARTY) - command_alert("A group of angry russians want to have a party, can you send them your cargo shuttle then make them disappear?","Centcom Russian Outreach Program") - if(SPIDER_GIFT) - command_alert("The Spider Clan has sent us a mysterious gift, can we ship it to you to see what's inside?","Centcom Diplomatic Corps") - if(DEPARTMENT_RESUPPLY) - command_alert("Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?","Centcom Supply Department") - thanks_msg = "The shuttle will be returned in 5 minutes." - bonus_points = 0 - -/datum/round_event/shuttle_loan/proc/loan_shuttle() - command_alert(thanks_msg, "Cargo shuttle commandeered by Centcom.") - - dispatched = 1 - supply_shuttle.points += bonus_points - endWhen = activeFor + 1 - supply_shuttle.eta_timeofday = (world.timeofday + 3000) % 2160000 - supply_shuttle.moving = 1 - - switch(dispatch_type) - if(HIJACK_SYNDIE) - supply_shuttle.centcom_message += "Syndicate hijack team incoming." - if(RUSKY_PARTY) - supply_shuttle.centcom_message += "Partying Russians incoming." - if(SPIDER_GIFT) - supply_shuttle.centcom_message += "Spider Clan gift incoming." - if(DEPARTMENT_RESUPPLY) - supply_shuttle.centcom_message += "Department resupply incoming." - -/datum/round_event/shuttle_loan/tick() - if(dispatched) - if(supply_shuttle.moving) - endWhen = activeFor - else - endWhen = activeFor + 1 - -/datum/round_event/shuttle_loan/end() - if(supply_shuttle.shuttle_loan && supply_shuttle.shuttle_loan.dispatched) - //make sure the shuttle was dispatched in time - supply_shuttle.shuttle_loan = null - - //spawn some stuff as reward - var/area/shuttle_at = locate(SUPPLY_DOCK_AREATYPE) - var/list/empty_shuttle_turfs = list() - for(var/turf/simulated/shuttle/T in shuttle_at) - if(T.density) - continue - empty_shuttle_turfs.Add(T) - - var/list/shuttle_spawns = list() - switch(dispatch_type) - if(HIJACK_SYNDIE) - var/datum/supply_order/O = new /datum/supply_order() - O.ordernum = supply_shuttle.ordernum - O.object = new /datum/supply_packs/emergency/specialops() - O.orderedby = "Syndicate" - supply_shuttle.shoppinglist += O - - shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate) - if(prob(75)) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate) - if(prob(50)) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate) - - var/turf/T = pick(empty_shuttle_turfs) - new /obj/effect/decal/cleanable/blood(T) - T = pick(empty_shuttle_turfs) - new /obj/effect/decal/cleanable/blood(T) - T = pick(empty_shuttle_turfs) - new /obj/effect/decal/cleanable/blood(T) - T = pick(empty_shuttle_turfs) - new /obj/effect/decal/cleanable/oil(T) - - if(RUSKY_PARTY) - var/datum/supply_order/O = new /datum/supply_order() - O.ordernum = supply_shuttle.ordernum - O.object = new /datum/supply_packs/organic/party() - O.orderedby = "Russian Confederation" - supply_shuttle.shoppinglist += O - - shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian/ranged) //drops a mateba - shuttle_spawns.Add(/mob/living/simple_animal/hostile/bear) - if(prob(75)) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian) - if(prob(50)) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/bear) - - var/turf/T = pick(empty_shuttle_turfs) - new /obj/effect/decal/cleanable/vomit(T) - T = pick(empty_shuttle_turfs) - new /obj/effect/decal/cleanable/vomit(T) - T = pick(empty_shuttle_turfs) - new /obj/effect/decal/cleanable/vomit(T) - T = pick(empty_shuttle_turfs) - new /obj/effect/decal/cleanable/vomit(T) - T = pick(empty_shuttle_turfs) - new /obj/effect/decal/cleanable/ash(T) - T = pick(empty_shuttle_turfs) - new /obj/effect/decal/cleanable/ash(T) - - if(SPIDER_GIFT) - var/datum/supply_order/O = new /datum/supply_order() - O.ordernum = supply_shuttle.ordernum - O.object = new /datum/supply_packs/emergency/specialops() - O.orderedby = "Spider Clan" - supply_shuttle.shoppinglist += O - - shuttle_spawns.Add(/mob/living/simple_animal/hostile/giant_spider) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/giant_spider) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/giant_spider/nurse) - if(prob(50)) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/giant_spider/hunter) - - var/turf/T = pick(empty_shuttle_turfs) - empty_shuttle_turfs.Remove(T) - - new /obj/effect/decal/remains/human(T) - new /obj/item/clothing/shoes/space_ninja(T) - new /obj/item/clothing/mask/balaclava(T) - - T = pick(empty_shuttle_turfs) - new /obj/effect/spider/stickyweb(T) - T = pick(empty_shuttle_turfs) - new /obj/effect/spider/stickyweb(T) - T = pick(empty_shuttle_turfs) - new /obj/effect/spider/stickyweb(T) - T = pick(empty_shuttle_turfs) - new /obj/effect/spider/stickyweb(T) - T = pick(empty_shuttle_turfs) - new /obj/effect/spider/stickyweb(T) - - if(DEPARTMENT_RESUPPLY) - var/list/crate_types = list() - - crate_types.Add(/datum/supply_packs/emergency/evac) - crate_types.Add(/datum/supply_packs/security/supplies) - crate_types.Add(/datum/supply_packs/organic/food) - crate_types.Add(/datum/supply_packs/emergency/weedcontrol) - crate_types.Add(/datum/supply_packs/engineering/tools) - crate_types.Add(/datum/supply_packs/engineering/engiequipment) - crate_types.Add(/datum/supply_packs/science/robotics) - crate_types.Add(/datum/supply_packs/science/plasma) - crate_types.Add(/datum/supply_packs/medical/supplies) - - while(crate_types.len > 0) - var/datum/supply_order/O = new /datum/supply_order() - O.ordernum = supply_shuttle.ordernum - O.orderedby = "Centcom" - supply_shuttle.shoppinglist += O - - var/spawn_type = crate_types[crate_types.len] - O.object = new spawn_type() - crate_types.Cut(crate_types.len, crate_types.len + 1) - - for(var/i=0,i<3,i++) - var/turf/T = pick(empty_shuttle_turfs) - var/spawn_type = pick(/obj/effect/decal/cleanable/flour, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/oil) - new spawn_type(T) - - var/false_positive = 0 - while(shuttle_spawns.len > 0 && empty_shuttle_turfs.len > 0) - var/turf/T = pick(empty_shuttle_turfs) - if(T.contents.len && false_positive < 5) - false_positive++ - continue - - var/spawn_type = shuttle_spawns[1] - shuttle_spawns.Cut(1, 2) - empty_shuttle_turfs.Remove(T) - new spawn_type(T) - - supply_shuttle.buy() - //supply_shuttle.send() - //supply_shuttle.moving = 0 - -#undef HIJACK_SYNDIE -#undef RUSKY_PARTY -#undef SPIDER_GIFT -#undef DEPARTMENT_RESUPPLY +#define HIJACK_SYNDIE 1 +#define RUSKY_PARTY 2 +#define SPIDER_GIFT 3 +#define DEPARTMENT_RESUPPLY 4 + +/datum/round_event_control/shuttle_loan + name = "Shuttle loan" + typepath = /datum/round_event/shuttle_loan + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/shuttle_loan + endWhen = 500 + var/dispatch_type = 4 + var/bonus_points = 100 + var/thanks_msg = "Have some supply points as thanks (the shuttle will be returned in 5 minutes)." + var/dispatched = 0 + +/datum/round_event/shuttle_loan/start() + dispatch_type = pick(HIJACK_SYNDIE, RUSKY_PARTY, SPIDER_GIFT, DEPARTMENT_RESUPPLY) + +/datum/round_event/shuttle_loan/announce() + supply_shuttle.shuttle_loan = src + switch(dispatch_type) + if(HIJACK_SYNDIE) + command_alert("The syndicate are trying to infiltrate your station. If you let them hijack your shuttle, you'll save us a headache.","Centcom Counter Intelligence") + if(RUSKY_PARTY) + command_alert("A group of angry russians want to have a party, can you send them your cargo shuttle then make them disappear?","Centcom Russian Outreach Program") + if(SPIDER_GIFT) + command_alert("The Spider Clan has sent us a mysterious gift, can we ship it to you to see what's inside?","Centcom Diplomatic Corps") + if(DEPARTMENT_RESUPPLY) + command_alert("Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?","Centcom Supply Department") + thanks_msg = "The shuttle will be returned in 5 minutes." + bonus_points = 0 + +/datum/round_event/shuttle_loan/proc/loan_shuttle() + command_alert(thanks_msg, "Cargo shuttle commandeered by Centcom.") + + dispatched = 1 + supply_shuttle.points += bonus_points + endWhen = activeFor + 1 + supply_shuttle.eta_timeofday = (world.timeofday + 3000) % 2160000 + supply_shuttle.moving = 1 + + switch(dispatch_type) + if(HIJACK_SYNDIE) + supply_shuttle.centcom_message += "Syndicate hijack team incoming." + if(RUSKY_PARTY) + supply_shuttle.centcom_message += "Partying Russians incoming." + if(SPIDER_GIFT) + supply_shuttle.centcom_message += "Spider Clan gift incoming." + if(DEPARTMENT_RESUPPLY) + supply_shuttle.centcom_message += "Department resupply incoming." + +/datum/round_event/shuttle_loan/tick() + if(dispatched) + if(supply_shuttle.moving) + endWhen = activeFor + else + endWhen = activeFor + 1 + +/datum/round_event/shuttle_loan/end() + if(supply_shuttle.shuttle_loan && supply_shuttle.shuttle_loan.dispatched) + //make sure the shuttle was dispatched in time + supply_shuttle.shuttle_loan = null + + //spawn some stuff as reward + var/area/shuttle_at = locate(SUPPLY_DOCK_AREATYPE) + var/list/empty_shuttle_turfs = list() + for(var/turf/simulated/shuttle/T in shuttle_at) + if(T.density) + continue + empty_shuttle_turfs.Add(T) + + var/list/shuttle_spawns = list() + switch(dispatch_type) + if(HIJACK_SYNDIE) + var/datum/supply_order/O = new /datum/supply_order() + O.ordernum = supply_shuttle.ordernum + O.object = new /datum/supply_packs/emergency/specialops() + O.orderedby = "Syndicate" + supply_shuttle.shoppinglist += O + + shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate) + shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate) + if(prob(75)) + shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate) + if(prob(50)) + shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate) + + var/turf/T = pick(empty_shuttle_turfs) + new /obj/effect/decal/cleanable/blood(T) + T = pick(empty_shuttle_turfs) + new /obj/effect/decal/cleanable/blood(T) + T = pick(empty_shuttle_turfs) + new /obj/effect/decal/cleanable/blood(T) + T = pick(empty_shuttle_turfs) + new /obj/effect/decal/cleanable/oil(T) + + if(RUSKY_PARTY) + var/datum/supply_order/O = new /datum/supply_order() + O.ordernum = supply_shuttle.ordernum + O.object = new /datum/supply_packs/organic/party() + O.orderedby = "Russian Confederation" + supply_shuttle.shoppinglist += O + + shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian) + shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian/ranged) //drops a mateba + shuttle_spawns.Add(/mob/living/simple_animal/hostile/bear) + if(prob(75)) + shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian) + if(prob(50)) + shuttle_spawns.Add(/mob/living/simple_animal/hostile/bear) + + var/turf/T = pick(empty_shuttle_turfs) + new /obj/effect/decal/cleanable/vomit(T) + T = pick(empty_shuttle_turfs) + new /obj/effect/decal/cleanable/vomit(T) + T = pick(empty_shuttle_turfs) + new /obj/effect/decal/cleanable/vomit(T) + T = pick(empty_shuttle_turfs) + new /obj/effect/decal/cleanable/vomit(T) + T = pick(empty_shuttle_turfs) + new /obj/effect/decal/cleanable/ash(T) + T = pick(empty_shuttle_turfs) + new /obj/effect/decal/cleanable/ash(T) + + if(SPIDER_GIFT) + var/datum/supply_order/O = new /datum/supply_order() + O.ordernum = supply_shuttle.ordernum + O.object = new /datum/supply_packs/emergency/specialops() + O.orderedby = "Spider Clan" + supply_shuttle.shoppinglist += O + + shuttle_spawns.Add(/mob/living/simple_animal/hostile/giant_spider) + shuttle_spawns.Add(/mob/living/simple_animal/hostile/giant_spider) + shuttle_spawns.Add(/mob/living/simple_animal/hostile/giant_spider/nurse) + if(prob(50)) + shuttle_spawns.Add(/mob/living/simple_animal/hostile/giant_spider/hunter) + + var/turf/T = pick(empty_shuttle_turfs) + empty_shuttle_turfs.Remove(T) + + new /obj/effect/decal/remains/human(T) + new /obj/item/clothing/shoes/space_ninja(T) + new /obj/item/clothing/mask/balaclava(T) + + T = pick(empty_shuttle_turfs) + new /obj/effect/spider/stickyweb(T) + T = pick(empty_shuttle_turfs) + new /obj/effect/spider/stickyweb(T) + T = pick(empty_shuttle_turfs) + new /obj/effect/spider/stickyweb(T) + T = pick(empty_shuttle_turfs) + new /obj/effect/spider/stickyweb(T) + T = pick(empty_shuttle_turfs) + new /obj/effect/spider/stickyweb(T) + + if(DEPARTMENT_RESUPPLY) + var/list/crate_types = list() + + crate_types.Add(/datum/supply_packs/emergency/evac) + crate_types.Add(/datum/supply_packs/security/supplies) + crate_types.Add(/datum/supply_packs/organic/food) + crate_types.Add(/datum/supply_packs/emergency/weedcontrol) + crate_types.Add(/datum/supply_packs/engineering/tools) + crate_types.Add(/datum/supply_packs/engineering/engiequipment) + crate_types.Add(/datum/supply_packs/science/robotics) + crate_types.Add(/datum/supply_packs/science/plasma) + crate_types.Add(/datum/supply_packs/medical/supplies) + + while(crate_types.len > 0) + var/datum/supply_order/O = new /datum/supply_order() + O.ordernum = supply_shuttle.ordernum + O.orderedby = "Centcom" + supply_shuttle.shoppinglist += O + + var/spawn_type = crate_types[crate_types.len] + O.object = new spawn_type() + crate_types.Cut(crate_types.len, crate_types.len + 1) + + for(var/i=0,i<3,i++) + var/turf/T = pick(empty_shuttle_turfs) + var/spawn_type = pick(/obj/effect/decal/cleanable/flour, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/oil) + new spawn_type(T) + + var/false_positive = 0 + while(shuttle_spawns.len > 0 && empty_shuttle_turfs.len > 0) + var/turf/T = pick(empty_shuttle_turfs) + if(T.contents.len && false_positive < 5) + false_positive++ + continue + + var/spawn_type = shuttle_spawns[1] + shuttle_spawns.Cut(1, 2) + empty_shuttle_turfs.Remove(T) + new spawn_type(T) + + supply_shuttle.buy() + //supply_shuttle.send() + //supply_shuttle.moving = 0 + +#undef HIJACK_SYNDIE +#undef RUSKY_PARTY +#undef SPIDER_GIFT +#undef DEPARTMENT_RESUPPLY diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index fddb051241d..a0e24f81570 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -36,7 +36,7 @@ New() return - Del() + Destroy() if(master) master.vines -= src master.growth_queue -= src @@ -46,24 +46,24 @@ /obj/effect/spacevine/attackby(obj/item/weapon/W as obj, mob/user as mob) if (!W || !user || !W.type) return switch(W.type) - if(/obj/item/weapon/circular_saw) del src - if(/obj/item/weapon/kitchen/utensil/knife) del src - if(/obj/item/weapon/scalpel) del src - if(/obj/item/weapon/twohanded/fireaxe) del src - if(/obj/item/weapon/hatchet) del src - if(/obj/item/weapon/melee/energy) del src + if(/obj/item/weapon/circular_saw) qdel(src) + if(/obj/item/weapon/kitchen/utensil/knife) qdel(src) + if(/obj/item/weapon/scalpel) qdel(src) + if(/obj/item/weapon/twohanded/fireaxe) qdel(src) + if(/obj/item/weapon/hatchet) qdel(src) + if(/obj/item/weapon/melee/energy) qdel(src) //less effective weapons if(/obj/item/weapon/wirecutters) - if(prob(25)) del src + if(prob(25)) qdel(src) if(/obj/item/weapon/shard) - if(prob(25)) del src + if(prob(25)) qdel(src) else //weapons with subtypes - if(istype(W, /obj/item/weapon/melee/energy/sword)) del src + if(istype(W, /obj/item/weapon/melee/energy/sword)) qdel(src) else if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W - if(WT.remove_fuel(0, user)) del src + if(WT.remove_fuel(0, user)) qdel(src) else manual_unbuckle(user) return @@ -120,12 +120,12 @@ New() if(!istype(src.loc,/turf/simulated/floor)) - del(src) + qdel(src) spawn_spacevine_piece(src.loc) processing_objects.Add(src) - Del() + Destroy() processing_objects.Remove(src) ..() @@ -137,10 +137,10 @@ process() if(!vines) - del(src) //space vines exterminated. Remove the controller + qdel(src) //space vines exterminated. Remove the controller return if(!growth_queue) - del(src) //Sanity check + qdel(src) //Sanity check return if(vines.len >= 250 && !reached_collapse_size) reached_collapse_size = 1 @@ -248,18 +248,18 @@ /obj/effect/spacevine/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(90)) - del(src) + qdel(src) return if(3.0) if (prob(50)) - del(src) + qdel(src) return return /obj/effect/spacevine/temperature_expose(null, temp, volume) //hotspots kill vines - del src + qdel(src) diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 13c0cd78089..51e62dd24f1 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -1,40 +1,40 @@ -/datum/round_event_control/vent_clog - name = "Clogged Vents" - typepath = /datum/round_event/vent_clog - weight = 35 - -/datum/round_event/vent_clog - announceWhen = 0 - startWhen = 5 - endWhen = 35 - var/interval = 2 - var/list/vents = list() - -/datum/round_event/vent_clog/announce() - command_alert("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert") - - -/datum/round_event/vent_clog/setup() - endWhen = rand(25, 100) - for(var/obj/machinery/atmospherics/unary/vent_scrubber/temp_vent in machines) - if(temp_vent.loc.z == 1 && temp_vent.network) - if(temp_vent.network.normal_members.len > 20) - vents += temp_vent - if(!vents.len) - return kill() - -/datum/round_event/vent_clog/tick() - if(activeFor % interval == 0) - var/obj/vent = pick_n_take(vents) - if(vent && vent.loc) - var/list/gunk = list("water","carbon","flour","radium","toxin","cleaner","nutriment","condensedcapsaicin","mushroomhallucinogen","lube", - "plantbgone","banana","anti_toxin","space_drugs","hyperzine","holywater","ethanol","hot_coco","pacid") - var/datum/reagents/R = new/datum/reagents(50) - R.my_atom = vent - R.add_reagent(pick(gunk), 50) - - var/datum/effect/effect/system/chem_smoke_spread/smoke = new - smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1) - playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3) - smoke.start() +/datum/round_event_control/vent_clog + name = "Clogged Vents" + typepath = /datum/round_event/vent_clog + weight = 35 + +/datum/round_event/vent_clog + announceWhen = 0 + startWhen = 5 + endWhen = 35 + var/interval = 2 + var/list/vents = list() + +/datum/round_event/vent_clog/announce() + command_alert("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert") + + +/datum/round_event/vent_clog/setup() + endWhen = rand(25, 100) + for(var/obj/machinery/atmospherics/unary/vent_scrubber/temp_vent in machines) + if(temp_vent.loc.z == 1 && temp_vent.network) + if(temp_vent.network.normal_members.len > 20) + vents += temp_vent + if(!vents.len) + return kill() + +/datum/round_event/vent_clog/tick() + if(activeFor % interval == 0) + var/obj/vent = pick_n_take(vents) + if(vent && vent.loc) + var/list/gunk = list("water","carbon","flour","radium","toxin","cleaner","nutriment","condensedcapsaicin","mushroomhallucinogen","lube", + "plantbgone","banana","anti_toxin","space_drugs","hyperzine","holywater","ethanol","hot_coco","pacid") + var/datum/reagents/R = new/datum/reagents(50) + R.my_atom = vent + R.add_reagent(pick(gunk), 50) + + var/datum/effect/effect/system/chem_smoke_spread/smoke = new + smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1) + playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3) + smoke.start() R.delete() //GC the reagents \ No newline at end of file diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 50a4145ee85..72f59dbf7b0 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -77,7 +77,7 @@ mob/living/carbon/proc/handle_hallucinations() halitem.name = "Flashbang" if(client) client.screen += halitem spawn(rand(100,250)) - del halitem + qdel(halitem) if(26 to 40) //Flashes of danger //src << "Danger Flash" @@ -262,7 +262,7 @@ proc/check_panel(mob/M) spawn(300) if(my_target) my_target.hallucinations -= src - del(src) + qdel(src) step_away(src,my_target,2) spawn attack_loop() @@ -327,7 +327,7 @@ proc/check_panel(mob/M) var/image/I = image('icons/effects/blood.dmi',O,"floor[rand(1,7)]",O.dir,1) target << I spawn(300) - del(O) + qdel(O) return var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/item/ammo_box/a357,\ diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index e983fc6e50b..2c6558d10c3 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -1,16 +1,6 @@ // see code/datums/recipe.dm - -/* No telebacon. just no... -/datum/recipe/telebacon - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/device/assembly/signaler - ) - result = /obj/item/weapon/reagent_containers/food/snacks/telebacon -*/ - /datum/recipe/friedegg reagents = list("sodiumchloride" = 1, "blackpepper" = 1) items = list( @@ -25,16 +15,6 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/boiledegg -/* -/datum/recipe/bananaphone - reagents = list("mushroomhallucinogen" = 5) //Trippin' balls, man. - items = list( - /obj/item/weapon/reagent_containers/food/snacks/grown/banana, - /obj/item/device/radio - ) - result = /obj/item/weapon/reagent_containers/food/snacks/bananaphone -*/ - /datum/recipe/jellydonut reagents = list("berryjuice" = 5, "flour" = 5) items = list( @@ -95,7 +75,6 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/appendix - /datum/recipe/brainburger reagents = list("flour" = 5) items = list( @@ -135,7 +114,6 @@ reagents = list("flour" = 5) items = list( /obj/item/clothing/mask/gas/clown_hat, - /* /obj/item/weapon/reagent_containers/food/snacks/grown/banana, */ ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/clown @@ -262,6 +240,15 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/muffin/booberry +/datum/recipe/cornedbeef + reagents = list("sodiumchloride" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage, + /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/cornedbeef + /datum/recipe/eggplantparm items = list( /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, @@ -943,7 +930,6 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/bloodsoup - /datum/recipe/slimesoup reagents = list("water" = 10, "slimejelly" = 5) items = list( @@ -957,14 +943,7 @@ /obj/item/weapon/ore/clown, ) result = /obj/item/weapon/reagent_containers/food/snacks/clownstears -/* -/datum/recipe/boiledslimeextract - reagents = list("water" = 5) - items = list( - /obj/item/slime_core, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/boiledslimecore -*/ + /datum/recipe/braincake reagents = list("milk" = 5, "flour" = 15) items = list( diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 23154b5ad56..ea7803aecf1 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -176,7 +176,7 @@ if(I.reagents.get_reagent_amount("nutriment") < 0.1) points += 1*productivity else points += I.reagents.get_reagent_amount("nutriment")*10*productivity - del(I) + qdel(I) if(S) processing = 1 update_icon() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index cb4bfe35781..6c2a883840c 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -87,8 +87,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/cherries seed = "/obj/item/seeds/cherryseed" @@ -100,9 +101,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 15), 1)) - reagents.add_reagent("sugar", 1+round((potency / 15), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 15), 1)) + reagents.add_reagent("sugar", 1+round((potency / 15), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/poppy seed = "/obj/item/seeds/poppyseed" @@ -115,9 +117,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - reagents.add_reagent("bicaridine", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 3, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) + reagents.add_reagent("bicaridine", 1+round((potency / 10), 1)) + bitesize = 1+round(reagents.total_volume / 3, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/harebell seed = "obj/item/seeds/harebellseed" @@ -130,8 +133,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 3, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) + bitesize = 1+round(reagents.total_volume / 3, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/potato seed = "/obj/item/seeds/potatoseed" @@ -144,19 +148,20 @@ ..() reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) spawn(5) //So potency can be set in the proc that creates these crops - bitesize = reagents.total_volume + if(reagents) + bitesize = reagents.total_volume /obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() if(istype(W, /obj/item/stack/cable_coil)) if(W:amount >= 5) W:amount -= 5 - if(!W:amount) del(W) + if(!W:amount) qdel(W) user << "You add some cable to the potato and slide it inside the battery encasing." var/obj/item/weapon/stock_parts/cell/potato/pocell = new /obj/item/weapon/stock_parts/cell/potato(user.loc) pocell.maxcharge = src.potency * 10 pocell.charge = pocell.maxcharge - del(src) + qdel(src) return /obj/item/weapon/reagent_containers/food/snacks/grown/grapes @@ -168,9 +173,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("sugar", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + reagents.add_reagent("sugar", 1+round((potency / 5), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/greengrapes seed = "/obj/item/seeds/greengrapeseed" @@ -182,9 +188,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("kelotane", 3+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + reagents.add_reagent("kelotane", 3+round((potency / 5), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage seed = "/obj/item/seeds/cabbageseed" @@ -196,8 +203,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = reagents.total_volume + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + bitesize = reagents.total_volume /obj/item/weapon/reagent_containers/food/snacks/grown/berries seed = "/obj/item/seeds/berryseed" @@ -208,8 +216,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries seed = "/obj/item/seeds/glowberryseed" @@ -222,11 +231,12 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", round((potency / 10), 1)) - reagents.add_reagent("uranium", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", round((potency / 10), 1)) + reagents.add_reagent("uranium", 3+round(potency / 5, 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) -/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/Del() +/obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/Destroy() if(istype(loc,/mob)) loc.AddLuminosity(round(-potency/5,1)) ..() @@ -249,9 +259,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("coco", 4+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + reagents.add_reagent("coco", 4+round((potency / 5), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane seed = "/obj/item/seeds/sugarcaneseed" @@ -263,7 +274,8 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("sugar", 4+round((potency / 5), 1)) + if(reagents) + reagents.add_reagent("sugar", 4+round((potency / 5), 1)) /obj/item/weapon/reagent_containers/food/snacks/grown/poisonberries seed = "/obj/item/seeds/poisonberryseed" @@ -276,9 +288,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("toxin", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("toxin", 3+round(potency / 5, 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/deathberries seed = "/obj/item/seeds/deathberryseed" @@ -291,10 +304,11 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("toxin", 3+round(potency / 3, 1)) - reagents.add_reagent("lexorin", 1+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("toxin", 3+round(potency / 3, 1)) + reagents.add_reagent("lexorin", 1+round(potency / 5, 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris seed = "/obj/item/seeds/ambrosiavulgaris" @@ -307,12 +321,13 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("space_drugs", 1+round(potency / 8, 1)) - reagents.add_reagent("kelotane", 1+round(potency / 8, 1)) - reagents.add_reagent("bicaridine", 1+round(potency / 10, 1)) - reagents.add_reagent("toxin", 1+round(potency / 10, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("space_drugs", 1+round(potency / 8, 1)) + reagents.add_reagent("kelotane", 1+round(potency / 8, 1)) + reagents.add_reagent("bicaridine", 1+round(potency / 10, 1)) + reagents.add_reagent("toxin", 1+round(potency / 10, 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus seed = "/obj/item/seeds/ambrosiadeus" @@ -325,12 +340,13 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("bicaridine", 1+round(potency / 8, 1)) - reagents.add_reagent("synaptizine", 1+round(potency / 8, 1)) - reagents.add_reagent("hyperzine", 1+round(potency / 10, 1)) - reagents.add_reagent("space_drugs", 1+round(potency / 10, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("bicaridine", 1+round(potency / 8, 1)) + reagents.add_reagent("synaptizine", 1+round(potency / 8, 1)) + reagents.add_reagent("hyperzine", 1+round(potency / 10, 1)) + reagents.add_reagent("space_drugs", 1+round(potency / 10, 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/apple seed = "/obj/item/seeds/appleseed" @@ -342,9 +358,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.maximum_volume = 20 - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = reagents.maximum_volume // Always eat the apple in one + if(reagents) + reagents.maximum_volume = 20 + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + bitesize = reagents.maximum_volume // Always eat the apple in one /obj/item/weapon/reagent_containers/food/snacks/grown/apple/poisoned seed = "/obj/item/seeds/poisonedappleseed" @@ -356,9 +373,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.maximum_volume = 20 - reagents.add_reagent("cyanide", 1+round((potency / 5), 1)) - bitesize = reagents.maximum_volume // Always eat the apple in one + if(reagents) + reagents.maximum_volume = 20 + reagents.add_reagent("cyanide", 1+round((potency / 5), 1)) + bitesize = reagents.maximum_volume // Always eat the apple in one /obj/item/weapon/reagent_containers/food/snacks/grown/goldapple seed = "/obj/item/seeds/goldappleseed" @@ -370,9 +388,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("gold", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + reagents.add_reagent("gold", 1+round((potency / 5), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/goldapple/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -391,8 +410,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 6), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 6), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin seed = "/obj/item/seeds/pumpkinseed" @@ -404,8 +424,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 6), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 6), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -413,7 +434,7 @@ if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/twohanded/fireaxe) || istype(W, /obj/item/weapon/kitchen/utensil/knife) || istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/melee/energy)) user.show_message("You carve a face into [src]!", 1) new /obj/item/clothing/head/hardhat/pumpkinhead (user.loc) - del(src) + qdel(src) return /obj/item/weapon/reagent_containers/food/snacks/grown/lime @@ -426,8 +447,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/lemon seed = "/obj/item/seeds/lemonseed" @@ -439,8 +461,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/orange seed = "/obj/item/seeds/orangeseed" @@ -452,8 +475,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet seed = "/obj/item/seeds/whitebeetseed" @@ -465,9 +489,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", round((potency / 20), 1)) - reagents.add_reagent("sugar", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", round((potency / 20), 1)) + reagents.add_reagent("sugar", 1+round((potency / 5), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/banana seed = "/obj/item/seeds/bananaseed" @@ -482,8 +507,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("banana", 1+round((potency / 10), 1)) - bitesize = 5 + if(reagents) + reagents.add_reagent("banana", 1+round((potency / 10), 1)) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/grown/chili seed = "/obj/item/seeds/chiliseed" @@ -494,9 +520,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) - reagents.add_reagent("capsaicin", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) + reagents.add_reagent("capsaicin", 3+round(potency / 5, 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/chili/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -513,10 +540,11 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) - reagents.add_reagent("capsaicin", 8+round(potency / 2, 1)) - reagents.add_reagent("condensedcapsaicin", 4+round(potency / 4, 1)) - bitesize = 1+round(reagents.total_volume / 4, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) + reagents.add_reagent("capsaicin", 8+round(potency / 2, 1)) + reagents.add_reagent("condensedcapsaicin", 4+round(potency / 4, 1)) + bitesize = 1+round(reagents.total_volume / 4, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chilli/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -550,8 +578,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans seed = "/obj/item/seeds/soyaseed" @@ -563,8 +592,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/koibeans seed = "/obj/item/seeds/koiseed" @@ -575,9 +605,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 30), 1)) - reagents.add_reagent("carpotoxin", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 30), 1)) + reagents.add_reagent("carpotoxin", 1+round((potency / 20), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/moonflower seed = "/obj/item/seeds/moonflowerseed" @@ -588,9 +619,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("moonshine", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) + reagents.add_reagent("moonshine", 1+round((potency / 10), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/tomato seed = "/obj/item/seeds/tomatoseed" @@ -602,14 +634,15 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) throw_impact(atom/hit_atom) ..() new/obj/effect/decal/cleanable/tomato_smudge(src.loc) src.visible_message("The [src.name] has been squashed.","You hear a smack.") - del(src) + qdel(src) return /obj/item/weapon/reagent_containers/food/snacks/grown/killertomato @@ -621,14 +654,15 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/killertomato/attack_self(mob/user as mob) if(istype(user.loc,/turf/space)) return new /mob/living/simple_animal/tomato(user.loc) - del(src) + qdel(src) user << "You plant the killer-tomato." @@ -642,9 +676,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) - reagents.add_reagent("blood", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) + reagents.add_reagent("blood", 1+round((potency / 5), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato/throw_impact(atom/hit_atom) ..() @@ -653,7 +688,7 @@ src.reagents.reaction(get_turf(hit_atom)) for(var/atom/A in get_turf(hit_atom)) src.reagents.reaction(A) - del(src) + qdel(src) return /obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato @@ -666,9 +701,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - reagents.add_reagent("lube", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) + reagents.add_reagent("lube", 1+round((potency / 5), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato/throw_impact(atom/hit_atom) ..() @@ -677,7 +713,7 @@ src.reagents.reaction(get_turf(hit_atom)) for(var/atom/A in get_turf(hit_atom)) src.reagents.reaction(A) - del(src) + qdel(src) return /obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato/Crossed(AM as mob|obj) @@ -702,8 +738,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/grass seed = "/obj/item/seeds/grassseed" @@ -713,8 +750,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/grass/attack_self(mob/user as mob) user << "You prepare the astroturf." @@ -722,10 +760,10 @@ var/grassAmt = 1 // The grass we're holding for(var/obj/item/weapon/reagent_containers/food/snacks/grown/grass/grassToConvert in location) // The grass on the floor grassAmt += 1 - del(grassToConvert) + qdel(grassToConvert) var/obj/item/stack/tile/newAstroturf = new /obj/item/stack/tile/grass(location) newAstroturf.amount = grassAmt - del(src) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/grown/kudzupod seed = "/obj/item/seeds/kudzuseed" @@ -735,9 +773,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("anti_toxin", 1+round((potency / 25), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) + reagents.add_reagent("anti_toxin", 1+round((potency / 25), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper seed = "/obj/item/seeds/icepepperseed" @@ -749,9 +788,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("frostoil", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) + reagents.add_reagent("frostoil", 3+round(potency / 5, 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -768,9 +808,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - reagents.add_reagent("imidazoline", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) + reagents.add_reagent("imidazoline", 3+round(potency / 5, 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi seed = "/obj/item/seeds/reishimycelium" @@ -782,10 +823,11 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("anti_toxin", 3+round(potency / 3, 1)) - reagents.add_reagent("stoxin", 3+round(potency / 3, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("anti_toxin", 3+round(potency / 3, 1)) + reagents.add_reagent("stoxin", 3+round(potency / 3, 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -803,10 +845,11 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("amatoxin", 3+round(potency / 3, 1)) - reagents.add_reagent("mushroomhallucinogen", 1+round(potency / 25, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("amatoxin", 3+round(potency / 3, 1)) + reagents.add_reagent("mushroomhallucinogen", 1+round(potency / 25, 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -824,10 +867,11 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("amatoxin", 13+round(potency / 3, 1)) - reagents.add_reagent("mushroomhallucinogen", 1+round(potency / 25, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) + reagents.add_reagent("amatoxin", 13+round(potency / 3, 1)) + reagents.add_reagent("mushroomhallucinogen", 1+round(potency / 25, 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -845,9 +889,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) - reagents.add_reagent("mushroomhallucinogen", 3+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) + reagents.add_reagent("mushroomhallucinogen", 3+round(potency / 5, 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -863,8 +908,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 2+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 2+round((potency / 10), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom seed = "/obj/item/seeds/walkingmushroom" @@ -874,8 +920,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 2+round((potency / 10), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 2+round((potency / 10), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user as mob) if(istype(user.loc,/turf/space)) @@ -886,7 +933,7 @@ M.melee_damage_upper += round(potency / 20) M.move_to_delay -= round(production / 50) M.health = M.maxHealth - del(src) + qdel(src) user << "You plant the walking mushroom." @@ -899,8 +946,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom seed = "/obj/item/seeds/glowshroom" @@ -919,7 +967,8 @@ potency = 30 plant_type = 2 spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("radium", 1+round((potency / 20), 1)) + if(reagents) + reagents.add_reagent("radium", 1+round((potency / 20), 1)) if(istype(src.loc,/mob)) pickup(src.loc)//adjusts the lighting on the mob else @@ -934,11 +983,11 @@ planted.endurance = endurance planted.yield = yield planted.potency = potency - del(src) + qdel(src) user << "You plant the glowshroom." -/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/Del() +/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/Destroy() if(istype(loc,/mob)) loc.AddLuminosity(round(-potency/10,1)) ..() @@ -978,7 +1027,7 @@ else new/obj/item/weapon/spacecash/c1000(src.loc) spawn(5) //Workaround to keep harvesting from working weirdly. - del(src) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/grown/bluespacetomato seed = "/obj/item/seeds/bluespacetomatoseed" @@ -991,9 +1040,10 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) - reagents.add_reagent("singulo", 1+round((potency / 5), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) + reagents.add_reagent("singulo", 1+round((potency / 5), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/gatfruit seed = "/obj/item/seeds/gatfruit" @@ -1006,11 +1056,12 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("sulfur", 1+round((potency / 10), 1)) - reagents.add_reagent("carbon", 1+round((potency / 10), 1)) - reagents.add_reagent("nitrogen", 1+round((potency / 15), 1)) - reagents.add_reagent("potassium", 1+round((potency / 20), 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + if(reagents) + reagents.add_reagent("sulfur", 1+round((potency / 10), 1)) + reagents.add_reagent("carbon", 1+round((potency / 10), 1)) + reagents.add_reagent("nitrogen", 1+round((potency / 15), 1)) + reagents.add_reagent("potassium", 1+round((potency / 20), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/coffee_arabica @@ -1023,7 +1074,8 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("coffeepowder", 1+round((potency / 10), 2)) + if(reagents) + reagents.add_reagent("coffeepowder", 1+round((potency / 10), 2)) /obj/item/weapon/reagent_containers/food/snacks/grown/coffee_robusta seed = "/obj/item/seeds/coffee_robusta_seed" @@ -1035,8 +1087,9 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("coffeepowder", 1+round((potency / 10), 2)) - reagents.add_reagent("hyperzine", 1+round((potency / 20), 1)) + if(reagents) + reagents.add_reagent("coffeepowder", 1+round((potency / 10), 2)) + reagents.add_reagent("hyperzine", 1+round((potency / 20), 1)) /obj/item/weapon/reagent_containers/food/snacks/grown/tobacco seed = "/obj/item/seeds/tobacco_seed" @@ -1057,7 +1110,8 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("dexalin", 1+round((potency / 20), 1)) + if(reagents) + reagents.add_reagent("dexalin", 1+round((potency / 20), 1)) /obj/item/weapon/reagent_containers/food/snacks/grown/tea_aspera @@ -1070,7 +1124,8 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("teapowder", 1+round((potency / 10), 2)) + if(reagents) + reagents.add_reagent("teapowder", 1+round((potency / 10), 2)) /obj/item/weapon/reagent_containers/food/snacks/grown/tea_astra @@ -1083,5 +1138,6 @@ New() ..() spawn(5) //So potency can be set in the proc that creates these crops - reagents.add_reagent("teapowder", 1+round((potency / 10), 2)) - reagents.add_reagent("kelotane", 1+round((potency / 20), 1)) + if(reagents) + reagents.add_reagent("teapowder", 1+round((potency / 10), 2)) + reagents.add_reagent("kelotane", 1+round((potency / 20), 1)) diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 0b783cc6aff..ad9022bbbad 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -68,7 +68,7 @@ continue G.attackby(NG, user) usr << "You add the newly-formed wood to the stack. It now contains [NG.amount] planks." - del(src) + qdel(src) return if(is_type_in_list(W,accepted)) var/obj/item/weapon/reagent_containers/food/snacks/grown/leaf = W @@ -77,8 +77,8 @@ var/obj/item/device/flashlight/flare/torch/T = new /obj/item/device/flashlight/flare/torch(user.loc) usr.unEquip(W) usr.put_in_active_hand(T) - del(leaf) - del(src) + qdel(leaf) + qdel(src) return else usr << "\red You must dry this first." @@ -189,4 +189,4 @@ w_class = 1.0 throwforce = 0 throw_speed = 3 - throw_range = 7 + throw_range = 7 diff --git a/code/modules/hydroponics/hydroitemcode.dm b/code/modules/hydroponics/hydroitemcode.dm index 938778ee691..dcb3c2346c2 100644 --- a/code/modules/hydroponics/hydroitemcode.dm +++ b/code/modules/hydroponics/hydroitemcode.dm @@ -21,7 +21,7 @@ else usr << "All the petals have fallen off the [name] from violent whacking." usr.unEquip(src) - del(src) + qdel(src) /obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user as mob) if(!user.gloves) @@ -47,7 +47,7 @@ else usr << "All the leaves have fallen off the nettle from violent whacking." usr.unEquip(src) - del(src) + qdel(src) /obj/item/weapon/grown/nettle/changePotency(newValue) //-QualityVan ..() @@ -87,7 +87,7 @@ else usr << "All the leaves have fallen off the deathnettle from violent whacking." usr.unEquip(src) - del(src) + qdel(src) /obj/item/weapon/grown/deathnettle/changePotency(newValue) //-QualityVan ..() @@ -101,7 +101,7 @@ user << "You use [W] to fashion a pipe out of the corn cob!" new /obj/item/clothing/mask/cigarette/pipe/cobpipe (user.loc) usr.unEquip(src) - del(src) + qdel(src) return //Bluespace Tomatoes @@ -116,7 +116,7 @@ new/obj/effect/decal/cleanable/oil(src.loc) src.visible_message("The [src.name] has been squashed.","You hear a smack.") usr.unEquip(src) - del(src) + qdel(src) return for(var/turf/T in orange(M,outer_teleport_radius)) if(T in orange(M,inner_teleport_radius)) continue @@ -153,5 +153,5 @@ s.start() new/obj/effect/decal/cleanable/oil(src.loc) src.visible_message("The [src.name] has been squashed, causing a distortion in space-time.","You hear a splat and a crackle.") - del(src) + qdel(src) return \ No newline at end of file diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 0a0175b0d3c..cde9b447a88 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -274,7 +274,7 @@ obj/machinery/hydroponics/proc/weedinvasion() // If a weed growth is sufficient, var/oldPlantName if(myseed) // In case there's nothing in the tray beforehand oldPlantName = myseed.plantname - del(myseed) + qdel(myseed) else oldPlantName = "Empty tray" switch(rand(1,18)) // randomly pick predominative weed @@ -326,7 +326,7 @@ obj/machinery/hydroponics/proc/mutatespecie() // Mutagent produced a new plant! var/oldPlantName = myseed.plantname if(myseed.mutatelist.len > 0) var/mutantseed = pick(myseed.mutatelist) - del(myseed) + qdel(myseed) myseed = new mutantseed else @@ -349,7 +349,7 @@ obj/machinery/hydroponics/proc/mutatespecie() // Mutagent produced a new plant! obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant if( weedlevel > 5 ) if(myseed) - del(myseed) + qdel(myseed) var/newWeed = pick(/obj/item/seeds/libertymycelium, /obj/item/seeds/angelmycelium, /obj/item/seeds/deathnettleseed, /obj/item/seeds/kudzuseed) myseed = new newWeed dead = 0 @@ -442,7 +442,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) reagent_source.reagents.trans_to(S,split) if(istype(reagent_source, /obj/item/weapon/reagent_containers/food/snacks) || istype(reagent_source, /obj/item/weapon/reagent_containers/pill)) - del(reagent_source) + qdel(reagent_source) @@ -618,7 +618,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) else user << "Nothing happens..." S.clear_reagents() - del(S) + qdel(S) H.update_icon() return 1 @@ -727,7 +727,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) planted = 0 dead = 0 user << "You remove the dead plant from [src]." - del(myseed) + qdel(myseed) update_icon() else if(planted && !dead) @@ -939,7 +939,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) else user << "You harvest [myseed.yield] items from the [myseed.plantname]." if(myseed.oneharvest) - del(myseed) + qdel(myseed) planted = 0 dead = 0 update_icon() @@ -1051,4 +1051,4 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) ..() if(istype(O, /obj/item/weapon/shovel)) user << "You clear up [src]!" - del(src) + qdel(src) diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index c67f22314d4..758bd4c27af 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -14,7 +14,7 @@ t_prod.yield = F.yield t_prod.potency = F.potency t_amount++ - del(O) + qdel(O) return 1 else if(istype(O, /obj/item/weapon/grown/)) @@ -29,7 +29,7 @@ t_prod.yield = F.yield t_prod.potency = F.potency t_amount++ - del(O) + qdel(O) return 1 else return 0 @@ -182,4 +182,4 @@ obj/machinery/seed_extractor/proc/add(var/obj/item/seeds/O as obj) return piles += new /datum/seed_pile(O.plantname, O.lifespan, O.endurance, O.maturation, O.production, O.yield, O.potency) - return \ No newline at end of file + return diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index e81b479066c..06628962216 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -1039,7 +1039,7 @@ return user << "You plant the kudzu. You monster." new /obj/effect/spacevine_controller(user.loc) - del(src) + qdel(src) /obj/item/seeds/chillighost name = "pack of ghost chilli seeds" diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 443da63c688..1923fa230b2 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -44,7 +44,7 @@ if(do_after(user, 20)) user << "You pry the frame apart." new /obj/item/stack/sheet/wood(loc, 4) - del(src) + qdel(src) if(1) if(istype(I, /obj/item/stack/sheet/wood)) @@ -108,20 +108,20 @@ switch(severity) if(1.0) for(var/obj/item/weapon/book/b in contents) - del(b) - del(src) + qdel(b) + qdel(src) if(2.0) for(var/obj/item/weapon/book/b in contents) if(prob(50)) b.loc = (get_turf(src)) else - del(b) - del(src) + qdel(b) + qdel(src) if(3.0) if(prob(50)) for(var/obj/item/weapon/book/b in contents) b.loc = (get_turf(src)) - del(src) + qdel(src) /obj/structure/bookcase/update_icon() diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 16e4dd7dcdb..e0e3b36e19f 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -472,6 +472,6 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f b.dat = O:info b.name = "Print Job #" + "[rand(100, 999)]" b.icon_state = "book[rand(1,7)]" - del(O) + qdel(O) else ..() diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 9c6b94214ef..e9cad5c53d7 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -64,7 +64,7 @@ var/obj/item/stack/sheet/M = O.refined_type points += O.points return M - del(O)//No refined type? Purge it. + qdel(O)//No refined type? Purge it. return /obj/machinery/mineral/ore_redemption/attack_hand(user as mob) @@ -262,7 +262,7 @@ new /obj/item/weapon/weldingtool/hugetank(src.loc) if("Cancel") return - del(voucher) + qdel(voucher) /obj/machinery/mineral/equipment_locker/ex_act() return @@ -335,7 +335,7 @@ J.target = chosen_beacon try_move_adjacent(J) playsound(src,'sound/effects/sparks4.ogg',50,1) - del(src) + qdel(src) /obj/effect/portal/wormhole/jaunt_tunnel name = "jaunt tunnel" @@ -413,7 +413,7 @@ playsound(src,'sound/effects/sparks4.ogg',50,1) M.gets_drilled() spawn(5) - del(src) + qdel(src) else var/datum/gas_mixture/environment = proj_turf.return_air() var/pressure = environment.return_pressure() @@ -431,7 +431,7 @@ for(var/mob/living/L in src.loc) L << "The [src.name] ruptured with you in it!" L.adjustBruteLoss(resonance_damage) - del(src) + qdel(src) /**********************Facehugger toy**********************/ @@ -515,7 +515,7 @@ visible_message("[src] is destroyed!") new /obj/effect/decal/cleanable/robot_debris(src.loc) DropOre() - del src + qdel(src) return /mob/living/simple_animal/hostile/mining_drone/New() @@ -694,4 +694,4 @@ name = "mining jetpack" icon_state = "jetpack-mining" item_state = "jetpack-mining" - desc = "A tank of compressed carbon dioxide for miners to use as propulsion in local space. Should not be used for internals." \ No newline at end of file + desc = "A tank of compressed carbon dioxide for miners to use as propulsion in local space. Should not be used for internals." diff --git a/code/modules/mining/laborcamp/laborminerals.dm b/code/modules/mining/laborcamp/laborminerals.dm index 8c5d70b08ea..8649128cd23 100644 --- a/code/modules/mining/laborcamp/laborminerals.dm +++ b/code/modules/mining/laborcamp/laborminerals.dm @@ -1,7 +1,7 @@ -/turf/simulated/mineral/random/labormineral - mineralSpawnChanceList = list("Uranium" = 1, "Iron" = 100, "Diamond" = 1, "Gold" = 1, "Silver" = 1, "Plasma" = 1/*, "Adamantine" =5, "Cave" = 1 */) //Don't suffocate the prisoners with caves - icon_state = "rock_labor" - -/turf/simulated/mineral/random/labormineral/New() - icon_state = "rock" +/turf/simulated/mineral/random/labormineral + mineralSpawnChanceList = list("Uranium" = 1, "Iron" = 100, "Diamond" = 1, "Gold" = 1, "Silver" = 1, "Plasma" = 1/*, "Adamantine" =5, "Cave" = 1 */) //Don't suffocate the prisoners with caves + icon_state = "rock_labor" + +/turf/simulated/mineral/random/labormineral/New() + icon_state = "rock" ..() \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm index fb93f98e83a..535edbb899d 100644 --- a/code/modules/mining/laborcamp/laborshuttle.dm +++ b/code/modules/mining/laborcamp/laborshuttle.dm @@ -1,22 +1,22 @@ -/obj/machinery/computer/shuttle/labor - name = "Labor Shuttle Console" - icon = 'icons/obj/computer.dmi' - icon_state = "shuttle" - circuit = /obj/item/weapon/circuitboard/labor_shuttle - id = "laborcamp" - req_access = list(access_brig) - - -/obj/machinery/computer/shuttle/labor/one_way - name = "Prisoner Shuttle Console" - desc = "A one-way shuttle console, used to summon the shuttle to the labor camp." - circuit = /obj/item/weapon/circuitboard/labor_shuttle/one_way - req_access = list( ) - -/obj/machinery/computer/shuttle/labor/one_way/Topic(href, href_list) - if(href_list["move"]) - var/datum/shuttle_manager/s = shuttles["laborcamp"] - if(s.location == /area/shuttle/laborcamp/outpost) - usr << "\blue Shuttle is already at the outpost." - return 0 +/obj/machinery/computer/shuttle/labor + name = "Labor Shuttle Console" + icon = 'icons/obj/computer.dmi' + icon_state = "shuttle" + circuit = /obj/item/weapon/circuitboard/labor_shuttle + id = "laborcamp" + req_access = list(access_brig) + + +/obj/machinery/computer/shuttle/labor/one_way + name = "Prisoner Shuttle Console" + desc = "A one-way shuttle console, used to summon the shuttle to the labor camp." + circuit = /obj/item/weapon/circuitboard/labor_shuttle/one_way + req_access = list( ) + +/obj/machinery/computer/shuttle/labor/one_way/Topic(href, href_list) + if(href_list["move"]) + var/datum/shuttle_manager/s = shuttles["laborcamp"] + if(s.location == /area/shuttle/laborcamp/outpost) + usr << "\blue Shuttle is already at the outpost." + return 0 ..() \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index b7e86d5c48b..13195eff487 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -1,139 +1,139 @@ -/**********************Prisoners' Console**************************/ - -/obj/machinery/mineral/labor_claim_console - name = "Point Claim Console" - desc = "A stacking console with an electromagnetic writer, used to track ore mined by prisoners." - name = "stacking machine console" - icon = 'icons/obj/machines/mining_machines.dmi' - icon_state = "console" - density = 0 - anchored = 1 - var/obj/machinery/mineral/stacking_machine/laborstacker/machine = null - var/machinedir = SOUTH - var/obj/item/weapon/card/id/prisoner/inserted_id - var/obj/machinery/door/airlock/release_door - var/door_tag = "prisonshuttle" - -/obj/machinery/mineral/labor_claim_console/New() - ..() - spawn(7) - src.machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) - var/t - for(var/obj/machinery/door/airlock/d in range(5,src)) - t = d.id_tag - if(t == src.door_tag) - src.release_door = d - if (machine && release_door) - machine.CONSOLE = src - else - del(src) - -/obj/machinery/mineral/labor_claim_console/proc/check_auth() - if(emagged) return 1 //Shuttle is emagged, let any ol' person through - return (istype(inserted_id) && inserted_id.points >= inserted_id.goal) //Otherwise, only let them out if the prisoner's reached his quota. - - -/obj/machinery/mineral/labor_claim_console/attack_hand(user as mob) - name = "Point Claim Console" - icon = 'icons/obj/machines/mining_machines.dmi' - icon_state = "console" - desc = "A stacking console with an electromagnetic writer, used to track ore mined by prisoners." - density = 0 - anchored = 1 - var/dat - dat += text("Point Claim Console

    ") - if(emagged) //Shit's broken - dat += text("QU&#t0A In%aL*D
    ") - else if(istype(inserted_id)) //There's an ID in there. - dat += text("[inserted_id.points] / [inserted_id.goal] collected. Eject ID.
    ") - dat += text("Unclaimed Collection Points: [machine.points]. Claim points.
    ") - else //No ID in sight. Complain about it. - dat += text("No ID inserted. Insert ID.
    ") - if(check_auth()) - dat += text("Proceed to Station.
    ") - dat += text("Open release door.
    ") - if(machine) - dat += text("
    Mineral Value List:
    [machine.get_ore_values()]") - - - user << browse("[dat]", "window=console_stacking_machine") - - -/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I as obj, mob/user as mob) - if(istype(I, /obj/item/weapon/card/emag)) - emagged = 1 - user << "PZZTTPFFFT" - return - else if(istype(I, /obj/item/weapon/card/id)) - return attack_hand(user) - ..() - - - - - -/obj/machinery/mineral/labor_claim_console/Topic(href, href_list) - usr.set_machine(src) - src.add_fingerprint(usr) - if(href_list["choice"]) - if(istype(inserted_id)) //Sanity check against href spoofs - if(href_list["choice"] == "eject") - inserted_id.loc = loc - inserted_id.verb_pickup() - inserted_id = null - if(href_list["choice"] == "claim") - inserted_id.points += machine.points - machine.points = 0 - src << "Points transferred." - else if(href_list["choice"] == "insert") - var/obj/item/weapon/card/id/prisoner/I = usr.get_active_hand() - if(istype(I)) - usr.drop_item() - I.loc = src - inserted_id = I - else usr << "\red No valid ID." - if(check_auth()) //Sanity check against hef spoofs - if(href_list["choice"] == "station") - var/datum/shuttle_manager/s = shuttles["laborcamp"] - if(s.location == /area/shuttle/laborcamp/outpost) - if(alone_in_area(get_area(loc), usr)) - if (s.move_shuttle(0)) // No delay, to stop people from getting on while it is departing. - usr << "\blue Shuttle recieved message and will be sent shortly." - else - usr << "\blue Shuttle is already moving." - else - usr << "\red Prisoners are only allowed to be released while alone." - else - usr << "\blue Shuttle is already on-station." - if(href_list["choice"] == "release") - if(alone_in_area(get_area(loc), usr)) - if(release_door.density) - release_door.open() - else - usr << "\red Prisoners are only allowed to be released while alone." - src.updateUsrDialog() - return - - -/**********************Prisoner Collection Unit**************************/ - - -/obj/machinery/mineral/stacking_machine/laborstacker - var/points = 0 //The unclaimed value of ore stacked. Value for each ore loosely relative to its rarity. - var/list/ore_values = list(("glass" = 1), ("metal" = 2), ("solid plasma" = 20), ("plasteel" = 23), ("reinforced glass" = 4), ("gold" = 20), ("silver" = 20), ("uranium" = 20), ("diamond" = 25), ("bananium" = 50)) - -/obj/machinery/mineral/stacking_machine/laborstacker/proc/get_ore_values() - var/dat = "" - for(var/ore in ore_values) - var/value = ore_values[ore] - dat += "" - dat += "
    [capitalize(ore)][value]
    " - return dat - -/obj/machinery/mineral/stacking_machine/laborstacker/process_sheet(obj/item/stack/sheet/inp) - if(istype(inp)) - var/n = inp.name - var/a = inp.amount - if(n in ore_values) - points += ore_values[n] * a +/**********************Prisoners' Console**************************/ + +/obj/machinery/mineral/labor_claim_console + name = "Point Claim Console" + desc = "A stacking console with an electromagnetic writer, used to track ore mined by prisoners." + name = "stacking machine console" + icon = 'icons/obj/machines/mining_machines.dmi' + icon_state = "console" + density = 0 + anchored = 1 + var/obj/machinery/mineral/stacking_machine/laborstacker/machine = null + var/machinedir = SOUTH + var/obj/item/weapon/card/id/prisoner/inserted_id + var/obj/machinery/door/airlock/release_door + var/door_tag = "prisonshuttle" + +/obj/machinery/mineral/labor_claim_console/New() + ..() + spawn(7) + src.machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) + var/t + for(var/obj/machinery/door/airlock/d in range(5,src)) + t = d.id_tag + if(t == src.door_tag) + src.release_door = d + if (machine && release_door) + machine.CONSOLE = src + else + qdel(src) + +/obj/machinery/mineral/labor_claim_console/proc/check_auth() + if(emagged) return 1 //Shuttle is emagged, let any ol' person through + return (istype(inserted_id) && inserted_id.points >= inserted_id.goal) //Otherwise, only let them out if the prisoner's reached his quota. + + +/obj/machinery/mineral/labor_claim_console/attack_hand(user as mob) + name = "Point Claim Console" + icon = 'icons/obj/machines/mining_machines.dmi' + icon_state = "console" + desc = "A stacking console with an electromagnetic writer, used to track ore mined by prisoners." + density = 0 + anchored = 1 + var/dat + dat += text("Point Claim Console

    ") + if(emagged) //Shit's broken + dat += text("QU&#t0A In%aL*D
    ") + else if(istype(inserted_id)) //There's an ID in there. + dat += text("[inserted_id.points] / [inserted_id.goal] collected. Eject ID.
    ") + dat += text("Unclaimed Collection Points: [machine.points]. Claim points.
    ") + else //No ID in sight. Complain about it. + dat += text("No ID inserted. Insert ID.
    ") + if(check_auth()) + dat += text("Proceed to Station.
    ") + dat += text("Open release door.
    ") + if(machine) + dat += text("
    Mineral Value List:
    [machine.get_ore_values()]") + + + user << browse("[dat]", "window=console_stacking_machine") + + +/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I as obj, mob/user as mob) + if(istype(I, /obj/item/weapon/card/emag)) + emagged = 1 + user << "PZZTTPFFFT" + return + else if(istype(I, /obj/item/weapon/card/id)) + return attack_hand(user) + ..() + + + + + +/obj/machinery/mineral/labor_claim_console/Topic(href, href_list) + usr.set_machine(src) + src.add_fingerprint(usr) + if(href_list["choice"]) + if(istype(inserted_id)) //Sanity check against href spoofs + if(href_list["choice"] == "eject") + inserted_id.loc = loc + inserted_id.verb_pickup() + inserted_id = null + if(href_list["choice"] == "claim") + inserted_id.points += machine.points + machine.points = 0 + src << "Points transferred." + else if(href_list["choice"] == "insert") + var/obj/item/weapon/card/id/prisoner/I = usr.get_active_hand() + if(istype(I)) + usr.drop_item() + I.loc = src + inserted_id = I + else usr << "\red No valid ID." + if(check_auth()) //Sanity check against hef spoofs + if(href_list["choice"] == "station") + var/datum/shuttle_manager/s = shuttles["laborcamp"] + if(s.location == /area/shuttle/laborcamp/outpost) + if(alone_in_area(get_area(loc), usr)) + if (s.move_shuttle(0)) // No delay, to stop people from getting on while it is departing. + usr << "\blue Shuttle recieved message and will be sent shortly." + else + usr << "\blue Shuttle is already moving." + else + usr << "\red Prisoners are only allowed to be released while alone." + else + usr << "\blue Shuttle is already on-station." + if(href_list["choice"] == "release") + if(alone_in_area(get_area(loc), usr)) + if(release_door.density) + release_door.open() + else + usr << "\red Prisoners are only allowed to be released while alone." + src.updateUsrDialog() + return + + +/**********************Prisoner Collection Unit**************************/ + + +/obj/machinery/mineral/stacking_machine/laborstacker + var/points = 0 //The unclaimed value of ore stacked. Value for each ore loosely relative to its rarity. + var/list/ore_values = list(("glass" = 1), ("metal" = 2), ("solid plasma" = 20), ("plasteel" = 23), ("reinforced glass" = 4), ("gold" = 20), ("silver" = 20), ("uranium" = 20), ("diamond" = 25), ("bananium" = 50)) + +/obj/machinery/mineral/stacking_machine/laborstacker/proc/get_ore_values() + var/dat = "" + for(var/ore in ore_values) + var/value = ore_values[ore] + dat += "" + dat += "
    [capitalize(ore)][value]
    " + return dat + +/obj/machinery/mineral/stacking_machine/laborstacker/process_sheet(obj/item/stack/sheet/inp) + if(istype(inp)) + var/n = inp.name + var/a = inp.amount + if(n in ore_values) + points += ore_values[n] * a ..() \ No newline at end of file diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 2a0c97eddba..3dfcec72548 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -16,7 +16,7 @@ if (machine) machine.CONSOLE = src else - del(src) + qdel(src) /obj/machinery/mineral/processing_unit_console/attack_hand(user as mob) diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index e1f32e1bdbe..c1f1474eeb4 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -16,7 +16,7 @@ if (machine) machine.CONSOLE = src else - del(src) + qdel(src) /obj/machinery/mineral/stacking_unit_console/attack_hand(user as mob) diff --git a/code/modules/mining/mine_areas.dm b/code/modules/mining/mine_areas.dm index 40ed5deb184..06ced5db488 100644 --- a/code/modules/mining/mine_areas.dm +++ b/code/modules/mining/mine_areas.dm @@ -2,6 +2,7 @@ /area/mine icon_state = "mining" + has_gravity = 1 /area/mine/explored name = "Mine" diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index f0f2d409b53..48c101d41be 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -12,7 +12,7 @@ var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(15)) new refined_type(get_turf(src.loc)) - del(src) + qdel(src) else user << "Not enough fuel to smelt [src]." ..() @@ -43,10 +43,10 @@ var/sandAmt = 1 // The sand we're holding for(var/obj/item/weapon/ore/glass/sandToConvert in location) // The sand on the floor sandAmt += 1 - del(sandToConvert) + qdel(sandToConvert) var/obj/item/stack/sheet/mineral/newSandstone = new /obj/item/stack/sheet/mineral/sandstone(location) newSandstone.amount = sandAmt - del(src) + qdel(src) /obj/item/weapon/ore/plasma name = "Plasma ore" @@ -158,7 +158,7 @@ explosion(src.loc,1,2,5,adminlog = notify_admins) if(quality == 1) explosion(src.loc,-1,1,3,adminlog = notify_admins) - del(src) + qdel(src) /obj/item/weapon/ore/New() pixel_x = rand(0,16)-8 @@ -232,7 +232,7 @@ if(CC.amount <= 0) user << "\blue This cable coil appears to be empty." - del(CC) + qdel(CC) return overlays += image('icons/obj/economy.dmi',"coin_string_overlay") diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index 528e9222117..8116544117e 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -1,15 +1,19 @@ -// Camera mob, used by AI camera and blob. - -/mob/camera - name = "camera mob" - density = 0 - anchored = 1 - status_flags = GODMODE // You can't damage it. - mouse_opacity = 0 - see_in_dark = 7 - invisibility = 101 // No one can see us - - move_on_shuttle = 0 - -/mob/camera/experience_pressure_difference() - return \ No newline at end of file +// Camera mob, used by AI camera and blob. + +/mob/camera + name = "camera mob" + density = 0 + anchored = 1 + status_flags = GODMODE // You can't damage it. + mouse_opacity = 0 + see_in_dark = 7 + invisibility = 101 // No one can see us + + move_on_shuttle = 0 + +/mob/camera/experience_pressure_difference() + return + +/mob/camera/Destroy() + ..() + del(src) \ No newline at end of file diff --git a/code/modules/mob/dead/observer/logout.dm b/code/modules/mob/dead/observer/logout.dm index cf51df634eb..11c6c3c834c 100644 --- a/code/modules/mob/dead/observer/logout.dm +++ b/code/modules/mob/dead/observer/logout.dm @@ -2,4 +2,4 @@ ..() spawn(0) if(src && !key) //we've transferred to another mob. This ghost should be deleted. - del(src) + qdel(src) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index ddbaeafd8b7..b4e43ce2af4 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -210,7 +210,7 @@ Des: Removes all infected images from the alien. if (client) for(var/image/I in client.images) if(dd_hasprefix_case(I.icon_state, "infected")) - del(I) + qdel(I) return #undef HEAT_DAMAGE_LEVEL_1 diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 989e09c6755..7766851cbf1 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -1,2 +1,2 @@ -/mob/living/carbon/alien/hitby(atom/movable/AM) +/mob/living/carbon/alien/hitby(atom/movable/AM) ..(AM, 1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index 4d837ed7379..efe7e9d47aa 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -42,7 +42,7 @@ O.show_message(text("\green [src] begins to twist and contort!"), 1) var/mob/living/carbon/alien/humanoid/queen/new_xeno = new (loc) mind.transfer_to(new_xeno) - del(src) + qdel(src) else src << "We already have an alive queen." return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index f64ce5a9246..937323da58f 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -463,7 +463,7 @@ if(M.stat == 2) M.death(1) stomach_contents.Remove(M) - del(M) + qdel(M) continue if(air_master.current_cycle%3==1) if(!(status_flags & GODMODE)) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 8c5f4684b3f..2e2c464a30c 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -312,4 +312,4 @@ else var/mob/living/carbon/alien/humanoid/A = new(loc) A.key = key - del(src) */ \ No newline at end of file + qdel(src) */ diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index a41fe0f9f5a..90ca908de60 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -377,7 +377,7 @@ if(M.stat == 2) M.death(1) stomach_contents.Remove(M) - del(M) + qdel(M) continue if(air_master.current_cycle%3==1) if(!(M.status_flags & GODMODE)) diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index a1806692dfa..21e5494e2bb 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -49,7 +49,7 @@ if("Drone") new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc) if(mind) mind.transfer_to(new_xeno) - del(src) + qdel(src) return else src << "\red You are not fully grown." diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 861f63f0c10..6c1ca41053a 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -18,9 +18,9 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds spawn(0) AddInfectionImages(affected_mob) else - del(src) + qdel(src) -/obj/item/alien_embryo/Del() +/obj/item/alien_embryo/Destroy() if(affected_mob) affected_mob.status_flags &= ~(XENO_HOST) spawn(0) @@ -103,7 +103,7 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds if(istype(new_xeno.loc,/mob/living/carbon)) var/mob/living/carbon/digester = new_xeno.loc digester.stomach_contents += new_xeno - del(src) + qdel(src) /*---------------------------------------- Proc: RefreshInfectionImage() @@ -114,7 +114,7 @@ Des: Removes all infection images from aliens and places an infection image on a if(alien.client) for(var/image/I in alien.client.images) if(dd_hasprefix_case(I.icon_state, "infected")) - del(I) + qdel(I) for(var/mob/living/L in mob_list) if(iscorgi(L) || iscarbon(L)) if(L.status_flags & XENO_HOST) @@ -145,4 +145,4 @@ Des: Removes the alien infection image from all aliens in the world located in p for(var/image/I in alien.client.images) if(I.loc == C) if(dd_hasprefix_case(I.icon_state, "infected")) - del(I) \ No newline at end of file + qdel(I) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index d1a45c5a75b..82498bd1afd 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -10,7 +10,7 @@ create_reagents(1000) ..() - Del() + Destroy() if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. if(stat!=DEAD) //If not dead. death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA @@ -51,4 +51,4 @@ return canmove /mob/living/carbon/brain/toggle_throw_mode() - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index c39f1039943..5e44ce96ccd 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -21,8 +21,8 @@ /mob/living/carbon/brain/gib(var/animation = 0) if(container && istype(container, /obj/item/device/mmi)) - del(container)//Gets rid of the MMI if there is one + qdel(container)//Gets rid of the MMI if there is one if(loc) if(istype(loc,/obj/item/organ/brain)) - del(loc)//Gets rid of the brain item + qdel(loc)//Gets rid of the brain item ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index dd886691d40..e59f5571cb9 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1,3 +1,10 @@ +/mob/living/carbon/Destroy() + for(var/atom/movable/guts in internal_organs) + qdel(guts) + for(var/atom/movable/food in stomach_contents) + qdel(food) + return ..() + /mob/living/carbon/Move(NewLoc, direct) . = ..() if(.) @@ -266,6 +273,7 @@ /mob/proc/throw_item(atom/target) return + /mob/living/carbon/throw_item(atom/target) throw_mode_off() if(usr.stat || !target) @@ -279,7 +287,7 @@ if(istype(item, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = item item = G.throw() //throw the person instead of the grab - del(G) //We delete the grab, as it needs to stay around until it's returned. + qdel(G) //We delete the grab, as it needs to stay around until it's returned. if(ismob(item)) var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors var/turf/end_T = get_turf(target) @@ -304,7 +312,7 @@ if(!src.lastarea) src.lastarea = get_area(src.loc) - if((istype(src.loc, /turf/space)) || (src.lastarea.has_gravity == 0)) + if(!has_gravity(src)) src.inertia_dir = get_dir(target, src) step(src, inertia_dir) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 753589628c6..28ebc72d92a 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -1,12 +1,12 @@ -/mob/living/carbon/hitby(atom/movable/AM, skip) - if(!skip) //ugly, but easy - if(in_throw_mode && !get_active_hand()) //empty active hand and we're in throw mode - if(canmove && !restrained()) - if(istype(AM, /obj/item)) - var/obj/item/I = AM - if(isturf(I.loc)) - put_in_active_hand(I) - visible_message("[src] catches [I]!") - throw_mode_off() - return +/mob/living/carbon/hitby(atom/movable/AM, skip) + if(!skip) //ugly, but easy + if(in_throw_mode && !get_active_hand()) //empty active hand and we're in throw mode + if(canmove && !restrained()) + if(istype(AM, /obj/item)) + var/obj/item/I = AM + if(isturf(I.loc)) + put_in_active_hand(I) + visible_message("[src] catches [I]!") + throw_mode_off() + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index 6541ebe7c56..af48fdc58b7 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -1,200 +1,200 @@ -//This only assumes that the mob has a body and face with at least one eye, and one mouth. -//Things like airguitar can be done without arms, and the flap thing makes so little sense it's a keeper. -//Intended to be called by a higher up emote proc if the requested emote isn't in the custom emotes. - -/mob/living/carbon/emote(var/act,var/m_type=1,var/message = null) - var/param = null - - if (findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - - if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' - act = copytext(act,1,length(act)) - - var/muzzled = (src.wear_mask && istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) - //var/m_type = 1 - - switch(act)//Even carbon organisms want it alphabetically ordered.. - if ("aflap") - if (!src.restrained()) - message = "[src] flaps \his wings ANGRILY!" - m_type = 2 - - if ("airguitar") - if (!src.restrained()) - message = "[src] is strumming the air and headbanging like a safari chimp." - m_type = 1 - - if ("blink") - message = "[src] blinks." - m_type = 1 - - if ("blink_r") - message = "[src] blinks rapidly." - m_type = 1 - - if ("blush") - message = "[src] blushes." - m_type = 1 - - if ("bow") - if (!src.buckled) - var/M = null - if (param) - for (var/mob/A in view(1, src)) - if (param == A.name) - M = A - break - if (!M) - param = null - if (param) - message = "[src] bows to [param]." - else - message = "[src] bows." - m_type = 1 - - if ("burp") - if (!muzzled) - ..(act) - - if ("choke") - if (!muzzled) - ..(act) - else - message = "[src] makes a strong noise." - m_type = 2 - - if ("chuckle") - if (!muzzled) - ..(act) - else - message = "[src] makes a noise." - m_type = 2 - - if ("clap") - if (!src.restrained()) - message = "[src] claps." - m_type = 2 - - if ("cough") - if (!muzzled) - ..(act) - else - message = "[src] makes a strong noise." - m_type = 2 - - if ("deathgasp") - message = "[src] seizes up and falls limp, \his eyes dead and lifeless..." - m_type = 1 - - if ("flap") - if (!src.restrained()) - message = "[src] flaps \his wings." - m_type = 2 - - if ("gasp") - if (!muzzled) - ..(act) - else - message = "[src] makes a weak noise." - m_type = 2 - - if ("giggle") - if (!muzzled) - ..(act) - else - message = "[src] makes a noise." - m_type = 2 - - if ("laugh") - if (!muzzled) - ..(act) - else - message = "[src] makes a noise." - - if ("nod") - message = "[src] nods." - m_type = 1 - - if ("scream") - if (!muzzled) - ..(act) - else - message = "[src] makes a very loud noise." - m_type = 2 - - if ("shake") - message = "[src] shakes \his head." - m_type = 1 - - if ("sneeze") - if (!muzzled) - ..(act) - else - message = "[src] makes a strange noise." - m_type = 2 - - if ("sigh") - if (!muzzled) - ..(act) - else - message = "[src] sighs." - m_type = 2 - - if ("sniff") - message = "[src] sniffs." - m_type = 2 - - if ("snore") - if (!muzzled) - ..(act) - else - message = "[src] makes a noise." - m_type = 2 - - if ("whimper") - if (!muzzled) - ..(act) - else - message = "[src] makes a weak noise." - m_type = 2 - - if ("wink") - message = "[src] winks." - m_type = 1 - - if ("yawn") - if (!muzzled) - ..(act) - - if ("help") - src << "Help for emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, grin, jump, laugh, look, me, nod, point-atom, scream, shake, sigh, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, wink, yawn" - - else - ..(act) - - - - - - if (message) - log_emote("[name]/[key] : [message]") - - //Hearing gasp and such every five seconds is not good emotes were not global for a reason. - // Maybe some people are okay with that. - - for(var/mob/M in dead_mob_list) - if(!M.client || istype(M, /mob/new_player)) - continue //skip monkeys, leavers and new players - if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) - M.show_message(message) - - - if (m_type & 1) - for (var/mob/O in viewers(src, null)) - O.show_message(message, m_type) - else if (m_type & 2) - for (var/mob/O in hearers(src.loc, null)) - O.show_message(message, m_type) +//This only assumes that the mob has a body and face with at least one eye, and one mouth. +//Things like airguitar can be done without arms, and the flap thing makes so little sense it's a keeper. +//Intended to be called by a higher up emote proc if the requested emote isn't in the custom emotes. + +/mob/living/carbon/emote(var/act,var/m_type=1,var/message = null) + var/param = null + + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + + if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' + act = copytext(act,1,length(act)) + + var/muzzled = (src.wear_mask && istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) + //var/m_type = 1 + + switch(act)//Even carbon organisms want it alphabetically ordered.. + if ("aflap") + if (!src.restrained()) + message = "[src] flaps \his wings ANGRILY!" + m_type = 2 + + if ("airguitar") + if (!src.restrained()) + message = "[src] is strumming the air and headbanging like a safari chimp." + m_type = 1 + + if ("blink") + message = "[src] blinks." + m_type = 1 + + if ("blink_r") + message = "[src] blinks rapidly." + m_type = 1 + + if ("blush") + message = "[src] blushes." + m_type = 1 + + if ("bow") + if (!src.buckled) + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] bows to [param]." + else + message = "[src] bows." + m_type = 1 + + if ("burp") + if (!muzzled) + ..(act) + + if ("choke") + if (!muzzled) + ..(act) + else + message = "[src] makes a strong noise." + m_type = 2 + + if ("chuckle") + if (!muzzled) + ..(act) + else + message = "[src] makes a noise." + m_type = 2 + + if ("clap") + if (!src.restrained()) + message = "[src] claps." + m_type = 2 + + if ("cough") + if (!muzzled) + ..(act) + else + message = "[src] makes a strong noise." + m_type = 2 + + if ("deathgasp") + message = "[src] seizes up and falls limp, \his eyes dead and lifeless..." + m_type = 1 + + if ("flap") + if (!src.restrained()) + message = "[src] flaps \his wings." + m_type = 2 + + if ("gasp") + if (!muzzled) + ..(act) + else + message = "[src] makes a weak noise." + m_type = 2 + + if ("giggle") + if (!muzzled) + ..(act) + else + message = "[src] makes a noise." + m_type = 2 + + if ("laugh") + if (!muzzled) + ..(act) + else + message = "[src] makes a noise." + + if ("nod") + message = "[src] nods." + m_type = 1 + + if ("scream") + if (!muzzled) + ..(act) + else + message = "[src] makes a very loud noise." + m_type = 2 + + if ("shake") + message = "[src] shakes \his head." + m_type = 1 + + if ("sneeze") + if (!muzzled) + ..(act) + else + message = "[src] makes a strange noise." + m_type = 2 + + if ("sigh") + if (!muzzled) + ..(act) + else + message = "[src] sighs." + m_type = 2 + + if ("sniff") + message = "[src] sniffs." + m_type = 2 + + if ("snore") + if (!muzzled) + ..(act) + else + message = "[src] makes a noise." + m_type = 2 + + if ("whimper") + if (!muzzled) + ..(act) + else + message = "[src] makes a weak noise." + m_type = 2 + + if ("wink") + message = "[src] winks." + m_type = 1 + + if ("yawn") + if (!muzzled) + ..(act) + + if ("help") + src << "Help for emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, grin, jump, laugh, look, me, nod, point-atom, scream, shake, sigh, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, wink, yawn" + + else + ..(act) + + + + + + if (message) + log_emote("[name]/[key] : [message]") + + //Hearing gasp and such every five seconds is not good emotes were not global for a reason. + // Maybe some people are okay with that. + + for(var/mob/M in dead_mob_list) + if(!M.client || istype(M, /mob/new_player)) + continue //skip monkeys, leavers and new players + if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) + M.show_message(message) + + + if (m_type & 1) + for (var/mob/O in viewers(src, null)) + O.show_message(message, m_type) + else if (m_type & 2) + for (var/mob/O in hearers(src.loc, null)) + O.show_message(message, m_type) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 636102ec00f..50a03307add 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -32,6 +32,11 @@ ..() +/mob/living/carbon/human/Destroy() + for(var/atom/movable/organelle in organs) + qdel(organelle) + return ..() + /mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes) if ((!( yes ) || now_pushing)) return @@ -115,7 +120,7 @@ if (client.statpanel == "Status") if (internal) if (!internal.air_contents) - del(internal) + qdel(internal) else stat("Internal Atmosphere Info", internal.name) stat("Tank Pressure", internal.air_contents.return_pressure()) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 62d68701827..0d1ef146670 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -138,14 +138,14 @@ visible_message("[M] has broken [src]'s grip on [lgrab.affecting]!") talked = 1 spawn(1) - del(lgrab) + qdel(lgrab) if(istype(r_hand, /obj/item/weapon/grab)) var/obj/item/weapon/grab/rgrab = r_hand if(rgrab.affecting) visible_message("[M] has broken [src]'s grip on [rgrab.affecting]!") talked = 1 spawn(1) - del(rgrab) + qdel(rgrab) //End BubbleWrap if(!talked) //BubbleWrap diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 1aab445d093..c1c1e7240f1 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -1,192 +1,192 @@ -//Updates the mob's health from organs and mob damage variables -/mob/living/carbon/human/updatehealth() - if(status_flags & GODMODE) - health = maxHealth - stat = CONSCIOUS - return - var/total_burn = 0 - var/total_brute = 0 - for(var/obj/item/organ/limb/O in organs) //hardcoded to streamline things a bit - total_brute += O.brute_dam - total_burn += O.burn_dam - health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute - //TODO: fix husking - if( ((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD ) - ChangeToHusk() - return - - -//These procs fetch a cumulative total damage from all organs -/mob/living/carbon/human/getBruteLoss() - var/amount = 0 - for(var/obj/item/organ/limb/O in organs) - amount += O.brute_dam - return amount - -/mob/living/carbon/human/getFireLoss() - var/amount = 0 - for(var/obj/item/organ/limb/O in organs) - amount += O.burn_dam - return amount - - -/mob/living/carbon/human/adjustBruteLoss(var/amount) - if(amount > 0) - take_overall_damage(amount, 0) - else - heal_overall_damage(-amount, 0) - -/mob/living/carbon/human/adjustFireLoss(var/amount) - if(amount > 0) - take_overall_damage(0, amount) - else - heal_overall_damage(0, -amount) - -/mob/living/carbon/human/Stun(amount) - if(HULK in mutations) return - ..() - -/mob/living/carbon/human/Weaken(amount) - if(HULK in mutations) return - ..() - -/mob/living/carbon/human/Paralyse(amount) - if(HULK in mutations) return - ..() - -mob/living/carbon/human/proc/hat_fall_prob() - var/multiplier = 1 - var/obj/item/clothing/head/H = head - var/loose = 40 - if(stat || (status_flags & FAKEDEATH)) - multiplier = 2 - if(H.flags & (HEADCOVERSEYES | HEADCOVERSMOUTH) || H.flags_inv & (HIDEEYES | HIDEFACE)) - loose = 0 - return loose * multiplier - -//////////////////////////////////////////// - -//Returns a list of damaged organs -/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn) - var/list/obj/item/organ/limb/parts = list() - for(var/obj/item/organ/limb/O in organs) - if((brute && O.brute_dam) || (burn && O.burn_dam)) - parts += O - return parts - -//Returns a list of damageable organs -/mob/living/carbon/human/proc/get_damageable_organs() - var/list/obj/item/organ/limb/parts = list() - for(var/obj/item/organ/limb/O in organs) - if(O.brute_dam + O.burn_dam < O.max_damage) - parts += O - return parts - -//Heals ONE external organ, organ gets randomly selected from damaged ones. -//It automatically updates damage overlays if necesary -//It automatically updates health status -/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn) - var/list/obj/item/organ/limb/parts = get_damaged_organs(brute,burn) - if(!parts.len) return - var/obj/item/organ/limb/picked = pick(parts) - if(picked.heal_damage(brute,burn,0)) - update_damage_overlays(0) - updatehealth() - -//Damages ONE external organ, organ gets randomly selected from damagable ones. -//It automatically updates damage overlays if necesary -//It automatically updates health status -/mob/living/carbon/human/take_organ_damage(var/brute, var/burn) - var/list/obj/item/organ/limb/parts = get_damageable_organs() - if(!parts.len) return - var/obj/item/organ/limb/picked = pick(parts) - if(picked.take_damage(brute,burn)) - update_damage_overlays(0) - updatehealth() - - -//Heal MANY external organs, in random order -/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn) - var/list/obj/item/organ/limb/parts = get_damaged_organs(brute,burn) - - var/update = 0 - while(parts.len && (brute>0 || burn>0) ) - var/obj/item/organ/limb/picked = pick(parts) - - var/brute_was = picked.brute_dam - var/burn_was = picked.burn_dam - - update |= picked.heal_damage(brute,burn,0) - - brute -= (brute_was-picked.brute_dam) - burn -= (burn_was-picked.burn_dam) - - parts -= picked - updatehealth() - if(update) update_damage_overlays(0) - -// damage MANY external organs, in random order -/mob/living/carbon/human/take_overall_damage(var/brute, var/burn) - if(status_flags & GODMODE) return //godmode - var/list/obj/item/organ/limb/parts = get_damageable_organs() - var/update = 0 - while(parts.len && (brute>0 || burn>0) ) - var/obj/item/organ/limb/picked = pick(parts) - - var/brute_was = picked.brute_dam - var/burn_was = picked.burn_dam - - - update |= picked.take_damage(brute,burn) - - brute -= (picked.brute_dam - brute_was) - burn -= (picked.burn_dam - burn_was) - - parts -= picked - updatehealth() - if(update) update_damage_overlays(0) - - -//////////////////////////////////////////// - - -/mob/living/carbon/human/proc/get_organ(var/zone) - if(!zone) zone = "chest" - for(var/obj/item/organ/limb/O in organs) - if(O.name == zone) - return O - return null - - -/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0) - if((damagetype != BRUTE) && (damagetype != BURN)) - ..(damage, damagetype, def_zone, blocked) - return 1 - - blocked = (100-blocked)/100 - if(blocked <= 0) return 0 - - var/obj/item/organ/limb/organ = null - if(isorgan(def_zone)) - organ = def_zone - else - if(!def_zone) def_zone = ran_zone(def_zone) - organ = get_organ(check_zone(def_zone)) - if(!organ) return 0 - - damage = (damage * blocked) - - switch(damagetype) - if(BRUTE) - damageoverlaytemp = 20 - if(organ.take_damage(damage, 0)) - update_damage_overlays(0) - if(BURN) - damageoverlaytemp = 20 - if(organ.take_damage(0, damage)) - update_damage_overlays(0) - - // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life(). - - updatehealth() - return 1 +//Updates the mob's health from organs and mob damage variables +/mob/living/carbon/human/updatehealth() + if(status_flags & GODMODE) + health = maxHealth + stat = CONSCIOUS + return + var/total_burn = 0 + var/total_brute = 0 + for(var/obj/item/organ/limb/O in organs) //hardcoded to streamline things a bit + total_brute += O.brute_dam + total_burn += O.burn_dam + health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute + //TODO: fix husking + if( ((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD ) + ChangeToHusk() + return + + +//These procs fetch a cumulative total damage from all organs +/mob/living/carbon/human/getBruteLoss() + var/amount = 0 + for(var/obj/item/organ/limb/O in organs) + amount += O.brute_dam + return amount + +/mob/living/carbon/human/getFireLoss() + var/amount = 0 + for(var/obj/item/organ/limb/O in organs) + amount += O.burn_dam + return amount + + +/mob/living/carbon/human/adjustBruteLoss(var/amount) + if(amount > 0) + take_overall_damage(amount, 0) + else + heal_overall_damage(-amount, 0) + +/mob/living/carbon/human/adjustFireLoss(var/amount) + if(amount > 0) + take_overall_damage(0, amount) + else + heal_overall_damage(0, -amount) + +/mob/living/carbon/human/Stun(amount) + if(HULK in mutations) return + ..() + +/mob/living/carbon/human/Weaken(amount) + if(HULK in mutations) return + ..() + +/mob/living/carbon/human/Paralyse(amount) + if(HULK in mutations) return + ..() + +mob/living/carbon/human/proc/hat_fall_prob() + var/multiplier = 1 + var/obj/item/clothing/head/H = head + var/loose = 40 + if(stat || (status_flags & FAKEDEATH)) + multiplier = 2 + if(H.flags & (HEADCOVERSEYES | HEADCOVERSMOUTH) || H.flags_inv & (HIDEEYES | HIDEFACE)) + loose = 0 + return loose * multiplier + +//////////////////////////////////////////// + +//Returns a list of damaged organs +/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn) + var/list/obj/item/organ/limb/parts = list() + for(var/obj/item/organ/limb/O in organs) + if((brute && O.brute_dam) || (burn && O.burn_dam)) + parts += O + return parts + +//Returns a list of damageable organs +/mob/living/carbon/human/proc/get_damageable_organs() + var/list/obj/item/organ/limb/parts = list() + for(var/obj/item/organ/limb/O in organs) + if(O.brute_dam + O.burn_dam < O.max_damage) + parts += O + return parts + +//Heals ONE external organ, organ gets randomly selected from damaged ones. +//It automatically updates damage overlays if necesary +//It automatically updates health status +/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn) + var/list/obj/item/organ/limb/parts = get_damaged_organs(brute,burn) + if(!parts.len) return + var/obj/item/organ/limb/picked = pick(parts) + if(picked.heal_damage(brute,burn,0)) + update_damage_overlays(0) + updatehealth() + +//Damages ONE external organ, organ gets randomly selected from damagable ones. +//It automatically updates damage overlays if necesary +//It automatically updates health status +/mob/living/carbon/human/take_organ_damage(var/brute, var/burn) + var/list/obj/item/organ/limb/parts = get_damageable_organs() + if(!parts.len) return + var/obj/item/organ/limb/picked = pick(parts) + if(picked.take_damage(brute,burn)) + update_damage_overlays(0) + updatehealth() + + +//Heal MANY external organs, in random order +/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn) + var/list/obj/item/organ/limb/parts = get_damaged_organs(brute,burn) + + var/update = 0 + while(parts.len && (brute>0 || burn>0) ) + var/obj/item/organ/limb/picked = pick(parts) + + var/brute_was = picked.brute_dam + var/burn_was = picked.burn_dam + + update |= picked.heal_damage(brute,burn,0) + + brute -= (brute_was-picked.brute_dam) + burn -= (burn_was-picked.burn_dam) + + parts -= picked + updatehealth() + if(update) update_damage_overlays(0) + +// damage MANY external organs, in random order +/mob/living/carbon/human/take_overall_damage(var/brute, var/burn) + if(status_flags & GODMODE) return //godmode + var/list/obj/item/organ/limb/parts = get_damageable_organs() + var/update = 0 + while(parts.len && (brute>0 || burn>0) ) + var/obj/item/organ/limb/picked = pick(parts) + + var/brute_was = picked.brute_dam + var/burn_was = picked.burn_dam + + + update |= picked.take_damage(brute,burn) + + brute -= (picked.brute_dam - brute_was) + burn -= (picked.burn_dam - burn_was) + + parts -= picked + updatehealth() + if(update) update_damage_overlays(0) + + +//////////////////////////////////////////// + + +/mob/living/carbon/human/proc/get_organ(var/zone) + if(!zone) zone = "chest" + for(var/obj/item/organ/limb/O in organs) + if(O.name == zone) + return O + return null + + +/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0) + if((damagetype != BRUTE) && (damagetype != BURN)) + ..(damage, damagetype, def_zone, blocked) + return 1 + + blocked = (100-blocked)/100 + if(blocked <= 0) return 0 + + var/obj/item/organ/limb/organ = null + if(isorgan(def_zone)) + organ = def_zone + else + if(!def_zone) def_zone = ran_zone(def_zone) + organ = get_organ(check_zone(def_zone)) + if(!organ) return 0 + + damage = (damage * blocked) + + switch(damagetype) + if(BRUTE) + damageoverlaytemp = 20 + if(organ.take_damage(damage, 0)) + update_damage_overlays(0) + if(BURN) + damageoverlaytemp = 20 + if(organ.take_damage(0, damage)) + update_damage_overlays(0) + + // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life(). + + updatehealth() + return 1 diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 737e102d87f..d3aabfd97fb 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -1,119 +1,119 @@ - -/mob/living/carbon/human/restrained() - if (handcuffed) - return 1 - if (istype(wear_suit, /obj/item/clothing/suit/straight_jacket)) - return 1 - return 0 - -//gets assignment from ID or ID inside PDA or PDA itself -//Useful when player do something with computers -/mob/living/carbon/human/proc/get_assignment(var/if_no_id = "No id", var/if_no_job = "No job") - var/obj/item/weapon/card/id/id = get_idcard() - if(id) - . = id.assignment - else - var/obj/item/device/pda/pda = wear_id - if(istype(pda)) - . = pda.ownjob - else - return if_no_id - if(!.) - return if_no_job - -//gets name from ID or ID inside PDA or PDA itself -//Useful when player do something with computers -/mob/living/carbon/human/proc/get_authentification_name(var/if_no_id = "Unknown") - var/obj/item/weapon/card/id/id = get_idcard() - if(id) - return id.registered_name - var/obj/item/device/pda/pda = wear_id - if(istype(pda)) - return pda.owner - return if_no_id - -//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere -/mob/living/carbon/human/get_visible_name() - var/face_name = get_face_name("") - var/id_name = get_id_name("") - if(face_name) - if(id_name && (id_name != face_name)) - return "[face_name] (as [id_name])" - return face_name - if(id_name) - return id_name - return "Unknown" - -//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable -/mob/living/carbon/human/proc/get_face_name(if_no_face="Unknown") - if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible - return if_no_face - if( head && (head.flags_inv&HIDEFACE) ) - return if_no_face //Likewise for hats - var/obj/item/organ/limb/O = get_organ("head") - if( (status_flags&DISFIGURED) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name ) //disfigured. use id-name if possible - return if_no_face - return real_name - -//gets name from ID or PDA itself, ID inside PDA doesn't matter -//Useful when player is being seen by other mobs -/mob/living/carbon/human/proc/get_id_name(var/if_no_id = "Unknown") - var/obj/item/weapon/storage/wallet/wallet = wear_id - var/obj/item/device/pda/pda = wear_id - var/obj/item/weapon/card/id/id = wear_id - if(istype(wallet)) id = wallet.front_id - if(istype(id)) . = id.registered_name - else if(istype(pda)) . = pda.owner - if(!.) . = if_no_id //to prevent null-names making the mob unclickable - return - -//gets ID card object from special clothes slot or null. -/mob/living/carbon/human/proc/get_idcard() - if(wear_id) - return wear_id.GetID() - -///eyecheck() -///Returns a number between -1 to 2 -/mob/living/carbon/human/eyecheck() - var/number = 0 - if(istype(src.head, /obj/item/clothing/head)) //are they wearing something on their head - var/obj/item/clothing/head/HFP = src.head //if yes gets the flash protection value from that item - number += HFP.flash_protect - if(istype(src.glasses, /obj/item/clothing/glasses)) //glasses - var/obj/item/clothing/glasses/GFP = src.glasses - number += GFP.flash_protect - if(istype(src.wear_mask, /obj/item/clothing/mask)) //mask - var/obj/item/clothing/mask/MFP = src.wear_mask - number += MFP.flash_protect - return number - -///tintcheck() -///Checks eye covering items for visually impairing tinting, such as welding masks -///Checked in life.dm. 0 & 1 = no impairment, 2 = welding mask overlay, 3 = You can see jack, but you can't see shit. -/mob/living/carbon/human/tintcheck() - var/tinted = 0 - if(istype(src.head, /obj/item/clothing/head)) - var/obj/item/clothing/head/HT = src.head - tinted += HT.tint - if(istype(src.glasses, /obj/item/clothing/glasses)) - var/obj/item/clothing/glasses/GT = src.glasses - tinted += GT.tint - if(istype(src.wear_mask, /obj/item/clothing/mask)) - var/obj/item/clothing/mask/MT = src.wear_mask - tinted += MT.tint - return tinted - -/mob/living/carbon/human/abiotic(var/full_body = 0) - if(full_body && ((src.l_hand && !( src.l_hand.flags&ABSTRACT )) || (src.r_hand && !( src.r_hand.flags&ABSTRACT )) || (src.back || src.wear_mask || src.head || src.shoes || src.w_uniform || src.wear_suit || src.glasses || src.ears || src.gloves))) - return 1 - - if( (src.l_hand && !(src.l_hand.flags&ABSTRACT)) || (src.r_hand && !(src.r_hand.flags&ABSTRACT)) ) - return 1 - - return 0 - -/mob/living/carbon/human/IsAdvancedToolUser() - return 1//Humans can use guns and such - -/mob/living/carbon/human/InCritical() + +/mob/living/carbon/human/restrained() + if (handcuffed) + return 1 + if (istype(wear_suit, /obj/item/clothing/suit/straight_jacket)) + return 1 + return 0 + +//gets assignment from ID or ID inside PDA or PDA itself +//Useful when player do something with computers +/mob/living/carbon/human/proc/get_assignment(var/if_no_id = "No id", var/if_no_job = "No job") + var/obj/item/weapon/card/id/id = get_idcard() + if(id) + . = id.assignment + else + var/obj/item/device/pda/pda = wear_id + if(istype(pda)) + . = pda.ownjob + else + return if_no_id + if(!.) + return if_no_job + +//gets name from ID or ID inside PDA or PDA itself +//Useful when player do something with computers +/mob/living/carbon/human/proc/get_authentification_name(var/if_no_id = "Unknown") + var/obj/item/weapon/card/id/id = get_idcard() + if(id) + return id.registered_name + var/obj/item/device/pda/pda = wear_id + if(istype(pda)) + return pda.owner + return if_no_id + +//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere +/mob/living/carbon/human/get_visible_name() + var/face_name = get_face_name("") + var/id_name = get_id_name("") + if(face_name) + if(id_name && (id_name != face_name)) + return "[face_name] (as [id_name])" + return face_name + if(id_name) + return id_name + return "Unknown" + +//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable +/mob/living/carbon/human/proc/get_face_name(if_no_face="Unknown") + if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible + return if_no_face + if( head && (head.flags_inv&HIDEFACE) ) + return if_no_face //Likewise for hats + var/obj/item/organ/limb/O = get_organ("head") + if( (status_flags&DISFIGURED) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name ) //disfigured. use id-name if possible + return if_no_face + return real_name + +//gets name from ID or PDA itself, ID inside PDA doesn't matter +//Useful when player is being seen by other mobs +/mob/living/carbon/human/proc/get_id_name(var/if_no_id = "Unknown") + var/obj/item/weapon/storage/wallet/wallet = wear_id + var/obj/item/device/pda/pda = wear_id + var/obj/item/weapon/card/id/id = wear_id + if(istype(wallet)) id = wallet.front_id + if(istype(id)) . = id.registered_name + else if(istype(pda)) . = pda.owner + if(!.) . = if_no_id //to prevent null-names making the mob unclickable + return + +//gets ID card object from special clothes slot or null. +/mob/living/carbon/human/proc/get_idcard() + if(wear_id) + return wear_id.GetID() + +///eyecheck() +///Returns a number between -1 to 2 +/mob/living/carbon/human/eyecheck() + var/number = 0 + if(istype(src.head, /obj/item/clothing/head)) //are they wearing something on their head + var/obj/item/clothing/head/HFP = src.head //if yes gets the flash protection value from that item + number += HFP.flash_protect + if(istype(src.glasses, /obj/item/clothing/glasses)) //glasses + var/obj/item/clothing/glasses/GFP = src.glasses + number += GFP.flash_protect + if(istype(src.wear_mask, /obj/item/clothing/mask)) //mask + var/obj/item/clothing/mask/MFP = src.wear_mask + number += MFP.flash_protect + return number + +///tintcheck() +///Checks eye covering items for visually impairing tinting, such as welding masks +///Checked in life.dm. 0 & 1 = no impairment, 2 = welding mask overlay, 3 = You can see jack, but you can't see shit. +/mob/living/carbon/human/tintcheck() + var/tinted = 0 + if(istype(src.head, /obj/item/clothing/head)) + var/obj/item/clothing/head/HT = src.head + tinted += HT.tint + if(istype(src.glasses, /obj/item/clothing/glasses)) + var/obj/item/clothing/glasses/GT = src.glasses + tinted += GT.tint + if(istype(src.wear_mask, /obj/item/clothing/mask)) + var/obj/item/clothing/mask/MT = src.wear_mask + tinted += MT.tint + return tinted + +/mob/living/carbon/human/abiotic(var/full_body = 0) + if(full_body && ((src.l_hand && !( src.l_hand.flags&ABSTRACT )) || (src.r_hand && !( src.r_hand.flags&ABSTRACT )) || (src.back || src.wear_mask || src.head || src.shoes || src.w_uniform || src.wear_suit || src.glasses || src.ears || src.gloves))) + return 1 + + if( (src.l_hand && !(src.l_hand.flags&ABSTRACT)) || (src.r_hand && !(src.r_hand.flags&ABSTRACT)) ) + return 1 + + return 0 + +/mob/living/carbon/human/IsAdvancedToolUser() + return 1//Humans can use guns and such + +/mob/living/carbon/human/InCritical() return (health <= config.health_threshold_crit && stat == UNCONSCIOUS) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 4aa98a7e2f6..a41bd7a5e7a 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -1,5 +1,5 @@ /mob/living/carbon/human/movement_delay() - if(istype(loc, /turf/space)) + if(!has_gravity(src)) return -1 //It's hard to be slowed down in space by... anything if(reagents.has_reagent("hyperzine")) return -1 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 8bd834c4d8d..e5f6b5e5ab2 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -30,12 +30,12 @@ H << "\red You are unable to equip that." -/mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/I, list/slots, del_on_fail = 1) +/mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/I, list/slots, qdel_on_fail = 1) for(var/slot in slots) - if(equip_to_slot_if_possible(I, slots[slot], del_on_fail = 0)) + if(equip_to_slot_if_possible(I, slots[slot], qdel_on_fail = 0)) return slot - if(del_on_fail) - del(I) + if(qdel_on_fail) + qdel(I) return null diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 58246bda071..beb593fa87e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -856,7 +856,7 @@ else for(var/atom/a in hallucinations) - del a + qdel(a) if(paralysis) AdjustParalysis(-1) @@ -1231,7 +1231,7 @@ if(M.stat == 2) M.death(1) stomach_contents.Remove(M) - del(M) + qdel(M) continue if(air_master.current_cycle%3==1) if(!(M.status_flags & GODMODE)) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 35176f0514d..5a7455748cf 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -1,15 +1,15 @@ -/mob/living/carbon/get_item_by_slot(slot_id) - switch(slot_id) - if(slot_back) - return back - if(slot_wear_mask) - return wear_mask - if(slot_handcuffed) - return handcuffed - if(slot_legcuffed) - return legcuffed - if(slot_l_hand) - return l_hand - if(slot_r_hand) - return r_hand +/mob/living/carbon/get_item_by_slot(slot_id) + switch(slot_id) + if(slot_back) + return back + if(slot_wear_mask) + return wear_mask + if(slot_handcuffed) + return handcuffed + if(slot_legcuffed) + return legcuffed + if(slot_l_hand) + return l_hand + if(slot_r_hand) + return r_hand return null \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 553c5861b79..ab479dffe30 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -201,7 +201,7 @@ var/f_loss = null switch (severity) if (1.0) - del(src) + qdel(src) return if (2.0) @@ -652,7 +652,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 user <<"You apply the enhancer. It now has triple the amount of uses." Uses = 3 enhanced = 1 - del (O) + qdel(O) /obj/item/slime_extract/New() ..() @@ -773,14 +773,14 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 pet.icon_dead = "[M.colour] baby slime dead" pet.colour = "[M.colour]" user <<"You feed the slime the potion, removing it's powers and calming it." - del (M) + qdel(M) var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN) if (!newname) newname = "pet slime" pet.name = newname pet.real_name = newname - del (src) + qdel(src) /obj/item/weapon/slimepotion2 name = "advanced docility potion" @@ -804,14 +804,14 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 pet.icon_dead = "[M.colour] baby slime dead" pet.colour = "[M.colour]" user <<"You feed the slime the potion, removing it's powers and calming it." - del (M) + qdel(M) var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN) if (!newname) newname = "pet slime" pet.name = newname pet.real_name = newname - del (src) + qdel(src) /obj/item/weapon/slimesteroid @@ -836,7 +836,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 user <<"You feed the slime the steroid. It now has triple the amount of extract." M.cores = 3 - del (src) + qdel(src) /obj/item/weapon/slimesteroid2 name = "extract enhancer" @@ -855,7 +855,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 user <<"You apply the enhancer. It now has triple the amount of uses." target.Uses = 3 target.enahnced = 1 - del (src)*/ + qdel(src)*/ ////////Adamantine Golem stuff I dunno where else to put it @@ -975,7 +975,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 G.loc = src.loc G.key = ghost.key G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost." - del (src) + qdel(src) proc/announce_to_ghosts() @@ -1063,7 +1063,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 spawn(rand(50,100)) src.visible_message("\blue The [name] bursts open!") new/mob/living/carbon/slime(T) - del(src) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/egg/slime/process() diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm index ed7149cdd83..771fc56eae1 100644 --- a/code/modules/mob/living/carbon/metroid/powers.dm +++ b/code/modules/mob/living/carbon/metroid/powers.dm @@ -221,8 +221,8 @@ src.mind.transfer_to(new_slime) else new_slime.key = src.key - del(src) + qdel(src) else src << "I am not ready to reproduce yet..." else - src << "I am not old enough to reproduce yet..." \ No newline at end of file + src << "I am not old enough to reproduce yet..." diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index bdb2c232142..e93425f412b 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -365,7 +365,7 @@ return if (stat == DEAD && !client) gibs(loc, viruses) - del(src) + qdel(src) return diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index a2a20c93b5c..c58542f7b6a 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -1,25 +1,25 @@ -//LOOK G-MA, I'VE JOINED CARBON PROCS THAT ARE IDENTICAL IN ALL CASES INTO ONE PROC, I'M BETTER THAN LIFE() -//I thought about mob/living but silicons and simple_animals don't want this just yet. -//Right now just handles lying down, but could handle other cases later. -//IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can. -/mob/living/carbon/update_transform() - var/matrix/ntransform = matrix(transform) //aka transform.Copy() - var/final_pixel_y = pixel_y - var/final_dir = dir - var/changed = 0 - - if(lying != lying_prev) - changed++ - ntransform.TurnTo(lying_prev,lying) - if(lying == 0) //Lying to standing - final_pixel_y += 6 - else //if(lying != 0) - if(lying_prev == 0) //Standing to lying - final_pixel_y -= 6 - - if(dir & (EAST|WEST)) //Facing east or west - final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass - lying_prev = lying //so we don't try to animate until there's been another change. - - if(changed) +//LOOK G-MA, I'VE JOINED CARBON PROCS THAT ARE IDENTICAL IN ALL CASES INTO ONE PROC, I'M BETTER THAN LIFE() +//I thought about mob/living but silicons and simple_animals don't want this just yet. +//Right now just handles lying down, but could handle other cases later. +//IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can. +/mob/living/carbon/update_transform() + var/matrix/ntransform = matrix(transform) //aka transform.Copy() + var/final_pixel_y = pixel_y + var/final_dir = dir + var/changed = 0 + + if(lying != lying_prev) + changed++ + ntransform.TurnTo(lying_prev,lying) + if(lying == 0) //Lying to standing + final_pixel_y += 6 + else //if(lying != 0) + if(lying_prev == 0) //Standing to lying + final_pixel_y -= 6 + + if(dir & (EAST|WEST)) //Facing east or west + final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass + lying_prev = lying //so we don't try to animate until there's been another change. + + if(changed) animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT) \ No newline at end of file diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 281ccc35774..9b0accbe230 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -1,62 +1,63 @@ -/mob/living/gib(var/animation = 1) - var/prev_lying = lying - death(1) - - var/atom/movable/overlay/animate = setup_animation(animation, prev_lying) - if(animate) - gib_animation(animate) - - spawn_gibs() - - end_animation(animate) // Will del(src) - -/mob/living/proc/spawn_gibs() - gibs(loc, viruses) - -/mob/living/proc/gib_animation(var/animate, var/flick_name = "gibbed") - flick(flick_name, animate) - -/mob/living/dust(var/animation = 0) - death(1) - var/atom/movable/overlay/animate = setup_animation(animation, 0) - if(animate) - dust_animation(animate) - - spawn_dust() - end_animation(animate) - -/mob/living/proc/spawn_dust() - new /obj/effect/decal/cleanable/ash(loc) - -/mob/living/proc/dust_animation(var/animate, var/flick_name = "") - flick(flick_name, animate) - -/mob/living/death(gibbed) - timeofdeath = world.time - - living_mob_list -= src - if(!gibbed) - dead_mob_list += src - - -/mob/living/proc/setup_animation(var/animation, var/prev_lying) - var/atom/movable/overlay/animate = null - notransform = 1 - canmove = 0 - icon = null - invisibility = 101 - - if(!prev_lying && animation) - animate = new(loc) - animate.icon_state = "blank" - animate.icon = 'icons/mob/mob.dmi' - animate.master = src - return animate - -/mob/living/proc/end_animation(var/animate) - if(!animate) - del(src) - else - spawn(15) - if(animate) del(animate) - if(src) del(src) \ No newline at end of file +/mob/living/gib(var/animation = 1) + var/prev_lying = lying + death(1) + + var/atom/movable/overlay/animate = setup_animation(animation, prev_lying) + if(animate) + gib_animation(animate) + + spawn_gibs() + + end_animation(animate) // Will qdel(src) + +/mob/living/proc/spawn_gibs() + gibs(loc, viruses) + +/mob/living/proc/gib_animation(var/animate, var/flick_name = "gibbed") + flick(flick_name, animate) + +/mob/living/dust(var/animation = 0) + death(1) + var/atom/movable/overlay/animate = setup_animation(animation, 0) + if(animate) + dust_animation(animate) + + spawn_dust() + end_animation(animate) + +/mob/living/proc/spawn_dust() + new /obj/effect/decal/cleanable/ash(loc) + +/mob/living/proc/dust_animation(var/animate, var/flick_name = "") + flick(flick_name, animate) + +/mob/living/death(gibbed) + timeofdeath = world.time + + living_mob_list -= src + if(!gibbed) + dead_mob_list += src + + +/mob/living/proc/setup_animation(var/animation, var/prev_lying) + var/atom/movable/overlay/animate = null + notransform = 1 + canmove = 0 + icon = null + invisibility = 101 + alpha = 0 + + if(!prev_lying && animation) + animate = new(loc) + animate.icon_state = "blank" + animate.icon = 'icons/mob/mob.dmi' + animate.master = src + return animate + +/mob/living/proc/end_animation(var/animate) + if(!animate) + qdel(src) + else + spawn(15) + if(animate) qdel(animate) + if(src) qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 1543b3f14aa..f4dcb2f7648 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -1,282 +1,282 @@ -//This only assumes that the mob has a body and face with at least one mouth. -//Things like airguitar can be done without arms, and the flap thing makes so little sense it's a keeper. -//Intended to be called by a higher up emote proc if the requested emote isn't in the custom emotes. - -/mob/living/emote(var/act,var/m_type=1,var/message = null) - var/param = null - - if (findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - - if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' - act = copytext(act,1,length(act)) - - switch(act)//Hello, how would you like to order? Alphabetically! - if ("aflap") - if (!src.restrained()) - message = "[src] flaps its wings ANGRILY!" - m_type = 2 - - if ("blush") - message = "[src] blushes." - m_type = 1 - - if ("bow") - if (!src.buckled) - var/M = null - if (param) - for (var/mob/A in view(1, src)) - if (param == A.name) - M = A - break - if (!M) - param = null - if (param) - message = "[src] bows to [param]." - else - message = "[src] bows." - m_type = 1 - - if ("burp") - message = "[src] burps." - m_type = 2 - - if ("choke") - message = "[src] chokes!" - m_type = 2 - - if ("chuckle") - message = "[src] chuckles." - m_type = 2 - - if ("collapse") - Paralyse(2) - message = "[src] collapses!" - m_type = 2 - - if ("cough") - message = "[src] coughs!" - m_type = 2 - - if ("dance") - if (!src.restrained()) - message = "[src] dances around happily." - m_type = 1 - - if ("deathgasp") - message = "[src] seizes up and falls limp, its eyes dead and lifeless..." - m_type = 1 - - if ("drool") - message = "[src] drools." - m_type = 1 - - if ("faint") - message = "[src] faints." - if(src.sleeping) - return //Can't faint while asleep - src.sleeping += 10 //Short-short nap - m_type = 1 - - if ("flap") - if (!src.restrained()) - message = "[src] flaps its wings." - m_type = 2 - - if ("frown") - message = "[src] frowns." - m_type = 1 - - if ("gasp") - message = "[src] gasps!" - m_type = 2 - - if ("giggle") - message = "[src] giggles." - m_type = 2 - - if ("glare") - var/M = null - if (param) - for (var/mob/A in view(1, src)) - if (param == A.name) - M = A - break - if (!M) - param = null - if (param) - message = "[src] glares at [param]." - else - message = "[src] glares." - - if ("grin") - message = "[src] grins." - m_type = 1 - - if ("jump") - message = "[src] jumps!" - m_type = 1 - - if ("laugh") - message = "[src] laughs." - m_type = 2 - - if ("look") - var/M = null - if (param) - for (var/mob/A in view(1, src)) - if (param == A.name) - M = A - break - if (!M) - param = null - if (param) - message = "[src] looks at [param]." - else - message = "[src] looks." - m_type = 1 - - if ("me") - if (src.client) - if(client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." - return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return - if (stat) - return - if(!(message)) - return - else - message = "[src] [message]" - - if ("nod") - message = "[src] nods." - m_type = 1 - - if ("point") - if (!src.restrained()) - var/mob/M = null - if (param) - for (var/atom/A as mob|obj|turf|area in view(1, src)) - if (param == A.name) - M = A - break - if (!M) - message = "[src] points." - else - M.point() - if (M) - message = "[src] points to [M]." - else - m_type = 1 - - if ("scream") - message = "[src] screams!" - m_type = 2 - - if ("shake") - message = "[src] shakes its head." - m_type = 1 - - if ("sigh") - message = "[src] sighs." - m_type = 2 - - if ("sit") - message = "[src] sits down." - m_type = 1 - - if ("smile") - message = "[src] smiles." - m_type = 1 - - if ("sneeze") - message = "[src] sneezes." - m_type = 2 - - if ("sniff") - message = "[src] sniffs." - m_type = 2 - - if ("snore") - message = "[src] snores." - m_type = 2 - - if ("stare") - var/M = null - if (param) - for (var/mob/A in view(1, src)) - if (param == A.name) - M = A - break - if (!M) - param = null - if (param) - message = "[src] stares at [param]." - else - message = "[src] stares." - - if ("sulk") - message = "[src] sulks down sadly." - m_type = 1 - - if ("sway") - message = "[src] sways around dizzily." - m_type = 1 - - if ("tremble") - message = "[src] trembles in fear!" - m_type = 1 - - if ("twitch") - message = "[src] twitches violently." - m_type = 1 - - if ("twitch_s") - message = "[src] twitches." - m_type = 1 - - if ("wave") - message = "[src] waves." - m_type = 1 - - if ("whimper") - message = "[src] whimpers." - m_type = 2 - - if ("yawn") - message = "[src] yawns." - m_type = 2 - - if ("help") - src << "Help for emotes. You can use these emotes with say \"*emote\":\n\naflap, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, grin, jump, laugh, look, me, nod, point-atom, scream, shake, sit, sigh, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, yawn" - - else - src << "\blue Unusable emote '[act]'. Say *help for a list." - - - - - - if (message) - log_emote("[name]/[key] : [message]") - - //Hearing gasp and such every five seconds is not good emotes were not global for a reason. - // Maybe some people are okay with that. - - for(var/mob/M in dead_mob_list) - if(!M.client || istype(M, /mob/new_player)) - continue //skip monkeys, leavers and new players - if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) - M.show_message(message) - - - if (m_type & 1) - for (var/mob/O in viewers(src, null)) - O.show_message(message, m_type) - else if (m_type & 2) - for (var/mob/O in hearers(src.loc, null)) - O.show_message(message, m_type) +//This only assumes that the mob has a body and face with at least one mouth. +//Things like airguitar can be done without arms, and the flap thing makes so little sense it's a keeper. +//Intended to be called by a higher up emote proc if the requested emote isn't in the custom emotes. + +/mob/living/emote(var/act,var/m_type=1,var/message = null) + var/param = null + + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + + if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' + act = copytext(act,1,length(act)) + + switch(act)//Hello, how would you like to order? Alphabetically! + if ("aflap") + if (!src.restrained()) + message = "[src] flaps its wings ANGRILY!" + m_type = 2 + + if ("blush") + message = "[src] blushes." + m_type = 1 + + if ("bow") + if (!src.buckled) + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] bows to [param]." + else + message = "[src] bows." + m_type = 1 + + if ("burp") + message = "[src] burps." + m_type = 2 + + if ("choke") + message = "[src] chokes!" + m_type = 2 + + if ("chuckle") + message = "[src] chuckles." + m_type = 2 + + if ("collapse") + Paralyse(2) + message = "[src] collapses!" + m_type = 2 + + if ("cough") + message = "[src] coughs!" + m_type = 2 + + if ("dance") + if (!src.restrained()) + message = "[src] dances around happily." + m_type = 1 + + if ("deathgasp") + message = "[src] seizes up and falls limp, its eyes dead and lifeless..." + m_type = 1 + + if ("drool") + message = "[src] drools." + m_type = 1 + + if ("faint") + message = "[src] faints." + if(src.sleeping) + return //Can't faint while asleep + src.sleeping += 10 //Short-short nap + m_type = 1 + + if ("flap") + if (!src.restrained()) + message = "[src] flaps its wings." + m_type = 2 + + if ("frown") + message = "[src] frowns." + m_type = 1 + + if ("gasp") + message = "[src] gasps!" + m_type = 2 + + if ("giggle") + message = "[src] giggles." + m_type = 2 + + if ("glare") + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] glares at [param]." + else + message = "[src] glares." + + if ("grin") + message = "[src] grins." + m_type = 1 + + if ("jump") + message = "[src] jumps!" + m_type = 1 + + if ("laugh") + message = "[src] laughs." + m_type = 2 + + if ("look") + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] looks at [param]." + else + message = "[src] looks." + m_type = 1 + + if ("me") + if (src.client) + if(client.prefs.muted & MUTE_IC) + src << "You cannot send IC messages (muted)." + return + if (src.client.handle_spam_prevention(message,MUTE_IC)) + return + if (stat) + return + if(!(message)) + return + else + message = "[src] [message]" + + if ("nod") + message = "[src] nods." + m_type = 1 + + if ("point") + if (!src.restrained()) + var/mob/M = null + if (param) + for (var/atom/A as mob|obj|turf|area in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + message = "[src] points." + else + M.point() + if (M) + message = "[src] points to [M]." + else + m_type = 1 + + if ("scream") + message = "[src] screams!" + m_type = 2 + + if ("shake") + message = "[src] shakes its head." + m_type = 1 + + if ("sigh") + message = "[src] sighs." + m_type = 2 + + if ("sit") + message = "[src] sits down." + m_type = 1 + + if ("smile") + message = "[src] smiles." + m_type = 1 + + if ("sneeze") + message = "[src] sneezes." + m_type = 2 + + if ("sniff") + message = "[src] sniffs." + m_type = 2 + + if ("snore") + message = "[src] snores." + m_type = 2 + + if ("stare") + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] stares at [param]." + else + message = "[src] stares." + + if ("sulk") + message = "[src] sulks down sadly." + m_type = 1 + + if ("sway") + message = "[src] sways around dizzily." + m_type = 1 + + if ("tremble") + message = "[src] trembles in fear!" + m_type = 1 + + if ("twitch") + message = "[src] twitches violently." + m_type = 1 + + if ("twitch_s") + message = "[src] twitches." + m_type = 1 + + if ("wave") + message = "[src] waves." + m_type = 1 + + if ("whimper") + message = "[src] whimpers." + m_type = 2 + + if ("yawn") + message = "[src] yawns." + m_type = 2 + + if ("help") + src << "Help for emotes. You can use these emotes with say \"*emote\":\n\naflap, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, grin, jump, laugh, look, me, nod, point-atom, scream, shake, sit, sigh, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, yawn" + + else + src << "\blue Unusable emote '[act]'. Say *help for a list." + + + + + + if (message) + log_emote("[name]/[key] : [message]") + + //Hearing gasp and such every five seconds is not good emotes were not global for a reason. + // Maybe some people are okay with that. + + for(var/mob/M in dead_mob_list) + if(!M.client || istype(M, /mob/new_player)) + continue //skip monkeys, leavers and new players + if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) + M.show_message(message) + + + if (m_type & 1) + for (var/mob/O in viewers(src, null)) + O.show_message(message, m_type) + else if (m_type & 2) + for (var/mob/O in hearers(src.loc, null)) + O.show_message(message, m_type) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 7690bdbcb06..560ecb1e9dc 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -4,6 +4,11 @@ if(cur_area) cur_area.mob_activate(src) +/mob/living/Destroy() +// if(mind) +// mind.current = null + ..() + del(src) /mob/living/verb/succumb(var/whispered as null) set hidden = 1 @@ -358,7 +363,7 @@ for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] has been pulled from []'s grip by []", G.affecting, G.assailant, src), 1) //G = null - del(G) + qdel(G) else ok = 0 if (locate(/obj/item/weapon/grab, M.grabbed_by.len)) @@ -430,22 +435,22 @@ if(!L.stat && L.canmove && !L.restrained()) var/resisting = 0 for(var/obj/O in L.requests) - del(O) + qdel(O) resisting++ for(var/obj/item/weapon/grab/G in usr.grabbed_by) resisting++ if(G.state == GRAB_PASSIVE) - del(G) + qdel(G) else if(G.state == GRAB_AGGRESSIVE) if(prob(25)) L.visible_message("[L] has broken free of [G.assailant]'s grip!") - del(G) + qdel(G) else if(G.state == GRAB_NECK) if(prob(5)) L.visible_message("[L] has broken free of [G.assailant]'s headlock!") - del(G) + qdel(G) if(resisting) L.visible_message("[L] resists!") return @@ -503,7 +508,7 @@ CM.visible_message("[CM] manages to break [CM.handcuffed]!" , \ "You successfully break [CM.handcuffed]!") CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - del(CM.handcuffed) + qdel(CM.handcuffed) CM.handcuffed = null CM.update_inv_handcuffed(0) else @@ -537,7 +542,7 @@ CM.visible_message("[CM] manages to break [CM.legcuffed]!", \ "You successfully break [CM.legcuffed].") CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - del(CM.legcuffed) + qdel(CM.legcuffed) CM.legcuffed = null CM.update_inv_legcuffed(0) else diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 97e1dfe9860..f078b822e3d 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -97,7 +97,7 @@ var/list/ai_list = list() if(!safety)//Only used by AIize() to successfully spawn an AI. if (!B)//If there is no player/brain inside. new/obj/structure/AIcore/deactivated(loc)//New empty terminal. - del(src)//Delete AI. + qdel(src)//Delete AI. return else if (B.brainmob.mind) @@ -118,7 +118,7 @@ var/list/ai_list = list() ..() return -/mob/living/silicon/ai/Del() +/mob/living/silicon/ai/Destroy() ai_list -= src shuttle_caller_list -= src emergency_shuttle.autoshuttlecall() diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 7f911fa56ad..d1eb8e21c19 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -51,9 +51,9 @@ spawn(5) eyeobj.loc = src.loc -/mob/living/silicon/ai/Del() +/mob/living/silicon/ai/Destroy() eyeobj.ai = null - del(eyeobj) // No AI, no Eye + qdel(eyeobj) // No AI, no Eye ..() /atom/proc/move_camera_by_click() diff --git a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm index cf7776f0629..f67578c5286 100644 --- a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm +++ b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm @@ -23,7 +23,7 @@ // STRUCTURES -/obj/structure/Del() +/obj/structure/Destroy() if(ticker) cameranet.updateVisibility(src) ..() @@ -35,7 +35,7 @@ // EFFECTS -/obj/effect/Del() +/obj/effect/Destroy() if(ticker) cameranet.updateVisibility(src) ..() @@ -91,7 +91,7 @@ cameranet.cameras += src cameranet.addCamera(src) -/obj/machinery/camera/Del() +/obj/machinery/camera/Destroy() cameranet.cameras -= src cameranet.removeCamera(src) ..() diff --git a/code/modules/mob/living/silicon/ai/vox_sounds.dm b/code/modules/mob/living/silicon/ai/vox_sounds.dm index 3502c8d76f1..aa2bb96cfe2 100644 --- a/code/modules/mob/living/silicon/ai/vox_sounds.dm +++ b/code/modules/mob/living/silicon/ai/vox_sounds.dm @@ -1,719 +1,719 @@ -// 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. -#ifdef AI_VOX - -var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg', -"." = 'sound/vox_fem/..ogg', -"a" = 'sound/vox_fem/a.ogg', -"abortions" = 'sound/vox_fem/abortions.ogg', -"accelerating" = 'sound/vox_fem/accelerating.ogg', -"accelerator" = 'sound/vox_fem/accelerator.ogg', -"accepted" = 'sound/vox_fem/accepted.ogg', -"access" = 'sound/vox_fem/access.ogg', -"acknowledge" = 'sound/vox_fem/acknowledge.ogg', -"acknowledged" = 'sound/vox_fem/acknowledged.ogg', -"acquired" = 'sound/vox_fem/acquired.ogg', -"acquisition" = 'sound/vox_fem/acquisition.ogg', -"across" = 'sound/vox_fem/across.ogg', -"activate" = 'sound/vox_fem/activate.ogg', -"activated" = 'sound/vox_fem/activated.ogg', -"activity" = 'sound/vox_fem/activity.ogg', -"adios" = 'sound/vox_fem/adios.ogg', -"administration" = 'sound/vox_fem/administration.ogg', -"advanced" = 'sound/vox_fem/advanced.ogg', -"aft" = 'sound/vox_fem/aft.ogg', -"after" = 'sound/vox_fem/after.ogg', -"agent" = 'sound/vox_fem/agent.ogg', -"ai" = 'sound/vox_fem/ai.ogg', -"alarm" = 'sound/vox_fem/alarm.ogg', -"alert" = 'sound/vox_fem/alert.ogg', -"alien" = 'sound/vox_fem/alien.ogg', -"aligned" = 'sound/vox_fem/aligned.ogg', -"all" = 'sound/vox_fem/all.ogg', -"alpha" = 'sound/vox_fem/alpha.ogg', -"am" = 'sound/vox_fem/am.ogg', -"amigo" = 'sound/vox_fem/amigo.ogg', -"ammunition" = 'sound/vox_fem/ammunition.ogg', -"an" = 'sound/vox_fem/an.ogg', -"and" = 'sound/vox_fem/and.ogg', -"announcement" = 'sound/vox_fem/announcement.ogg', -"anomalous" = 'sound/vox_fem/anomalous.ogg', -"antenna" = 'sound/vox_fem/antenna.ogg', -"any" = 'sound/vox_fem/any.ogg', -"apprehend" = 'sound/vox_fem/apprehend.ogg', -"approach" = 'sound/vox_fem/approach.ogg', -"are" = 'sound/vox_fem/are.ogg', -"area" = 'sound/vox_fem/area.ogg', -"arm" = 'sound/vox_fem/arm.ogg', -"armed" = 'sound/vox_fem/armed.ogg', -"armor" = 'sound/vox_fem/armor.ogg', -"armory" = 'sound/vox_fem/armory.ogg', -"array" = 'sound/vox_fem/array.ogg', -"arrest" = 'sound/vox_fem/arrest.ogg', -"asimov" = 'sound/vox_fem/asimov.ogg', -"ass" = 'sound/vox_fem/ass.ogg', -"asshole" = 'sound/vox_fem/asshole.ogg', -"assholes" = 'sound/vox_fem/assholes.ogg', -"at" = 'sound/vox_fem/at.ogg', -"atomic" = 'sound/vox_fem/atomic.ogg', -"attention" = 'sound/vox_fem/attention.ogg', -"authorize" = 'sound/vox_fem/authorize.ogg', -"authorized" = 'sound/vox_fem/authorized.ogg', -"automatic" = 'sound/vox_fem/automatic.ogg', -"away" = 'sound/vox_fem/away.ogg', -"b" = 'sound/vox_fem/b.ogg', -"back" = 'sound/vox_fem/back.ogg', -"backman" = 'sound/vox_fem/backman.ogg', -"bad" = 'sound/vox_fem/bad.ogg', -"bag" = 'sound/vox_fem/bag.ogg', -"bailey" = 'sound/vox_fem/bailey.ogg', -"barracks" = 'sound/vox_fem/barracks.ogg', -"base" = 'sound/vox_fem/base.ogg', -"bay" = 'sound/vox_fem/bay.ogg', -"be" = 'sound/vox_fem/be.ogg', -"been" = 'sound/vox_fem/been.ogg', -"before" = 'sound/vox_fem/before.ogg', -"beyond" = 'sound/vox_fem/beyond.ogg', -"biohazard" = 'sound/vox_fem/biohazard.ogg', -"biological" = 'sound/vox_fem/biological.ogg', -"birdwell" = 'sound/vox_fem/birdwell.ogg', -"bitch" = 'sound/vox_fem/bitch.ogg', -"bitches" = 'sound/vox_fem/bitches.ogg', -"black" = 'sound/vox_fem/black.ogg', -"blast" = 'sound/vox_fem/blast.ogg', -"blocked" = 'sound/vox_fem/blocked.ogg', -"blue" = 'sound/vox_fem/blue.ogg', -"bottom" = 'sound/vox_fem/bottom.ogg', -"bravo" = 'sound/vox_fem/bravo.ogg', -"breach" = 'sound/vox_fem/breach.ogg', -"breached" = 'sound/vox_fem/breached.ogg', -"break" = 'sound/vox_fem/break.ogg', -"bridge" = 'sound/vox_fem/bridge.ogg', -"bust" = 'sound/vox_fem/bust.ogg', -"but" = 'sound/vox_fem/but.ogg', -"button" = 'sound/vox_fem/button.ogg', -"bypass" = 'sound/vox_fem/bypass.ogg', -"c" = 'sound/vox_fem/c.ogg', -"cable" = 'sound/vox_fem/cable.ogg', -"call" = 'sound/vox_fem/call.ogg', -"called" = 'sound/vox_fem/called.ogg', -"canal" = 'sound/vox_fem/canal.ogg', -"cap" = 'sound/vox_fem/cap.ogg', -"captain" = 'sound/vox_fem/captain.ogg', -"capture" = 'sound/vox_fem/capture.ogg', -"cargo" = 'sound/vox_fem/cargo.ogg', -"ceiling" = 'sound/vox_fem/ceiling.ogg', -"celsius" = 'sound/vox_fem/celsius.ogg', -"centcom" = 'sound/vox_fem/centcom.ogg', -"center" = 'sound/vox_fem/center.ogg', -"centi" = 'sound/vox_fem/centi.ogg', -"central" = 'sound/vox_fem/central.ogg', -"chamber" = 'sound/vox_fem/chamber.ogg', -"changed" = 'sound/vox_fem/changed.ogg', -"charlie" = 'sound/vox_fem/charlie.ogg', -"check" = 'sound/vox_fem/check.ogg', -"checkpoint" = 'sound/vox_fem/checkpoint.ogg', -"chemical" = 'sound/vox_fem/chemical.ogg', -"cleanup" = 'sound/vox_fem/cleanup.ogg', -"clear" = 'sound/vox_fem/clear.ogg', -"clearance" = 'sound/vox_fem/clearance.ogg', -"close" = 'sound/vox_fem/close.ogg', -"clown" = 'sound/vox_fem/clown.ogg', -"code" = 'sound/vox_fem/code.ogg', -"coded" = 'sound/vox_fem/coded.ogg', -"collider" = 'sound/vox_fem/collider.ogg', -"come" = 'sound/vox_fem/come.ogg', -"command" = 'sound/vox_fem/command.ogg', -"communication" = 'sound/vox_fem/communication.ogg', -"complex" = 'sound/vox_fem/complex.ogg', -"computer" = 'sound/vox_fem/computer.ogg', -"condition" = 'sound/vox_fem/condition.ogg', -"connor" = 'sound/vox_fem/connor.ogg', -"containment" = 'sound/vox_fem/containment.ogg', -"contamination" = 'sound/vox_fem/contamination.ogg', -"contraband" = 'sound/vox_fem/contraband.ogg', -"control" = 'sound/vox_fem/control.ogg', -"coolant" = 'sound/vox_fem/coolant.ogg', -"coomer" = 'sound/vox_fem/coomer.ogg', -"core" = 'sound/vox_fem/core.ogg', -"correct" = 'sound/vox_fem/correct.ogg', -"corridor" = 'sound/vox_fem/corridor.ogg', -"coward" = 'sound/vox_fem/coward.ogg', -"cowards" = 'sound/vox_fem/cowards.ogg', -"crew" = 'sound/vox_fem/crew.ogg', -"cross" = 'sound/vox_fem/cross.ogg', -"cryogenic" = 'sound/vox_fem/cryogenic.ogg', -"cunt" = 'sound/vox_fem/cunt.ogg', -"cyborg" = 'sound/vox_fem/cyborg.ogg', -"cyborgs" = 'sound/vox_fem/cyborgs.ogg', -"d" = 'sound/vox_fem/d.ogg', -"damage" = 'sound/vox_fem/damage.ogg', -"damaged" = 'sound/vox_fem/damaged.ogg', -"danger" = 'sound/vox_fem/danger.ogg', -"day" = 'sound/vox_fem/day.ogg', -"deactivated" = 'sound/vox_fem/deactivated.ogg', -"decompression" = 'sound/vox_fem/decompression.ogg', -"decontamination" = 'sound/vox_fem/decontamination.ogg', -"deeoo" = 'sound/vox_fem/deeoo.ogg', -"defense" = 'sound/vox_fem/defense.ogg', -"degrees" = 'sound/vox_fem/degrees.ogg', -"delta" = 'sound/vox_fem/delta.ogg', -"denied" = 'sound/vox_fem/denied.ogg', -"deploy" = 'sound/vox_fem/deploy.ogg', -"deployed" = 'sound/vox_fem/deployed.ogg', -"destroy" = 'sound/vox_fem/destroy.ogg', -"destroyed" = 'sound/vox_fem/destroyed.ogg', -"detain" = 'sound/vox_fem/detain.ogg', -"detected" = 'sound/vox_fem/detected.ogg', -"detonation" = 'sound/vox_fem/detonation.ogg', -"device" = 'sound/vox_fem/device.ogg', -"did" = 'sound/vox_fem/did.ogg', -"die" = 'sound/vox_fem/die.ogg', -"dimensional" = 'sound/vox_fem/dimensional.ogg', -"dirt" = 'sound/vox_fem/dirt.ogg', -"disengaged" = 'sound/vox_fem/disengaged.ogg', -"dish" = 'sound/vox_fem/dish.ogg', -"disposal" = 'sound/vox_fem/disposal.ogg', -"distance" = 'sound/vox_fem/distance.ogg', -"distortion" = 'sound/vox_fem/distortion.ogg', -"do" = 'sound/vox_fem/do.ogg', -"doctor" = 'sound/vox_fem/doctor.ogg', -"door" = 'sound/vox_fem/door.ogg', -"down" = 'sound/vox_fem/down.ogg', -"dual" = 'sound/vox_fem/dual.ogg', -"duct" = 'sound/vox_fem/duct.ogg', -"e" = 'sound/vox_fem/e.ogg', -"east" = 'sound/vox_fem/east.ogg', -"echo" = 'sound/vox_fem/echo.ogg', -"ed" = 'sound/vox_fem/ed.ogg', -"effect" = 'sound/vox_fem/effect.ogg', -"egress" = 'sound/vox_fem/egress.ogg', -"eight" = 'sound/vox_fem/eight.ogg', -"eighteen" = 'sound/vox_fem/eighteen.ogg', -"eighty" = 'sound/vox_fem/eighty.ogg', -"electric" = 'sound/vox_fem/electric.ogg', -"electromagnetic" = 'sound/vox_fem/electromagnetic.ogg', -"elevator" = 'sound/vox_fem/elevator.ogg', -"eleven" = 'sound/vox_fem/eleven.ogg', -"eliminate" = 'sound/vox_fem/eliminate.ogg', -"emergency" = 'sound/vox_fem/emergency.ogg', -"energy" = 'sound/vox_fem/energy.ogg', -"engage" = 'sound/vox_fem/engage.ogg', -"engaged" = 'sound/vox_fem/engaged.ogg', -"engine" = 'sound/vox_fem/engine.ogg', -"enter" = 'sound/vox_fem/enter.ogg', -"entry" = 'sound/vox_fem/entry.ogg', -"environment" = 'sound/vox_fem/environment.ogg', -"error" = 'sound/vox_fem/error.ogg', -"escape" = 'sound/vox_fem/escape.ogg', -"evacuate" = 'sound/vox_fem/evacuate.ogg', -"exchange" = 'sound/vox_fem/exchange.ogg', -"exit" = 'sound/vox_fem/exit.ogg', -"expect" = 'sound/vox_fem/expect.ogg', -"experiment" = 'sound/vox_fem/experiment.ogg', -"experimental" = 'sound/vox_fem/experimental.ogg', -"explode" = 'sound/vox_fem/explode.ogg', -"explosion" = 'sound/vox_fem/explosion.ogg', -"exposure" = 'sound/vox_fem/exposure.ogg', -"exterminate" = 'sound/vox_fem/exterminate.ogg', -"extinguish" = 'sound/vox_fem/extinguish.ogg', -"extinguisher" = 'sound/vox_fem/extinguisher.ogg', -"extreme" = 'sound/vox_fem/extreme.ogg', -"f" = 'sound/vox_fem/f.ogg', -"facility" = 'sound/vox_fem/facility.ogg', -"fahrenheit" = 'sound/vox_fem/fahrenheit.ogg', -"failed" = 'sound/vox_fem/failed.ogg', -"failure" = 'sound/vox_fem/failure.ogg', -"farthest" = 'sound/vox_fem/farthest.ogg', -"fast" = 'sound/vox_fem/fast.ogg', -"feet" = 'sound/vox_fem/feet.ogg', -"field" = 'sound/vox_fem/field.ogg', -"fifteen" = 'sound/vox_fem/fifteen.ogg', -"fifth" = 'sound/vox_fem/fifth.ogg', -"fifty" = 'sound/vox_fem/fifty.ogg', -"final" = 'sound/vox_fem/final.ogg', -"fine" = 'sound/vox_fem/fine.ogg', -"fire" = 'sound/vox_fem/fire.ogg', -"first" = 'sound/vox_fem/first.ogg', -"five" = 'sound/vox_fem/five.ogg', -"flooding" = 'sound/vox_fem/flooding.ogg', -"floor" = 'sound/vox_fem/floor.ogg', -"fool" = 'sound/vox_fem/fool.ogg', -"for" = 'sound/vox_fem/for.ogg', -"forbidden" = 'sound/vox_fem/forbidden.ogg', -"force" = 'sound/vox_fem/force.ogg', -"fore" = 'sound/vox_fem/fore.ogg', -"forms" = 'sound/vox_fem/forms.ogg', -"found" = 'sound/vox_fem/found.ogg', -"four" = 'sound/vox_fem/four.ogg', -"fourteen" = 'sound/vox_fem/fourteen.ogg', -"fourth" = 'sound/vox_fem/fourth.ogg', -"fourty" = 'sound/vox_fem/fourty.ogg', -"foxtrot" = 'sound/vox_fem/foxtrot.ogg', -"freeman" = 'sound/vox_fem/freeman.ogg', -"freezer" = 'sound/vox_fem/freezer.ogg', -"from" = 'sound/vox_fem/from.ogg', -"front" = 'sound/vox_fem/front.ogg', -"fuck" = 'sound/vox_fem/fuck.ogg', -"fucking" = 'sound/vox_fem/fucking.ogg', -"fucks" = 'sound/vox_fem/fucks.ogg', -"fuel" = 'sound/vox_fem/fuel.ogg', -"g" = 'sound/vox_fem/g.ogg', -"gas" = 'sound/vox_fem/gas.ogg', -"get" = 'sound/vox_fem/get.ogg', -"glory" = 'sound/vox_fem/glory.ogg', -"go" = 'sound/vox_fem/go.ogg', -"going" = 'sound/vox_fem/going.ogg', -"good" = 'sound/vox_fem/good.ogg', -"goodbye" = 'sound/vox_fem/goodbye.ogg', -"gordon" = 'sound/vox_fem/gordon.ogg', -"got" = 'sound/vox_fem/got.ogg', -"government" = 'sound/vox_fem/government.ogg', -"granted" = 'sound/vox_fem/granted.ogg', -"gray" = 'sound/vox_fem/gray.ogg', -"great" = 'sound/vox_fem/great.ogg', -"green" = 'sound/vox_fem/green.ogg', -"grenade" = 'sound/vox_fem/grenade.ogg', -"guard" = 'sound/vox_fem/guard.ogg', -"gulf" = 'sound/vox_fem/gulf.ogg', -"gun" = 'sound/vox_fem/gun.ogg', -"guthrie" = 'sound/vox_fem/guthrie.ogg', -"h" = 'sound/vox_fem/h.ogg', -"hacker" = 'sound/vox_fem/hacker.ogg', -"hackers" = 'sound/vox_fem/hackers.ogg', -"handling" = 'sound/vox_fem/handling.ogg', -"hangar" = 'sound/vox_fem/hangar.ogg', -"harm" = 'sound/vox_fem/harm.ogg', -"has" = 'sound/vox_fem/has.ogg', -"have" = 'sound/vox_fem/have.ogg', -"hazard" = 'sound/vox_fem/hazard.ogg', -"head" = 'sound/vox_fem/head.ogg', -"health" = 'sound/vox_fem/health.ogg', -"heat" = 'sound/vox_fem/heat.ogg', -"helicopter" = 'sound/vox_fem/helicopter.ogg', -"helium" = 'sound/vox_fem/helium.ogg', -"hello" = 'sound/vox_fem/hello.ogg', -"help" = 'sound/vox_fem/help.ogg', -"here" = 'sound/vox_fem/here.ogg', -"hide" = 'sound/vox_fem/hide.ogg', -"high" = 'sound/vox_fem/high.ogg', -"highest" = 'sound/vox_fem/highest.ogg', -"hit" = 'sound/vox_fem/hit.ogg', -"hole" = 'sound/vox_fem/hole.ogg', -"hostile" = 'sound/vox_fem/hostile.ogg', -"hot" = 'sound/vox_fem/hot.ogg', -"hotel" = 'sound/vox_fem/hotel.ogg', -"hour" = 'sound/vox_fem/hour.ogg', -"hours" = 'sound/vox_fem/hours.ogg', -"human" = 'sound/vox_fem/human.ogg', -"hundred" = 'sound/vox_fem/hundred.ogg', -"hunger" = 'sound/vox_fem/hunger.ogg', -"hydro" = 'sound/vox_fem/hydro.ogg', -"hydroponics" = 'sound/vox_fem/hydroponics.ogg', -"i" = 'sound/vox_fem/i.ogg', -"idiot" = 'sound/vox_fem/idiot.ogg', -"illegal" = 'sound/vox_fem/illegal.ogg', -"immediate" = 'sound/vox_fem/immediate.ogg', -"immediately" = 'sound/vox_fem/immediately.ogg', -"in" = 'sound/vox_fem/in.ogg', -"inches" = 'sound/vox_fem/inches.ogg', -"india" = 'sound/vox_fem/india.ogg', -"ing" = 'sound/vox_fem/ing.ogg', -"inoperative" = 'sound/vox_fem/inoperative.ogg', -"inside" = 'sound/vox_fem/inside.ogg', -"inspection" = 'sound/vox_fem/inspection.ogg', -"inspector" = 'sound/vox_fem/inspector.ogg', -"interchange" = 'sound/vox_fem/interchange.ogg', -"intruder" = 'sound/vox_fem/intruder.ogg', -"invalid" = 'sound/vox_fem/invalid.ogg', -"invasion" = 'sound/vox_fem/invasion.ogg', -"is" = 'sound/vox_fem/is.ogg', -"it" = 'sound/vox_fem/it.ogg', -"j" = 'sound/vox_fem/j.ogg', -"johnson" = 'sound/vox_fem/johnson.ogg', -"juliet" = 'sound/vox_fem/juliet.ogg', -"k" = 'sound/vox_fem/k.ogg', -"key" = 'sound/vox_fem/key.ogg', -"kill" = 'sound/vox_fem/kill.ogg', -"kilo" = 'sound/vox_fem/kilo.ogg', -"kit" = 'sound/vox_fem/kit.ogg', -"l" = 'sound/vox_fem/l.ogg', -"lab" = 'sound/vox_fem/lab.ogg', -"lambda" = 'sound/vox_fem/lambda.ogg', -"laser" = 'sound/vox_fem/laser.ogg', -"last" = 'sound/vox_fem/last.ogg', -"launch" = 'sound/vox_fem/launch.ogg', -"law" = 'sound/vox_fem/law.ogg', -"laws" = 'sound/vox_fem/laws.ogg', -"leak" = 'sound/vox_fem/leak.ogg', -"leave" = 'sound/vox_fem/leave.ogg', -"left" = 'sound/vox_fem/left.ogg', -"legal" = 'sound/vox_fem/legal.ogg', -"level" = 'sound/vox_fem/level.ogg', -"lever" = 'sound/vox_fem/lever.ogg', -"lie" = 'sound/vox_fem/lie.ogg', -"lieutenant" = 'sound/vox_fem/lieutenant.ogg', -"life" = 'sound/vox_fem/life.ogg', -"light" = 'sound/vox_fem/light.ogg', -"lima" = 'sound/vox_fem/lima.ogg', -"liquid" = 'sound/vox_fem/liquid.ogg', -"loading" = 'sound/vox_fem/loading.ogg', -"locate" = 'sound/vox_fem/locate.ogg', -"located" = 'sound/vox_fem/located.ogg', -"location" = 'sound/vox_fem/location.ogg', -"lock" = 'sound/vox_fem/lock.ogg', -"locked" = 'sound/vox_fem/locked.ogg', -"locker" = 'sound/vox_fem/locker.ogg', -"lockout" = 'sound/vox_fem/lockout.ogg', -"loose" = 'sound/vox_fem/loose.ogg', -"lower" = 'sound/vox_fem/lower.ogg', -"lowest" = 'sound/vox_fem/lowest.ogg', -"m" = 'sound/vox_fem/m.ogg', -"magnetic" = 'sound/vox_fem/magnetic.ogg', -"main" = 'sound/vox_fem/main.ogg', -"maintenance" = 'sound/vox_fem/maintenance.ogg', -"malfunction" = 'sound/vox_fem/malfunction.ogg', -"man" = 'sound/vox_fem/man.ogg', -"mass" = 'sound/vox_fem/mass.ogg', -"materials" = 'sound/vox_fem/materials.ogg', -"maximum" = 'sound/vox_fem/maximum.ogg', -"may" = 'sound/vox_fem/may.ogg', -"me" = 'sound/vox_fem/me.ogg', -"medbay" = 'sound/vox_fem/medbay.ogg', -"medical" = 'sound/vox_fem/medical.ogg', -"men" = 'sound/vox_fem/men.ogg', -"mercy" = 'sound/vox_fem/mercy.ogg', -"mesa" = 'sound/vox_fem/mesa.ogg', -"message" = 'sound/vox_fem/message.ogg', -"meter" = 'sound/vox_fem/meter.ogg', -"micro" = 'sound/vox_fem/micro.ogg', -"middle" = 'sound/vox_fem/middle.ogg', -"mike" = 'sound/vox_fem/mike.ogg', -"miles" = 'sound/vox_fem/miles.ogg', -"military" = 'sound/vox_fem/military.ogg', -"milli" = 'sound/vox_fem/milli.ogg', -"million" = 'sound/vox_fem/million.ogg', -"minefield" = 'sound/vox_fem/minefield.ogg', -"minimum" = 'sound/vox_fem/minimum.ogg', -"minutes" = 'sound/vox_fem/minutes.ogg', -"mister" = 'sound/vox_fem/mister.ogg', -"mode" = 'sound/vox_fem/mode.ogg', -"money" = 'sound/vox_fem/money.ogg', -"motor" = 'sound/vox_fem/motor.ogg', -"motorpool" = 'sound/vox_fem/motorpool.ogg', -"move" = 'sound/vox_fem/move.ogg', -"must" = 'sound/vox_fem/must.ogg', -"my" = 'sound/vox_fem/my.ogg', -"n" = 'sound/vox_fem/n.ogg', -"nanotrasen" = 'sound/vox_fem/nanotrasen.ogg', -"nearest" = 'sound/vox_fem/nearest.ogg', -"nice" = 'sound/vox_fem/nice.ogg', -"nine" = 'sound/vox_fem/nine.ogg', -"nineteen" = 'sound/vox_fem/nineteen.ogg', -"ninety" = 'sound/vox_fem/ninety.ogg', -"no" = 'sound/vox_fem/no.ogg', -"nominal" = 'sound/vox_fem/nominal.ogg', -"north" = 'sound/vox_fem/north.ogg', -"not" = 'sound/vox_fem/not.ogg', -"november" = 'sound/vox_fem/november.ogg', -"now" = 'sound/vox_fem/now.ogg', -"number" = 'sound/vox_fem/number.ogg', -"o" = 'sound/vox_fem/o.ogg', -"objective" = 'sound/vox_fem/objective.ogg', -"observation" = 'sound/vox_fem/observation.ogg', -"obtain" = 'sound/vox_fem/obtain.ogg', -"of" = 'sound/vox_fem/of.ogg', -"officer" = 'sound/vox_fem/officer.ogg', -"ok" = 'sound/vox_fem/ok.ogg', -"on" = 'sound/vox_fem/on.ogg', -"one" = 'sound/vox_fem/one.ogg', -"open" = 'sound/vox_fem/open.ogg', -"operating" = 'sound/vox_fem/operating.ogg', -"operations" = 'sound/vox_fem/operations.ogg', -"operative" = 'sound/vox_fem/operative.ogg', -"option" = 'sound/vox_fem/option.ogg', -"order" = 'sound/vox_fem/order.ogg', -"organic" = 'sound/vox_fem/organic.ogg', -"oscar" = 'sound/vox_fem/oscar.ogg', -"out" = 'sound/vox_fem/out.ogg', -"outside" = 'sound/vox_fem/outside.ogg', -"over" = 'sound/vox_fem/over.ogg', -"overload" = 'sound/vox_fem/overload.ogg', -"override" = 'sound/vox_fem/override.ogg', -"p" = 'sound/vox_fem/p.ogg', -"pacify" = 'sound/vox_fem/pacify.ogg', -"pain" = 'sound/vox_fem/pain.ogg', -"pal" = 'sound/vox_fem/pal.ogg', -"panel" = 'sound/vox_fem/panel.ogg', -"percent" = 'sound/vox_fem/percent.ogg', -"perimeter" = 'sound/vox_fem/perimeter.ogg', -"permitted" = 'sound/vox_fem/permitted.ogg', -"personnel" = 'sound/vox_fem/personnel.ogg', -"pipe" = 'sound/vox_fem/pipe.ogg', -"plant" = 'sound/vox_fem/plant.ogg', -"plasma" = 'sound/vox_fem/plasma.ogg', -"platform" = 'sound/vox_fem/platform.ogg', -"please" = 'sound/vox_fem/please.ogg', -"point" = 'sound/vox_fem/point.ogg', -"port" = 'sound/vox_fem/port.ogg', -"portal" = 'sound/vox_fem/portal.ogg', -"power" = 'sound/vox_fem/power.ogg', -"presence" = 'sound/vox_fem/presence.ogg', -"press" = 'sound/vox_fem/press.ogg', -"primary" = 'sound/vox_fem/primary.ogg', -"proceed" = 'sound/vox_fem/proceed.ogg', -"processing" = 'sound/vox_fem/processing.ogg', -"progress" = 'sound/vox_fem/progress.ogg', -"proper" = 'sound/vox_fem/proper.ogg', -"propulsion" = 'sound/vox_fem/propulsion.ogg', -"prosecute" = 'sound/vox_fem/prosecute.ogg', -"protective" = 'sound/vox_fem/protective.ogg', -"push" = 'sound/vox_fem/push.ogg', -"q" = 'sound/vox_fem/q.ogg', -"quantum" = 'sound/vox_fem/quantum.ogg', -"quebec" = 'sound/vox_fem/quebec.ogg', -"queen" = 'sound/vox_fem/queen.ogg', -"question" = 'sound/vox_fem/question.ogg', -"questioning" = 'sound/vox_fem/questioning.ogg', -"quick" = 'sound/vox_fem/quick.ogg', -"quit" = 'sound/vox_fem/quit.ogg', -"r" = 'sound/vox_fem/r.ogg', -"radiation" = 'sound/vox_fem/radiation.ogg', -"radioactive" = 'sound/vox_fem/radioactive.ogg', -"rads" = 'sound/vox_fem/rads.ogg', -"raider" = 'sound/vox_fem/raider.ogg', -"raiders" = 'sound/vox_fem/raiders.ogg', -"rapid" = 'sound/vox_fem/rapid.ogg', -"reach" = 'sound/vox_fem/reach.ogg', -"reached" = 'sound/vox_fem/reached.ogg', -"reactor" = 'sound/vox_fem/reactor.ogg', -"red" = 'sound/vox_fem/red.ogg', -"relay" = 'sound/vox_fem/relay.ogg', -"released" = 'sound/vox_fem/released.ogg', -"remaining" = 'sound/vox_fem/remaining.ogg', -"removal" = 'sound/vox_fem/removal.ogg', -"renegade" = 'sound/vox_fem/renegade.ogg', -"repair" = 'sound/vox_fem/repair.ogg', -"report" = 'sound/vox_fem/report.ogg', -"reports" = 'sound/vox_fem/reports.ogg', -"required" = 'sound/vox_fem/required.ogg', -"research" = 'sound/vox_fem/research.ogg', -"resevoir" = 'sound/vox_fem/resevoir.ogg', -"resistance" = 'sound/vox_fem/resistance.ogg', -"rest" = 'sound/vox_fem/rest.ogg', -"right" = 'sound/vox_fem/right.ogg', -"rocket" = 'sound/vox_fem/rocket.ogg', -"roger" = 'sound/vox_fem/roger.ogg', -"romeo" = 'sound/vox_fem/romeo.ogg', -"room" = 'sound/vox_fem/room.ogg', -"round" = 'sound/vox_fem/round.ogg', -"run" = 'sound/vox_fem/run.ogg', -"s" = 'sound/vox_fem/s.ogg', -"safe" = 'sound/vox_fem/safe.ogg', -"safety" = 'sound/vox_fem/safety.ogg', -"sarah" = 'sound/vox_fem/sarah.ogg', -"sargeant" = 'sound/vox_fem/sargeant.ogg', -"satellite" = 'sound/vox_fem/satellite.ogg', -"save" = 'sound/vox_fem/save.ogg', -"science" = 'sound/vox_fem/science.ogg', -"scream" = 'sound/vox_fem/scream.ogg', -"screen" = 'sound/vox_fem/screen.ogg', -"search" = 'sound/vox_fem/search.ogg', -"second" = 'sound/vox_fem/second.ogg', -"secondary" = 'sound/vox_fem/secondary.ogg', -"seconds" = 'sound/vox_fem/seconds.ogg', -"sector" = 'sound/vox_fem/sector.ogg', -"secure" = 'sound/vox_fem/secure.ogg', -"secured" = 'sound/vox_fem/secured.ogg', -"security" = 'sound/vox_fem/security.ogg', -"select" = 'sound/vox_fem/select.ogg', -"selected" = 'sound/vox_fem/selected.ogg', -"sensors" = 'sound/vox_fem/sensors.ogg', -"service" = 'sound/vox_fem/service.ogg', -"seven" = 'sound/vox_fem/seven.ogg', -"seventeen" = 'sound/vox_fem/seventeen.ogg', -"seventy" = 'sound/vox_fem/seventy.ogg', -"severe" = 'sound/vox_fem/severe.ogg', -"sewage" = 'sound/vox_fem/sewage.ogg', -"sewer" = 'sound/vox_fem/sewer.ogg', -"shield" = 'sound/vox_fem/shield.ogg', -"shipment" = 'sound/vox_fem/shipment.ogg', -"shirt" = 'sound/vox_fem/shirt.ogg', -"shit" = 'sound/vox_fem/shit.ogg', -"shitlord" = 'sound/vox_fem/shitlord.ogg', -"shits" = 'sound/vox_fem/shits.ogg', -"shitting" = 'sound/vox_fem/shitting.ogg', -"shock" = 'sound/vox_fem/shock.ogg', -"shoot" = 'sound/vox_fem/shoot.ogg', -"shower" = 'sound/vox_fem/shower.ogg', -"shut" = 'sound/vox_fem/shut.ogg', -"shuttle" = 'sound/vox_fem/shuttle.ogg', -"side" = 'sound/vox_fem/side.ogg', -"sierra" = 'sound/vox_fem/sierra.ogg', -"sight" = 'sound/vox_fem/sight.ogg', -"silo" = 'sound/vox_fem/silo.ogg', -"singularity" = 'sound/vox_fem/singularity.ogg', -"six" = 'sound/vox_fem/six.ogg', -"sixteen" = 'sound/vox_fem/sixteen.ogg', -"sixty" = 'sound/vox_fem/sixty.ogg', -"slime" = 'sound/vox_fem/slime.ogg', -"slow" = 'sound/vox_fem/slow.ogg', -"solar" = 'sound/vox_fem/solar.ogg', -"solars" = 'sound/vox_fem/solars.ogg', -"soldier" = 'sound/vox_fem/soldier.ogg', -"some" = 'sound/vox_fem/some.ogg', -"someone" = 'sound/vox_fem/someone.ogg', -"something" = 'sound/vox_fem/something.ogg', -"son" = 'sound/vox_fem/son.ogg', -"sorry" = 'sound/vox_fem/sorry.ogg', -"south" = 'sound/vox_fem/south.ogg', -"squad" = 'sound/vox_fem/squad.ogg', -"square" = 'sound/vox_fem/square.ogg', -"ss13" = 'sound/vox_fem/ss13.ogg', -"stairway" = 'sound/vox_fem/stairway.ogg', -"starboard" = 'sound/vox_fem/starboard.ogg', -"station" = 'sound/vox_fem/station.ogg', -"status" = 'sound/vox_fem/status.ogg', -"sterile" = 'sound/vox_fem/sterile.ogg', -"sterilization" = 'sound/vox_fem/sterilization.ogg', -"storage" = 'sound/vox_fem/storage.ogg', -"stuck" = 'sound/vox_fem/stuck.ogg', -"sub" = 'sound/vox_fem/sub.ogg', -"subsurface" = 'sound/vox_fem/subsurface.ogg', -"sudden" = 'sound/vox_fem/sudden.ogg', -"suffer" = 'sound/vox_fem/suffer.ogg', -"suit" = 'sound/vox_fem/suit.ogg', -"superconducting" = 'sound/vox_fem/superconducting.ogg', -"supercooled" = 'sound/vox_fem/supercooled.ogg', -"supply" = 'sound/vox_fem/supply.ogg', -"surface" = 'sound/vox_fem/surface.ogg', -"surrender" = 'sound/vox_fem/surrender.ogg', -"surround" = 'sound/vox_fem/surround.ogg', -"surrounded" = 'sound/vox_fem/surrounded.ogg', -"switch" = 'sound/vox_fem/switch.ogg', -"syndicate" = 'sound/vox_fem/syndicate.ogg', -"system" = 'sound/vox_fem/system.ogg', -"systems" = 'sound/vox_fem/systems.ogg', -"t" = 'sound/vox_fem/t.ogg', -"tactical" = 'sound/vox_fem/tactical.ogg', -"take" = 'sound/vox_fem/take.ogg', -"talk" = 'sound/vox_fem/talk.ogg', -"tango" = 'sound/vox_fem/tango.ogg', -"tank" = 'sound/vox_fem/tank.ogg', -"target" = 'sound/vox_fem/target.ogg', -"team" = 'sound/vox_fem/team.ogg', -"temperature" = 'sound/vox_fem/temperature.ogg', -"temporal" = 'sound/vox_fem/temporal.ogg', -"ten" = 'sound/vox_fem/ten.ogg', -"terminal" = 'sound/vox_fem/terminal.ogg', -"terminated" = 'sound/vox_fem/terminated.ogg', -"termination" = 'sound/vox_fem/termination.ogg', -"test" = 'sound/vox_fem/test.ogg', -"that" = 'sound/vox_fem/that.ogg', -"the" = 'sound/vox_fem/the.ogg', -"then" = 'sound/vox_fem/then.ogg', -"there" = 'sound/vox_fem/there.ogg', -"third" = 'sound/vox_fem/third.ogg', -"thirteen" = 'sound/vox_fem/thirteen.ogg', -"thirty" = 'sound/vox_fem/thirty.ogg', -"this" = 'sound/vox_fem/this.ogg', -"those" = 'sound/vox_fem/those.ogg', -"thousand" = 'sound/vox_fem/thousand.ogg', -"threat" = 'sound/vox_fem/threat.ogg', -"three" = 'sound/vox_fem/three.ogg', -"through" = 'sound/vox_fem/through.ogg', -"tide" = 'sound/vox_fem/tide.ogg', -"time" = 'sound/vox_fem/time.ogg', -"to" = 'sound/vox_fem/to.ogg', -"top" = 'sound/vox_fem/top.ogg', -"topside" = 'sound/vox_fem/topside.ogg', -"touch" = 'sound/vox_fem/touch.ogg', -"towards" = 'sound/vox_fem/towards.ogg', -"toxins" = 'sound/vox_fem/toxins.ogg', -"track" = 'sound/vox_fem/track.ogg', -"train" = 'sound/vox_fem/train.ogg', -"traitor" = 'sound/vox_fem/traitor.ogg', -"transportation" = 'sound/vox_fem/transportation.ogg', -"truck" = 'sound/vox_fem/truck.ogg', -"tunnel" = 'sound/vox_fem/tunnel.ogg', -"turn" = 'sound/vox_fem/turn.ogg', -"turret" = 'sound/vox_fem/turret.ogg', -"twelve" = 'sound/vox_fem/twelve.ogg', -"twenty" = 'sound/vox_fem/twenty.ogg', -"two" = 'sound/vox_fem/two.ogg', -"u" = 'sound/vox_fem/u.ogg', -"unauthorized" = 'sound/vox_fem/unauthorized.ogg', -"under" = 'sound/vox_fem/under.ogg', -"uniform" = 'sound/vox_fem/uniform.ogg', -"unlocked" = 'sound/vox_fem/unlocked.ogg', -"until" = 'sound/vox_fem/until.ogg', -"up" = 'sound/vox_fem/up.ogg', -"update" = 'sound/vox_fem/update.ogg', -"updated" = 'sound/vox_fem/updated.ogg', -"updating" = 'sound/vox_fem/updating.ogg', -"upload" = 'sound/vox_fem/upload.ogg', -"upper" = 'sound/vox_fem/upper.ogg', -"uranium" = 'sound/vox_fem/uranium.ogg', -"us" = 'sound/vox_fem/us.ogg', -"usa" = 'sound/vox_fem/usa.ogg', -"use" = 'sound/vox_fem/use.ogg', -"used" = 'sound/vox_fem/used.ogg', -"user" = 'sound/vox_fem/user.ogg', -"v" = 'sound/vox_fem/v.ogg', -"vacate" = 'sound/vox_fem/vacate.ogg', -"valid" = 'sound/vox_fem/valid.ogg', -"vapor" = 'sound/vox_fem/vapor.ogg', -"vent" = 'sound/vox_fem/vent.ogg', -"ventilation" = 'sound/vox_fem/ventilation.ogg', -"victor" = 'sound/vox_fem/victor.ogg', -"violated" = 'sound/vox_fem/violated.ogg', -"violation" = 'sound/vox_fem/violation.ogg', -"virology" = 'sound/vox_fem/virology.ogg', -"voltage" = 'sound/vox_fem/voltage.ogg', -"vox" = 'sound/vox_fem/vox.ogg', -"vox_login" = 'sound/vox_fem/vox_login.ogg', -"voxtest" = 'sound/vox_fem/voxtest.ogg', -"voxtest2" = 'sound/vox_fem/voxtest2.ogg', -"w" = 'sound/vox_fem/w.ogg', -"walk" = 'sound/vox_fem/walk.ogg', -"wall" = 'sound/vox_fem/wall.ogg', -"wanker" = 'sound/vox_fem/wanker.ogg', -"want" = 'sound/vox_fem/want.ogg', -"wanted" = 'sound/vox_fem/wanted.ogg', -"warm" = 'sound/vox_fem/warm.ogg', -"warn" = 'sound/vox_fem/warn.ogg', -"warning" = 'sound/vox_fem/warning.ogg', -"waste" = 'sound/vox_fem/waste.ogg', -"water" = 'sound/vox_fem/water.ogg', -"we" = 'sound/vox_fem/we.ogg', -"weapon" = 'sound/vox_fem/weapon.ogg', -"welcome" = 'sound/vox_fem/welcome.ogg', -"west" = 'sound/vox_fem/west.ogg', -"whiskey" = 'sound/vox_fem/whiskey.ogg', -"white" = 'sound/vox_fem/white.ogg', -"wilco" = 'sound/vox_fem/wilco.ogg', -"will" = 'sound/vox_fem/will.ogg', -"with" = 'sound/vox_fem/with.ogg', -"without" = 'sound/vox_fem/without.ogg', -"wood" = 'sound/vox_fem/wood.ogg', -"woody" = 'sound/vox_fem/woody.ogg', -"x" = 'sound/vox_fem/x.ogg', -"xeno" = 'sound/vox_fem/xeno.ogg', -"xenobiology" = 'sound/vox_fem/xenobiology.ogg', -"xenomorph" = 'sound/vox_fem/xenomorph.ogg', -"xenomorphs" = 'sound/vox_fem/xenomorphs.ogg', -"y" = 'sound/vox_fem/y.ogg', -"yankee" = 'sound/vox_fem/yankee.ogg', -"yards" = 'sound/vox_fem/yards.ogg', -"year" = 'sound/vox_fem/year.ogg', -"yellow" = 'sound/vox_fem/yellow.ogg', -"yes" = 'sound/vox_fem/yes.ogg', -"you" = 'sound/vox_fem/you.ogg', -"your" = 'sound/vox_fem/your.ogg', -"yourself" = 'sound/vox_fem/yourself.ogg', -"z" = 'sound/vox_fem/z.ogg', -"zero" = 'sound/vox_fem/zero.ogg', -"zone" = 'sound/vox_fem/zone.ogg', -"zulu" = 'sound/vox_fem/zulu.ogg', -) +// 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. +#ifdef AI_VOX + +var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg', +"." = 'sound/vox_fem/..ogg', +"a" = 'sound/vox_fem/a.ogg', +"abortions" = 'sound/vox_fem/abortions.ogg', +"accelerating" = 'sound/vox_fem/accelerating.ogg', +"accelerator" = 'sound/vox_fem/accelerator.ogg', +"accepted" = 'sound/vox_fem/accepted.ogg', +"access" = 'sound/vox_fem/access.ogg', +"acknowledge" = 'sound/vox_fem/acknowledge.ogg', +"acknowledged" = 'sound/vox_fem/acknowledged.ogg', +"acquired" = 'sound/vox_fem/acquired.ogg', +"acquisition" = 'sound/vox_fem/acquisition.ogg', +"across" = 'sound/vox_fem/across.ogg', +"activate" = 'sound/vox_fem/activate.ogg', +"activated" = 'sound/vox_fem/activated.ogg', +"activity" = 'sound/vox_fem/activity.ogg', +"adios" = 'sound/vox_fem/adios.ogg', +"administration" = 'sound/vox_fem/administration.ogg', +"advanced" = 'sound/vox_fem/advanced.ogg', +"aft" = 'sound/vox_fem/aft.ogg', +"after" = 'sound/vox_fem/after.ogg', +"agent" = 'sound/vox_fem/agent.ogg', +"ai" = 'sound/vox_fem/ai.ogg', +"alarm" = 'sound/vox_fem/alarm.ogg', +"alert" = 'sound/vox_fem/alert.ogg', +"alien" = 'sound/vox_fem/alien.ogg', +"aligned" = 'sound/vox_fem/aligned.ogg', +"all" = 'sound/vox_fem/all.ogg', +"alpha" = 'sound/vox_fem/alpha.ogg', +"am" = 'sound/vox_fem/am.ogg', +"amigo" = 'sound/vox_fem/amigo.ogg', +"ammunition" = 'sound/vox_fem/ammunition.ogg', +"an" = 'sound/vox_fem/an.ogg', +"and" = 'sound/vox_fem/and.ogg', +"announcement" = 'sound/vox_fem/announcement.ogg', +"anomalous" = 'sound/vox_fem/anomalous.ogg', +"antenna" = 'sound/vox_fem/antenna.ogg', +"any" = 'sound/vox_fem/any.ogg', +"apprehend" = 'sound/vox_fem/apprehend.ogg', +"approach" = 'sound/vox_fem/approach.ogg', +"are" = 'sound/vox_fem/are.ogg', +"area" = 'sound/vox_fem/area.ogg', +"arm" = 'sound/vox_fem/arm.ogg', +"armed" = 'sound/vox_fem/armed.ogg', +"armor" = 'sound/vox_fem/armor.ogg', +"armory" = 'sound/vox_fem/armory.ogg', +"array" = 'sound/vox_fem/array.ogg', +"arrest" = 'sound/vox_fem/arrest.ogg', +"asimov" = 'sound/vox_fem/asimov.ogg', +"ass" = 'sound/vox_fem/ass.ogg', +"asshole" = 'sound/vox_fem/asshole.ogg', +"assholes" = 'sound/vox_fem/assholes.ogg', +"at" = 'sound/vox_fem/at.ogg', +"atomic" = 'sound/vox_fem/atomic.ogg', +"attention" = 'sound/vox_fem/attention.ogg', +"authorize" = 'sound/vox_fem/authorize.ogg', +"authorized" = 'sound/vox_fem/authorized.ogg', +"automatic" = 'sound/vox_fem/automatic.ogg', +"away" = 'sound/vox_fem/away.ogg', +"b" = 'sound/vox_fem/b.ogg', +"back" = 'sound/vox_fem/back.ogg', +"backman" = 'sound/vox_fem/backman.ogg', +"bad" = 'sound/vox_fem/bad.ogg', +"bag" = 'sound/vox_fem/bag.ogg', +"bailey" = 'sound/vox_fem/bailey.ogg', +"barracks" = 'sound/vox_fem/barracks.ogg', +"base" = 'sound/vox_fem/base.ogg', +"bay" = 'sound/vox_fem/bay.ogg', +"be" = 'sound/vox_fem/be.ogg', +"been" = 'sound/vox_fem/been.ogg', +"before" = 'sound/vox_fem/before.ogg', +"beyond" = 'sound/vox_fem/beyond.ogg', +"biohazard" = 'sound/vox_fem/biohazard.ogg', +"biological" = 'sound/vox_fem/biological.ogg', +"birdwell" = 'sound/vox_fem/birdwell.ogg', +"bitch" = 'sound/vox_fem/bitch.ogg', +"bitches" = 'sound/vox_fem/bitches.ogg', +"black" = 'sound/vox_fem/black.ogg', +"blast" = 'sound/vox_fem/blast.ogg', +"blocked" = 'sound/vox_fem/blocked.ogg', +"blue" = 'sound/vox_fem/blue.ogg', +"bottom" = 'sound/vox_fem/bottom.ogg', +"bravo" = 'sound/vox_fem/bravo.ogg', +"breach" = 'sound/vox_fem/breach.ogg', +"breached" = 'sound/vox_fem/breached.ogg', +"break" = 'sound/vox_fem/break.ogg', +"bridge" = 'sound/vox_fem/bridge.ogg', +"bust" = 'sound/vox_fem/bust.ogg', +"but" = 'sound/vox_fem/but.ogg', +"button" = 'sound/vox_fem/button.ogg', +"bypass" = 'sound/vox_fem/bypass.ogg', +"c" = 'sound/vox_fem/c.ogg', +"cable" = 'sound/vox_fem/cable.ogg', +"call" = 'sound/vox_fem/call.ogg', +"called" = 'sound/vox_fem/called.ogg', +"canal" = 'sound/vox_fem/canal.ogg', +"cap" = 'sound/vox_fem/cap.ogg', +"captain" = 'sound/vox_fem/captain.ogg', +"capture" = 'sound/vox_fem/capture.ogg', +"cargo" = 'sound/vox_fem/cargo.ogg', +"ceiling" = 'sound/vox_fem/ceiling.ogg', +"celsius" = 'sound/vox_fem/celsius.ogg', +"centcom" = 'sound/vox_fem/centcom.ogg', +"center" = 'sound/vox_fem/center.ogg', +"centi" = 'sound/vox_fem/centi.ogg', +"central" = 'sound/vox_fem/central.ogg', +"chamber" = 'sound/vox_fem/chamber.ogg', +"changed" = 'sound/vox_fem/changed.ogg', +"charlie" = 'sound/vox_fem/charlie.ogg', +"check" = 'sound/vox_fem/check.ogg', +"checkpoint" = 'sound/vox_fem/checkpoint.ogg', +"chemical" = 'sound/vox_fem/chemical.ogg', +"cleanup" = 'sound/vox_fem/cleanup.ogg', +"clear" = 'sound/vox_fem/clear.ogg', +"clearance" = 'sound/vox_fem/clearance.ogg', +"close" = 'sound/vox_fem/close.ogg', +"clown" = 'sound/vox_fem/clown.ogg', +"code" = 'sound/vox_fem/code.ogg', +"coded" = 'sound/vox_fem/coded.ogg', +"collider" = 'sound/vox_fem/collider.ogg', +"come" = 'sound/vox_fem/come.ogg', +"command" = 'sound/vox_fem/command.ogg', +"communication" = 'sound/vox_fem/communication.ogg', +"complex" = 'sound/vox_fem/complex.ogg', +"computer" = 'sound/vox_fem/computer.ogg', +"condition" = 'sound/vox_fem/condition.ogg', +"connor" = 'sound/vox_fem/connor.ogg', +"containment" = 'sound/vox_fem/containment.ogg', +"contamination" = 'sound/vox_fem/contamination.ogg', +"contraband" = 'sound/vox_fem/contraband.ogg', +"control" = 'sound/vox_fem/control.ogg', +"coolant" = 'sound/vox_fem/coolant.ogg', +"coomer" = 'sound/vox_fem/coomer.ogg', +"core" = 'sound/vox_fem/core.ogg', +"correct" = 'sound/vox_fem/correct.ogg', +"corridor" = 'sound/vox_fem/corridor.ogg', +"coward" = 'sound/vox_fem/coward.ogg', +"cowards" = 'sound/vox_fem/cowards.ogg', +"crew" = 'sound/vox_fem/crew.ogg', +"cross" = 'sound/vox_fem/cross.ogg', +"cryogenic" = 'sound/vox_fem/cryogenic.ogg', +"cunt" = 'sound/vox_fem/cunt.ogg', +"cyborg" = 'sound/vox_fem/cyborg.ogg', +"cyborgs" = 'sound/vox_fem/cyborgs.ogg', +"d" = 'sound/vox_fem/d.ogg', +"damage" = 'sound/vox_fem/damage.ogg', +"damaged" = 'sound/vox_fem/damaged.ogg', +"danger" = 'sound/vox_fem/danger.ogg', +"day" = 'sound/vox_fem/day.ogg', +"deactivated" = 'sound/vox_fem/deactivated.ogg', +"decompression" = 'sound/vox_fem/decompression.ogg', +"decontamination" = 'sound/vox_fem/decontamination.ogg', +"deeoo" = 'sound/vox_fem/deeoo.ogg', +"defense" = 'sound/vox_fem/defense.ogg', +"degrees" = 'sound/vox_fem/degrees.ogg', +"delta" = 'sound/vox_fem/delta.ogg', +"denied" = 'sound/vox_fem/denied.ogg', +"deploy" = 'sound/vox_fem/deploy.ogg', +"deployed" = 'sound/vox_fem/deployed.ogg', +"destroy" = 'sound/vox_fem/destroy.ogg', +"destroyed" = 'sound/vox_fem/destroyed.ogg', +"detain" = 'sound/vox_fem/detain.ogg', +"detected" = 'sound/vox_fem/detected.ogg', +"detonation" = 'sound/vox_fem/detonation.ogg', +"device" = 'sound/vox_fem/device.ogg', +"did" = 'sound/vox_fem/did.ogg', +"die" = 'sound/vox_fem/die.ogg', +"dimensional" = 'sound/vox_fem/dimensional.ogg', +"dirt" = 'sound/vox_fem/dirt.ogg', +"disengaged" = 'sound/vox_fem/disengaged.ogg', +"dish" = 'sound/vox_fem/dish.ogg', +"disposal" = 'sound/vox_fem/disposal.ogg', +"distance" = 'sound/vox_fem/distance.ogg', +"distortion" = 'sound/vox_fem/distortion.ogg', +"do" = 'sound/vox_fem/do.ogg', +"doctor" = 'sound/vox_fem/doctor.ogg', +"door" = 'sound/vox_fem/door.ogg', +"down" = 'sound/vox_fem/down.ogg', +"dual" = 'sound/vox_fem/dual.ogg', +"duct" = 'sound/vox_fem/duct.ogg', +"e" = 'sound/vox_fem/e.ogg', +"east" = 'sound/vox_fem/east.ogg', +"echo" = 'sound/vox_fem/echo.ogg', +"ed" = 'sound/vox_fem/ed.ogg', +"effect" = 'sound/vox_fem/effect.ogg', +"egress" = 'sound/vox_fem/egress.ogg', +"eight" = 'sound/vox_fem/eight.ogg', +"eighteen" = 'sound/vox_fem/eighteen.ogg', +"eighty" = 'sound/vox_fem/eighty.ogg', +"electric" = 'sound/vox_fem/electric.ogg', +"electromagnetic" = 'sound/vox_fem/electromagnetic.ogg', +"elevator" = 'sound/vox_fem/elevator.ogg', +"eleven" = 'sound/vox_fem/eleven.ogg', +"eliminate" = 'sound/vox_fem/eliminate.ogg', +"emergency" = 'sound/vox_fem/emergency.ogg', +"energy" = 'sound/vox_fem/energy.ogg', +"engage" = 'sound/vox_fem/engage.ogg', +"engaged" = 'sound/vox_fem/engaged.ogg', +"engine" = 'sound/vox_fem/engine.ogg', +"enter" = 'sound/vox_fem/enter.ogg', +"entry" = 'sound/vox_fem/entry.ogg', +"environment" = 'sound/vox_fem/environment.ogg', +"error" = 'sound/vox_fem/error.ogg', +"escape" = 'sound/vox_fem/escape.ogg', +"evacuate" = 'sound/vox_fem/evacuate.ogg', +"exchange" = 'sound/vox_fem/exchange.ogg', +"exit" = 'sound/vox_fem/exit.ogg', +"expect" = 'sound/vox_fem/expect.ogg', +"experiment" = 'sound/vox_fem/experiment.ogg', +"experimental" = 'sound/vox_fem/experimental.ogg', +"explode" = 'sound/vox_fem/explode.ogg', +"explosion" = 'sound/vox_fem/explosion.ogg', +"exposure" = 'sound/vox_fem/exposure.ogg', +"exterminate" = 'sound/vox_fem/exterminate.ogg', +"extinguish" = 'sound/vox_fem/extinguish.ogg', +"extinguisher" = 'sound/vox_fem/extinguisher.ogg', +"extreme" = 'sound/vox_fem/extreme.ogg', +"f" = 'sound/vox_fem/f.ogg', +"facility" = 'sound/vox_fem/facility.ogg', +"fahrenheit" = 'sound/vox_fem/fahrenheit.ogg', +"failed" = 'sound/vox_fem/failed.ogg', +"failure" = 'sound/vox_fem/failure.ogg', +"farthest" = 'sound/vox_fem/farthest.ogg', +"fast" = 'sound/vox_fem/fast.ogg', +"feet" = 'sound/vox_fem/feet.ogg', +"field" = 'sound/vox_fem/field.ogg', +"fifteen" = 'sound/vox_fem/fifteen.ogg', +"fifth" = 'sound/vox_fem/fifth.ogg', +"fifty" = 'sound/vox_fem/fifty.ogg', +"final" = 'sound/vox_fem/final.ogg', +"fine" = 'sound/vox_fem/fine.ogg', +"fire" = 'sound/vox_fem/fire.ogg', +"first" = 'sound/vox_fem/first.ogg', +"five" = 'sound/vox_fem/five.ogg', +"flooding" = 'sound/vox_fem/flooding.ogg', +"floor" = 'sound/vox_fem/floor.ogg', +"fool" = 'sound/vox_fem/fool.ogg', +"for" = 'sound/vox_fem/for.ogg', +"forbidden" = 'sound/vox_fem/forbidden.ogg', +"force" = 'sound/vox_fem/force.ogg', +"fore" = 'sound/vox_fem/fore.ogg', +"forms" = 'sound/vox_fem/forms.ogg', +"found" = 'sound/vox_fem/found.ogg', +"four" = 'sound/vox_fem/four.ogg', +"fourteen" = 'sound/vox_fem/fourteen.ogg', +"fourth" = 'sound/vox_fem/fourth.ogg', +"fourty" = 'sound/vox_fem/fourty.ogg', +"foxtrot" = 'sound/vox_fem/foxtrot.ogg', +"freeman" = 'sound/vox_fem/freeman.ogg', +"freezer" = 'sound/vox_fem/freezer.ogg', +"from" = 'sound/vox_fem/from.ogg', +"front" = 'sound/vox_fem/front.ogg', +"fuck" = 'sound/vox_fem/fuck.ogg', +"fucking" = 'sound/vox_fem/fucking.ogg', +"fucks" = 'sound/vox_fem/fucks.ogg', +"fuel" = 'sound/vox_fem/fuel.ogg', +"g" = 'sound/vox_fem/g.ogg', +"gas" = 'sound/vox_fem/gas.ogg', +"get" = 'sound/vox_fem/get.ogg', +"glory" = 'sound/vox_fem/glory.ogg', +"go" = 'sound/vox_fem/go.ogg', +"going" = 'sound/vox_fem/going.ogg', +"good" = 'sound/vox_fem/good.ogg', +"goodbye" = 'sound/vox_fem/goodbye.ogg', +"gordon" = 'sound/vox_fem/gordon.ogg', +"got" = 'sound/vox_fem/got.ogg', +"government" = 'sound/vox_fem/government.ogg', +"granted" = 'sound/vox_fem/granted.ogg', +"gray" = 'sound/vox_fem/gray.ogg', +"great" = 'sound/vox_fem/great.ogg', +"green" = 'sound/vox_fem/green.ogg', +"grenade" = 'sound/vox_fem/grenade.ogg', +"guard" = 'sound/vox_fem/guard.ogg', +"gulf" = 'sound/vox_fem/gulf.ogg', +"gun" = 'sound/vox_fem/gun.ogg', +"guthrie" = 'sound/vox_fem/guthrie.ogg', +"h" = 'sound/vox_fem/h.ogg', +"hacker" = 'sound/vox_fem/hacker.ogg', +"hackers" = 'sound/vox_fem/hackers.ogg', +"handling" = 'sound/vox_fem/handling.ogg', +"hangar" = 'sound/vox_fem/hangar.ogg', +"harm" = 'sound/vox_fem/harm.ogg', +"has" = 'sound/vox_fem/has.ogg', +"have" = 'sound/vox_fem/have.ogg', +"hazard" = 'sound/vox_fem/hazard.ogg', +"head" = 'sound/vox_fem/head.ogg', +"health" = 'sound/vox_fem/health.ogg', +"heat" = 'sound/vox_fem/heat.ogg', +"helicopter" = 'sound/vox_fem/helicopter.ogg', +"helium" = 'sound/vox_fem/helium.ogg', +"hello" = 'sound/vox_fem/hello.ogg', +"help" = 'sound/vox_fem/help.ogg', +"here" = 'sound/vox_fem/here.ogg', +"hide" = 'sound/vox_fem/hide.ogg', +"high" = 'sound/vox_fem/high.ogg', +"highest" = 'sound/vox_fem/highest.ogg', +"hit" = 'sound/vox_fem/hit.ogg', +"hole" = 'sound/vox_fem/hole.ogg', +"hostile" = 'sound/vox_fem/hostile.ogg', +"hot" = 'sound/vox_fem/hot.ogg', +"hotel" = 'sound/vox_fem/hotel.ogg', +"hour" = 'sound/vox_fem/hour.ogg', +"hours" = 'sound/vox_fem/hours.ogg', +"human" = 'sound/vox_fem/human.ogg', +"hundred" = 'sound/vox_fem/hundred.ogg', +"hunger" = 'sound/vox_fem/hunger.ogg', +"hydro" = 'sound/vox_fem/hydro.ogg', +"hydroponics" = 'sound/vox_fem/hydroponics.ogg', +"i" = 'sound/vox_fem/i.ogg', +"idiot" = 'sound/vox_fem/idiot.ogg', +"illegal" = 'sound/vox_fem/illegal.ogg', +"immediate" = 'sound/vox_fem/immediate.ogg', +"immediately" = 'sound/vox_fem/immediately.ogg', +"in" = 'sound/vox_fem/in.ogg', +"inches" = 'sound/vox_fem/inches.ogg', +"india" = 'sound/vox_fem/india.ogg', +"ing" = 'sound/vox_fem/ing.ogg', +"inoperative" = 'sound/vox_fem/inoperative.ogg', +"inside" = 'sound/vox_fem/inside.ogg', +"inspection" = 'sound/vox_fem/inspection.ogg', +"inspector" = 'sound/vox_fem/inspector.ogg', +"interchange" = 'sound/vox_fem/interchange.ogg', +"intruder" = 'sound/vox_fem/intruder.ogg', +"invalid" = 'sound/vox_fem/invalid.ogg', +"invasion" = 'sound/vox_fem/invasion.ogg', +"is" = 'sound/vox_fem/is.ogg', +"it" = 'sound/vox_fem/it.ogg', +"j" = 'sound/vox_fem/j.ogg', +"johnson" = 'sound/vox_fem/johnson.ogg', +"juliet" = 'sound/vox_fem/juliet.ogg', +"k" = 'sound/vox_fem/k.ogg', +"key" = 'sound/vox_fem/key.ogg', +"kill" = 'sound/vox_fem/kill.ogg', +"kilo" = 'sound/vox_fem/kilo.ogg', +"kit" = 'sound/vox_fem/kit.ogg', +"l" = 'sound/vox_fem/l.ogg', +"lab" = 'sound/vox_fem/lab.ogg', +"lambda" = 'sound/vox_fem/lambda.ogg', +"laser" = 'sound/vox_fem/laser.ogg', +"last" = 'sound/vox_fem/last.ogg', +"launch" = 'sound/vox_fem/launch.ogg', +"law" = 'sound/vox_fem/law.ogg', +"laws" = 'sound/vox_fem/laws.ogg', +"leak" = 'sound/vox_fem/leak.ogg', +"leave" = 'sound/vox_fem/leave.ogg', +"left" = 'sound/vox_fem/left.ogg', +"legal" = 'sound/vox_fem/legal.ogg', +"level" = 'sound/vox_fem/level.ogg', +"lever" = 'sound/vox_fem/lever.ogg', +"lie" = 'sound/vox_fem/lie.ogg', +"lieutenant" = 'sound/vox_fem/lieutenant.ogg', +"life" = 'sound/vox_fem/life.ogg', +"light" = 'sound/vox_fem/light.ogg', +"lima" = 'sound/vox_fem/lima.ogg', +"liquid" = 'sound/vox_fem/liquid.ogg', +"loading" = 'sound/vox_fem/loading.ogg', +"locate" = 'sound/vox_fem/locate.ogg', +"located" = 'sound/vox_fem/located.ogg', +"location" = 'sound/vox_fem/location.ogg', +"lock" = 'sound/vox_fem/lock.ogg', +"locked" = 'sound/vox_fem/locked.ogg', +"locker" = 'sound/vox_fem/locker.ogg', +"lockout" = 'sound/vox_fem/lockout.ogg', +"loose" = 'sound/vox_fem/loose.ogg', +"lower" = 'sound/vox_fem/lower.ogg', +"lowest" = 'sound/vox_fem/lowest.ogg', +"m" = 'sound/vox_fem/m.ogg', +"magnetic" = 'sound/vox_fem/magnetic.ogg', +"main" = 'sound/vox_fem/main.ogg', +"maintenance" = 'sound/vox_fem/maintenance.ogg', +"malfunction" = 'sound/vox_fem/malfunction.ogg', +"man" = 'sound/vox_fem/man.ogg', +"mass" = 'sound/vox_fem/mass.ogg', +"materials" = 'sound/vox_fem/materials.ogg', +"maximum" = 'sound/vox_fem/maximum.ogg', +"may" = 'sound/vox_fem/may.ogg', +"me" = 'sound/vox_fem/me.ogg', +"medbay" = 'sound/vox_fem/medbay.ogg', +"medical" = 'sound/vox_fem/medical.ogg', +"men" = 'sound/vox_fem/men.ogg', +"mercy" = 'sound/vox_fem/mercy.ogg', +"mesa" = 'sound/vox_fem/mesa.ogg', +"message" = 'sound/vox_fem/message.ogg', +"meter" = 'sound/vox_fem/meter.ogg', +"micro" = 'sound/vox_fem/micro.ogg', +"middle" = 'sound/vox_fem/middle.ogg', +"mike" = 'sound/vox_fem/mike.ogg', +"miles" = 'sound/vox_fem/miles.ogg', +"military" = 'sound/vox_fem/military.ogg', +"milli" = 'sound/vox_fem/milli.ogg', +"million" = 'sound/vox_fem/million.ogg', +"minefield" = 'sound/vox_fem/minefield.ogg', +"minimum" = 'sound/vox_fem/minimum.ogg', +"minutes" = 'sound/vox_fem/minutes.ogg', +"mister" = 'sound/vox_fem/mister.ogg', +"mode" = 'sound/vox_fem/mode.ogg', +"money" = 'sound/vox_fem/money.ogg', +"motor" = 'sound/vox_fem/motor.ogg', +"motorpool" = 'sound/vox_fem/motorpool.ogg', +"move" = 'sound/vox_fem/move.ogg', +"must" = 'sound/vox_fem/must.ogg', +"my" = 'sound/vox_fem/my.ogg', +"n" = 'sound/vox_fem/n.ogg', +"nanotrasen" = 'sound/vox_fem/nanotrasen.ogg', +"nearest" = 'sound/vox_fem/nearest.ogg', +"nice" = 'sound/vox_fem/nice.ogg', +"nine" = 'sound/vox_fem/nine.ogg', +"nineteen" = 'sound/vox_fem/nineteen.ogg', +"ninety" = 'sound/vox_fem/ninety.ogg', +"no" = 'sound/vox_fem/no.ogg', +"nominal" = 'sound/vox_fem/nominal.ogg', +"north" = 'sound/vox_fem/north.ogg', +"not" = 'sound/vox_fem/not.ogg', +"november" = 'sound/vox_fem/november.ogg', +"now" = 'sound/vox_fem/now.ogg', +"number" = 'sound/vox_fem/number.ogg', +"o" = 'sound/vox_fem/o.ogg', +"objective" = 'sound/vox_fem/objective.ogg', +"observation" = 'sound/vox_fem/observation.ogg', +"obtain" = 'sound/vox_fem/obtain.ogg', +"of" = 'sound/vox_fem/of.ogg', +"officer" = 'sound/vox_fem/officer.ogg', +"ok" = 'sound/vox_fem/ok.ogg', +"on" = 'sound/vox_fem/on.ogg', +"one" = 'sound/vox_fem/one.ogg', +"open" = 'sound/vox_fem/open.ogg', +"operating" = 'sound/vox_fem/operating.ogg', +"operations" = 'sound/vox_fem/operations.ogg', +"operative" = 'sound/vox_fem/operative.ogg', +"option" = 'sound/vox_fem/option.ogg', +"order" = 'sound/vox_fem/order.ogg', +"organic" = 'sound/vox_fem/organic.ogg', +"oscar" = 'sound/vox_fem/oscar.ogg', +"out" = 'sound/vox_fem/out.ogg', +"outside" = 'sound/vox_fem/outside.ogg', +"over" = 'sound/vox_fem/over.ogg', +"overload" = 'sound/vox_fem/overload.ogg', +"override" = 'sound/vox_fem/override.ogg', +"p" = 'sound/vox_fem/p.ogg', +"pacify" = 'sound/vox_fem/pacify.ogg', +"pain" = 'sound/vox_fem/pain.ogg', +"pal" = 'sound/vox_fem/pal.ogg', +"panel" = 'sound/vox_fem/panel.ogg', +"percent" = 'sound/vox_fem/percent.ogg', +"perimeter" = 'sound/vox_fem/perimeter.ogg', +"permitted" = 'sound/vox_fem/permitted.ogg', +"personnel" = 'sound/vox_fem/personnel.ogg', +"pipe" = 'sound/vox_fem/pipe.ogg', +"plant" = 'sound/vox_fem/plant.ogg', +"plasma" = 'sound/vox_fem/plasma.ogg', +"platform" = 'sound/vox_fem/platform.ogg', +"please" = 'sound/vox_fem/please.ogg', +"point" = 'sound/vox_fem/point.ogg', +"port" = 'sound/vox_fem/port.ogg', +"portal" = 'sound/vox_fem/portal.ogg', +"power" = 'sound/vox_fem/power.ogg', +"presence" = 'sound/vox_fem/presence.ogg', +"press" = 'sound/vox_fem/press.ogg', +"primary" = 'sound/vox_fem/primary.ogg', +"proceed" = 'sound/vox_fem/proceed.ogg', +"processing" = 'sound/vox_fem/processing.ogg', +"progress" = 'sound/vox_fem/progress.ogg', +"proper" = 'sound/vox_fem/proper.ogg', +"propulsion" = 'sound/vox_fem/propulsion.ogg', +"prosecute" = 'sound/vox_fem/prosecute.ogg', +"protective" = 'sound/vox_fem/protective.ogg', +"push" = 'sound/vox_fem/push.ogg', +"q" = 'sound/vox_fem/q.ogg', +"quantum" = 'sound/vox_fem/quantum.ogg', +"quebec" = 'sound/vox_fem/quebec.ogg', +"queen" = 'sound/vox_fem/queen.ogg', +"question" = 'sound/vox_fem/question.ogg', +"questioning" = 'sound/vox_fem/questioning.ogg', +"quick" = 'sound/vox_fem/quick.ogg', +"quit" = 'sound/vox_fem/quit.ogg', +"r" = 'sound/vox_fem/r.ogg', +"radiation" = 'sound/vox_fem/radiation.ogg', +"radioactive" = 'sound/vox_fem/radioactive.ogg', +"rads" = 'sound/vox_fem/rads.ogg', +"raider" = 'sound/vox_fem/raider.ogg', +"raiders" = 'sound/vox_fem/raiders.ogg', +"rapid" = 'sound/vox_fem/rapid.ogg', +"reach" = 'sound/vox_fem/reach.ogg', +"reached" = 'sound/vox_fem/reached.ogg', +"reactor" = 'sound/vox_fem/reactor.ogg', +"red" = 'sound/vox_fem/red.ogg', +"relay" = 'sound/vox_fem/relay.ogg', +"released" = 'sound/vox_fem/released.ogg', +"remaining" = 'sound/vox_fem/remaining.ogg', +"removal" = 'sound/vox_fem/removal.ogg', +"renegade" = 'sound/vox_fem/renegade.ogg', +"repair" = 'sound/vox_fem/repair.ogg', +"report" = 'sound/vox_fem/report.ogg', +"reports" = 'sound/vox_fem/reports.ogg', +"required" = 'sound/vox_fem/required.ogg', +"research" = 'sound/vox_fem/research.ogg', +"resevoir" = 'sound/vox_fem/resevoir.ogg', +"resistance" = 'sound/vox_fem/resistance.ogg', +"rest" = 'sound/vox_fem/rest.ogg', +"right" = 'sound/vox_fem/right.ogg', +"rocket" = 'sound/vox_fem/rocket.ogg', +"roger" = 'sound/vox_fem/roger.ogg', +"romeo" = 'sound/vox_fem/romeo.ogg', +"room" = 'sound/vox_fem/room.ogg', +"round" = 'sound/vox_fem/round.ogg', +"run" = 'sound/vox_fem/run.ogg', +"s" = 'sound/vox_fem/s.ogg', +"safe" = 'sound/vox_fem/safe.ogg', +"safety" = 'sound/vox_fem/safety.ogg', +"sarah" = 'sound/vox_fem/sarah.ogg', +"sargeant" = 'sound/vox_fem/sargeant.ogg', +"satellite" = 'sound/vox_fem/satellite.ogg', +"save" = 'sound/vox_fem/save.ogg', +"science" = 'sound/vox_fem/science.ogg', +"scream" = 'sound/vox_fem/scream.ogg', +"screen" = 'sound/vox_fem/screen.ogg', +"search" = 'sound/vox_fem/search.ogg', +"second" = 'sound/vox_fem/second.ogg', +"secondary" = 'sound/vox_fem/secondary.ogg', +"seconds" = 'sound/vox_fem/seconds.ogg', +"sector" = 'sound/vox_fem/sector.ogg', +"secure" = 'sound/vox_fem/secure.ogg', +"secured" = 'sound/vox_fem/secured.ogg', +"security" = 'sound/vox_fem/security.ogg', +"select" = 'sound/vox_fem/select.ogg', +"selected" = 'sound/vox_fem/selected.ogg', +"sensors" = 'sound/vox_fem/sensors.ogg', +"service" = 'sound/vox_fem/service.ogg', +"seven" = 'sound/vox_fem/seven.ogg', +"seventeen" = 'sound/vox_fem/seventeen.ogg', +"seventy" = 'sound/vox_fem/seventy.ogg', +"severe" = 'sound/vox_fem/severe.ogg', +"sewage" = 'sound/vox_fem/sewage.ogg', +"sewer" = 'sound/vox_fem/sewer.ogg', +"shield" = 'sound/vox_fem/shield.ogg', +"shipment" = 'sound/vox_fem/shipment.ogg', +"shirt" = 'sound/vox_fem/shirt.ogg', +"shit" = 'sound/vox_fem/shit.ogg', +"shitlord" = 'sound/vox_fem/shitlord.ogg', +"shits" = 'sound/vox_fem/shits.ogg', +"shitting" = 'sound/vox_fem/shitting.ogg', +"shock" = 'sound/vox_fem/shock.ogg', +"shoot" = 'sound/vox_fem/shoot.ogg', +"shower" = 'sound/vox_fem/shower.ogg', +"shut" = 'sound/vox_fem/shut.ogg', +"shuttle" = 'sound/vox_fem/shuttle.ogg', +"side" = 'sound/vox_fem/side.ogg', +"sierra" = 'sound/vox_fem/sierra.ogg', +"sight" = 'sound/vox_fem/sight.ogg', +"silo" = 'sound/vox_fem/silo.ogg', +"singularity" = 'sound/vox_fem/singularity.ogg', +"six" = 'sound/vox_fem/six.ogg', +"sixteen" = 'sound/vox_fem/sixteen.ogg', +"sixty" = 'sound/vox_fem/sixty.ogg', +"slime" = 'sound/vox_fem/slime.ogg', +"slow" = 'sound/vox_fem/slow.ogg', +"solar" = 'sound/vox_fem/solar.ogg', +"solars" = 'sound/vox_fem/solars.ogg', +"soldier" = 'sound/vox_fem/soldier.ogg', +"some" = 'sound/vox_fem/some.ogg', +"someone" = 'sound/vox_fem/someone.ogg', +"something" = 'sound/vox_fem/something.ogg', +"son" = 'sound/vox_fem/son.ogg', +"sorry" = 'sound/vox_fem/sorry.ogg', +"south" = 'sound/vox_fem/south.ogg', +"squad" = 'sound/vox_fem/squad.ogg', +"square" = 'sound/vox_fem/square.ogg', +"ss13" = 'sound/vox_fem/ss13.ogg', +"stairway" = 'sound/vox_fem/stairway.ogg', +"starboard" = 'sound/vox_fem/starboard.ogg', +"station" = 'sound/vox_fem/station.ogg', +"status" = 'sound/vox_fem/status.ogg', +"sterile" = 'sound/vox_fem/sterile.ogg', +"sterilization" = 'sound/vox_fem/sterilization.ogg', +"storage" = 'sound/vox_fem/storage.ogg', +"stuck" = 'sound/vox_fem/stuck.ogg', +"sub" = 'sound/vox_fem/sub.ogg', +"subsurface" = 'sound/vox_fem/subsurface.ogg', +"sudden" = 'sound/vox_fem/sudden.ogg', +"suffer" = 'sound/vox_fem/suffer.ogg', +"suit" = 'sound/vox_fem/suit.ogg', +"superconducting" = 'sound/vox_fem/superconducting.ogg', +"supercooled" = 'sound/vox_fem/supercooled.ogg', +"supply" = 'sound/vox_fem/supply.ogg', +"surface" = 'sound/vox_fem/surface.ogg', +"surrender" = 'sound/vox_fem/surrender.ogg', +"surround" = 'sound/vox_fem/surround.ogg', +"surrounded" = 'sound/vox_fem/surrounded.ogg', +"switch" = 'sound/vox_fem/switch.ogg', +"syndicate" = 'sound/vox_fem/syndicate.ogg', +"system" = 'sound/vox_fem/system.ogg', +"systems" = 'sound/vox_fem/systems.ogg', +"t" = 'sound/vox_fem/t.ogg', +"tactical" = 'sound/vox_fem/tactical.ogg', +"take" = 'sound/vox_fem/take.ogg', +"talk" = 'sound/vox_fem/talk.ogg', +"tango" = 'sound/vox_fem/tango.ogg', +"tank" = 'sound/vox_fem/tank.ogg', +"target" = 'sound/vox_fem/target.ogg', +"team" = 'sound/vox_fem/team.ogg', +"temperature" = 'sound/vox_fem/temperature.ogg', +"temporal" = 'sound/vox_fem/temporal.ogg', +"ten" = 'sound/vox_fem/ten.ogg', +"terminal" = 'sound/vox_fem/terminal.ogg', +"terminated" = 'sound/vox_fem/terminated.ogg', +"termination" = 'sound/vox_fem/termination.ogg', +"test" = 'sound/vox_fem/test.ogg', +"that" = 'sound/vox_fem/that.ogg', +"the" = 'sound/vox_fem/the.ogg', +"then" = 'sound/vox_fem/then.ogg', +"there" = 'sound/vox_fem/there.ogg', +"third" = 'sound/vox_fem/third.ogg', +"thirteen" = 'sound/vox_fem/thirteen.ogg', +"thirty" = 'sound/vox_fem/thirty.ogg', +"this" = 'sound/vox_fem/this.ogg', +"those" = 'sound/vox_fem/those.ogg', +"thousand" = 'sound/vox_fem/thousand.ogg', +"threat" = 'sound/vox_fem/threat.ogg', +"three" = 'sound/vox_fem/three.ogg', +"through" = 'sound/vox_fem/through.ogg', +"tide" = 'sound/vox_fem/tide.ogg', +"time" = 'sound/vox_fem/time.ogg', +"to" = 'sound/vox_fem/to.ogg', +"top" = 'sound/vox_fem/top.ogg', +"topside" = 'sound/vox_fem/topside.ogg', +"touch" = 'sound/vox_fem/touch.ogg', +"towards" = 'sound/vox_fem/towards.ogg', +"toxins" = 'sound/vox_fem/toxins.ogg', +"track" = 'sound/vox_fem/track.ogg', +"train" = 'sound/vox_fem/train.ogg', +"traitor" = 'sound/vox_fem/traitor.ogg', +"transportation" = 'sound/vox_fem/transportation.ogg', +"truck" = 'sound/vox_fem/truck.ogg', +"tunnel" = 'sound/vox_fem/tunnel.ogg', +"turn" = 'sound/vox_fem/turn.ogg', +"turret" = 'sound/vox_fem/turret.ogg', +"twelve" = 'sound/vox_fem/twelve.ogg', +"twenty" = 'sound/vox_fem/twenty.ogg', +"two" = 'sound/vox_fem/two.ogg', +"u" = 'sound/vox_fem/u.ogg', +"unauthorized" = 'sound/vox_fem/unauthorized.ogg', +"under" = 'sound/vox_fem/under.ogg', +"uniform" = 'sound/vox_fem/uniform.ogg', +"unlocked" = 'sound/vox_fem/unlocked.ogg', +"until" = 'sound/vox_fem/until.ogg', +"up" = 'sound/vox_fem/up.ogg', +"update" = 'sound/vox_fem/update.ogg', +"updated" = 'sound/vox_fem/updated.ogg', +"updating" = 'sound/vox_fem/updating.ogg', +"upload" = 'sound/vox_fem/upload.ogg', +"upper" = 'sound/vox_fem/upper.ogg', +"uranium" = 'sound/vox_fem/uranium.ogg', +"us" = 'sound/vox_fem/us.ogg', +"usa" = 'sound/vox_fem/usa.ogg', +"use" = 'sound/vox_fem/use.ogg', +"used" = 'sound/vox_fem/used.ogg', +"user" = 'sound/vox_fem/user.ogg', +"v" = 'sound/vox_fem/v.ogg', +"vacate" = 'sound/vox_fem/vacate.ogg', +"valid" = 'sound/vox_fem/valid.ogg', +"vapor" = 'sound/vox_fem/vapor.ogg', +"vent" = 'sound/vox_fem/vent.ogg', +"ventilation" = 'sound/vox_fem/ventilation.ogg', +"victor" = 'sound/vox_fem/victor.ogg', +"violated" = 'sound/vox_fem/violated.ogg', +"violation" = 'sound/vox_fem/violation.ogg', +"virology" = 'sound/vox_fem/virology.ogg', +"voltage" = 'sound/vox_fem/voltage.ogg', +"vox" = 'sound/vox_fem/vox.ogg', +"vox_login" = 'sound/vox_fem/vox_login.ogg', +"voxtest" = 'sound/vox_fem/voxtest.ogg', +"voxtest2" = 'sound/vox_fem/voxtest2.ogg', +"w" = 'sound/vox_fem/w.ogg', +"walk" = 'sound/vox_fem/walk.ogg', +"wall" = 'sound/vox_fem/wall.ogg', +"wanker" = 'sound/vox_fem/wanker.ogg', +"want" = 'sound/vox_fem/want.ogg', +"wanted" = 'sound/vox_fem/wanted.ogg', +"warm" = 'sound/vox_fem/warm.ogg', +"warn" = 'sound/vox_fem/warn.ogg', +"warning" = 'sound/vox_fem/warning.ogg', +"waste" = 'sound/vox_fem/waste.ogg', +"water" = 'sound/vox_fem/water.ogg', +"we" = 'sound/vox_fem/we.ogg', +"weapon" = 'sound/vox_fem/weapon.ogg', +"welcome" = 'sound/vox_fem/welcome.ogg', +"west" = 'sound/vox_fem/west.ogg', +"whiskey" = 'sound/vox_fem/whiskey.ogg', +"white" = 'sound/vox_fem/white.ogg', +"wilco" = 'sound/vox_fem/wilco.ogg', +"will" = 'sound/vox_fem/will.ogg', +"with" = 'sound/vox_fem/with.ogg', +"without" = 'sound/vox_fem/without.ogg', +"wood" = 'sound/vox_fem/wood.ogg', +"woody" = 'sound/vox_fem/woody.ogg', +"x" = 'sound/vox_fem/x.ogg', +"xeno" = 'sound/vox_fem/xeno.ogg', +"xenobiology" = 'sound/vox_fem/xenobiology.ogg', +"xenomorph" = 'sound/vox_fem/xenomorph.ogg', +"xenomorphs" = 'sound/vox_fem/xenomorphs.ogg', +"y" = 'sound/vox_fem/y.ogg', +"yankee" = 'sound/vox_fem/yankee.ogg', +"yards" = 'sound/vox_fem/yards.ogg', +"year" = 'sound/vox_fem/year.ogg', +"yellow" = 'sound/vox_fem/yellow.ogg', +"yes" = 'sound/vox_fem/yes.ogg', +"you" = 'sound/vox_fem/you.ogg', +"your" = 'sound/vox_fem/your.ogg', +"yourself" = 'sound/vox_fem/yourself.ogg', +"z" = 'sound/vox_fem/z.ogg', +"zero" = 'sound/vox_fem/zero.ogg', +"zone" = 'sound/vox_fem/zone.ogg', +"zulu" = 'sound/vox_fem/zulu.ogg', +) #endif \ No newline at end of file diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index d31b548787e..aed6b5c06a4 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -1,42 +1,42 @@ -/mob/living/silicon/proc/show_laws() //Redefined in ai/laws.dm and robot/laws.dm - return - -/mob/living/silicon/proc/laws_sanity_check() - if (!laws) - make_laws() - -/mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg) - src.laws_sanity_check() - src.laws.set_zeroth_law(law, law_borg) - -/mob/living/silicon/proc/add_inherent_law(var/law) - laws_sanity_check() - laws.add_inherent_law(law) - -/mob/living/silicon/proc/clear_inherent_laws() - laws_sanity_check() - laws.clear_inherent_laws() - -/mob/living/silicon/proc/add_supplied_law(var/number, var/law) - laws_sanity_check() - laws.add_supplied_law(number, law) - -/mob/living/silicon/proc/clear_supplied_laws() - laws_sanity_check() - laws.clear_supplied_laws() - -/mob/living/silicon/proc/add_ion_law(var/law) - laws_sanity_check() - laws.add_ion_law(law) - -/mob/living/silicon/proc/clear_ion_laws() - laws_sanity_check() - laws.clear_ion_laws() - -/mob/living/silicon/proc/make_laws() - switch(config.default_laws) - if(0) laws = new /datum/ai_laws/default/asimov() - if(1) laws = new /datum/ai_laws/custom() - if(2) - var/datum/ai_laws/lawtype = pick(typesof(/datum/ai_laws/default) - /datum/ai_laws/default) - laws = new lawtype() +/mob/living/silicon/proc/show_laws() //Redefined in ai/laws.dm and robot/laws.dm + return + +/mob/living/silicon/proc/laws_sanity_check() + if (!laws) + make_laws() + +/mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg) + src.laws_sanity_check() + src.laws.set_zeroth_law(law, law_borg) + +/mob/living/silicon/proc/add_inherent_law(var/law) + laws_sanity_check() + laws.add_inherent_law(law) + +/mob/living/silicon/proc/clear_inherent_laws() + laws_sanity_check() + laws.clear_inherent_laws() + +/mob/living/silicon/proc/add_supplied_law(var/number, var/law) + laws_sanity_check() + laws.add_supplied_law(number, law) + +/mob/living/silicon/proc/clear_supplied_laws() + laws_sanity_check() + laws.clear_supplied_laws() + +/mob/living/silicon/proc/add_ion_law(var/law) + laws_sanity_check() + laws.add_ion_law(law) + +/mob/living/silicon/proc/clear_ion_laws() + laws_sanity_check() + laws.clear_ion_laws() + +/mob/living/silicon/proc/make_laws() + switch(config.default_laws) + if(0) laws = new /datum/ai_laws/default/asimov() + if(1) laws = new /datum/ai_laws/custom() + if(2) + var/datum/ai_laws/lawtype = pick(typesof(/datum/ai_laws/default) - /datum/ai_laws/default) + laws = new lawtype() diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index 127091a854c..75e30dda3f9 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -15,4 +15,4 @@ if(mind) del(mind) living_mob_list -= src ghostize() - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index eb70e667da6..385c0ae6760 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -6,7 +6,8 @@ var/turf/T = get_turf(src.loc) for (var/mob/M in viewers(T)) M.show_message("\red [src.cable] rapidly retracts back into its spool.", 3, "\red You hear a click and the sound of wire spooling rapidly.", 2) - del(src.cable) + qdel(src.cable) + cable = null regular_hud_updates() if(src.secHUD == 1) @@ -29,4 +30,4 @@ while(card) loc = get_turf(card) sleep(5) - del(src) //if there's no pAI we shouldn't exist + qdel(src) //if there's no pAI we shouldn't exist diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 1fcafeb374a..3d92ef79620 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -9,7 +9,7 @@ /mob/living/silicon/robot/dust(var/animation = 1) if(mmi) - del(mmi) + qdel(mmi) ..() /mob/living/silicon/robot/spawn_dust() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 0d517a64c01..4a33a9a6d3e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -7,6 +7,7 @@ health = 100 var/sight_mode = 0 var/custom_name = "" + designation = "Default" //used for displaying the prefix & getting the current module of cyborg //Hud stuff @@ -71,7 +72,7 @@ robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it. ident = rand(1, 999) - updatename("Default") + updatename() updateicon() if(!cell) @@ -116,7 +117,7 @@ //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO //Improved /N -/mob/living/silicon/robot/Del() +/mob/living/silicon/robot/Destroy() if(mmi && mind)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. var/turf/T = get_turf(loc)//To hopefully prevent run time errors. if(T) mmi.loc = T @@ -127,13 +128,13 @@ /mob/living/silicon/robot/proc/pick_module() if(module) return - var/mod = input("Please, select a module!", "Robot", null, null) in list("Standard", "Engineering", "Medical", "Miner", "Janitor","Service", "Security") + designation = input("Please, select a module!", "Robot", null, null) in list("Standard", "Engineering", "Medical", "Miner", "Janitor","Service", "Security") var/animation_length=0 if(module) return - switch(mod) + updatename() + switch(designation) if("Standard") - updatename(mod) module = new /obj/item/weapon/robot_module/standard(src) hands.icon_state = "standard" icon_state = "robot" @@ -141,7 +142,6 @@ feedback_inc("cyborg_standard",1) if("Service") - updatename(mod) module = new /obj/item/weapon/robot_module/butler(src) hands.icon_state = "service" var/icontype = input("Select an icon!", "Robot", null, null) in list("Waitress", "Bro", "Butler", "Kent", "Rich") @@ -164,7 +164,6 @@ feedback_inc("cyborg_service",1) if("Miner") - updatename(mod) module = new /obj/item/weapon/robot_module/miner(src) hands.icon_state = "miner" icon_state = "minerborg" @@ -173,7 +172,6 @@ feedback_inc("cyborg_miner",1) if("Medical") - updatename(mod) module = new /obj/item/weapon/robot_module/medical(src) hands.icon_state = "medical" icon_state = "mediborg" @@ -183,7 +181,6 @@ feedback_inc("cyborg_medical",1) if("Security") - updatename(mod) module = new /obj/item/weapon/robot_module/security(src) hands.icon_state = "security" icon_state = "secborg" @@ -194,7 +191,6 @@ feedback_inc("cyborg_security",1) if("Engineering") - updatename(mod) module = new /obj/item/weapon/robot_module/engineering(src) hands.icon_state = "engineer" icon_state = "engiborg" @@ -203,7 +199,6 @@ feedback_inc("cyborg_engineering",1) if("Janitor") - updatename(mod) module = new /obj/item/weapon/robot_module/janitor(src) hands.icon_state = "janitor" icon_state = "janiborg" @@ -227,13 +222,13 @@ notransform = 0 icon = 'icons/mob/robots.dmi' -/mob/living/silicon/robot/proc/updatename(var/prefix as text) +/mob/living/silicon/robot/proc/updatename() var/changed_name = "" if(custom_name) changed_name = custom_name else - changed_name = "[(prefix ? "[prefix] " : "")]Cyborg-[num2text(ident)]" + changed_name = "[(designation ? "[designation] " : "")]Cyborg-[num2text(ident)]" real_name = changed_name name = real_name if(camera) @@ -927,7 +922,7 @@ for(var/A in tile) if(istype(A, /obj/effect)) if(istype(A, /obj/effect/rune) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay)) - del(A) + qdel(A) else if(istype(A, /obj/item)) var/obj/item/cleaned_item = A cleaned_item.clean_blood() @@ -953,7 +948,7 @@ /mob/living/silicon/robot/proc/self_destruct() if(emagged) if(mmi) - del(mmi) + qdel(mmi) explosion(src.loc,1,2,4,flame_range = 2) else explosion(src.loc,-1,0,2) @@ -969,7 +964,7 @@ scrambledcodes = 1 //Disconnect it's camera so it's not so easily tracked. if(src.camera) - del(src.camera) + qdel(src.camera) src.camera = null // I'm trying to get the Cyborg to not be listed in the camera list // Instead of being listed as "deactivated". The downside is that I'm going @@ -1066,7 +1061,7 @@ if (cell) //Sanity check. cell.loc = T cell = null - del(src) + qdel(src) /mob/living/silicon/robot/syndicate icon_state = "syndie_bloodhound" @@ -1074,12 +1069,12 @@ scrambledcodes = 1 modtype = "Synd" faction = "syndicate" + designation = "Syndicate" /mob/living/silicon/robot/syndicate/New(loc) ..() cell.maxcharge = 25000 cell.charge = 25000 - updatename("Syndicate") radio = new /obj/item/device/radio/borg/syndicate(src) module = new /obj/item/weapon/robot_module/syndicate(src) laws = new /datum/ai_laws/syndicate_override() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index e88c672bc0f..2401c132ad5 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -223,7 +223,7 @@ on_emag() ..() for(var/obj/item/weapon/pickaxe/borgdrill/D in modules) - del(D) + qdel(D) modules += new /obj/item/weapon/pickaxe/diamonddrill(src) rebuild() diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 81a9c45bfd6..3e9b78638ab 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -92,14 +92,17 @@ if (!message) return - + var/desig = "Default Cyborg" //ezmode for taters + if(istype(src, /mob/living/silicon)) + var/mob/living/silicon/S = src + desig = trim_left(S.designation + " " + S.job) var/message_a = say_quote(message) var/rendered = "Robotic Talk, [name] [message_a]" for (var/mob/living/S in living_mob_list) if(S.robot_talk_understand && (S.robot_talk_understand == robot_talk_understand)) // This SHOULD catch everything caught by the one below, but I'm not going to change it. if(istype(S , /mob/living/silicon/ai)) - var/renderedAI = "Robotic Talk, [name] [message_a]" + var/renderedAI = "Robotic Talk, [name] ([desig]) [message_a]" S.show_message(renderedAI, 2) else S.show_message(rendered, 2) @@ -107,7 +110,7 @@ else if (S.binarycheck()) if(istype(S , /mob/living/silicon/ai)) - var/renderedAI = "Robotic Talk, [name] [message_a]" + var/renderedAI = "Robotic Talk, [name] ([desig]) [message_a]" S.show_message(renderedAI, 2) else S.show_message(rendered, 2) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index d96e3205c0c..422fe6693dd 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -6,6 +6,7 @@ var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS var/list/alarms_to_show = list() var/list/alarms_to_clear = list() + var/designation = "" var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 9a3c96f33a0..783b3e53585 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -40,7 +40,7 @@ if((M.client && !( M.blinded ))) M.show_message("\red [src] collapses in a shattered heap. ") ghostize() - del src + qdel(src) return /mob/living/simple_animal/construct/examine() diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 047e18e651c..25f65ee9990 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -78,7 +78,7 @@ W.assignment = corpseidjob W.registered_name = M.real_name M.equip_to_slot_or_del(W, slot_wear_id) - del(src) + qdel(src) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 0df85076f4f..efed432d09e 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -58,7 +58,7 @@ health = min(maxHealth, health + MED.heal_brute) MED.amount -= 1 if(MED.amount <= 0) - del(MED) + qdel(MED) for(var/mob/M in viewers(src, null)) if ((M.client && !( M.blinded ))) M.show_message("\blue [user] applies [MED] on [src]") diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index e56df2e9648..ac5350437e2 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -48,7 +48,7 @@ if(locate(/obj/effect/spacevine) in loc) var/obj/effect/spacevine/SV = locate(/obj/effect/spacevine) in loc - del(SV) + qdel(SV) if(prob(10)) say("Nom") @@ -68,7 +68,7 @@ if(!stat) if(locate(/obj/effect/spacevine) in loc) var/obj/effect/spacevine/SV = locate(/obj/effect/spacevine) in loc - del(SV) + qdel(SV) if(prob(10)) say("Nom") @@ -183,7 +183,7 @@ amount_grown += rand(1,2) if(amount_grown >= 100) new /mob/living/simple_animal/chicken(src.loc) - del(src) + qdel(src) var/const/MAX_CHICKENS = 50 var/global/chicken_count = 0 @@ -232,7 +232,7 @@ var/global/chicken_count = 0 if(!stat && eggsleft < 8) user.visible_message("\blue [user] feeds [O] to [name]! It clucks happily.","\blue You feed [O] to [name]! It clucks happily.") user.drop_item() - del(O) + qdel(O) eggsleft += rand(1, 4) //world << eggsleft else @@ -261,6 +261,6 @@ var/global/chicken_count = 0 visible_message("[src] hatches with a quiet cracking sound.") new /mob/living/simple_animal/chick(get_turf(src)) processing_objects.Remove(src) - del(src) + qdel(src) else processing_objects.Remove(src) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 6fd06c6a3cb..6b3751e633f 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -40,7 +40,7 @@ if(!ckey) var/obj/item/trash/deadmouse/M = new(src.loc) M.icon_state = src.icon_dead - del (src) + qdel(src) /mob/living/simple_animal/mouse/Crossed(AM as mob|obj) if( ishuman(AM) ) diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm index 8a723ae1dd2..b008220cfac 100644 --- a/code/modules/mob/living/simple_animal/friendly/pug.dm +++ b/code/modules/mob/living/simple_animal/friendly/pug.dm @@ -1,42 +1,42 @@ -//Corgi -/mob/living/simple_animal/pug - name = "\improper pug" - real_name = "pug" - desc = "It's a pug." - icon_state = "pug" - icon_living = "pug" - icon_dead = "pug_dead" - speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") - speak_emote = list("barks", "woofs") - emote_hear = list("barks", "woofs", "yaps","pants") - emote_see = list("shakes its head", "chases its tail","shivers") - speak_chance = 1 - turns_per_move = 10 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/pug - meat_amount = 3 - response_help = "pets" - response_disarm = "bops" - response_harm = "kicks" - see_in_dark = 5 - -/mob/living/simple_animal/pug/Life() - ..() - - if(!stat && !resting && !buckled) - if(prob(1)) - emote(pick("chases its tail")) - spawn(0) - for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) - dir = i - sleep(1) - -/mob/living/simple_animal/pug/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri - if(istype(O, /obj/item/weapon/newspaper)) - if(!stat) - user.visible_message("\blue [user] baps [name] on the nose with the rolled up [O]") - spawn(0) - for(var/i in list(1,2,4,8,4,2,1,2)) - dir = i - sleep(1) - else - ..() +//Corgi +/mob/living/simple_animal/pug + name = "\improper pug" + real_name = "pug" + desc = "It's a pug." + icon_state = "pug" + icon_living = "pug" + icon_dead = "pug_dead" + speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") + speak_emote = list("barks", "woofs") + emote_hear = list("barks", "woofs", "yaps","pants") + emote_see = list("shakes its head", "chases its tail","shivers") + speak_chance = 1 + turns_per_move = 10 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/pug + meat_amount = 3 + response_help = "pets" + response_disarm = "bops" + response_harm = "kicks" + see_in_dark = 5 + +/mob/living/simple_animal/pug/Life() + ..() + + if(!stat && !resting && !buckled) + if(prob(1)) + emote(pick("chases its tail")) + spawn(0) + for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) + dir = i + sleep(1) + +/mob/living/simple_animal/pug/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri + if(istype(O, /obj/item/weapon/newspaper)) + if(!stat) + user.visible_message("\blue [user] baps [name] on the nose with the rolled up [O]") + spawn(0) + for(var/i in list(1,2,4,8,4,2,1,2)) + dir = i + sleep(1) + else + ..() diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm index de3b5e5a313..ef0f511b1a6 100644 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ b/code/modules/mob/living/simple_animal/friendly/slime.dm @@ -73,4 +73,4 @@ S2.icon_living = "[src.colour] baby slime" S2.icon_dead = "[src.colour] baby slime dead" S2.colour = "[src.colour]" - del(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 4a5565dc759..e79fa4b1fb8 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -57,5 +57,5 @@ icon_living = "holocarp" /mob/living/simple_animal/hostile/carp/holocarp/Die() - del(src) + qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index d2f7e80559a..278849e1b65 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -53,7 +53,7 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - del src + qdel(src) return /mob/living/simple_animal/hostile/hivebot/tele//this still needs work @@ -97,7 +97,7 @@ if("rapid") new /mob/living/simple_animal/hostile/hivebot/rapid(get_turf(src)) spawn(100) - del(src) + qdel(src) return diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index b94ba3c1991..522122633b8 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -254,7 +254,7 @@ if(!A) return if (!istype(target, /turf)) - del(A) + qdel(A) return A.current = target A.yo = target:y - start:y diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 7530d354235..7bc1857537c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -44,7 +44,7 @@ /mob/living/simple_animal/hostile/mimic/Die() ..() visible_message("\red [src] stops moving!") - del(src) + qdel(src) @@ -198,7 +198,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca src.creator = creator faction = "\ref[creator]" // very unique if(destroy_original) - del(O) + qdel(O) return 1 return diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 3a114be9e4c..a6e715b7763 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -175,7 +175,7 @@ ore_eaten++ if(!(O.type in ore_types_eaten)) ore_types_eaten += O.type - del(O) + qdel(O) if(ore_eaten > 5)//Limit the scope of the reward you can get, or else things might get silly ore_eaten = 5 visible_message("The ore was swallowed whole!") @@ -186,7 +186,7 @@ spawn(chase_time) if(alerted) visible_message("The [src.name] buries into the ground, vanishing from sight!") - del(src) + qdel(src) /mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Reward() if(!ore_eaten || ore_types_eaten.len == 0) @@ -286,7 +286,7 @@ user << "You chomp into [src], barely managing to hold it down, but feel amazingly refreshed in mere moments." playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) H.revive() - del(src) + qdel(src) ..() /mob/living/simple_animal/hostile/asteroid/hivelordbrood @@ -316,10 +316,10 @@ /mob/living/simple_animal/hostile/asteroid/hivelordbrood/New() ..() spawn(100) - del(src) + qdel(src) /mob/living/simple_animal/hostile/asteroid/hivelordbrood/Die() - del(src) + qdel(src) /mob/living/simple_animal/hostile/asteroid/goliath name = "goliath" @@ -398,7 +398,7 @@ for(var/mob/living/M in src.loc) M.Weaken(5) visible_message("The [src.name] knocks [M.name] down!") - del(src) + qdel(src) /obj/effect/goliath_tentacle/Crossed(AM as mob|obj) if(isliving(AM)) @@ -427,7 +427,7 @@ if(current_armor.["melee"] < 80) current_armor.["melee"] = min(current_armor.["melee"] + 10, 80) user << "You strengthen [target], improving its resistance against melee attacks." - del(src) + qdel(src) else user << "You can't improve [C] any further." return diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 97ac5ab6f81..07e835267f3 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -1,160 +1,160 @@ -/mob/living/simple_animal/hostile/mushroom - name = "walking mushroom" - desc = "It's a massive mushroom... with legs?" - icon_state = "mushroom_color" - icon_living = "mushroom_color" - icon_dead = "mushroom_dead" - speak_chance = 0 - turns_per_move = 1 - maxHealth = 10 - health = 10 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "whacks" - harm_intent_damage = 5 - melee_damage_lower = 1 - melee_damage_upper = 1 - attack_same = 2 - attacktext = "chomps" - faction = "mushroom" - environment_smash = 0 - stat_attack = 2 - mouse_opacity = 1 - speed = 1 - ventcrawler = 2 - var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms - var/bruised = 0 //If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it wont award levels to shrooms that eat it - var/recovery_cooldown = 0 //So you can't repeatedly revive it during a fight - var/faint_ticker = 0 //If we hit three, another mushroom's gonna eat us - var/image/cap_living = null //Where we store our cap icons so we dont generate them constantly to update our icon - var/image/cap_dead = null - -/mob/living/simple_animal/hostile/mushroom/examine() - ..() - if(health >= maxHealth) - usr << "It looks healthy." - else - usr << "It looks like it's been roughed up." - -/mob/living/simple_animal/hostile/mushroom/Life() - ..() - if(!stat)//Mushrooms slowly regenerate if conscious, for people who want to save them from being eaten - health = min(health+2, maxHealth) - -/mob/living/simple_animal/hostile/mushroom/New()//Makes every shroom a little unique - melee_damage_lower += rand(3, 5) - melee_damage_upper += rand(10,20) - maxHealth += rand(40,60) - move_to_delay = rand(3,11) - var/cap_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) - cap_living = image('icons/mob/animal.dmi',icon_state = "mushroom_cap") - cap_dead = image('icons/mob/animal.dmi',icon_state = "mushroom_cap_dead") - cap_living.color = cap_color - cap_dead.color = cap_color - UpdateMushroomCap() - health = maxHealth - ..() - -/mob/living/simple_animal/hostile/mushroom/adjustBruteLoss(var/damage)//Possibility to flee from a fight just to make it more visually interesting - if(!retreat_distance && prob(33)) - retreat_distance = 5 - spawn(30) - retreat_distance = null - ..() - -/mob/living/simple_animal/hostile/mushroom/attack_animal(var/mob/living/L) - if(istype(L, /mob/living/simple_animal/hostile/mushroom) && stat == DEAD) - var/mob/living/simple_animal/hostile/mushroom/M = L - if(faint_ticker < 2) - M.visible_message("[M] chews a bit on [src].") - faint_ticker++ - return - M.visible_message("[M] devours [src]!") - var/level_gain = (powerlevel - M.powerlevel) - if(level_gain >= -1 && !bruised && !M.ckey)//Player shrooms can't level up to become robust gods. - if(level_gain < 1)//So we still gain a level if two mushrooms were the same level - level_gain = 1 - M.LevelUp(level_gain) - M.health = M.maxHealth - del(src) - ..() - -/mob/living/simple_animal/hostile/mushroom/revive() - ..() - icon_state = "mushroom_color" - UpdateMushroomCap() - -/mob/living/simple_animal/hostile/mushroom/Die() - visible_message("[src] fainted.") - ..() - UpdateMushroomCap() - -/mob/living/simple_animal/hostile/mushroom/proc/UpdateMushroomCap() - overlays.Cut() - if(health == 0) - overlays += cap_dead - else - overlays += cap_living - -/mob/living/simple_animal/hostile/mushroom/proc/Recover() - visible_message("[src] slowly begins to recover.") - health = 5 - faint_ticker = 0 - icon_state = icon_living - UpdateMushroomCap() - recovery_cooldown = 1 - spawn(300) - recovery_cooldown = 0 - -/mob/living/simple_animal/hostile/mushroom/proc/LevelUp(var/level_gain) - if(powerlevel <= 9) - powerlevel += level_gain - if(prob(25)) - melee_damage_lower += (level_gain * rand(1,5)) - else - melee_damage_upper += (level_gain * rand(1,5)) - maxHealth += (level_gain * rand(1,5)) - health = maxHealth //They'll always heal, even if they don't gain a level, in case you want to keep this shroom around instead of harvesting it - -/mob/living/simple_animal/hostile/mushroom/proc/Bruise() - if(!bruised && !stat) - src.visible_message("The [src.name] was bruised!") - bruised = 1 - -/mob/living/simple_animal/hostile/mushroom/attackby(obj/item/I as obj, mob/user as mob) - if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom)) - if(stat == DEAD && !recovery_cooldown) - Recover() - del(I) - else - user << "[src] won't eat it!" - return - if(I.force) - Bruise() - ..() - -/mob/living/simple_animal/hostile/mushroom/attack_hand(mob/living/carbon/human/M as mob) - ..() - if(M.a_intent == "harm") - Bruise() - -/mob/living/simple_animal/hostile/mushroom/hitby(atom/movable/AM) - ..() - if(istype(AM, /obj/item)) - var/obj/item/T = AM - if(T.throwforce) - Bruise() - -/mob/living/simple_animal/hostile/mushroom/bullet_act() - ..() - Bruise() - -/mob/living/simple_animal/hostile/mushroom/harvest() - var/counter - for(counter=0, counter<=powerlevel, counter++) - var/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/S = new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src.loc) - S.reagents.add_reagent("mushroomhallucinogen", powerlevel) - S.reagents.add_reagent("doctorsdelight", powerlevel) - S.reagents.add_reagent("synaptizine", powerlevel) - del(src) \ No newline at end of file +/mob/living/simple_animal/hostile/mushroom + name = "walking mushroom" + desc = "It's a massive mushroom... with legs?" + icon_state = "mushroom_color" + icon_living = "mushroom_color" + icon_dead = "mushroom_dead" + speak_chance = 0 + turns_per_move = 1 + maxHealth = 10 + health = 10 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "whacks" + harm_intent_damage = 5 + melee_damage_lower = 1 + melee_damage_upper = 1 + attack_same = 2 + attacktext = "chomps" + faction = "mushroom" + environment_smash = 0 + stat_attack = 2 + mouse_opacity = 1 + speed = 1 + ventcrawler = 2 + var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms + var/bruised = 0 //If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it wont award levels to shrooms that eat it + var/recovery_cooldown = 0 //So you can't repeatedly revive it during a fight + var/faint_ticker = 0 //If we hit three, another mushroom's gonna eat us + var/image/cap_living = null //Where we store our cap icons so we dont generate them constantly to update our icon + var/image/cap_dead = null + +/mob/living/simple_animal/hostile/mushroom/examine() + ..() + if(health >= maxHealth) + usr << "It looks healthy." + else + usr << "It looks like it's been roughed up." + +/mob/living/simple_animal/hostile/mushroom/Life() + ..() + if(!stat)//Mushrooms slowly regenerate if conscious, for people who want to save them from being eaten + health = min(health+2, maxHealth) + +/mob/living/simple_animal/hostile/mushroom/New()//Makes every shroom a little unique + melee_damage_lower += rand(3, 5) + melee_damage_upper += rand(10,20) + maxHealth += rand(40,60) + move_to_delay = rand(3,11) + var/cap_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) + cap_living = image('icons/mob/animal.dmi',icon_state = "mushroom_cap") + cap_dead = image('icons/mob/animal.dmi',icon_state = "mushroom_cap_dead") + cap_living.color = cap_color + cap_dead.color = cap_color + UpdateMushroomCap() + health = maxHealth + ..() + +/mob/living/simple_animal/hostile/mushroom/adjustBruteLoss(var/damage)//Possibility to flee from a fight just to make it more visually interesting + if(!retreat_distance && prob(33)) + retreat_distance = 5 + spawn(30) + retreat_distance = null + ..() + +/mob/living/simple_animal/hostile/mushroom/attack_animal(var/mob/living/L) + if(istype(L, /mob/living/simple_animal/hostile/mushroom) && stat == DEAD) + var/mob/living/simple_animal/hostile/mushroom/M = L + if(faint_ticker < 2) + M.visible_message("[M] chews a bit on [src].") + faint_ticker++ + return + M.visible_message("[M] devours [src]!") + var/level_gain = (powerlevel - M.powerlevel) + if(level_gain >= -1 && !bruised && !M.ckey)//Player shrooms can't level up to become robust gods. + if(level_gain < 1)//So we still gain a level if two mushrooms were the same level + level_gain = 1 + M.LevelUp(level_gain) + M.health = M.maxHealth + qdel(src) + ..() + +/mob/living/simple_animal/hostile/mushroom/revive() + ..() + icon_state = "mushroom_color" + UpdateMushroomCap() + +/mob/living/simple_animal/hostile/mushroom/Die() + visible_message("[src] fainted.") + ..() + UpdateMushroomCap() + +/mob/living/simple_animal/hostile/mushroom/proc/UpdateMushroomCap() + overlays.Cut() + if(health == 0) + overlays += cap_dead + else + overlays += cap_living + +/mob/living/simple_animal/hostile/mushroom/proc/Recover() + visible_message("[src] slowly begins to recover.") + health = 5 + faint_ticker = 0 + icon_state = icon_living + UpdateMushroomCap() + recovery_cooldown = 1 + spawn(300) + recovery_cooldown = 0 + +/mob/living/simple_animal/hostile/mushroom/proc/LevelUp(var/level_gain) + if(powerlevel <= 9) + powerlevel += level_gain + if(prob(25)) + melee_damage_lower += (level_gain * rand(1,5)) + else + melee_damage_upper += (level_gain * rand(1,5)) + maxHealth += (level_gain * rand(1,5)) + health = maxHealth //They'll always heal, even if they don't gain a level, in case you want to keep this shroom around instead of harvesting it + +/mob/living/simple_animal/hostile/mushroom/proc/Bruise() + if(!bruised && !stat) + src.visible_message("The [src.name] was bruised!") + bruised = 1 + +/mob/living/simple_animal/hostile/mushroom/attackby(obj/item/I as obj, mob/user as mob) + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom)) + if(stat == DEAD && !recovery_cooldown) + Recover() + qdel(I) + else + user << "[src] won't eat it!" + return + if(I.force) + Bruise() + ..() + +/mob/living/simple_animal/hostile/mushroom/attack_hand(mob/living/carbon/human/M as mob) + ..() + if(M.a_intent == "harm") + Bruise() + +/mob/living/simple_animal/hostile/mushroom/hitby(atom/movable/AM) + ..() + if(istype(AM, /obj/item)) + var/obj/item/T = AM + if(T.throwforce) + Bruise() + +/mob/living/simple_animal/hostile/mushroom/bullet_act() + ..() + Bruise() + +/mob/living/simple_animal/hostile/mushroom/harvest() + var/counter + for(counter=0, counter<=powerlevel, counter++) + var/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/S = new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src.loc) + S.reagents.add_reagent("mushroomhallucinogen", powerlevel) + S.reagents.add_reagent("doctorsdelight", powerlevel) + S.reagents.add_reagent("synaptizine", powerlevel) + qdel(src) diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index 129c873f2a7..5a4d410642f 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -55,5 +55,5 @@ new corpse (src.loc) if(weapon1) new weapon1 (src.loc) - del src + qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm index 8e32e320b36..7425c799a7b 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm @@ -1,38 +1,38 @@ -/mob/living/simple_animal/hostile/retaliate/bat - name = "Space Bat" - desc = "A rare breed of bat which roosts in spaceships, probably not vampiric." - icon_state = "bat" - icon_living = "bat" - icon_dead = "bat_dead" - icon_gib = "bat_dead" - turns_per_move = 1 - response_help = "brushes aside" - response_disarm = "flails at" - response_harm = "hits" - speak_chance = 0 - a_intent = "harm" - stop_automated_movement_when_pulled = 0 - maxHealth = 15 - health = 15 - see_in_dark = 10 - harm_intent_damage = 6 - melee_damage_lower = 6 - melee_damage_upper = 5 - attacktext = "bites" - pass_flags = PASSTABLE - faction = "carp" - attack_sound = 'sound/weapons/bite.ogg' - environment_smash = 0 - ventcrawler = 2 - - - //Space bats need no air to fly in. - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 +/mob/living/simple_animal/hostile/retaliate/bat + name = "Space Bat" + desc = "A rare breed of bat which roosts in spaceships, probably not vampiric." + icon_state = "bat" + icon_living = "bat" + icon_dead = "bat_dead" + icon_gib = "bat_dead" + turns_per_move = 1 + response_help = "brushes aside" + response_disarm = "flails at" + response_harm = "hits" + speak_chance = 0 + a_intent = "harm" + stop_automated_movement_when_pulled = 0 + maxHealth = 15 + health = 15 + see_in_dark = 10 + harm_intent_damage = 6 + melee_damage_lower = 6 + melee_damage_upper = 5 + attacktext = "bites" + pass_flags = PASSTABLE + faction = "carp" + attack_sound = 'sound/weapons/bite.ogg' + environment_smash = 0 + ventcrawler = 2 + + + //Space bats need no air to fly in. + 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 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index 180da67c1c4..63d7b15eb48 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -53,5 +53,5 @@ new corpse (src.loc) if(weapon1) new weapon1 (src.loc) - del src + qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index d3726cb90db..fa547eb50b8 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -50,11 +50,12 @@ status_flags = GODMODE // Cannot push also var/cannot_be_seen = 1 + var/mob/living/creator = null // No movement while seen code. -/mob/living/simple_animal/hostile/statue/New() +/mob/living/simple_animal/hostile/statue/New(loc, var/mob/living/creator) ..() // Give spells mob_spell_list += new /obj/effect/proc_holder/spell/aoe_turf/flicker_lights(src) @@ -64,6 +65,10 @@ // Give nightvision see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING + // Set creator + if(creator) + src.creator = creator + /mob/living/simple_animal/hostile/statue/Move(var/turf/NewLoc) if(can_be_seen(NewLoc)) if(client) @@ -146,6 +151,11 @@ return 0 return ..() +// Don't attack your creator if there is one + +/mob/living/simple_animal/hostile/statue/ListTargets() + . = ..() + return . - creator // Statue powers diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index f316d2c826d..87c2562b454 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -42,7 +42,7 @@ new weapon1 (src.loc) if(weapon2) new weapon2 (src.loc) - del src + qdel(src) return ///////////////Sword and shield//////////// @@ -161,5 +161,5 @@ /mob/living/simple_animal/hostile/viscerator/Die() ..() visible_message("\red [src] is smashed into pieces!") - del src + qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 10af7595908..df89648dd87 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -54,7 +54,7 @@ ..() visible_message("\red [src] is hacked into pieces!") new /obj/item/stack/sheet/wood(loc) - del(src) + qdel(src) /mob/living/simple_animal/hostile/tree/festivus name = "festivus pole" @@ -68,4 +68,4 @@ ..() visible_message("\red [src] is hacked into pieces!") new /obj/item/stack/rods(loc) - del(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 597a3c49e8b..7b3b06ce6fb 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -284,7 +284,7 @@ lines 294-301 in living/say.dm (speech buffer) icon_state = "parrot_fly" drop_held_item(0) else if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/cracker)) //Poly wants a cracker. - del(O) + qdel(O) user.drop_item() if(health < maxHealth) adjustBruteLoss(-10) @@ -704,7 +704,7 @@ lines 294-301 in living/say.dm (speech buffer) //parrots will eat crackers instead of dropping them if(istype(held_item,/obj/item/weapon/reagent_containers/food/snacks/cracker) && (drop_gently)) - del(held_item) + qdel(held_item) held_item = null if(health < maxHealth) adjustBruteLoss(-10) diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index e97f720e909..07b0d85c86e 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -36,7 +36,7 @@ if((M.client && !( M.blinded ))) M.show_message("\red [src] lets out a contented sigh as their form unwinds. ") ghostize() - del src + qdel(src) return diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 57398602cb8..45b93f79d7d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -389,7 +389,7 @@ adjustBruteLoss(-MED.heal_brute) MED.amount -= 1 if(MED.amount <= 0) - del(MED) + qdel(MED) for(var/mob/M in viewers(src, null)) if ((M.client && !( M.blinded ))) M.show_message("\blue [user] applies [MED] on [src]") @@ -519,7 +519,7 @@ /mob/living/simple_animal/proc/harvest() new meat_type (get_turf(src)) if(prob(95)) - del(src) + qdel(src) return gib() return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/worm.dm b/code/modules/mob/living/simple_animal/worm.dm index 814b619d558..fb16a4da40d 100644 --- a/code/modules/mob/living/simple_animal/worm.dm +++ b/code/modules/mob/living/simple_animal/worm.dm @@ -96,7 +96,7 @@ return - Del() //if a chunk a destroyed, make a new worm out of the split halves + Delete() //if a chunk a destroyed, make a new worm out of the split halves if(previous) previous.Detach() ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 142025ff79c..1cf449f9b01 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1,7 +1,17 @@ -/mob/Del()//This makes sure that mobs with clients/keys are not just deleted from the game. +/mob/Destroy()//This makes sure that mobs with clients/keys are not just deleted from the game. mob_list -= src dead_mob_list -= src living_mob_list -= src + //Set the mob up for GC. Mobs have lots of references + if(client) + for(var/atom/movable/AM in client.screen) + qdel(AM) + client.screen = list() + del(hud_used) + for(var/magic in mob_spell_list) + del(magic) + for(var/infection in viruses) + del(infection) ghostize() ..() @@ -126,7 +136,7 @@ var/next_mob_id = 0 var/list/temp = list( ) temp += L.container //L = null - del(L) + qdel(L) return temp else return L.container @@ -151,25 +161,25 @@ var/next_mob_id = 0 return 0 -/mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, del_on_fail = 0, disable_warning = 1, redraw_mob = 1) - if(equip_to_slot_if_possible(W, slot_l_hand, del_on_fail, disable_warning, redraw_mob)) +/mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, qdel_on_fail = 0, disable_warning = 1, redraw_mob = 1) + if(equip_to_slot_if_possible(W, slot_l_hand, qdel_on_fail, disable_warning, redraw_mob)) return 1 - else if(equip_to_slot_if_possible(W, slot_r_hand, del_on_fail, disable_warning, redraw_mob)) + else if(equip_to_slot_if_possible(W, slot_r_hand, qdel_on_fail, disable_warning, redraw_mob)) return 1 return 0 //This is a SAFE proc. Use this instead of equip_to_splot()! -//set del_on_fail to have it delete W if it fails to equip +//set qdel_on_fail to have it delete W if it fails to equip //set disable_warning to disable the 'you are unable to equip that' warning. //unset redraw_mob to prevent the mob from being redrawn at the end. -/mob/proc/equip_to_slot_if_possible(obj/item/W as obj, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1) +/mob/proc/equip_to_slot_if_possible(obj/item/W as obj, slot, qdel_on_fail = 0, disable_warning = 0, redraw_mob = 1) if(!istype(W)) return 0 if(!W.mob_can_equip(src, slot, disable_warning)) - if(del_on_fail) - del(W) + if(qdel_on_fail) + qdel(W) else if(!disable_warning) - src << "\red You are unable to equip that." //Only print if del_on_fail is false + src << "\red You are unable to equip that." //Only print if qdel_on_fail is false return 0 equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail. return 1 @@ -207,7 +217,7 @@ var/list/slot_equipment_priority = list( \ if(!istype(W)) return 0 for(var/slot in slot_equipment_priority) - if(equip_to_slot_if_possible(W, slot, 0, 1, 1)) //del_on_fail = 0; disable_warning = 0; redraw_mob = 1 + if(equip_to_slot_if_possible(W, slot, 0, 1, 1)) //qdel_on_fail = 0; disable_warning = 0; redraw_mob = 1 return 1 return 0 @@ -339,7 +349,7 @@ var/list/slot_equipment_priority = list( \ var/mob/new_player/M = new /mob/new_player() if(!client) log_game("[usr.key] AM failed due to disconnect.") - del(M) + qdel(M) return M.key = key @@ -589,6 +599,7 @@ var/list/slot_equipment_priority = list( \ stat(null,"Obj-[master_controller.objects_cost]\t#[processing_objects.len]") stat(null,"Net-[master_controller.networks_cost]\tPnet-[master_controller.powernets_cost]") stat(null,"NanoUI-[master_controller.nano_cost]\t#[nanomanager.processing_uis.len]") + stat(null,"GC-[master_controller.gc_cost]\t#[garbage.destroyed.len + garbage.queue.len]-#dels[garbage.dels]") stat(null,"Tick-[master_controller.ticker_cost]\tALL-[master_controller.total_cost]") else stat(null,"MasterController-ERROR") diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index c5a9c364919..8f7c703591f 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -24,7 +24,7 @@ affecting = victim if(affecting.anchored) - del(src) + qdel(src) return hud = new /obj/screen/grab(src) @@ -35,10 +35,10 @@ affecting.grabbed_by += src -/obj/item/weapon/grab/Del() +/obj/item/weapon/grab/Destroy() if(affecting) affecting.grabbed_by -= src - del(hud) + qdel(hud) ..() //Used by throw code to hand over the mob, instead of throwing the grab. The grab is then deleted by the throw code. @@ -120,7 +120,7 @@ if(world.time < (last_upgrade + UPGRADE_COOLDOWN)) return if(!assailant.canmove || assailant.lying) - del(src) + qdel(src) return last_upgrade = world.time @@ -154,10 +154,10 @@ if(state == GRAB_KILL) return if(!affecting) - del(src) + qdel(src) return if(!assailant.canmove || assailant.lying) - del(src) + qdel(src) return state = GRAB_KILL assailant.visible_message("[assailant] has tightened \his grip on [affecting]'s neck!") @@ -174,12 +174,12 @@ //This is used to make sure the victim hasn't managed to yackety sax away before using the grab. /obj/item/weapon/grab/proc/confirm() if(!assailant || !affecting) - del(src) + qdel(src) return 0 if(affecting) if(!isturf(assailant.loc) || ( !isturf(affecting.loc) || assailant.loc != affecting.loc && get_dist(assailant, affecting) > 1) ) - del(src) + qdel(src) return 0 return 1 @@ -204,11 +204,11 @@ user.visible_message("[user] devours [affecting]!") affecting.loc = user attacker.stomach_contents.Add(affecting) - del(src) + qdel(src) /obj/item/weapon/grab/dropped() - del(src) + qdel(src) #undef UPGRADE_COOLDOWN #undef UPGRADE_KILL_TIMER \ No newline at end of file diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 80e9f8d41ea..db189fb416d 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -174,7 +174,7 @@ if(!mob.lastarea) mob.lastarea = get_area(mob.loc) - if((istype(mob.loc, /turf/space)) || (mob.lastarea.has_gravity == 0)) + if(!has_gravity(mob)) if(!mob.Process_Spacemove(0)) return 0 @@ -272,21 +272,21 @@ for(var/obj/item/weapon/grab/G in mob.grabbed_by) if(G.state == GRAB_PASSIVE && !grabbing.Find(G.assailant)) - del(G) + qdel(G) if(G.state == GRAB_AGGRESSIVE) move_delay = world.time + 10 if(!prob(25)) return 1 mob.visible_message("[mob] has broken free of [G.assailant]'s grip!") - del(G) + qdel(G) if(G.state == GRAB_NECK) move_delay = world.time + 10 if(!prob(5)) return 1 mob.visible_message("[mob] has broken free of [G.assailant]'s headlock!") - del(G) + qdel(G) return 0 @@ -357,34 +357,20 @@ if(!isturf(loc)) //if they're in a disposal unit, for example return 1 - /* - if(istype(src,/mob/living/carbon)) - if(src.l_hand && src.r_hand) - return 0 - */ - var/dense_object = 0 for(var/turf/turf in oview(1,src)) if(istype(turf,/turf/space)) continue if(istype(src,/mob/living/carbon/human/)) // Only humans can wear magboots, so we give them a chance to. - if((istype(turf,/turf/simulated/floor)) && (src.lastarea.has_gravity == 0) && !(istype(src:shoes, /obj/item/clothing/shoes/magboots) && (src:shoes:flags & NOSLIP))) + if((istype(turf,/turf/simulated/floor)) && (!has_gravity(src)) && !(istype(src:shoes, /obj/item/clothing/shoes/magboots) && (src:shoes:flags & NOSLIP))) continue else - if((istype(turf,/turf/simulated/floor)) && (src.lastarea.has_gravity == 0)) // No one else gets a chance. + if((istype(turf,/turf/simulated/floor)) && (!has_gravity(src))) // No one else gets a chance. continue - - - /* - if(istype(turf,/turf/simulated/floor) && (src.flags & NOGRAV)) - continue - */ - - dense_object++ break diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 7d1907c74ef..a81a46609d1 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -30,7 +30,7 @@ if(!M || !ismob(M)) usr << "Type path is not a mob (new_type = [new_type]) in change_mob_type(). Contact a coder." - del(M) + qdel(M) return if( istext(new_name) ) @@ -54,5 +54,5 @@ if(delete_old_mob) spawn(1) - del(src) + qdel(src) return M diff --git a/code/modules/mob/new_player/logout.dm b/code/modules/mob/new_player/logout.dm index 9f064a99cd5..ad1c9b3098d 100644 --- a/code/modules/mob/new_player/logout.dm +++ b/code/modules/mob/new_player/logout.dm @@ -3,5 +3,5 @@ ..() if(!spawning)//Here so that if they are spawning and log out, the other procs can play out and they will have a mob to come back to. key = null//We null their key before deleting the mob, so they are properly kicked out. - del(src) + qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 340bd4f9c1c..597ee6a8b5d 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -120,7 +120,7 @@ observer.name = observer.real_name observer.key = key - del(src) + qdel(src) return 1 if(href_list["late_join"]) @@ -267,7 +267,7 @@ if(config.allow_latejoin_antagonists && emergency_shuttle.timeleft() > 300) //Don't make them antags if the station is evacuating ticker.mode.make_antag_chance(character) - del(src) + qdel(src) proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank) if (ticker.current_state == GAME_STATE_PLAYING) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 7bdc77290ab..8682335817e 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -282,6 +282,40 @@ name = "Side Part" icon_state = "hair_part" + braid + name = "Braided" + icon_state = "hair_braid" + + bun + name = "Bun Head" + icon_state = "hair_bun" + gender = FEMALE + + side_tail + name = "Side Pony" + icon_state = "hair_sidetail" + + long_over_eye + name = "Over eye" + icon_state = "hair_longovereye" + + front_braid + name = "Braided front" + icon_state = "hair_braidfront" + + antenna + name = "Ahoge" + icon_state = "hair_antenna" + + pigtail + name = "Pig tails" + icon_state = "hair_pigtails" + gender = FEMALE + + protagonist + name = "Slightly long" + icon_state = "hair_protagonist" + ///////////////////////////// // Facial Hair Definitions // ///////////////////////////// diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 6622d549dc4..bceb9ce2152 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,510 +1,513 @@ -/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG), newname = null) - if (notransform) - return - //Handle items on mob - - //first implants - var/list/implants = list() - if (tr_flags & TR_KEEPIMPLANTS) - for(var/obj/item/weapon/implant/W in src) - implants += W - - if(tr_flags & TR_KEEPITEMS) - for(var/obj/item/W in (src.contents-implants)) - unEquip(W) - - //Make mob invisible and spawn animation - regenerate_icons() - notransform = 1 - canmove = 0 - stunned = 1 - icon = null - invisibility = 101 - var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("h2monkey", animation) - sleep(22) - //animation = null - var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc ) - del(animation) - - - - // hash the original name? - if (tr_flags & TR_HASHNAME) - O.name = "monkey ([copytext(md5(real_name), 2, 6)])" - O.real_name = "monkey ([copytext(md5(real_name), 2, 6)])" - if (newname) //if there's a name as an argument, always take that one over the current name - O.name = newname - O.real_name = newname - - //handle DNA and other attributes - O.dna = dna - dna = null - if (!(tr_flags & TR_KEEPSE)) - O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, RACEBLOCK, construct_block(BAD_MUTATION_DIFFICULTY,BAD_MUTATION_DIFFICULTY)) - if(suiciding) - O.suiciding = suiciding - O.loc = loc - O.a_intent = "harm" - - //keep viruses? - if (tr_flags & TR_KEEPVIRUS) - O.viruses = viruses - viruses = list() - for(var/datum/disease/D in O.viruses) - D.affected_mob = O - - //keep damage? - if (tr_flags & TR_KEEPDAMAGE) - O.setToxLoss(getToxLoss()) - O.adjustBruteLoss(getBruteLoss()) - O.setOxyLoss(getOxyLoss()) - O.adjustFireLoss(getFireLoss()) - - //re-add implants to new mob - for(var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O - - //transfer mind and delete old mob - if(mind) - mind.transfer_to(O) - if (tr_flags & TR_DEFAULTMSG) - O << "You are now a monkey." - updateappearance(O) - . = O - if ( !(tr_flags & TR_KEEPSRC) ) //flag should be used if monkeyize() is called inside another proc of src so that one does not crash - del(src) - return - - - -////////////////////////// Humanize ////////////////////////////// -//Could probably be merged with monkeyize but other transformations got their own procs, too - -/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG), newname = null) - if (notransform) - return - //Handle items on mob - - //first implants - var/list/implants = list() - if (tr_flags & TR_KEEPIMPLANTS) - for(var/obj/item/weapon/implant/W in src) - implants += W - - //now the rest - if (tr_flags & TR_KEEPITEMS) - for(var/obj/item/W in (src.contents-implants)) - unEquip(W) - if (client) - client.screen -= W - if (W) - W.loc = loc - W.dropped(src) - W.layer = initial(W.layer) - - // for(var/obj/item/W in src) - // unEquip(W) - - //Make mob invisible and spawn animation - regenerate_icons() - notransform = 1 - canmove = 0 - stunned = 1 - icon = null - invisibility = 101 - var/atom/movable/overlay/animation = new( loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("monkey2h", animation) - sleep(22) - var/mob/living/carbon/human/O = new( loc ) - for(var/obj/item/C in O.loc) - O.equip_to_appropriate_slot(C) - del(animation) - - - O.gender = (deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? FEMALE : MALE - O.dna = dna - dna = null - if (newname) //if there's a name as an argument, always take that one over the current name - O.real_name = newname - else - if ( !(cmptext ("monkey",copytext(O.dna.real_name,1,7)) ) ) - O.real_name = O.dna.real_name - else - O.real_name = random_name(O.gender) - O.name = O.real_name - - if (!(tr_flags & TR_KEEPSE)) - O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, RACEBLOCK, construct_block(1,BAD_MUTATION_DIFFICULTY)) - - if(suiciding) - O.suiciding = suiciding - - O.loc = loc - - //keep viruses? - if (tr_flags & TR_KEEPVIRUS) - O.viruses = viruses - viruses = list() - for(var/datum/disease/D in O.viruses) - D.affected_mob = O - - //keep damage? - if (tr_flags & TR_KEEPDAMAGE) - O.setToxLoss(getToxLoss()) - O.adjustBruteLoss(getBruteLoss()) - O.setOxyLoss(getOxyLoss()) - O.adjustFireLoss(getFireLoss()) - - //re-add implants to new mob - for(var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O - - if(mind) - mind.transfer_to(O) - O.a_intent = "help" - if (tr_flags & TR_DEFAULTMSG) - O << "You are now a human." - updateappearance(O) - . = O - if ( !(tr_flags & TR_KEEPSRC) ) //don't delete src yet if it's needed to finish calling proc - del(src) - return - -/mob/new_player/AIize() - spawning = 1 - return ..() - -/mob/living/carbon/human/AIize() - if (notransform) - return - for(var/t in organs) - del(t) - - return ..() - -/mob/living/carbon/AIize() - if (notransform) - return - for(var/obj/item/W in src) - unEquip(W) - regenerate_icons() - notransform = 1 - canmove = 0 - icon = null - invisibility = 101 - return ..() - -/mob/proc/AIize() - if(client) - src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jams for AIs - var/mob/living/silicon/ai/O = new (loc,,,1)//No MMI but safety is in effect. - O.invisibility = 0 - O.aiRestorePowerRoutine = 0 - - if(mind) - mind.transfer_to(O) - else - O.key = key - - var/obj/loc_landmark - for(var/obj/effect/landmark/start/sloc in landmarks_list) - if (sloc.name != "AI") - continue - if (locate(/mob/living) in sloc.loc) - continue - loc_landmark = sloc - if (!loc_landmark) - for(var/obj/effect/landmark/tripai in landmarks_list) - if (tripai.name == "tripai") - if(locate(/mob/living) in tripai.loc) - continue - loc_landmark = tripai - if (!loc_landmark) - O << "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone." - for(var/obj/effect/landmark/start/sloc in landmarks_list) - if (sloc.name == "AI") - loc_landmark = sloc - - O.loc = loc_landmark.loc - for (var/obj/item/device/radio/intercom/comm in O.loc) - comm.ai += O - - O << "You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras)." - O << "To look at other parts of the station, click on yourself to get a camera menu." - O << "While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc." - O << "To use something, simply click on it." - O << {"Use say ":b to speak to your cyborgs through binary."} - if (!(ticker && ticker.mode && (O.mind in ticker.mode.malf_ai))) - O.show_laws() - O << "These laws may be changed by other players, or by you being the traitor." - - O.verbs += /mob/living/silicon/ai/proc/ai_call_shuttle - O.verbs += /mob/living/silicon/ai/proc/show_laws_verb - O.verbs += /mob/living/silicon/ai/proc/ai_camera_track - O.verbs += /mob/living/silicon/ai/proc/ai_alerts - O.verbs += /mob/living/silicon/ai/proc/ai_camera_list - O.verbs += /mob/living/silicon/ai/proc/ai_statuschange - O.verbs += /mob/living/silicon/ai/proc/ai_roster - - O.job = "AI" - - O.rename_self("ai",1) - . = O - del(src) - return - - -//human -> robot -/mob/living/carbon/human/proc/Robotize(var/delete_items = 0) - if (notransform) - return - for(var/obj/item/W in src) - if(delete_items) - del(W) - else - unEquip(W) - regenerate_icons() - notransform = 1 - canmove = 0 - icon = null - invisibility = 101 - for(var/t in organs) - del(t) - - var/mob/living/silicon/robot/O = new /mob/living/silicon/robot( loc ) - - // cyborgs produced by Robotize get an automatic power cell - O.cell = new(O) - O.cell.maxcharge = 7500 - O.cell.charge = 7500 - - - O.gender = gender - O.invisibility = 0 - - - if(mind) //TODO - mind.transfer_to(O) - if(mind.special_role) - O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite") - else - O.key = key - - O.loc = loc - O.job = "Cyborg" - - O.mmi = new /obj/item/device/mmi(O) - O.mmi.transfer_identity(src)//Does not transfer key/client. - - . = O - del(src) - -//human -> alien -/mob/living/carbon/human/proc/Alienize() - if (notransform) - return - for(var/obj/item/W in src) - unEquip(W) - regenerate_icons() - notransform = 1 - canmove = 0 - icon = null - invisibility = 101 - for(var/t in organs) - del(t) - - var/alien_caste = pick("Hunter","Sentinel","Drone") - var/mob/living/carbon/alien/humanoid/new_xeno - switch(alien_caste) - if("Hunter") - new_xeno = new /mob/living/carbon/alien/humanoid/hunter(loc) - if("Sentinel") - new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(loc) - if("Drone") - new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc) - - new_xeno.a_intent = "harm" - new_xeno.key = key - - new_xeno << "You are now an alien." - . = new_xeno - del(src) - -/mob/living/carbon/human/proc/slimeize(reproduce as num) - if (notransform) - return - for(var/obj/item/W in src) - unEquip(W) - regenerate_icons() - notransform = 1 - canmove = 0 - icon = null - invisibility = 101 - for(var/t in organs) - del(t) - - var/mob/living/carbon/slime/new_slime - if(reproduce) - var/number = pick(14;2,3,4) //reproduce (has a small chance of producing 3 or 4 offspring) - var/list/babies = list() - for(var/i=1,i<=number,i++) - var/mob/living/carbon/slime/M = new/mob/living/carbon/slime(loc) - M.nutrition = round(nutrition/number) - step_away(M,src) - babies += M - new_slime = pick(babies) - else - new_slime = new /mob/living/carbon/slime(loc) - new_slime.a_intent = "harm" - new_slime.key = key - - new_slime << "You are now a slime. Skreee!" - . = new_slime - del(src) - -/mob/living/carbon/human/proc/Blobize() - if (notransform) - return - var/obj/effect/blob/core/new_blob = new /obj/effect/blob/core (loc) - if(!client) - for(var/mob/dead/observer/G in player_list) - if(ckey == "@[G.ckey]") - new_blob.create_overmind(G.client , 1) - break - else - new_blob.create_overmind(src.client , 1) - gib(src) - - - -/mob/living/carbon/human/proc/corgize() - if (notransform) - return - for(var/obj/item/W in src) - unEquip(W) - regenerate_icons() - notransform = 1 - canmove = 0 - icon = null - invisibility = 101 - for(var/t in organs) //this really should not be necessary - del(t) - - var/mob/living/simple_animal/corgi/new_corgi = new /mob/living/simple_animal/corgi (loc) - new_corgi.a_intent = "harm" - new_corgi.key = key - - new_corgi << "You are now a Corgi. Yap Yap!" - . = new_corgi - del(src) - -/mob/living/carbon/human/Animalize() - - var/list/mobtypes = typesof(/mob/living/simple_animal) - var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes - - if(!safe_animal(mobpath)) - usr << "\red Sorry but this mob type is currently unavailable." - return - - if(notransform) - return - for(var/obj/item/W in src) - unEquip(W) - - regenerate_icons() - notransform = 1 - canmove = 0 - icon = null - invisibility = 101 - - for(var/t in organs) - del(t) - - var/mob/new_mob = new mobpath(src.loc) - - new_mob.key = key - new_mob.a_intent = "harm" - - - new_mob << "You suddenly feel more... animalistic." - . = new_mob - del(src) - -/mob/proc/Animalize() - - var/list/mobtypes = typesof(/mob/living/simple_animal) - var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes - - if(!safe_animal(mobpath)) - usr << "\red Sorry but this mob type is currently unavailable." - return - - var/mob/new_mob = new mobpath(src.loc) - - new_mob.key = key - new_mob.a_intent = "harm" - new_mob << "You feel more... animalistic" - - . = new_mob - del(src) - -/* Certain mob types have problems and should not be allowed to be controlled by players. - * - * This proc is here to force coders to manually place their mob in this list, hopefully tested. - * This also gives a place to explain -why- players shouldnt be turn into certain mobs and hopefully someone can fix them. - */ -/mob/proc/safe_animal(var/MP) - -//Bad mobs! - Remember to add a comment explaining what's wrong with the mob - if(!MP) - return 0 //Sanity, this should never happen. - -// if(ispath(MP, /mob/living/simple_animal/space_worm)) //Goodbye Space Worms 2014 -// return 0 //Unfinished. Very buggy, they seem to just spawn additional space worms everywhere and eating your own tail results in new worms spawning. - - if(ispath(MP, /mob/living/simple_animal/construct/behemoth)) - return 0 //I think this may have been an unfinished WiP or something. These constructs should really have their own class simple_animal/construct/subtype - - if(ispath(MP, /mob/living/simple_animal/construct/armoured)) - return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype - - if(ispath(MP, /mob/living/simple_animal/construct/wraith)) - return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype - - if(ispath(MP, /mob/living/simple_animal/construct/builder)) - return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype - -//Good mobs! - if(ispath(MP, /mob/living/simple_animal/cat)) - return 1 - if(ispath(MP, /mob/living/simple_animal/corgi)) - return 1 - if(ispath(MP, /mob/living/simple_animal/crab)) - return 1 - if(ispath(MP, /mob/living/simple_animal/hostile/carp)) - return 1 - if(ispath(MP, /mob/living/simple_animal/hostile/mushroom)) - return 1 - if(ispath(MP, /mob/living/simple_animal/shade)) - return 1 - if(ispath(MP, /mob/living/simple_animal/tomato)) - return 1 - if(ispath(MP, /mob/living/simple_animal/mouse)) - return 1 //It is impossible to pull up the player panel for mice (Fixed! - Nodrak) - if(ispath(MP, /mob/living/simple_animal/hostile/bear)) - return 1 //Bears will auto-attack mobs, even if they're player controlled (Fixed! - Nodrak) - if(ispath(MP, /mob/living/simple_animal/parrot)) - return 1 //Parrots are no longer unfinished! -Nodrak - - //Not in here? Must be untested! - return 0 +/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG), newname = null) + if (notransform) + return + //Handle items on mob + + //first implants + var/list/implants = list() + if (tr_flags & TR_KEEPIMPLANTS) + for(var/obj/item/weapon/implant/W in src) + implants += W + + if(tr_flags & TR_KEEPITEMS) + for(var/obj/item/W in (src.contents-implants)) + unEquip(W) + + //Make mob invisible and spawn animation + regenerate_icons() + notransform = 1 + canmove = 0 + stunned = 1 + icon = null + invisibility = 101 + var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = src + flick("h2monkey", animation) + sleep(22) + //animation = null + var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc ) + qdel(animation) + + + + // hash the original name? + if (tr_flags & TR_HASHNAME) + O.name = "monkey ([copytext(md5(real_name), 2, 6)])" + O.real_name = "monkey ([copytext(md5(real_name), 2, 6)])" + if (newname) //if there's a name as an argument, always take that one over the current name + O.name = newname + O.real_name = newname + + //handle DNA and other attributes + O.dna = dna + dna = null + if (!(tr_flags & TR_KEEPSE)) + O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, RACEBLOCK, construct_block(BAD_MUTATION_DIFFICULTY,BAD_MUTATION_DIFFICULTY)) + if(suiciding) + O.suiciding = suiciding + O.loc = loc + O.a_intent = "harm" + + //keep viruses? + if (tr_flags & TR_KEEPVIRUS) + O.viruses = viruses + viruses = list() + for(var/datum/disease/D in O.viruses) + D.affected_mob = O + + //keep damage? + if (tr_flags & TR_KEEPDAMAGE) + O.setToxLoss(getToxLoss()) + O.adjustBruteLoss(getBruteLoss()) + O.setOxyLoss(getOxyLoss()) + O.adjustFireLoss(getFireLoss()) + + //re-add implants to new mob + for(var/obj/item/weapon/implant/I in implants) + I.loc = O + I.implanted = O + + //transfer mind and delete old mob + if(mind) + mind.transfer_to(O) + if (tr_flags & TR_DEFAULTMSG) + O << "You are now a monkey." + updateappearance(O) + . = O + if ( !(tr_flags & TR_KEEPSRC) ) //flag should be used if monkeyize() is called inside another proc of src so that one does not crash + qdel(src) + return + + + +////////////////////////// Humanize ////////////////////////////// +//Could probably be merged with monkeyize but other transformations got their own procs, too + +/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG), newname = null) + if (notransform) + return + //Handle items on mob + + //first implants + var/list/implants = list() + if (tr_flags & TR_KEEPIMPLANTS) + for(var/obj/item/weapon/implant/W in src) + implants += W + + //now the rest + if (tr_flags & TR_KEEPITEMS) + for(var/obj/item/W in (src.contents-implants)) + unEquip(W) + if (client) + client.screen -= W + if (W) + W.loc = loc + W.dropped(src) + W.layer = initial(W.layer) + + // for(var/obj/item/W in src) + // unEquip(W) + + //Make mob invisible and spawn animation + regenerate_icons() + notransform = 1 + canmove = 0 + stunned = 1 + icon = null + invisibility = 101 + var/atom/movable/overlay/animation = new( loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = src + flick("monkey2h", animation) + sleep(22) + var/mob/living/carbon/human/O = new( loc ) + for(var/obj/item/C in O.loc) + O.equip_to_appropriate_slot(C) + qdel(animation) + + + O.gender = (deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? FEMALE : MALE + O.dna = dna + dna = null + if (newname) //if there's a name as an argument, always take that one over the current name + O.real_name = newname + else + if ( !(cmptext ("monkey",copytext(O.dna.real_name,1,7)) ) ) + O.real_name = O.dna.real_name + else + O.real_name = random_name(O.gender) + O.name = O.real_name + + if (!(tr_flags & TR_KEEPSE)) + O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, RACEBLOCK, construct_block(1,BAD_MUTATION_DIFFICULTY)) + + if(suiciding) + O.suiciding = suiciding + + O.loc = loc + + //keep viruses? + if (tr_flags & TR_KEEPVIRUS) + O.viruses = viruses + viruses = list() + for(var/datum/disease/D in O.viruses) + D.affected_mob = O + + //keep damage? + if (tr_flags & TR_KEEPDAMAGE) + O.setToxLoss(getToxLoss()) + O.adjustBruteLoss(getBruteLoss()) + O.setOxyLoss(getOxyLoss()) + O.adjustFireLoss(getFireLoss()) + + //re-add implants to new mob + for(var/obj/item/weapon/implant/I in implants) + I.loc = O + I.implanted = O + + if(mind) + mind.transfer_to(O) + O.a_intent = "help" + if (tr_flags & TR_DEFAULTMSG) + O << "You are now a human." + updateappearance(O) + . = O + if ( !(tr_flags & TR_KEEPSRC) ) //don't delete src yet if it's needed to finish calling proc + qdel(src) + return + +/mob/new_player/AIize() + spawning = 1 + return ..() + +/mob/living/carbon/human/AIize() + if (notransform) + return + for(var/t in organs) + qdel(t) + + return ..() + +/mob/living/carbon/AIize() + if (notransform) + return + for(var/obj/item/W in src) + unEquip(W) + regenerate_icons() + notransform = 1 + canmove = 0 + icon = null + invisibility = 101 + return ..() + +/mob/proc/AIize() + if(client) + src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jams for AIs + var/mob/living/silicon/ai/O = new (loc,,,1)//No MMI but safety is in effect. + O.invisibility = 0 + O.aiRestorePowerRoutine = 0 + + if(mind) + mind.transfer_to(O) + else + O.key = key + + var/obj/loc_landmark + for(var/obj/effect/landmark/start/sloc in landmarks_list) + if (sloc.name != "AI") + continue + if (locate(/mob/living) in sloc.loc) + continue + loc_landmark = sloc + if (!loc_landmark) + for(var/obj/effect/landmark/tripai in landmarks_list) + if (tripai.name == "tripai") + if(locate(/mob/living) in tripai.loc) + continue + loc_landmark = tripai + if (!loc_landmark) + O << "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone." + for(var/obj/effect/landmark/start/sloc in landmarks_list) + if (sloc.name == "AI") + loc_landmark = sloc + + O.loc = loc_landmark.loc + for (var/obj/item/device/radio/intercom/comm in O.loc) + comm.ai += O + + O << "You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras)." + O << "To look at other parts of the station, click on yourself to get a camera menu." + O << "While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc." + O << "To use something, simply click on it." + O << {"Use say ":b to speak to your cyborgs through binary."} + if (!(ticker && ticker.mode && (O.mind in ticker.mode.malf_ai))) + O.show_laws() + O << "These laws may be changed by other players, or by you being the traitor." + + O.verbs += /mob/living/silicon/ai/proc/ai_call_shuttle + O.verbs += /mob/living/silicon/ai/proc/show_laws_verb + O.verbs += /mob/living/silicon/ai/proc/ai_camera_track + O.verbs += /mob/living/silicon/ai/proc/ai_alerts + O.verbs += /mob/living/silicon/ai/proc/ai_camera_list + O.verbs += /mob/living/silicon/ai/proc/ai_statuschange + O.verbs += /mob/living/silicon/ai/proc/ai_roster + + O.job = "AI" + + O.rename_self("ai",1) + . = O + qdel(src) + return + + +//human -> robot +/mob/living/carbon/human/proc/Robotize(var/delete_items = 0) + if (notransform) + return + for(var/obj/item/W in src) + if(delete_items) + qdel(W) + else + unEquip(W) + regenerate_icons() + notransform = 1 + canmove = 0 + icon = null + invisibility = 101 + for(var/t in organs) + qdel(t) + + var/mob/living/silicon/robot/O = new /mob/living/silicon/robot( loc ) + + if (config.rename_cyborg) + O.rename_self("cyborg", 1) + + // cyborgs produced by Robotize get an automatic power cell + O.cell = new(O) + O.cell.maxcharge = 7500 + O.cell.charge = 7500 + + + O.gender = gender + O.invisibility = 0 + + + if(mind) //TODO + mind.transfer_to(O) + if(mind.special_role) + O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite") + else + O.key = key + + O.loc = loc + O.job = "Cyborg" + + O.mmi = new /obj/item/device/mmi(O) + O.mmi.transfer_identity(src)//Does not transfer key/client. + + . = O + qdel(src) + +//human -> alien +/mob/living/carbon/human/proc/Alienize() + if (notransform) + return + for(var/obj/item/W in src) + unEquip(W) + regenerate_icons() + notransform = 1 + canmove = 0 + icon = null + invisibility = 101 + for(var/t in organs) + qdel(t) + + var/alien_caste = pick("Hunter","Sentinel","Drone") + var/mob/living/carbon/alien/humanoid/new_xeno + switch(alien_caste) + if("Hunter") + new_xeno = new /mob/living/carbon/alien/humanoid/hunter(loc) + if("Sentinel") + new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(loc) + if("Drone") + new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc) + + new_xeno.a_intent = "harm" + new_xeno.key = key + + new_xeno << "You are now an alien." + . = new_xeno + qdel(src) + +/mob/living/carbon/human/proc/slimeize(reproduce as num) + if (notransform) + return + for(var/obj/item/W in src) + unEquip(W) + regenerate_icons() + notransform = 1 + canmove = 0 + icon = null + invisibility = 101 + for(var/t in organs) + qdel(t) + + var/mob/living/carbon/slime/new_slime + if(reproduce) + var/number = pick(14;2,3,4) //reproduce (has a small chance of producing 3 or 4 offspring) + var/list/babies = list() + for(var/i=1,i<=number,i++) + var/mob/living/carbon/slime/M = new/mob/living/carbon/slime(loc) + M.nutrition = round(nutrition/number) + step_away(M,src) + babies += M + new_slime = pick(babies) + else + new_slime = new /mob/living/carbon/slime(loc) + new_slime.a_intent = "harm" + new_slime.key = key + + new_slime << "You are now a slime. Skreee!" + . = new_slime + qdel(src) + +/mob/living/carbon/human/proc/Blobize() + if (notransform) + return + var/obj/effect/blob/core/new_blob = new /obj/effect/blob/core (loc) + if(!client) + for(var/mob/dead/observer/G in player_list) + if(ckey == "@[G.ckey]") + new_blob.create_overmind(G.client , 1) + break + else + new_blob.create_overmind(src.client , 1) + gib(src) + + + +/mob/living/carbon/human/proc/corgize() + if (notransform) + return + for(var/obj/item/W in src) + unEquip(W) + regenerate_icons() + notransform = 1 + canmove = 0 + icon = null + invisibility = 101 + for(var/t in organs) //this really should not be necessary + qdel(t) + + var/mob/living/simple_animal/corgi/new_corgi = new /mob/living/simple_animal/corgi (loc) + new_corgi.a_intent = "harm" + new_corgi.key = key + + new_corgi << "You are now a Corgi. Yap Yap!" + . = new_corgi + qdel(src) + +/mob/living/carbon/human/Animalize() + + var/list/mobtypes = typesof(/mob/living/simple_animal) + var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes + + if(!safe_animal(mobpath)) + usr << "\red Sorry but this mob type is currently unavailable." + return + + if(notransform) + return + for(var/obj/item/W in src) + unEquip(W) + + regenerate_icons() + notransform = 1 + canmove = 0 + icon = null + invisibility = 101 + + for(var/t in organs) + qdel(t) + + var/mob/new_mob = new mobpath(src.loc) + + new_mob.key = key + new_mob.a_intent = "harm" + + + new_mob << "You suddenly feel more... animalistic." + . = new_mob + qdel(src) + +/mob/proc/Animalize() + + var/list/mobtypes = typesof(/mob/living/simple_animal) + var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes + + if(!safe_animal(mobpath)) + usr << "\red Sorry but this mob type is currently unavailable." + return + + var/mob/new_mob = new mobpath(src.loc) + + new_mob.key = key + new_mob.a_intent = "harm" + new_mob << "You feel more... animalistic" + + . = new_mob + qdel(src) + +/* Certain mob types have problems and should not be allowed to be controlled by players. + * + * This proc is here to force coders to manually place their mob in this list, hopefully tested. + * This also gives a place to explain -why- players shouldnt be turn into certain mobs and hopefully someone can fix them. + */ +/mob/proc/safe_animal(var/MP) + +//Bad mobs! - Remember to add a comment explaining what's wrong with the mob + if(!MP) + return 0 //Sanity, this should never happen. + +// if(ispath(MP, /mob/living/simple_animal/space_worm)) //Goodbye Space Worms 2014 +// return 0 //Unfinished. Very buggy, they seem to just spawn additional space worms everywhere and eating your own tail results in new worms spawning. + + if(ispath(MP, /mob/living/simple_animal/construct/behemoth)) + return 0 //I think this may have been an unfinished WiP or something. These constructs should really have their own class simple_animal/construct/subtype + + if(ispath(MP, /mob/living/simple_animal/construct/armoured)) + return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype + + if(ispath(MP, /mob/living/simple_animal/construct/wraith)) + return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype + + if(ispath(MP, /mob/living/simple_animal/construct/builder)) + return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype + +//Good mobs! + if(ispath(MP, /mob/living/simple_animal/cat)) + return 1 + if(ispath(MP, /mob/living/simple_animal/corgi)) + return 1 + if(ispath(MP, /mob/living/simple_animal/crab)) + return 1 + if(ispath(MP, /mob/living/simple_animal/hostile/carp)) + return 1 + if(ispath(MP, /mob/living/simple_animal/hostile/mushroom)) + return 1 + if(ispath(MP, /mob/living/simple_animal/shade)) + return 1 + if(ispath(MP, /mob/living/simple_animal/tomato)) + return 1 + if(ispath(MP, /mob/living/simple_animal/mouse)) + return 1 //It is impossible to pull up the player panel for mice (Fixed! - Nodrak) + if(ispath(MP, /mob/living/simple_animal/hostile/bear)) + return 1 //Bears will auto-attack mobs, even if they're player controlled (Fixed! - Nodrak) + if(ispath(MP, /mob/living/simple_animal/parrot)) + return 1 //Parrots are no longer unfinished! -Nodrak + + //Not in here? Must be untested! + return 0 diff --git a/code/modules/nano/JSON Reader.dm b/code/modules/nano/JSON Reader.dm index 12edf1dd5c0..638ff937a3f 100644 --- a/code/modules/nano/JSON Reader.dm +++ b/code/modules/nano/JSON Reader.dm @@ -1,205 +1,205 @@ -json_token - var - value - New(v) - src.value = v - text - number - word - symbol - eof - -json_reader - var - list - string = list("'", "\"") - symbols = list("{", "}", "\[", "]", ":", "\"", "'", ",") - sequences = list("b" = 8, "t" = 9, "n" = 10, "f" = 12, "r" = 13) - tokens - json - i = 1 - - - proc - // scanner - ScanJson(json) - src.json = json - . = new/list() - src.i = 1 - while(src.i <= lentext(json)) - var/char = get_char() - if(is_whitespace(char)) - i++ - continue - if(string.Find(char)) - . += read_string(char) - else if(symbols.Find(char)) - . += new/json_token/symbol(char) - else if(is_digit(char)) - . += read_number() - else - . += read_word() - i++ - . += new/json_token/eof() - - read_word() - var/val = "" - while(i <= lentext(json)) - var/char = get_char() - if(is_whitespace(char) || symbols.Find(char)) - i-- // let scanner handle this character - return new/json_token/word(val) - val += char - i++ - - read_string(delim) - var - escape = FALSE - val = "" - while(++i <= lentext(json)) - var/char = get_char() - if(escape) - switch(char) - if("\\", "'", "\"", "/", "u") - val += char - else - // TODO: support octal, hex, unicode sequences - ASSERT(sequences.Find(char)) - val += ascii2text(sequences[char]) - else - if(char == delim) - return new/json_token/text(val) - else if(char == "\\") - escape = TRUE - else - val += char - CRASH("Unterminated string.") - - read_number() - var/val = "" - var/char = get_char() - while(is_digit(char) || char == "." || lowertext(char) == "e") - val += char - i++ - char = get_char() - i-- // allow scanner to read the first non-number character - return new/json_token/number(text2num(val)) - - check_char() - ASSERT(args.Find(get_char())) - - get_char() - return copytext(json, i, i+1) - - is_whitespace(char) - return char == " " || char == "\t" || char == "\n" || text2ascii(char) == 13 - - is_digit(char) - var/c = text2ascii(char) - return 48 <= c && c <= 57 || char == "+" || char == "-" - - - // parser - ReadObject(list/tokens) - src.tokens = tokens - . = new/list() - i = 1 - read_token("{", /json_token/symbol) - while(i <= tokens.len) - var/json_token/K = get_token() - check_type(/json_token/word, /json_token/text) - next_token() - read_token(":", /json_token/symbol) - - .[K.value] = read_value() - - var/json_token/S = get_token() - check_type(/json_token/symbol) - switch(S.value) - if(",") - next_token() - continue - if("}") - next_token() - return - else - die() - - get_token() - return tokens[i] - - next_token() - return tokens[++i] - - read_token(val, type) - var/json_token/T = get_token() - if(!(T.value == val && istype(T, type))) - CRASH("Expected '[val]', found '[T.value]'.") - next_token() - return T - - check_type(...) - var/json_token/T = get_token() - for(var/type in args) - if(istype(T, type)) - return - CRASH("Bad token type: [T.type].") - - check_value(...) - var/json_token/T = get_token() - ASSERT(args.Find(T.value)) - - read_key() - var/char = get_char() - if(char == "\"" || char == "'") - return read_string(char) - - read_value() - var/json_token/T = get_token() - switch(T.type) - if(/json_token/text, /json_token/number) - next_token() - return T.value - if(/json_token/word) - next_token() - switch(T.value) - if("true") - return TRUE - if("false") - return FALSE - if("null") - return null - if(/json_token/symbol) - switch(T.value) - if("\[") - return read_array() - if("{") - return ReadObject(tokens.Copy(i)) - die() - - read_array() - read_token("\[", /json_token/symbol) - . = new/list() - var/list/L = . - while(i <= tokens.len) - // Avoid using Add() or += in case a list is returned. - L.len++ - L[L.len] = read_value() - var/json_token/T = get_token() - check_type(/json_token/symbol) - switch(T.value) - if(",") - next_token() - continue - if("]") - next_token() - return - else - die() - next_token() - CRASH("Unterminated array.") - - - die(json_token/T) - if(!T) T = get_token() +json_token + var + value + New(v) + src.value = v + text + number + word + symbol + eof + +json_reader + var + list + string = list("'", "\"") + symbols = list("{", "}", "\[", "]", ":", "\"", "'", ",") + sequences = list("b" = 8, "t" = 9, "n" = 10, "f" = 12, "r" = 13) + tokens + json + i = 1 + + + proc + // scanner + ScanJson(json) + src.json = json + . = new/list() + src.i = 1 + while(src.i <= lentext(json)) + var/char = get_char() + if(is_whitespace(char)) + i++ + continue + if(string.Find(char)) + . += read_string(char) + else if(symbols.Find(char)) + . += new/json_token/symbol(char) + else if(is_digit(char)) + . += read_number() + else + . += read_word() + i++ + . += new/json_token/eof() + + read_word() + var/val = "" + while(i <= lentext(json)) + var/char = get_char() + if(is_whitespace(char) || symbols.Find(char)) + i-- // let scanner handle this character + return new/json_token/word(val) + val += char + i++ + + read_string(delim) + var + escape = FALSE + val = "" + while(++i <= lentext(json)) + var/char = get_char() + if(escape) + switch(char) + if("\\", "'", "\"", "/", "u") + val += char + else + // TODO: support octal, hex, unicode sequences + ASSERT(sequences.Find(char)) + val += ascii2text(sequences[char]) + else + if(char == delim) + return new/json_token/text(val) + else if(char == "\\") + escape = TRUE + else + val += char + CRASH("Unterminated string.") + + read_number() + var/val = "" + var/char = get_char() + while(is_digit(char) || char == "." || lowertext(char) == "e") + val += char + i++ + char = get_char() + i-- // allow scanner to read the first non-number character + return new/json_token/number(text2num(val)) + + check_char() + ASSERT(args.Find(get_char())) + + get_char() + return copytext(json, i, i+1) + + is_whitespace(char) + return char == " " || char == "\t" || char == "\n" || text2ascii(char) == 13 + + is_digit(char) + var/c = text2ascii(char) + return 48 <= c && c <= 57 || char == "+" || char == "-" + + + // parser + ReadObject(list/tokens) + src.tokens = tokens + . = new/list() + i = 1 + read_token("{", /json_token/symbol) + while(i <= tokens.len) + var/json_token/K = get_token() + check_type(/json_token/word, /json_token/text) + next_token() + read_token(":", /json_token/symbol) + + .[K.value] = read_value() + + var/json_token/S = get_token() + check_type(/json_token/symbol) + switch(S.value) + if(",") + next_token() + continue + if("}") + next_token() + return + else + die() + + get_token() + return tokens[i] + + next_token() + return tokens[++i] + + read_token(val, type) + var/json_token/T = get_token() + if(!(T.value == val && istype(T, type))) + CRASH("Expected '[val]', found '[T.value]'.") + next_token() + return T + + check_type(...) + var/json_token/T = get_token() + for(var/type in args) + if(istype(T, type)) + return + CRASH("Bad token type: [T.type].") + + check_value(...) + var/json_token/T = get_token() + ASSERT(args.Find(T.value)) + + read_key() + var/char = get_char() + if(char == "\"" || char == "'") + return read_string(char) + + read_value() + var/json_token/T = get_token() + switch(T.type) + if(/json_token/text, /json_token/number) + next_token() + return T.value + if(/json_token/word) + next_token() + switch(T.value) + if("true") + return TRUE + if("false") + return FALSE + if("null") + return null + if(/json_token/symbol) + switch(T.value) + if("\[") + return read_array() + if("{") + return ReadObject(tokens.Copy(i)) + die() + + read_array() + read_token("\[", /json_token/symbol) + . = new/list() + var/list/L = . + while(i <= tokens.len) + // Avoid using Add() or += in case a list is returned. + L.len++ + L[L.len] = read_value() + var/json_token/T = get_token() + check_type(/json_token/symbol) + switch(T.value) + if(",") + next_token() + continue + if("]") + next_token() + return + else + die() + next_token() + CRASH("Unterminated array.") + + + die(json_token/T) + if(!T) T = get_token() CRASH("Unexpected token: [T.value].") \ No newline at end of file diff --git a/code/modules/nano/JSON Writer.dm b/code/modules/nano/JSON Writer.dm index 3cd3520f177..4398e5b8970 100644 --- a/code/modules/nano/JSON Writer.dm +++ b/code/modules/nano/JSON Writer.dm @@ -1,59 +1,59 @@ - -json_writer - proc - WriteObject(list/L) - . = "{" - var/i = 1 - for(var/k in L) - var/val = L[k] - . += {"\"[k]\":[write(val)]"} - if(i++ < L.len) - . += "," - .+= "}" - - write(val) - if(isnum(val)) - return num2text(val, 100) - else if(isnull(val)) - return "null" - else if(istype(val, /list)) - if(is_associative(val)) - return WriteObject(val) - else - return write_array(val) - else - . += write_string("[val]") - - write_array(list/L) - . = "\[" - for(var/i = 1 to L.len) - . += write(L[i]) - if(i < L.len) - . += "," - . += "]" - - write_string(txt) - var/static/list/json_escape = list("\\", "\"", "'", "\n") - for(var/targ in json_escape) - var/start = 1 - while(start <= lentext(txt)) - var/i = findtext(txt, targ, start) - if(!i) - break - if(targ == "\n") - txt = copytext(txt, 1, i) + "\\n" + copytext(txt, i+2) - start = i + 1 // 1 character added - if(targ == "'") - txt = copytext(txt, 1, i) + "`" + copytext(txt, i+1) // apostrophies fuck shit up... - start = i + 1 // 1 character added - else - txt = copytext(txt, 1, i) + "\\" + copytext(txt, i) - start = i + 2 // 2 characters added - - return {""[txt]""} - - is_associative(list/L) - for(var/key in L) - // if the key is a list that means it's actually an array of lists (stupid Byond...) - if(!isnum(key) && !istype(key, /list)) - return TRUE + +json_writer + proc + WriteObject(list/L) + . = "{" + var/i = 1 + for(var/k in L) + var/val = L[k] + . += {"\"[k]\":[write(val)]"} + if(i++ < L.len) + . += "," + .+= "}" + + write(val) + if(isnum(val)) + return num2text(val, 100) + else if(isnull(val)) + return "null" + else if(istype(val, /list)) + if(is_associative(val)) + return WriteObject(val) + else + return write_array(val) + else + . += write_string("[val]") + + write_array(list/L) + . = "\[" + for(var/i = 1 to L.len) + . += write(L[i]) + if(i < L.len) + . += "," + . += "]" + + write_string(txt) + var/static/list/json_escape = list("\\", "\"", "'", "\n") + for(var/targ in json_escape) + var/start = 1 + while(start <= lentext(txt)) + var/i = findtext(txt, targ, start) + if(!i) + break + if(targ == "\n") + txt = copytext(txt, 1, i) + "\\n" + copytext(txt, i+2) + start = i + 1 // 1 character added + if(targ == "'") + txt = copytext(txt, 1, i) + "`" + copytext(txt, i+1) // apostrophies fuck shit up... + start = i + 1 // 1 character added + else + txt = copytext(txt, 1, i) + "\\" + copytext(txt, i) + start = i + 2 // 2 characters added + + return {""[txt]""} + + is_associative(list/L) + for(var/key in L) + // if the key is a list that means it's actually an array of lists (stupid Byond...) + if(!isnum(key) && !istype(key, /list)) + return TRUE diff --git a/code/modules/nano/_JSON.dm b/code/modules/nano/_JSON.dm index 5692e643baa..ee8b9bdf499 100644 --- a/code/modules/nano/_JSON.dm +++ b/code/modules/nano/_JSON.dm @@ -1,12 +1,12 @@ -/* -n_Json v11.3.21 -*/ - -proc - json2list(json) - var/static/json_reader/_jsonr = new() - return _jsonr.ReadObject(_jsonr.ScanJson(json)) - - list2json(list/L) - var/static/json_writer/_jsonw = new() - return _jsonw.WriteObject(L) +/* +n_Json v11.3.21 +*/ + +proc + json2list(json) + var/static/json_reader/_jsonr = new() + return _jsonr.ReadObject(_jsonr.ScanJson(json)) + + list2json(list/L) + var/static/json_writer/_jsonw = new() + return _jsonw.WriteObject(L) diff --git a/code/modules/nano/nanoexternal.dm b/code/modules/nano/nanoexternal.dm index 2331debd9be..a6b2485f665 100644 --- a/code/modules/nano/nanoexternal.dm +++ b/code/modules/nano/nanoexternal.dm @@ -1,43 +1,43 @@ - // This file contains all Nano procs/definitions for external classes/objects - - /** - * Called when a Nano UI window is closed - * This is how Nano handles closed windows - * It must be a verb so that it can be called using winset - * - * @return nothing - */ -/client/verb/nanoclose(var/uiref as text) - set hidden = 1 // hide this verb from the user's panel - set name = "nanoclose" - - var/datum/nanoui/ui = locate(uiref) - - if (istype(ui)) - ui.close() - - if(ui.ref) - var/href = "close=1" - src.Topic(href, params2list(href), ui.ref) // this will direct to the atom's Topic() proc via client.Topic() - else if (ui.on_close_logic) - // no atomref specified (or not found) - // so just reset the user mob's machine var - if(src && src.mob) - src.mob.unset_machine() - - /** - * The ui_interact proc is used to open and update Nano UIs - * If ui_interact is not used then the UI will not update correctly - * ui_interact is currently defined for /atom/movable - * - * @param user /mob The mob who is interacting with this ui - * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main") - * @param ui /datum/nanoui This parameter is passed by the nanoui process() proc when updating an open ui - * - * @return nothing - */ -/atom/movable/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) - return - -// Used by the Nano UI Manager (/datum/nanomanager) to track UIs opened by this mob -/mob/var/list/open_uis = list() + // This file contains all Nano procs/definitions for external classes/objects + + /** + * Called when a Nano UI window is closed + * This is how Nano handles closed windows + * It must be a verb so that it can be called using winset + * + * @return nothing + */ +/client/verb/nanoclose(var/uiref as text) + set hidden = 1 // hide this verb from the user's panel + set name = "nanoclose" + + var/datum/nanoui/ui = locate(uiref) + + if (istype(ui)) + ui.close() + + if(ui.ref) + var/href = "close=1" + src.Topic(href, params2list(href), ui.ref) // this will direct to the atom's Topic() proc via client.Topic() + else if (ui.on_close_logic) + // no atomref specified (or not found) + // so just reset the user mob's machine var + if(src && src.mob) + src.mob.unset_machine() + + /** + * The ui_interact proc is used to open and update Nano UIs + * If ui_interact is not used then the UI will not update correctly + * ui_interact is currently defined for /atom/movable + * + * @param user /mob The mob who is interacting with this ui + * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main") + * @param ui /datum/nanoui This parameter is passed by the nanoui process() proc when updating an open ui + * + * @return nothing + */ +/atom/movable/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) + return + +// Used by the Nano UI Manager (/datum/nanomanager) to track UIs opened by this mob +/mob/var/list/open_uis = list() diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm index b7b45060bb7..9b8be6ce99e 100644 --- a/code/modules/nano/nanomanager.dm +++ b/code/modules/nano/nanomanager.dm @@ -1,200 +1,200 @@ -// This is the window/UI manager for Nano UI -// There should only ever be one (global) instance of nanomanger -/datum/nanomanager - // a list of current open /nanoui UIs, grouped by src_object and ui_key - var/open_uis[0] - // a list of current open /nanoui UIs, not grouped, for use in processing - var/list/processing_uis = list() - - /** - * Create a new nanomanager instance. - * - * @return /nanomanager new nanomanager object - */ -/datum/nanomanager/New() - return - - /** - * Get an open /nanoui ui for the current user, src_object and ui_key and try to update it with data - * - * @param user /mob The mob who opened/owns the ui - * @param src_object /obj|/mob The obj or mob which the ui belongs to - * @param ui_key string A string key used for the ui - * @param ui /datum/nanoui An existing instance of the ui (can be null) - * @param data list The data to be passed to the ui, if it exists - * - * @return /nanoui Returns the found ui, for null if none exists - */ -/datum/nanomanager/proc/try_update_ui(var/mob/user, src_object, ui_key, var/datum/nanoui/ui, data) - if (isnull(ui)) // no ui has been passed, so we'll search for one - { - ui = get_open_ui(user, src_object, ui_key) - } - if (!isnull(ui)) - // The UI is already open so push the data to it - ui.push_data(data) - return ui - - return null - - /** - * Get an open /nanoui ui for the current user, src_object and ui_key - * - * @param user /mob The mob who opened/owns the ui - * @param src_object /obj|/mob The obj or mob which the ui belongs to - * @param ui_key string A string key used for the ui - * - * @return /nanoui Returns the found ui, or null if none exists - */ -/datum/nanomanager/proc/get_open_ui(var/mob/user, src_object, ui_key) - var/src_object_key = "\ref[src_object]" - if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) - return null - else if (isnull(open_uis[src_object_key][ui_key]) || !istype(open_uis[src_object_key][ui_key], /list)) - return null - - for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) - if (ui.user == user) - return ui - - return null - - /** - * Update all /nanoui uis attached to src_object - * - * @param src_object /obj|/mob The obj or mob which the uis are attached to - * - * @return int The number of uis updated - */ -/datum/nanomanager/proc/update_uis(src_object) - var/src_object_key = "\ref[src_object]" - if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) - return 0 - - var/update_count = 0 - for (var/ui_key in open_uis[src_object_key]) - for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) - if(ui && ui.src_object && ui.user) - ui.process(1) - update_count++ - return update_count - - /** - * Update /nanoui uis belonging to user - * - * @param user /mob The mob who owns the uis - * @param src_object /obj|/mob If src_object is provided, only update uis which are attached to src_object (optional) - * @param ui_key string If ui_key is provided, only update uis with a matching ui_key (optional) - * - * @return int The number of uis updated - */ -/datum/nanomanager/proc/update_user_uis(var/mob/user, src_object = null, ui_key = null) - if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) - return 0 // has no open uis - - var/update_count = 0 - for (var/datum/nanoui/ui in user.open_uis) - 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(1) - update_count++ - - return update_count - - /** - * Close /nanoui uis belonging to user - * - * @param user /mob The mob who owns the uis - * @param src_object /obj|/mob If src_object is provided, only close uis which are attached to src_object (optional) - * @param ui_key string If ui_key is provided, only close uis with a matching ui_key (optional) - * - * @return int The number of uis closed - */ -/datum/nanomanager/proc/close_user_uis(var/mob/user, src_object = null, ui_key = null) - if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) - return 0 // has no open uis - - var/close_count = 0 - for (var/datum/nanoui/ui in user.open_uis) - 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_count++ - - return close_count - - /** - * Add a /nanoui ui to the list of open uis - * This is called by the /nanoui open() proc - * - * @param ui /nanoui The ui to add - * - * @return nothing - */ -/datum/nanomanager/proc/ui_opened(var/datum/nanoui/ui) - var/src_object_key = "\ref[ui.src_object]" - if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) - open_uis[src_object_key] = list(ui.ui_key = list()) - 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(); - - ui.user.open_uis.Add(ui) - var/list/uis = open_uis[src_object_key][ui.ui_key] - uis.Add(ui) - processing_uis.Add(ui) - - /** - * Remove a /nanoui ui from the list of open uis - * This is called by the /nanoui close() proc - * - * @param ui /nanoui The ui to remove - * - * @return int 0 if no ui was removed, 1 if removed successfully - */ -/datum/nanomanager/proc/ui_closed(var/datum/nanoui/ui) - var/src_object_key = "\ref[ui.src_object]" - if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) - return 0 // 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 0 // wasn't open - - processing_uis.Remove(ui) - ui.user.open_uis.Remove(ui) - var/list/uis = open_uis[src_object_key][ui.ui_key] - return uis.Remove(ui) - - /** - * This is called on user logout - * Closes/clears all uis attached to the user's /mob - * - * @param user /mob The user's mob - * - * @return nothing - */ - -// -/datum/nanomanager/proc/user_logout(var/mob/user) - return close_user_uis(user) - - /** - * This is called when a player transfers from one mob to another - * Transfers all open UIs to the new mob - * - * @param oldMob /mob The user's old mob - * @param newMob /mob The user's new mob - * - * @return nothing - */ -/datum/nanomanager/proc/user_transferred(var/mob/oldMob, var/mob/newMob) - if (isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0) - return 0 // has no open uis - - if (isnull(newMob.open_uis) || !istype(newMob.open_uis, /list)) - newMob.open_uis = list() - - for (var/datum/nanoui/ui in oldMob.open_uis) - ui.user = newMob - newMob.open_uis.Add(ui) - - oldMob.open_uis.Cut() - - return 1 // success - +// This is the window/UI manager for Nano UI +// There should only ever be one (global) instance of nanomanger +/datum/nanomanager + // a list of current open /nanoui UIs, grouped by src_object and ui_key + var/open_uis[0] + // a list of current open /nanoui UIs, not grouped, for use in processing + var/list/processing_uis = list() + + /** + * Create a new nanomanager instance. + * + * @return /nanomanager new nanomanager object + */ +/datum/nanomanager/New() + return + + /** + * Get an open /nanoui ui for the current user, src_object and ui_key and try to update it with data + * + * @param user /mob The mob who opened/owns the ui + * @param src_object /obj|/mob The obj or mob which the ui belongs to + * @param ui_key string A string key used for the ui + * @param ui /datum/nanoui An existing instance of the ui (can be null) + * @param data list The data to be passed to the ui, if it exists + * + * @return /nanoui Returns the found ui, for null if none exists + */ +/datum/nanomanager/proc/try_update_ui(var/mob/user, src_object, ui_key, var/datum/nanoui/ui, data) + if (isnull(ui)) // no ui has been passed, so we'll search for one + { + ui = get_open_ui(user, src_object, ui_key) + } + if (!isnull(ui)) + // The UI is already open so push the data to it + ui.push_data(data) + return ui + + return null + + /** + * Get an open /nanoui ui for the current user, src_object and ui_key + * + * @param user /mob The mob who opened/owns the ui + * @param src_object /obj|/mob The obj or mob which the ui belongs to + * @param ui_key string A string key used for the ui + * + * @return /nanoui Returns the found ui, or null if none exists + */ +/datum/nanomanager/proc/get_open_ui(var/mob/user, src_object, ui_key) + var/src_object_key = "\ref[src_object]" + if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) + return null + else if (isnull(open_uis[src_object_key][ui_key]) || !istype(open_uis[src_object_key][ui_key], /list)) + return null + + for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) + if (ui.user == user) + return ui + + return null + + /** + * Update all /nanoui uis attached to src_object + * + * @param src_object /obj|/mob The obj or mob which the uis are attached to + * + * @return int The number of uis updated + */ +/datum/nanomanager/proc/update_uis(src_object) + var/src_object_key = "\ref[src_object]" + if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) + return 0 + + var/update_count = 0 + for (var/ui_key in open_uis[src_object_key]) + for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) + if(ui && ui.src_object && ui.user) + ui.process(1) + update_count++ + return update_count + + /** + * Update /nanoui uis belonging to user + * + * @param user /mob The mob who owns the uis + * @param src_object /obj|/mob If src_object is provided, only update uis which are attached to src_object (optional) + * @param ui_key string If ui_key is provided, only update uis with a matching ui_key (optional) + * + * @return int The number of uis updated + */ +/datum/nanomanager/proc/update_user_uis(var/mob/user, src_object = null, ui_key = null) + if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) + return 0 // has no open uis + + var/update_count = 0 + for (var/datum/nanoui/ui in user.open_uis) + 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(1) + update_count++ + + return update_count + + /** + * Close /nanoui uis belonging to user + * + * @param user /mob The mob who owns the uis + * @param src_object /obj|/mob If src_object is provided, only close uis which are attached to src_object (optional) + * @param ui_key string If ui_key is provided, only close uis with a matching ui_key (optional) + * + * @return int The number of uis closed + */ +/datum/nanomanager/proc/close_user_uis(var/mob/user, src_object = null, ui_key = null) + if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) + return 0 // has no open uis + + var/close_count = 0 + for (var/datum/nanoui/ui in user.open_uis) + 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_count++ + + return close_count + + /** + * Add a /nanoui ui to the list of open uis + * This is called by the /nanoui open() proc + * + * @param ui /nanoui The ui to add + * + * @return nothing + */ +/datum/nanomanager/proc/ui_opened(var/datum/nanoui/ui) + var/src_object_key = "\ref[ui.src_object]" + if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) + open_uis[src_object_key] = list(ui.ui_key = list()) + 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(); + + ui.user.open_uis.Add(ui) + var/list/uis = open_uis[src_object_key][ui.ui_key] + uis.Add(ui) + processing_uis.Add(ui) + + /** + * Remove a /nanoui ui from the list of open uis + * This is called by the /nanoui close() proc + * + * @param ui /nanoui The ui to remove + * + * @return int 0 if no ui was removed, 1 if removed successfully + */ +/datum/nanomanager/proc/ui_closed(var/datum/nanoui/ui) + var/src_object_key = "\ref[ui.src_object]" + if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) + return 0 // 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 0 // wasn't open + + processing_uis.Remove(ui) + ui.user.open_uis.Remove(ui) + var/list/uis = open_uis[src_object_key][ui.ui_key] + return uis.Remove(ui) + + /** + * This is called on user logout + * Closes/clears all uis attached to the user's /mob + * + * @param user /mob The user's mob + * + * @return nothing + */ + +// +/datum/nanomanager/proc/user_logout(var/mob/user) + return close_user_uis(user) + + /** + * This is called when a player transfers from one mob to another + * Transfers all open UIs to the new mob + * + * @param oldMob /mob The user's old mob + * @param newMob /mob The user's new mob + * + * @return nothing + */ +/datum/nanomanager/proc/user_transferred(var/mob/oldMob, var/mob/newMob) + if (isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0) + return 0 // has no open uis + + if (isnull(newMob.open_uis) || !istype(newMob.open_uis, /list)) + newMob.open_uis = list() + + for (var/datum/nanoui/ui in oldMob.open_uis) + ui.user = newMob + newMob.open_uis.Add(ui) + + oldMob.open_uis.Cut() + + return 1 // success + diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 7b684aefb25..496f79b55ba 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -1,414 +1,414 @@ -/********************************************************** -NANO UI FRAMEWORK - -nanoui class (or whatever Byond calls classes) - -nanoui is used to open and update nano browser uis -**********************************************************/ - - -#define STATUS_INTERACTIVE 2 // GREEN Visability -#define STATUS_UPDATE 1 // ORANGE Visability -#define STATUS_DISABLED 0 // RED Visability - -/datum/nanoui - // the user who opened this ui - var/mob/user - // the object this ui "belongs" to - var/atom/movable/src_object - // the title of this ui - var/title - // the key of this ui, this is to allow multiple (different) uis for each src_object - var/ui_key - // window_id is used as the window name/identifier for browse and onclose - var/window_id - // the browser window width - var/width = 0 - // the browser window height - var/height = 0 - // whether to use extra logic when window closes - var/on_close_logic = 1 - // an extra ref to use when the window is closed, usually null - var/atom/ref = null - // options for modifying window behaviour - var/window_options = "focus=0;can_close=1;can_minimize=1;can_maximize=0;can_resize=1;titlebar=1;" // window option is set using window_id - // the list of stylesheets to apply to this ui - var/list/stylesheets = list() - // the list of javascript scripts to use for this ui - var/list/scripts = list() - // the list of templates to use with this ui (usually just one) - var/templates[0] - // the body content for this ui, do not change unless you know what you're doing - // the #mainTemplate div will contain the compiled "main" template html - var/content = "
    " - // initial data, containing the full data structure, must be sent to the ui (the data structure cannot be extended later on) - var/list/initial_data[0] - // set to 1 to update the ui automatically every master_controller tick - var/is_auto_updating = 0 - // the current status/visibility of the ui - var/status = STATUS_INTERACTIVE - - // Only allow users with a certain user.stat to get updates. Defaults to 0 (concious) - var/allowed_user_stat = 0 // -1 = ignore, 0 = alive, 1 = unconcious or alive, 2 = dead concious or alive - - /** - * Create a new nanoui instance. - * - * @param nuser /mob The mob who has opened/owns this ui - * @param nsrc_object /obj|/mob The obj or mob which this ui belongs to - * @param nui_key string A string key to use for this ui. Allows for multiple unique uis on one src_oject - * @param ntemplate string The name of the template file from /nano/templates (e.g. "my_template.tmpl") - * @param ntitle string The title of this ui - * @param nwidth int the width of the ui window - * @param nheight int the height of the ui window - * @param nref /atom A custom ref to use if "on_close_logic" is set to 1 - * - * @return /nanoui new nanoui object - */ -/datum/nanoui/New(nuser, nsrc_object, nui_key, ntemplate, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null) - user = nuser - src_object = nsrc_object - ui_key = nui_key - window_id = "[ui_key]\ref[src_object]" - - // Add the passed template as the 'main' template, this is required - add_template("main", ntemplate) - - if (ntitle) - title = ntitle - if (nwidth) - width = nwidth - if (nheight) - height = nheight - if (nref) - ref = nref - - add_common_assets() - - /** - * Use this proc to add assets which are common to all nano uis - * - * @return nothing - */ -/datum/nanoui/proc/add_common_assets() - add_script("libraries.min.js") // The jQuery library - add_script("nano_config.js") // The NanoConfig JS, this is used to store configuration values. - add_script("nano_update.js") // The NanoUpdate JS, this is used to receive updates and apply them. - add_script("nano_base_helpers.js") // The NanoBaseHelpers JS, this is used to set up template helpers which are common to all templates - add_stylesheet("shared.css") // this CSS sheet is common to all UIs - add_stylesheet("icons.css") // this CSS sheet is common to all UIs - - /** - * Set the current status (also known as visibility) of this ui. - * - * @param state int The status to set, see the defines at the top of this file - * @param push_update int (bool) Push an update to the ui to update it's status (an update is always sent if the status has changed to red (0)) - * - * @return nothing - */ -/datum/nanoui/proc/set_status(state, push_update) - if (state != status) - status = state - if (push_update || !status) - push_data(list(), 1) // Update the UI, force the update in case the status is 0 - else - status = state - - /** - * Update the status (visibility) of this ui based on the user's status - * - * @param push_update int (bool) Push an update to the ui to update it's status. This is set to 0/false if an update is going to be pushed anyway (to avoid unnessary updates) - * - * @return nothing - */ -/datum/nanoui/proc/update_status(push_update = 0) - if (istype(user, /mob/living/silicon/ai)) - set_status(STATUS_INTERACTIVE, push_update) // interactive (green visibility) - else if (istype(user, /mob/living/silicon/robot)) - if (src_object in view(7, user)) // robots can see and interact with things they can see within 7 tiles - set_status(STATUS_INTERACTIVE, push_update) // interactive (green visibility) - else - set_status(STATUS_DISABLED, push_update) // no updates, completely disabled (red visibility) - else - var/dist = get_dist(src_object, user) - - if (dist > 4) - close() - return - - if ((allowed_user_stat > -1) && (user.stat > allowed_user_stat)) - set_status(STATUS_DISABLED, push_update) // no updates, completely disabled (red visibility) - else if (user.restrained() || user.lying) - set_status(STATUS_UPDATE, push_update) // update only (orange visibility) - else if (!(src_object in view(4, user))) // If the src object is not in visable, set status to 0 - set_status(STATUS_DISABLED, push_update) // interactive (green visibility) - else if (dist <= 1) - set_status(STATUS_INTERACTIVE, push_update) // interactive (green visibility) - else if (dist <= 2) - set_status(STATUS_UPDATE, push_update) // update only (orange visibility) - else if (dist <= 4) - set_status(STATUS_DISABLED, push_update) // no updates, completely disabled (red visibility) - - /** - * Set the ui to auto update (every master_controller tick) - * - * @param state int (bool) Set auto update to 1 or 0 (true/false) - * - * @return nothing - */ -/datum/nanoui/proc/set_auto_update(state = 1) - is_auto_updating = state - - /** - * Set the initial data for the ui. This is vital as the data structure set here cannot be changed when pushing new updates. - * - * @param data /list The list of data for this ui - * - * @return nothing - */ -/datum/nanoui/proc/set_initial_data(list/data) - initial_data = add_default_data(data) - - /** - * Add default data to the data being sent to the ui. - * - * @param data /list The list of data to be modified - * - * @return /list modified data - */ -/datum/nanoui/proc/add_default_data(list/data) - data["ui"] = list( - "status" = status, - "user" = list("name" = user.name) - ) - return data - - /** - * Set the browser window options for this ui - * - * @param nwindow_options string The new window options - * - * @return nothing - */ -/datum/nanoui/proc/set_window_options(nwindow_options) - window_options = nwindow_options - - /** - * Add a CSS stylesheet to this UI - * - * @param file string The name of the CSS file from /nano/css (e.g. "my_style.css") - * - * @return nothing - */ -/datum/nanoui/proc/add_stylesheet(file) - stylesheets.Add(file) - - /** - * Add a JavsScript script to this UI - * - * @param file string The name of the JavaScript file from /nano/js (e.g. "my_script.js") - * - * @return nothing - */ -/datum/nanoui/proc/add_script(file) - scripts.Add(file) - - /** - * Add a template to this UI - * Templates are combined with the data sent to the UI to create the rendered view - * Each template needs a div in ui.content to contain the rendered content. - * The div format is '
    ' where is replaced with the templater's key. - * All UIs are set up by default to use a 'main' template, so only use this proc if you want to add advanced functionality. - * - * @param key string The key name for this template, used to identify the div to render this template into ('
    ') - * @param file string The name of the template file from /nano/templates (e.g. "my_template.tmpl") - * - * @return nothing - */ -/datum/nanoui/proc/add_template(key, file) - templates[key] = file - - /** - * Set the HTML content of the UI - * This should only really be used to add more template divs (see the add_template() proc) - * - * @param ncontent string The new HTML content for this UI - * - * @return nothing - */ -/datum/nanoui/proc/set_content(ncontent) - content = ncontent - - /** - * Set whether or not to use the "old" on close logic (mainly unset_machine()) - * - * @param state int (bool) Set on_close_logic to 1 or 0 (true/false) - * - * @return nothing - */ -/datum/nanoui/proc/use_on_close_logic(state) - on_close_logic = state - - /** - * Return the HTML header content for this UI - * - * @return string HTML header content - */ -/datum/nanoui/proc/get_header() - var/head_content = "" - - for (var/filename in scripts) - head_content += " " - - for (var/filename in stylesheets) - head_content += " " - - var/templatel_data[0] - for (var/key in templates) - templatel_data[key] = templates[key]; - - var/template_data_json = "{}" // An empty JSON object - if (templatel_data.len > 0) - template_data_json = list2json(templatel_data) - - var/initial_data_json = "{}" // An empty JSON object - if (initial_data.len > 0) - initial_data_json = list2json(initial_data) - - var/url_parameters_json = list2json(list("src" = "\ref[src]")) - - return {" - - - - - [head_content] - - -
    - [title ? "
    [title]
    " : ""] -
    -
    Initiating...
    - "} - - /** - * Return the HTML footer content for this UI - * - * @return string HTML footer content - */ -/datum/nanoui/proc/get_footer() - - return {" -
    -
    - -"} - - /** - * Return the HTML for this UI - * - * @return string HTML for the UI - */ -/datum/nanoui/proc/get_html() - return {" - [get_header()] - [content] - [get_footer()] - "} - - /** - * Open this UI - * - * @return nothing - */ -/datum/nanoui/proc/open() - var/window_size = "" - if (width && height) - window_size = "size=[width]x[height];" - update_status(0) - user << browse(get_html(), "window=[window_id];[window_size][window_options]") - winset(user, "mapwindow.map", "focus=true") // return keyboard focus to map - on_close_winset() - //onclose(user, window_id) - nanomanager.ui_opened(src) - - /** - * Close this UI - * - * @return nothing - */ -/datum/nanoui/proc/close() - is_auto_updating = 0 - nanomanager.ui_closed(src) - user << browse(null, "window=[window_id]") - - /** - * Set the UI window to call the nanoclose verb when the window is closed - * This allows Nano to handle closed windows - * - * @return nothing - */ -/datum/nanoui/proc/on_close_winset() - if(!user.client) - return - var/params = "\ref[src]" - - winset(user, window_id, "on-close=\"nanoclose [params]\"") - - /** - * Push data to an already open UI window - * - * @return nothing - */ -/datum/nanoui/proc/push_data(data, force_push = 0) - update_status(0) - if (status == STATUS_DISABLED && !force_push) - return // Cannot update UI, no visibility - - data = add_default_data(data) - //user << list2json(data) // used for debugging - user << output(list2params(list(list2json(data))),"[window_id].browser:receiveUpdateData") - - /** - * This Topic() proc is called whenever a user clicks on a link within a Nano UI - * If the UI status is currently STATUS_INTERACTIVE then call the src_object Topic() - * If the src_object Topic() returns 1 (true) then update all UIs attached to src_object - * - * @return nothing - */ -/datum/nanoui/Topic(href, href_list) - update_status(0) // update the status - if (status != STATUS_INTERACTIVE || user != usr) // If UI is not interactive or usr calling Topic is not the UI user - return - - if (src_object && src_object.Topic(href, href_list)) - nanomanager.update_uis(src_object) // update all UIs attached to src_object - - /** - * Process this UI, updating the entire UI or just the status (aka visibility) - * This process proc is called by the master_controller - * - * @param update string For this UI to update - * - * @return nothing - */ -/datum/nanoui/proc/process(update = 0) - if (!src_object || !user) - close() - return - - if (status && (update || is_auto_updating)) - src_object.ui_interact(user, ui_key, src) // Update the UI (update_status() is called whenever a UI is updated) - else - update_status(1) // Not updating UI, so lets check here if status has changed - +/********************************************************** +NANO UI FRAMEWORK + +nanoui class (or whatever Byond calls classes) + +nanoui is used to open and update nano browser uis +**********************************************************/ + + +#define STATUS_INTERACTIVE 2 // GREEN Visability +#define STATUS_UPDATE 1 // ORANGE Visability +#define STATUS_DISABLED 0 // RED Visability + +/datum/nanoui + // the user who opened this ui + var/mob/user + // the object this ui "belongs" to + var/atom/movable/src_object + // the title of this ui + var/title + // the key of this ui, this is to allow multiple (different) uis for each src_object + var/ui_key + // window_id is used as the window name/identifier for browse and onclose + var/window_id + // the browser window width + var/width = 0 + // the browser window height + var/height = 0 + // whether to use extra logic when window closes + var/on_close_logic = 1 + // an extra ref to use when the window is closed, usually null + var/atom/ref = null + // options for modifying window behaviour + var/window_options = "focus=0;can_close=1;can_minimize=1;can_maximize=0;can_resize=1;titlebar=1;" // window option is set using window_id + // the list of stylesheets to apply to this ui + var/list/stylesheets = list() + // the list of javascript scripts to use for this ui + var/list/scripts = list() + // the list of templates to use with this ui (usually just one) + var/templates[0] + // the body content for this ui, do not change unless you know what you're doing + // the #mainTemplate div will contain the compiled "main" template html + var/content = "
    " + // initial data, containing the full data structure, must be sent to the ui (the data structure cannot be extended later on) + var/list/initial_data[0] + // set to 1 to update the ui automatically every master_controller tick + var/is_auto_updating = 0 + // the current status/visibility of the ui + var/status = STATUS_INTERACTIVE + + // Only allow users with a certain user.stat to get updates. Defaults to 0 (concious) + var/allowed_user_stat = 0 // -1 = ignore, 0 = alive, 1 = unconcious or alive, 2 = dead concious or alive + + /** + * Create a new nanoui instance. + * + * @param nuser /mob The mob who has opened/owns this ui + * @param nsrc_object /obj|/mob The obj or mob which this ui belongs to + * @param nui_key string A string key to use for this ui. Allows for multiple unique uis on one src_oject + * @param ntemplate string The name of the template file from /nano/templates (e.g. "my_template.tmpl") + * @param ntitle string The title of this ui + * @param nwidth int the width of the ui window + * @param nheight int the height of the ui window + * @param nref /atom A custom ref to use if "on_close_logic" is set to 1 + * + * @return /nanoui new nanoui object + */ +/datum/nanoui/New(nuser, nsrc_object, nui_key, ntemplate, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null) + user = nuser + src_object = nsrc_object + ui_key = nui_key + window_id = "[ui_key]\ref[src_object]" + + // Add the passed template as the 'main' template, this is required + add_template("main", ntemplate) + + if (ntitle) + title = ntitle + if (nwidth) + width = nwidth + if (nheight) + height = nheight + if (nref) + ref = nref + + add_common_assets() + + /** + * Use this proc to add assets which are common to all nano uis + * + * @return nothing + */ +/datum/nanoui/proc/add_common_assets() + add_script("libraries.min.js") // The jQuery library + add_script("nano_config.js") // The NanoConfig JS, this is used to store configuration values. + add_script("nano_update.js") // The NanoUpdate JS, this is used to receive updates and apply them. + add_script("nano_base_helpers.js") // The NanoBaseHelpers JS, this is used to set up template helpers which are common to all templates + add_stylesheet("shared.css") // this CSS sheet is common to all UIs + add_stylesheet("icons.css") // this CSS sheet is common to all UIs + + /** + * Set the current status (also known as visibility) of this ui. + * + * @param state int The status to set, see the defines at the top of this file + * @param push_update int (bool) Push an update to the ui to update it's status (an update is always sent if the status has changed to red (0)) + * + * @return nothing + */ +/datum/nanoui/proc/set_status(state, push_update) + if (state != status) + status = state + if (push_update || !status) + push_data(list(), 1) // Update the UI, force the update in case the status is 0 + else + status = state + + /** + * Update the status (visibility) of this ui based on the user's status + * + * @param push_update int (bool) Push an update to the ui to update it's status. This is set to 0/false if an update is going to be pushed anyway (to avoid unnessary updates) + * + * @return nothing + */ +/datum/nanoui/proc/update_status(push_update = 0) + if (istype(user, /mob/living/silicon/ai)) + set_status(STATUS_INTERACTIVE, push_update) // interactive (green visibility) + else if (istype(user, /mob/living/silicon/robot)) + if (src_object in view(7, user)) // robots can see and interact with things they can see within 7 tiles + set_status(STATUS_INTERACTIVE, push_update) // interactive (green visibility) + else + set_status(STATUS_DISABLED, push_update) // no updates, completely disabled (red visibility) + else + var/dist = get_dist(src_object, user) + + if (dist > 4) + close() + return + + if ((allowed_user_stat > -1) && (user.stat > allowed_user_stat)) + set_status(STATUS_DISABLED, push_update) // no updates, completely disabled (red visibility) + else if (user.restrained() || user.lying) + set_status(STATUS_UPDATE, push_update) // update only (orange visibility) + else if (!(src_object in view(4, user))) // If the src object is not in visable, set status to 0 + set_status(STATUS_DISABLED, push_update) // interactive (green visibility) + else if (dist <= 1) + set_status(STATUS_INTERACTIVE, push_update) // interactive (green visibility) + else if (dist <= 2) + set_status(STATUS_UPDATE, push_update) // update only (orange visibility) + else if (dist <= 4) + set_status(STATUS_DISABLED, push_update) // no updates, completely disabled (red visibility) + + /** + * Set the ui to auto update (every master_controller tick) + * + * @param state int (bool) Set auto update to 1 or 0 (true/false) + * + * @return nothing + */ +/datum/nanoui/proc/set_auto_update(state = 1) + is_auto_updating = state + + /** + * Set the initial data for the ui. This is vital as the data structure set here cannot be changed when pushing new updates. + * + * @param data /list The list of data for this ui + * + * @return nothing + */ +/datum/nanoui/proc/set_initial_data(list/data) + initial_data = add_default_data(data) + + /** + * Add default data to the data being sent to the ui. + * + * @param data /list The list of data to be modified + * + * @return /list modified data + */ +/datum/nanoui/proc/add_default_data(list/data) + data["ui"] = list( + "status" = status, + "user" = list("name" = user.name) + ) + return data + + /** + * Set the browser window options for this ui + * + * @param nwindow_options string The new window options + * + * @return nothing + */ +/datum/nanoui/proc/set_window_options(nwindow_options) + window_options = nwindow_options + + /** + * Add a CSS stylesheet to this UI + * + * @param file string The name of the CSS file from /nano/css (e.g. "my_style.css") + * + * @return nothing + */ +/datum/nanoui/proc/add_stylesheet(file) + stylesheets.Add(file) + + /** + * Add a JavsScript script to this UI + * + * @param file string The name of the JavaScript file from /nano/js (e.g. "my_script.js") + * + * @return nothing + */ +/datum/nanoui/proc/add_script(file) + scripts.Add(file) + + /** + * Add a template to this UI + * Templates are combined with the data sent to the UI to create the rendered view + * Each template needs a div in ui.content to contain the rendered content. + * The div format is '
    ' where is replaced with the templater's key. + * All UIs are set up by default to use a 'main' template, so only use this proc if you want to add advanced functionality. + * + * @param key string The key name for this template, used to identify the div to render this template into ('
    ') + * @param file string The name of the template file from /nano/templates (e.g. "my_template.tmpl") + * + * @return nothing + */ +/datum/nanoui/proc/add_template(key, file) + templates[key] = file + + /** + * Set the HTML content of the UI + * This should only really be used to add more template divs (see the add_template() proc) + * + * @param ncontent string The new HTML content for this UI + * + * @return nothing + */ +/datum/nanoui/proc/set_content(ncontent) + content = ncontent + + /** + * Set whether or not to use the "old" on close logic (mainly unset_machine()) + * + * @param state int (bool) Set on_close_logic to 1 or 0 (true/false) + * + * @return nothing + */ +/datum/nanoui/proc/use_on_close_logic(state) + on_close_logic = state + + /** + * Return the HTML header content for this UI + * + * @return string HTML header content + */ +/datum/nanoui/proc/get_header() + var/head_content = "" + + for (var/filename in scripts) + head_content += " " + + for (var/filename in stylesheets) + head_content += " " + + var/templatel_data[0] + for (var/key in templates) + templatel_data[key] = templates[key]; + + var/template_data_json = "{}" // An empty JSON object + if (templatel_data.len > 0) + template_data_json = list2json(templatel_data) + + var/initial_data_json = "{}" // An empty JSON object + if (initial_data.len > 0) + initial_data_json = list2json(initial_data) + + var/url_parameters_json = list2json(list("src" = "\ref[src]")) + + return {" + + + + + [head_content] + + +
    + [title ? "
    [title]
    " : ""] +
    +
    Initiating...
    + "} + + /** + * Return the HTML footer content for this UI + * + * @return string HTML footer content + */ +/datum/nanoui/proc/get_footer() + + return {" +
    +
    + +"} + + /** + * Return the HTML for this UI + * + * @return string HTML for the UI + */ +/datum/nanoui/proc/get_html() + return {" + [get_header()] + [content] + [get_footer()] + "} + + /** + * Open this UI + * + * @return nothing + */ +/datum/nanoui/proc/open() + var/window_size = "" + if (width && height) + window_size = "size=[width]x[height];" + update_status(0) + user << browse(get_html(), "window=[window_id];[window_size][window_options]") + winset(user, "mapwindow.map", "focus=true") // return keyboard focus to map + on_close_winset() + //onclose(user, window_id) + nanomanager.ui_opened(src) + + /** + * Close this UI + * + * @return nothing + */ +/datum/nanoui/proc/close() + is_auto_updating = 0 + nanomanager.ui_closed(src) + user << browse(null, "window=[window_id]") + + /** + * Set the UI window to call the nanoclose verb when the window is closed + * This allows Nano to handle closed windows + * + * @return nothing + */ +/datum/nanoui/proc/on_close_winset() + if(!user.client) + return + var/params = "\ref[src]" + + winset(user, window_id, "on-close=\"nanoclose [params]\"") + + /** + * Push data to an already open UI window + * + * @return nothing + */ +/datum/nanoui/proc/push_data(data, force_push = 0) + update_status(0) + if (status == STATUS_DISABLED && !force_push) + return // Cannot update UI, no visibility + + data = add_default_data(data) + //user << list2json(data) // used for debugging + user << output(list2params(list(list2json(data))),"[window_id].browser:receiveUpdateData") + + /** + * This Topic() proc is called whenever a user clicks on a link within a Nano UI + * If the UI status is currently STATUS_INTERACTIVE then call the src_object Topic() + * If the src_object Topic() returns 1 (true) then update all UIs attached to src_object + * + * @return nothing + */ +/datum/nanoui/Topic(href, href_list) + update_status(0) // update the status + if (status != STATUS_INTERACTIVE || user != usr) // If UI is not interactive or usr calling Topic is not the UI user + return + + if (src_object && src_object.Topic(href, href_list)) + nanomanager.update_uis(src_object) // update all UIs attached to src_object + + /** + * Process this UI, updating the entire UI or just the status (aka visibility) + * This process proc is called by the master_controller + * + * @param update string For this UI to update + * + * @return nothing + */ +/datum/nanoui/proc/process(update = 0) + if (!src_object || !user) + close() + return + + if (status && (update || is_auto_updating)) + src_object.ui_interact(user, ui_key, src) // Update the UI (update_status() is called whenever a UI is updated) + else + update_status(1) // Not updating UI, so lets check here if status has changed + diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 99abdf8f1c7..67923d56280 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -57,7 +57,7 @@ if(istype(I, /obj/item/hand_labeler_refill)) user << "You insert [I] into [src]." user.drop_item() - del(I) + qdel(I) labels_left = initial(labels_left) return diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 0ddb43bd82f..b002c91a8dc 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -242,7 +242,7 @@ else if(istype(O, /obj/item/device/toner)) if(toner <= 0) user.drop_item() - del(O) + qdel(O) toner = 40 user << "You insert [O] into [src]." updateUsrDialog() @@ -270,10 +270,10 @@ /obj/machinery/photocopier/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) if(2.0) if(prob(50)) - del(src) + qdel(src) else if(toner > 0) new /obj/effect/decal/cleanable/oil(get_turf(src)) @@ -287,7 +287,7 @@ /obj/machinery/photocopier/blob_act() if(prob(50)) - del(src) + qdel(src) else if(toner > 0) new /obj/effect/decal/cleanable/oil(get_turf(src)) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 2a3420680e3..38726cb726e 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -1,355 +1,355 @@ -/* Photography! - * Contains: - * Camera - * Camera Film - * Photos - * Photo Albums - */ - -/* - * Film - */ -/obj/item/device/camera_film - name = "film cartridge" - icon = 'icons/obj/items.dmi' - desc = "A camera film cartridge. Insert it into a camera to reload it." - icon_state = "film" - item_state = "electropack" - w_class = 1.0 - - -/* - * Photo - */ -/obj/item/weapon/photo - name = "photo" - icon = 'icons/obj/items.dmi' - icon_state = "photo" - item_state = "paper" - w_class = 1.0 - var/icon/img //Big photo image - var/scribble //Scribble on the back. - var/blueprints = 0 //Does it include the blueprints? - - -/obj/item/weapon/photo/attack_self(mob/user) - examine() - - -/obj/item/weapon/photo/attackby(obj/item/weapon/P, mob/user) - if(istype(P, /obj/item/weapon/pen) || istype(P, /obj/item/toy/crayon)) - var/txt = sanitize(input(user, "What would you like to write on the back?", "Photo Writing", null) as text) - txt = copytext(txt, 1, 128) - if(loc == user && user.stat == 0) - scribble = txt - ..() - - -/obj/item/weapon/photo/examine() - set src in oview(1) - if(is_blind(usr)) return - - if(in_range(usr, src)) - show(usr) - usr << desc - else - usr << "It is too far away." - - -/obj/item/weapon/photo/proc/show(mob/user) - user << browse_rsc(img, "tmp_photo.png") - user << browse("[name]" \ - + "" \ - + "" \ - + "[scribble ? "
    Written on the back:
    [scribble]" : ""]"\ - + "", "window=book;size=192x[scribble ? 400 : 192]") - onclose(user, "[name]") - - -/obj/item/weapon/photo/verb/rename() - set name = "Rename photo" - set category = "Object" - set src in usr - - var/n_name = copytext(sanitize(input(usr, "What would you like to label the photo?", "Photo Labelling", null) as text), 1, MAX_NAME_LEN) - //loc.loc check is for making possible renaming photos in clipboards - if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == 0) - name = "photo[(n_name ? text("- '[n_name]'") : null)]" - add_fingerprint(usr) - - -/* - * Photo album - */ -/obj/item/weapon/storage/photo_album - name = "photo album" - icon = 'icons/obj/items.dmi' - icon_state = "album" - item_state = "briefcase" - can_hold = list("/obj/item/weapon/photo",) - - -/* - * Camera - */ -/obj/item/device/camera - name = "camera" - icon = 'icons/obj/items.dmi' - desc = "A polaroid camera. 10 photos left." - icon_state = "camera" - item_state = "electropack" - w_class = 2.0 - flags = CONDUCT - slot_flags = SLOT_BELT - m_amt = 2000 - var/pictures_max = 10 - var/pictures_left = 10 - var/on = 1 - var/blueprints = 0 //are blueprints visible in the current photo being created? - var/list/aipictures = list() //Allows for storage of pictures taken by AI, in a similar manner the datacore stores info - - -/obj/item/device/camera/ai_camera //camera AI can take pictures with - name = "AI photo camera" - var/in_camera_mode = 0 - - verb/picture() - set category ="AI Commands" - set name = "Take Image" - set src in usr - - toggle_camera_mode() - - verb/viewpicture() - set category ="AI Commands" - set name = "View Images" - set src in usr - - viewpictures() - - -/obj/item/device/camera/attack(mob/living/carbon/human/M, mob/user) - return - - -/obj/item/device/camera/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/device/camera_film)) - if(pictures_left) - user << "[src] still has some film in it!" - return - user << "You insert [I] into [src]." - user.drop_item() - del(I) - pictures_left = pictures_max - return - ..() - - -/obj/item/device/camera/proc/camera_get_icon(list/turfs, turf/center) - var/atoms[] = list() - for(var/turf/T in turfs) - atoms.Add(T) - for(var/atom/movable/A in T) - if(A.invisibility) continue - atoms.Add(A) - - var/list/sorted = list() - var/j - for(var/i = 1 to atoms.len) - var/atom/c = atoms[i] - for(j = sorted.len, j > 0, --j) - var/atom/c2 = sorted[j] - if(c2.layer <= c.layer) - break - sorted.Insert(j+1, c) - - var/icon/res = icon('icons/effects/96x96.dmi', "") - - for(var/atom/A in sorted) - var/icon/img = getFlatIcon(A) - if(istype(A, /mob/living) && A:lying) - img.Turn(A:lying) - - var/offX = 32 * (A.x - center.x) + A.pixel_x + 33 - var/offY = 32 * (A.y - center.y) + A.pixel_y + 33 - if(istype(A, /atom/movable)) - offX += A:step_x - offY += A:step_y - - res.Blend(img, blendMode2iconMode(A.blend_mode), offX, offY) - - if(istype(A, /obj/item/blueprints)) - blueprints = 1 - - for(var/turf/T in turfs) - res.Blend(getFlatIcon(T.loc), blendMode2iconMode(T.blend_mode), 32 * (T.x - center.x) + 33, 32 * (T.y - center.y) + 33) - - return res - - -/obj/item/device/camera/proc/camera_get_mobs(turf/the_turf) - var/mob_detail - for(var/mob/living/carbon/A in the_turf) - if(A.invisibility) continue - var/holding = null - if(A.l_hand || A.r_hand) - if(A.l_hand) holding = "They are holding \a [A.l_hand]" - if(A.r_hand) - if(holding) - holding += " and \a [A.r_hand]" - else - holding = "They are holding \a [A.r_hand]" - - if(!mob_detail) - mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " - else - mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." - return mob_detail - - -/obj/item/device/camera/proc/captureimage(atom/target, mob/user, flag) //Proc for both regular and AI-based camera to take the image - var/mobs = "" - var/isAi = istype(user, /mob/living/silicon/ai) - var/list/seen - if(!isAi) //crappy check, but without it AI photos would be subject to line of sight from the AI Eye object. Made the best of it by moving the sec camera check inside - if(user.client) //To make shooting through security cameras possible - seen = hear(world.view, user.client.eye) //To make shooting through security cameras possible - else - seen = hear(world.view, user) - else - seen = hear(world.view, target) - - var/list/turfs = list() - for(var/turf/T in range(1, target)) - if(T in seen) - if(isAi && !cameranet.checkTurfVis(T)) - continue - else - turfs += T - mobs += camera_get_mobs(T) - - var/icon/temp = icon('icons/effects/96x96.dmi',"") - temp.Blend("#000", ICON_OVERLAY) - temp.Blend(camera_get_icon(turfs, target), ICON_OVERLAY) - - if(!isAi) - printpicture(user, temp, mobs, flag) - else - aipicture(user, temp, mobs, blueprints) - - - - -/obj/item/device/camera/proc/printpicture(mob/user, icon/temp, mobs, flag) //Normal camera proc for creating photos - var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() - user.put_in_hands(P) - var/icon/small_img = icon(temp) - var/icon/ic = icon('icons/obj/items.dmi',"photo") - small_img.Scale(8, 8) - ic.Blend(small_img,ICON_OVERLAY, 10, 13) - P.icon = ic - P.img = temp - P.desc = mobs - P.pixel_x = rand(-10, 10) - P.pixel_y = rand(-10, 10) - - if(blueprints) - P.blueprints = 1 - blueprints = 0 - - -/obj/item/device/camera/proc/aipicture(mob/user, icon/temp, mobs) //instead of printing a picture like a regular camera would, we do this instead for the AI - - var/icon/small_img = icon(temp) - var/icon/ic = icon('icons/obj/items.dmi',"photo") - small_img.Scale(8, 8) - ic.Blend(small_img,ICON_OVERLAY, 10, 13) - var/icon = ic - var/img = temp - var/desc = mobs - var/pixel_x = rand(-10, 10) - var/pixel_y = rand(-10, 10) - - var/injectblueprints = 1 - if(blueprints) - injectblueprints = 1 - blueprints = 0 - - injectaialbum(icon, img, desc, pixel_x, pixel_y, injectblueprints) - - -/datum/picture - var/name = "image" - var/list/fields = list() - - -/obj/item/device/camera/proc/injectaialbum(var/icon, var/img, var/desc, var/pixel_x, var/pixel_y, var/blueprintsinject) //stores image information to a list similar to that of the datacore - var/numberer = 1 - for(var/datum/picture in src.aipictures) - numberer++ - var/datum/picture/P = new() - P.fields["name"] = "Image [numberer]" - P.fields["icon"] = icon - P.fields["img"] = img - P.fields["desc"] = desc - P.fields["pixel_x"] = pixel_x - P.fields["pixel_y"] = pixel_y - P.fields["blueprints"] = blueprintsinject - - aipictures += P - usr << "Image recorded" //feedback to the AI player that the picture was taken - - -/obj/item/device/camera/ai_camera/proc/viewpictures() //AI proc for viewing pictures they have taken - var/list/nametemp = list() - var/find - var/datum/picture/selection - if(src.aipictures.len == 0) - usr << "No images saved" - return - for(var/datum/picture/t in src.aipictures) - nametemp += t.fields["name"] - find = input("Select image (numbered in order taken)") in nametemp - var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() - for(var/datum/picture/q in src.aipictures) - if(q.fields["name"] == find) - selection = q - break // just in case some AI decides to take 10 thousand pictures in a round - P.icon = selection.fields["icon"] - P.img = selection.fields["img"] - P.desc = selection.fields["desc"] - P.pixel_x = selection.fields["pixel_x"] - P.pixel_y = selection.fields["pixel_y"] - - P.show(usr) - usr << P.desc - del P //so 10 thousdand pictures items are not left in memory should an AI take them and then view them all. - -/obj/item/device/camera/afterattack(atom/target, mob/user, flag) - if(!on || !pictures_left || ismob(target.loc)) return - captureimage(target, user, flag) - - playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, 1, -3) - - pictures_left-- - desc = "A polaroid camera. It has [pictures_left] photos left." - user << "[pictures_left] photos left." - icon_state = "camera_off" - on = 0 - spawn(64) - icon_state = "camera" - on = 1 - -/obj/item/device/camera/ai_camera/proc/toggle_camera_mode() - if(in_camera_mode) - camera_mode_off() - else - camera_mode_on() - -/obj/item/device/camera/ai_camera/proc/camera_mode_off() - src.in_camera_mode = 0 - usr << "Camera Mode deactivated" - -/obj/item/device/camera/ai_camera/proc/camera_mode_on() - src.in_camera_mode = 1 +/* Photography! + * Contains: + * Camera + * Camera Film + * Photos + * Photo Albums + */ + +/* + * Film + */ +/obj/item/device/camera_film + name = "film cartridge" + icon = 'icons/obj/items.dmi' + desc = "A camera film cartridge. Insert it into a camera to reload it." + icon_state = "film" + item_state = "electropack" + w_class = 1.0 + + +/* + * Photo + */ +/obj/item/weapon/photo + name = "photo" + icon = 'icons/obj/items.dmi' + icon_state = "photo" + item_state = "paper" + w_class = 1.0 + var/icon/img //Big photo image + var/scribble //Scribble on the back. + var/blueprints = 0 //Does it include the blueprints? + + +/obj/item/weapon/photo/attack_self(mob/user) + examine() + + +/obj/item/weapon/photo/attackby(obj/item/weapon/P, mob/user) + if(istype(P, /obj/item/weapon/pen) || istype(P, /obj/item/toy/crayon)) + var/txt = sanitize(input(user, "What would you like to write on the back?", "Photo Writing", null) as text) + txt = copytext(txt, 1, 128) + if(loc == user && user.stat == 0) + scribble = txt + ..() + + +/obj/item/weapon/photo/examine() + set src in oview(1) + if(is_blind(usr)) return + + if(in_range(usr, src)) + show(usr) + usr << desc + else + usr << "It is too far away." + + +/obj/item/weapon/photo/proc/show(mob/user) + user << browse_rsc(img, "tmp_photo.png") + user << browse("[name]" \ + + "" \ + + "" \ + + "[scribble ? "
    Written on the back:
    [scribble]" : ""]"\ + + "", "window=book;size=192x[scribble ? 400 : 192]") + onclose(user, "[name]") + + +/obj/item/weapon/photo/verb/rename() + set name = "Rename photo" + set category = "Object" + set src in usr + + var/n_name = copytext(sanitize(input(usr, "What would you like to label the photo?", "Photo Labelling", null) as text), 1, MAX_NAME_LEN) + //loc.loc check is for making possible renaming photos in clipboards + if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == 0) + name = "photo[(n_name ? text("- '[n_name]'") : null)]" + add_fingerprint(usr) + + +/* + * Photo album + */ +/obj/item/weapon/storage/photo_album + name = "photo album" + icon = 'icons/obj/items.dmi' + icon_state = "album" + item_state = "briefcase" + can_hold = list("/obj/item/weapon/photo",) + + +/* + * Camera + */ +/obj/item/device/camera + name = "camera" + icon = 'icons/obj/items.dmi' + desc = "A polaroid camera. 10 photos left." + icon_state = "camera" + item_state = "electropack" + w_class = 2.0 + flags = CONDUCT + slot_flags = SLOT_BELT + m_amt = 2000 + var/pictures_max = 10 + var/pictures_left = 10 + var/on = 1 + var/blueprints = 0 //are blueprints visible in the current photo being created? + var/list/aipictures = list() //Allows for storage of pictures taken by AI, in a similar manner the datacore stores info + + +/obj/item/device/camera/ai_camera //camera AI can take pictures with + name = "AI photo camera" + var/in_camera_mode = 0 + + verb/picture() + set category ="AI Commands" + set name = "Take Image" + set src in usr + + toggle_camera_mode() + + verb/viewpicture() + set category ="AI Commands" + set name = "View Images" + set src in usr + + viewpictures() + + +/obj/item/device/camera/attack(mob/living/carbon/human/M, mob/user) + return + + +/obj/item/device/camera/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/device/camera_film)) + if(pictures_left) + user << "[src] still has some film in it!" + return + user << "You insert [I] into [src]." + user.drop_item() + qdel(I) + pictures_left = pictures_max + return + ..() + + +/obj/item/device/camera/proc/camera_get_icon(list/turfs, turf/center) + var/atoms[] = list() + for(var/turf/T in turfs) + atoms.Add(T) + for(var/atom/movable/A in T) + if(A.invisibility) continue + atoms.Add(A) + + var/list/sorted = list() + var/j + for(var/i = 1 to atoms.len) + var/atom/c = atoms[i] + for(j = sorted.len, j > 0, --j) + var/atom/c2 = sorted[j] + if(c2.layer <= c.layer) + break + sorted.Insert(j+1, c) + + var/icon/res = icon('icons/effects/96x96.dmi', "") + + for(var/atom/A in sorted) + var/icon/img = getFlatIcon(A) + if(istype(A, /mob/living) && A:lying) + img.Turn(A:lying) + + var/offX = 32 * (A.x - center.x) + A.pixel_x + 33 + var/offY = 32 * (A.y - center.y) + A.pixel_y + 33 + if(istype(A, /atom/movable)) + offX += A:step_x + offY += A:step_y + + res.Blend(img, blendMode2iconMode(A.blend_mode), offX, offY) + + if(istype(A, /obj/item/blueprints)) + blueprints = 1 + + for(var/turf/T in turfs) + res.Blend(getFlatIcon(T.loc), blendMode2iconMode(T.blend_mode), 32 * (T.x - center.x) + 33, 32 * (T.y - center.y) + 33) + + return res + + +/obj/item/device/camera/proc/camera_get_mobs(turf/the_turf) + var/mob_detail + for(var/mob/living/carbon/A in the_turf) + if(A.invisibility) continue + var/holding = null + if(A.l_hand || A.r_hand) + if(A.l_hand) holding = "They are holding \a [A.l_hand]" + if(A.r_hand) + if(holding) + holding += " and \a [A.r_hand]" + else + holding = "They are holding \a [A.r_hand]" + + if(!mob_detail) + mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " + else + mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." + return mob_detail + + +/obj/item/device/camera/proc/captureimage(atom/target, mob/user, flag) //Proc for both regular and AI-based camera to take the image + var/mobs = "" + var/isAi = istype(user, /mob/living/silicon/ai) + var/list/seen + if(!isAi) //crappy check, but without it AI photos would be subject to line of sight from the AI Eye object. Made the best of it by moving the sec camera check inside + if(user.client) //To make shooting through security cameras possible + seen = hear(world.view, user.client.eye) //To make shooting through security cameras possible + else + seen = hear(world.view, user) + else + seen = hear(world.view, target) + + var/list/turfs = list() + for(var/turf/T in range(1, target)) + if(T in seen) + if(isAi && !cameranet.checkTurfVis(T)) + continue + else + turfs += T + mobs += camera_get_mobs(T) + + var/icon/temp = icon('icons/effects/96x96.dmi',"") + temp.Blend("#000", ICON_OVERLAY) + temp.Blend(camera_get_icon(turfs, target), ICON_OVERLAY) + + if(!isAi) + printpicture(user, temp, mobs, flag) + else + aipicture(user, temp, mobs, blueprints) + + + + +/obj/item/device/camera/proc/printpicture(mob/user, icon/temp, mobs, flag) //Normal camera proc for creating photos + var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() + user.put_in_hands(P) + var/icon/small_img = icon(temp) + var/icon/ic = icon('icons/obj/items.dmi',"photo") + small_img.Scale(8, 8) + ic.Blend(small_img,ICON_OVERLAY, 10, 13) + P.icon = ic + P.img = temp + P.desc = mobs + P.pixel_x = rand(-10, 10) + P.pixel_y = rand(-10, 10) + + if(blueprints) + P.blueprints = 1 + blueprints = 0 + + +/obj/item/device/camera/proc/aipicture(mob/user, icon/temp, mobs) //instead of printing a picture like a regular camera would, we do this instead for the AI + + var/icon/small_img = icon(temp) + var/icon/ic = icon('icons/obj/items.dmi',"photo") + small_img.Scale(8, 8) + ic.Blend(small_img,ICON_OVERLAY, 10, 13) + var/icon = ic + var/img = temp + var/desc = mobs + var/pixel_x = rand(-10, 10) + var/pixel_y = rand(-10, 10) + + var/injectblueprints = 1 + if(blueprints) + injectblueprints = 1 + blueprints = 0 + + injectaialbum(icon, img, desc, pixel_x, pixel_y, injectblueprints) + + +/datum/picture + var/name = "image" + var/list/fields = list() + + +/obj/item/device/camera/proc/injectaialbum(var/icon, var/img, var/desc, var/pixel_x, var/pixel_y, var/blueprintsinject) //stores image information to a list similar to that of the datacore + var/numberer = 1 + for(var/datum/picture in src.aipictures) + numberer++ + var/datum/picture/P = new() + P.fields["name"] = "Image [numberer]" + P.fields["icon"] = icon + P.fields["img"] = img + P.fields["desc"] = desc + P.fields["pixel_x"] = pixel_x + P.fields["pixel_y"] = pixel_y + P.fields["blueprints"] = blueprintsinject + + aipictures += P + usr << "Image recorded" //feedback to the AI player that the picture was taken + + +/obj/item/device/camera/ai_camera/proc/viewpictures() //AI proc for viewing pictures they have taken + var/list/nametemp = list() + var/find + var/datum/picture/selection + if(src.aipictures.len == 0) + usr << "No images saved" + return + for(var/datum/picture/t in src.aipictures) + nametemp += t.fields["name"] + find = input("Select image (numbered in order taken)") in nametemp + var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() + for(var/datum/picture/q in src.aipictures) + if(q.fields["name"] == find) + selection = q + break // just in case some AI decides to take 10 thousand pictures in a round + P.icon = selection.fields["icon"] + P.img = selection.fields["img"] + P.desc = selection.fields["desc"] + P.pixel_x = selection.fields["pixel_x"] + P.pixel_y = selection.fields["pixel_y"] + + P.show(usr) + usr << P.desc + qdel(src) //so 10 thousdand pictures items are not left in memory should an AI take them and then view them all. + +/obj/item/device/camera/afterattack(atom/target, mob/user, flag) + if(!on || !pictures_left || ismob(target.loc)) return + captureimage(target, user, flag) + + playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, 1, -3) + + pictures_left-- + desc = "A polaroid camera. It has [pictures_left] photos left." + user << "[pictures_left] photos left." + icon_state = "camera_off" + on = 0 + spawn(64) + icon_state = "camera" + on = 1 + +/obj/item/device/camera/ai_camera/proc/toggle_camera_mode() + if(in_camera_mode) + camera_mode_off() + else + camera_mode_on() + +/obj/item/device/camera/ai_camera/proc/camera_mode_off() + src.in_camera_mode = 0 + usr << "Camera Mode deactivated" + +/obj/item/device/camera/ai_camera/proc/camera_mode_on() + src.in_camera_mode = 1 usr << "Camera Mode activated" \ No newline at end of file diff --git a/code/modules/power/antimatter/containment_jar.dm b/code/modules/power/antimatter/containment_jar.dm index 8cb372b0c1a..dd0e503bd47 100644 --- a/code/modules/power/antimatter/containment_jar.dm +++ b/code/modules/power/antimatter/containment_jar.dm @@ -20,13 +20,13 @@ if(1.0) explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess if(src) - del(src) + qdel(src) return if(2.0) if(prob((fuel/10)-stability)) explosion(get_turf(src), 1, 2, 3, 5) if(src) - del(src) + qdel(src) return stability -= 40 if(3.0) diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 77a834fd8d1..c41a479aa97 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -35,16 +35,16 @@ linked_cores = list() -/obj/machinery/power/am_control_unit/Del()//Perhaps damage and run stability checks rather than just del on the others +/obj/machinery/power/am_control_unit/Destroy()//Perhaps damage and run stability checks rather than just del on the others for(var/obj/machinery/am_shielding/AMS in linked_shielding) - del(AMS) + qdel(AMS) ..() /obj/machinery/power/am_control_unit/process() if(exploding) explosion(get_turf(src),8,12,18,12) - if(src) del(src) + if(src) qdel(src) if(update_shield_icons && !shield_icon_delay) check_shield_icons() @@ -106,9 +106,7 @@ if(prob(100-stability))//Might infect the rest of the machine for(var/obj/machinery/am_shielding/AMS in linked_shielding) AMS.blob_act() - spawn(0) - //Likely explode - del(src) + qdel(src) return check_stability() return @@ -213,7 +211,7 @@ /obj/machinery/power/am_control_unit/proc/check_stability()//TODO: make it break when low also might want to add a way to fix it like a part or such that can be replaced if(stability <= 0) - del(src) + qdel(src) return diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index fac070f0928..5233d1b6f38 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -36,12 +36,11 @@ proc/cardinalrange(var/center) /obj/machinery/am_shielding/proc/controllerscan(var/priorscan = 0) //Make sure we are the only one here if(!istype(src.loc, /turf)) - del(src) + qdel(src) return for(var/obj/machinery/am_shielding/AMS in loc.contents) if(AMS == src) continue - spawn(0) - del(src) + qdel(src) return //Search for shielding first @@ -60,18 +59,16 @@ proc/cardinalrange(var/center) spawn(20) controllerscan(1)//Last chance return - spawn(0) - del(src) + qdel(src) return -/obj/machinery/am_shielding/Del() +/obj/machinery/am_shielding/Destroy() if(control_unit) control_unit.remove_shielding(src) if(processing) shutdown_core() visible_message("\red The [src.name] melts!") //Might want to have it leave a mess on the floor but no sprites for now ..() - return /obj/machinery/am_shielding/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -97,8 +94,7 @@ proc/cardinalrange(var/center) new /obj/effect/blob/node(src.loc,150) else new /obj/effect/blob(src.loc,60) - spawn(0) - del(src) + qdel(src) return check_stability() return @@ -185,7 +181,7 @@ proc/cardinalrange(var/center) if(injecting_fuel && control_unit) control_unit.exploding = 1 if(src) - del(src) + qdel(src) return @@ -215,7 +211,7 @@ proc/cardinalrange(var/center) /obj/item/device/am_shielding_container/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/device/multitool) && istype(src.loc,/turf)) new/obj/machinery/am_shielding(src.loc) - del(src) + qdel(src) return ..() return \ No newline at end of file diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index b7b320c6006..603b4a7e060 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1,1277 +1,1285 @@ -#define APC_WIRE_IDSCAN 1 -#define APC_WIRE_MAIN_POWER1 2 -#define APC_WIRE_MAIN_POWER2 3 -#define APC_WIRE_AI_CONTROL 4 - -//update_state -#define UPSTATE_CELL_IN 1 -#define UPSTATE_OPENED1 2 -#define UPSTATE_OPENED2 4 -#define UPSTATE_MAINT 8 -#define UPSTATE_BROKE 16 -#define UPSTATE_BLUESCREEN 32 -#define UPSTATE_WIREEXP 64 -#define UPSTATE_ALLGOOD 128 - -//update_overlay -#define APC_UPOVERLAY_CHARGEING0 1 -#define APC_UPOVERLAY_CHARGEING1 2 -#define APC_UPOVERLAY_CHARGEING2 4 -#define APC_UPOVERLAY_EQUIPMENT0 8 -#define APC_UPOVERLAY_EQUIPMENT1 16 -#define APC_UPOVERLAY_EQUIPMENT2 32 -#define APC_UPOVERLAY_LIGHTING0 64 -#define APC_UPOVERLAY_LIGHTING1 128 -#define APC_UPOVERLAY_LIGHTING2 256 -#define APC_UPOVERLAY_ENVIRON0 512 -#define APC_UPOVERLAY_ENVIRON1 1024 -#define APC_UPOVERLAY_ENVIRON2 2048 -#define APC_UPOVERLAY_LOCKED 4096 -#define APC_UPOVERLAY_OPERATING 8192 - - -#define APC_UPDATE_ICON_COOLDOWN 200 // 20 seconds - -// the Area Power Controller (APC), formerly Power Distribution Unit (PDU) -// one per area, needs wire conection to power network - -// controls power to devices in that area -// may be opened to change power cell -// three different channels (lighting/equipment/environ) - may each be set to on, off, or auto - - -//NOTE: STUFF STOLEN FROM AIRLOCK.DM thx - - -/obj/machinery/power/apc - name = "area power controller" - desc = "A control terminal for the area electrical systems." - - icon_state = "apc0" - anchored = 1 - use_power = 0 - req_access = list(access_engine_equip) - var/area/area - var/areastring = null - var/obj/item/weapon/stock_parts/cell/cell - var/start_charge = 90 // initial cell charge % - var/cell_type = 2500 // 0=no cell, 1=regular, 2=high-cap (x5) <- old, now it's just 0=no cell, otherwise dictate cellcapacity by changing this value. 1 used to be 1000, 2 was 2500 - var/opened = 0 //0=closed, 1=opened, 2=cover removed - var/shorted = 0 - var/lighting = 3 - var/equipment = 3 - var/environ = 3 - var/operating = 1 - var/charging = 0 - var/chargemode = 1 - var/chargecount = 0 - var/locked = 1 - var/coverlocked = 1 - var/aidisabled = 0 - var/tdir = null - var/obj/machinery/power/terminal/terminal = null - var/lastused_light = 0 - var/lastused_equip = 0 - var/lastused_environ = 0 - var/lastused_total = 0 - var/main_status = 0 - var/wiresexposed = 0 - powernet = 0 // set so that APCs aren't found as powernet nodes //Hackish, Horrible, was like this before I changed it :( - var/malfhack = 0 //New var for my changes to AI malf. --NeoFite - var/mob/living/silicon/ai/malfai = null //See above --NeoFite -// luminosity = 1 - var/has_electronics = 0 // 0 - none, 1 - plugged in, 2 - secured by screwdriver - var/overload = 1 //used for the Blackout malf module - var/beenhit = 0 // used for counting how many times it has been hit, used for Aliens at the moment - var/mob/living/silicon/ai/occupier = null - var/longtermpower = 10 - var/datum/wires/apc/wires = null - var/auto_name = 0 - var/update_state = -1 - var/update_overlay = -1 - var/global/status_overlays = 0 - var/updating_icon = 0 - var/global/list/status_overlays_lock - var/global/list/status_overlays_charging - var/global/list/status_overlays_equipment - var/global/list/status_overlays_lighting - var/global/list/status_overlays_environ - -/obj/machinery/power/apc/updateDialog() - if (stat & (BROKEN|MAINT)) - return - ..() - -/obj/machinery/power/apc/connect_to_network() - //Override because the APC does not directly connect to the network; it goes through a terminal. - //The terminal is what the power computer looks for anyway. - if(!terminal) - make_terminal() - if(terminal) - terminal.connect_to_network() - -/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0) - ..() - wires = new(src) - // offset 24 pixels in direction of dir - // this allows the APC to be embedded in a wall, yet still inside an area - if (building) - dir = ndir - src.tdir = dir // to fix Vars bug - dir = SOUTH - - if(auto_name) - name = "[get_area(src)] APC" - - pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24) - pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0 - if (building==0) - init() - else - area = src.loc.loc:master - opened = 1 - operating = 0 - name = "[area.name] APC" - stat |= MAINT - src.update_icon() - spawn(5) - src.update() - - - -/obj/machinery/power/apc/proc/make_terminal() - // create a terminal object at the same position as original turf loc - // wires will attach to this - terminal = new/obj/machinery/power/terminal(src.loc) - terminal.dir = tdir - terminal.master = src - -/obj/machinery/power/apc/proc/init() - has_electronics = 2 //installed and secured - // is starting with a power cell installed, create it and set its charge level - if(cell_type) - src.cell = new/obj/item/weapon/stock_parts/cell(src) - cell.maxcharge = cell_type // cell_type is maximum charge (old default was 1000 or 2500 (values one and two respectively) - cell.charge = start_charge * cell.maxcharge / 100.0 // (convert percentage to actual value) - - var/area/A = src.loc.loc - - //if area isn't specified use current - if(isarea(A) && src.areastring == null) - src.area = A - else - src.area = get_area_name(areastring) - update_icon() - - make_terminal() - - spawn(5) - src.update() - -/obj/machinery/power/apc/examine() - set src in oview(1) - - if(usr /*&& !usr.stat*/) - ..() - if(stat & BROKEN) - usr << "Looks broken." - return - if(opened) - if(has_electronics && terminal) - usr << "The cover is [opened==2?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"]." - else if (!has_electronics && terminal) - usr << "There are some wires but no any electronics." - else if (has_electronics && !terminal) - usr << "Electronics installed but not wired." - else /* if (!has_electronics && !terminal) */ - usr << "There is no electronics nor connected wires." - - else - if (stat & MAINT) - usr << "The cover is closed. Something wrong with it: it doesn't work." - else if (malfhack) - usr << "The cover is broken. It may be hard to force it open." - else - usr << "The cover is closed." - - -// update the APC icon to show the three base states -// also add overlays for indicator lights -/obj/machinery/power/apc/update_icon() - if (!status_overlays) - status_overlays = 1 - status_overlays_lock = new - status_overlays_charging = new - status_overlays_equipment = new - status_overlays_lighting = new - status_overlays_environ = new - - status_overlays_lock.len = 2 - status_overlays_charging.len = 3 - status_overlays_equipment.len = 4 - status_overlays_lighting.len = 4 - status_overlays_environ.len = 4 - - status_overlays_lock[1] = image(icon, "apcox-0") // 0=blue 1=red - status_overlays_lock[2] = image(icon, "apcox-1") - - status_overlays_charging[1] = image(icon, "apco3-0") - status_overlays_charging[2] = image(icon, "apco3-1") - status_overlays_charging[3] = image(icon, "apco3-2") - - status_overlays_equipment[1] = image(icon, "apco0-0") - status_overlays_equipment[2] = image(icon, "apco0-1") - status_overlays_equipment[3] = image(icon, "apco0-2") - status_overlays_equipment[4] = image(icon, "apco0-3") - - status_overlays_lighting[1] = image(icon, "apco1-0") - status_overlays_lighting[2] = image(icon, "apco1-1") - status_overlays_lighting[3] = image(icon, "apco1-2") - status_overlays_lighting[4] = image(icon, "apco1-3") - - status_overlays_environ[1] = image(icon, "apco2-0") - status_overlays_environ[2] = image(icon, "apco2-1") - status_overlays_environ[3] = image(icon, "apco2-2") - status_overlays_environ[4] = image(icon, "apco2-3") - - var/update = check_updates() //returns 0 if no need to update icons. - // 1 if we need to update the icon_state - // 2 if we need to update the overlays - if(!update) - return - - if(update & 1) // Updating the icon state - if(update_state & UPSTATE_ALLGOOD) - icon_state = "apc0" - else if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2)) - var/basestate = "apc[ cell ? "2" : "1" ]" - if(update_state & UPSTATE_OPENED1) - if(update_state & (UPSTATE_MAINT|UPSTATE_BROKE)) - icon_state = "apcmaint" //disabled APC cannot hold cell - else - icon_state = basestate - else if(update_state & UPSTATE_OPENED2) - if (update_state & UPSTATE_BROKE || malfhack) - icon_state = "[basestate]-b-nocover" - else - icon_state = "[basestate]-nocover" - else if(update_state & UPSTATE_BROKE) - icon_state = "apc-b" - else if(update_state & UPSTATE_BLUESCREEN) - icon_state = "apcemag" - else if(update_state & UPSTATE_WIREEXP) - icon_state = "apcewires" - - if(!(update_state & UPSTATE_ALLGOOD)) - if(overlays.len) - overlays = 0 - - if(update & 2) - if(overlays.len) - overlays.len = 0 - if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) - overlays += status_overlays_lock[locked+1] - overlays += status_overlays_charging[charging+1] - if(operating) - overlays += status_overlays_equipment[equipment+1] - overlays += status_overlays_lighting[lighting+1] - overlays += status_overlays_environ[environ+1] - - -/obj/machinery/power/apc/proc/check_updates() - - var/last_update_state = update_state - var/last_update_overlay = update_overlay - update_state = 0 - update_overlay = 0 - - if(cell) - update_state |= UPSTATE_CELL_IN - if(stat & BROKEN) - update_state |= UPSTATE_BROKE - if(stat & MAINT) - update_state |= UPSTATE_MAINT - if(opened) - if(opened==1) - update_state |= UPSTATE_OPENED1 - if(opened==2) - update_state |= UPSTATE_OPENED2 - else if(emagged || malfai) - update_state |= UPSTATE_BLUESCREEN - else if(wiresexposed) - update_state |= UPSTATE_WIREEXP - if(update_state <= 1) - update_state |= UPSTATE_ALLGOOD - - if(operating) - update_overlay |= APC_UPOVERLAY_OPERATING - - if(update_state & UPSTATE_ALLGOOD) - if(locked) - update_overlay |= APC_UPOVERLAY_LOCKED - - if(!charging) - update_overlay |= APC_UPOVERLAY_CHARGEING0 - else if(charging == 1) - update_overlay |= APC_UPOVERLAY_CHARGEING1 - else if(charging == 2) - update_overlay |= APC_UPOVERLAY_CHARGEING2 - - if (!equipment) - update_overlay |= APC_UPOVERLAY_EQUIPMENT0 - else if(equipment == 1) - update_overlay |= APC_UPOVERLAY_EQUIPMENT1 - else if(equipment == 2) - update_overlay |= APC_UPOVERLAY_EQUIPMENT2 - - if(!lighting) - update_overlay |= APC_UPOVERLAY_LIGHTING0 - else if(lighting == 1) - update_overlay |= APC_UPOVERLAY_LIGHTING1 - else if(lighting == 2) - update_overlay |= APC_UPOVERLAY_LIGHTING2 - - if(!environ) - update_overlay |= APC_UPOVERLAY_ENVIRON0 - else if(environ==1) - update_overlay |= APC_UPOVERLAY_ENVIRON1 - else if(environ==2) - update_overlay |= APC_UPOVERLAY_ENVIRON2 - - - var/results = 0 - if(last_update_state == update_state && last_update_overlay == update_overlay) - return 0 - if(last_update_state != update_state) - results += 1 - if(last_update_overlay != update_overlay) - results += 2 - return results - -// Used in process so it doesn't update the icon too much -/obj/machinery/power/apc/proc/queue_icon_update() - - if(!updating_icon) - updating_icon = 1 - // Start the update - spawn(APC_UPDATE_ICON_COOLDOWN) - update_icon() - updating_icon = 0 - -//attack with an item - open/close cover, insert cell, or (un)lock interface - -/obj/machinery/power/apc/attackby(obj/item/W, mob/user) - - if (istype(user, /mob/living/silicon) && get_dist(src,user)>1) - return src.attack_hand(user) - if (istype(W, /obj/item/weapon/crowbar) && opened) - if (has_electronics==1) - if (terminal) - user << "\red Disconnect wires first." - return - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "You are trying to remove the power control board..." //lpeters - fixed grammar issues - if(do_after(user, 50)) - has_electronics = 0 - if ((stat & BROKEN) || malfhack) - user.visible_message(\ - "\red [user.name] has broken the power control board inside [src.name]!",\ - "You broke the charred power control board and remove the remains.", - "You hear a crack!") - //ticker.mode:apcs-- //XSI said no and I agreed. -rastaf0 - else - user.visible_message(\ - "\red [user.name] has removed the power control board from [src.name]!",\ - "You remove the power control board.") - new /obj/item/weapon/module/power_control(loc) - else if (opened!=2) //cover isn't removed - opened = 0 - update_icon() - else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) ) - if(coverlocked && !(stat & MAINT)) - user << "\red The cover is locked and cannot be opened." - return - else - opened = 1 - update_icon() - else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside - if(cell) - user << "There is a power cell already installed." - return - else - if (stat & MAINT) - user << "\red There is no connector for your power cell." - return - user.drop_item() - W.loc = src - cell = W - user.visible_message(\ - "\red [user.name] has inserted the power cell to [src.name]!",\ - "You insert the power cell.") - chargecount = 0 - update_icon() - else if (istype(W, /obj/item/weapon/screwdriver)) // haxing - if(opened) - if (cell) - user << "\red Close the APC first." //Less hints more mystery! - return - else - if (has_electronics==1 && terminal) - has_electronics = 2 - stat &= ~MAINT - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You screw the circuit electronics into place." - else if (has_electronics==2) - has_electronics = 1 - stat |= MAINT - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You unfasten the electronics." - else /* has_electronics==0 */ - user << "\red There is nothing to secure." - return - update_icon() - else if(emagged) - user << "The interface is broken." - else - wiresexposed = !wiresexposed - user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" - update_icon() - - else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card - if(emagged) - user << "The interface is broken." - else if(opened) - user << "You must close the cover to swipe an ID card." - else if(wiresexposed) - user << "You must close the panel" - else if(stat & (BROKEN|MAINT)) - user << "Nothing happens." - else - if(src.allowed(usr) && !isWireCut(APC_WIRE_IDSCAN)) - locked = !locked - user << "You [ locked ? "lock" : "unlock"] the APC interface." - update_icon() - else - user << "\red Access denied." - else if (istype(W, /obj/item/weapon/card/emag) && !(emagged || malfhack)) // trying to unlock with an emag card - if(opened) - user << "You must close the cover to swipe an ID card." - else if(wiresexposed) - user << "You must close the panel first" - else if(stat & (BROKEN|MAINT)) - user << "Nothing happens." - else - flick("apc-spark", src) - if (do_after(user,6)) - if(prob(50)) - emagged = 1 - locked = 0 - user << "You emag the APC interface." - update_icon() - else - user << "You fail to [ locked ? "unlock" : "lock"] the APC interface." - else if (istype(W, /obj/item/stack/cable_coil) && !terminal && opened && has_electronics!=2) - if (src.loc:intact) - user << "\red You must remove the floor plating in front of the APC first." - return - var/obj/item/stack/cable_coil/C = W - if(C.amount < 10) - user << "\red You need more wires." - return - user << "You start adding cables to the APC frame..." - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 20) && C.amount >= 10) - var/turf/T = get_turf(src) - var/obj/structure/cable/N = T.get_cable_node() - if (prob(50) && electrocute_mob(usr, N, N)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - return - C.use(10) - user.visible_message(\ - "\red [user.name] has added cables to the APC frame!",\ - "You add cables to the APC frame.") - make_terminal() - terminal.connect_to_network() - else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2) - if (src.loc:intact) - user << "\red You must remove the floor plating in front of the APC first." - return - user << "You begin to cut the cables..." - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 50)) - if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - return - new /obj/item/stack/cable_coil(loc,10) - user.visible_message(\ - "\red [user.name] cut the cables and dismantled the power terminal.",\ - "You cut the cables and dismantle the power terminal.") - del(terminal) - else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack)) - user << "You trying to insert the power control board into the frame..." - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 10)) - has_electronics = 1 - user << "You place the power control board inside the frame." - del(W) - else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && ((stat & BROKEN) || malfhack)) - user << "\red You cannot put the board inside, the frame is damaged." - return - else if (istype(W, /obj/item/weapon/weldingtool) && opened && has_electronics==0 && !terminal) - var/obj/item/weapon/weldingtool/WT = W - if (WT.get_fuel() < 3) - user << "\blue You need more welding fuel to complete this task." - return - user << "You start welding the APC frame..." - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - if(do_after(user, 50)) - if(!src || !WT.remove_fuel(3, user)) return - if (emagged || malfhack || (stat & BROKEN) || opened==2) - new /obj/item/stack/sheet/metal(loc) - user.visible_message(\ - "\red [src] has been cut apart by [user.name] with the weldingtool.",\ - "You disassembled the broken APC frame.",\ - "\red You hear welding.") - else - new /obj/item/apc_frame(loc) - user.visible_message(\ - "\red [src] has been cut from the wall by [user.name] with the weldingtool.",\ - "You cut the APC frame from the wall.",\ - "\red You hear welding.") - del(src) - return - else if (istype(W, /obj/item/apc_frame) && opened && emagged) - emagged = 0 - if (opened==2) - opened = 1 - user.visible_message(\ - "\red [user.name] has replaced the damaged APC frontal panel with a new one.",\ - "You replace the damaged APC frontal panel with a new one.") - del(W) - update_icon() - else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || malfhack)) - if (has_electronics) - user << "You cannot repair this APC until you remove the electronics still inside." - return - user << "You begin to replace the damaged APC frame..." - if(do_after(user, 50)) - user.visible_message(\ - "\red [user.name] has replaced the damaged APC frame with new one.",\ - "You replace the damaged APC frame with new one.") - del(W) - stat &= ~BROKEN - malfai = null - malfhack = 0 - if (opened==2) - opened = 1 - update_icon() - else - if ( ((stat & BROKEN) || malfhack) \ - && !opened \ - && W.force >= 5 \ - && W.w_class >= 3.0 \ - && prob(20) ) - opened = 2 - user.visible_message("\red The APC cover was knocked down with the [W.name] by [user.name]!", \ - "\red You knock down the APC cover with your [W.name]!", \ - "You hear bang") - update_icon() - else - if (istype(user, /mob/living/silicon)) - return src.attack_hand(user) - if (!opened && wiresexposed && \ - (istype(W, /obj/item/device/multitool) || \ - istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/assembly/signaler))) - return src.attack_hand(user) - user.visible_message("\red The [src.name] has been hit with the [W.name] by [user.name]!", \ - "\red You hit the [src.name] with your [W.name]!", \ - "You hear bang") - -// attack with hand - remove cell (if cover open) or interact with the APC - -/obj/machinery/power/apc/attack_hand(mob/user) -// if (!can_use(user)) This already gets called in interact() and in topic() -// return - if(!user) - return - src.add_fingerprint(user) - if(usr == user && opened && (!issilicon(user))) - if(cell) - user.put_in_hands(cell) - cell.add_fingerprint(user) - cell.updateicon() - - src.cell = null - user.visible_message("\red [user.name] removes the power cell from [src.name]!", "You remove the power cell.") - //user << "You remove the power cell." - charging = 0 - src.update_icon() - return - if(stat & (BROKEN|MAINT)) - return - // do APC interaction - src.interact(user) - -/obj/machinery/power/apc/attack_alien(mob/living/carbon/alien/humanoid/user) - if(!user) - return - user.visible_message("\red [user.name] slashes at the [src.name]!", "\blue You slash at the [src.name]!") - playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) - - var/allcut = wires.IsAllCut() - - if(beenhit >= pick(3, 4) && wiresexposed != 1) - wiresexposed = 1 - src.update_icon() - src.visible_message("\red The [src.name]'s cover flies open, exposing the wires!") - - else if(wiresexposed == 1 && allcut == 0) - wires.CutAll() - src.update_icon() - src.visible_message("\red The [src.name]'s wires are shredded!") - else - beenhit += 1 - return - - -/obj/machinery/power/apc/interact(mob/user) - if(!user) - return - - if(wiresexposed /*&& (!istype(user, /mob/living/silicon))*/) //Commented out the typecheck to allow engiborgs to repair damaged apcs. - wires.Interact(user) - - return ui_interact(user) - - -/obj/machinery/power/apc/proc/get_malf_status(mob/user) - if (ticker && ticker.mode && (user.mind in ticker.mode.malf_ai) && istype(user, /mob/living/silicon/ai)) - if (src.malfai == (user:parent ? user:parent : user)) - if (src.occupier == user) - return 3 // 3 = User is shunted in this APC - else if (istype(user.loc, /obj/machinery/power/apc)) - return 4 // 4 = User is shunted in another APC - else - return 2 // 2 = APC hacked by user, and user is in its core. - else - return 1 // 1 = APC not hacked. - else - return 0 // 0 = User is not a Malf AI - - -/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) - if(!user) - return - - var/list/data = list( - "locked" = locked, - "isOperating" = operating, - "externalPower" = main_status, - "powerCellStatus" = cell ? cell.percent() : null, - "chargeMode" = chargemode, - "chargingStatus" = charging, - "totalLoad" = lastused_equip + lastused_light + lastused_environ, - "coverLocked" = coverlocked, - "siliconUser" = istype(user, /mob/living/silicon), - "malfStatus" = get_malf_status(user), - - "powerChannels" = list( - list( - "title" = "Equipment", - "powerLoad" = lastused_equip, - "status" = equipment, - "topicParams" = list( - "auto" = list("eqp" = 3), - "on" = list("eqp" = 2), - "off" = list("eqp" = 1) - ) - ), - list( - "title" = "Lighting", - "powerLoad" = lastused_light, - "status" = lighting, - "topicParams" = list( - "auto" = list("lgt" = 3), - "on" = list("lgt" = 2), - "off" = list("lgt" = 1) - ) - ), - list( - "title" = "Environment", - "powerLoad" = lastused_environ, - "status" = environ, - "topicParams" = list( - "auto" = list("env" = 3), - "on" = list("env" = 2), - "off" = list("env" = 1) - ) - ) - ) - ) - - // update the ui if it exists, returns null if no ui is passed/found - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) - 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, "apc.tmpl", "[area.name] - APC", 520, data["siliconUser"] ? 465 : 420) - // when the ui is first opened this is the data it will use - ui.set_initial_data(data) - // open the new ui window - ui.open() - // auto update every Master Controller tick - ui.set_auto_update(1) - -/obj/machinery/power/apc/proc/report() - return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_equip+lastused_light+lastused_environ]) : [cell? cell.percent() : "N/C"] ([charging])" - -/obj/machinery/power/apc/proc/update() - if(operating && !shorted) - area.power_light = (lighting > 1) - area.power_equip = (equipment > 1) - area.power_environ = (environ > 1) -// if (area.name == "AI Chamber") -// spawn(10) -// world << " [area.name] [area.power_equip]" - else - area.power_light = 0 - area.power_equip = 0 - area.power_environ = 0 -// if (area.name == "AI Chamber") -// world << "[area.power_equip]" - area.power_change() - -/obj/machinery/power/apc/proc/isWireCut(var/wireIndex) - return wires.IsIndexCut(wireIndex) - - -/obj/machinery/power/apc/proc/can_use(mob/user as mob, var/loud = 0) //used by attack_hand() and Topic() - if (user.stat) - user << "\red You must be conscious to use this [src]!" - return 0 - if(!user.client) - return 0 - if ( ! (istype(user, /mob/living/carbon/human) || \ - istype(user, /mob/living/silicon) || \ - istype(user, /mob/living/carbon/monkey) /*&& ticker && ticker.mode.name == "monkey"*/) ) - user << "\red You don't have the dexterity to use this [src]!" - return 0 - if(user.restrained()) - user << "\red You must have free hands to use this [src]" - return 0 - if(user.lying) - user << "\red You must stand to use this [src]!" - return 0 - if (istype(user, /mob/living/silicon)) - var/mob/living/silicon/ai/AI = user - var/mob/living/silicon/robot/robot = user - if ( \ - src.aidisabled || \ - malfhack && istype(malfai) && \ - ( \ - (istype(AI) && (malfai!=AI && malfai != AI.parent)) || \ - (istype(robot) && (robot in malfai.connected_robots)) \ - ) \ - ) - if(!loud) - user << "\red \The [src] have AI control disabled!" - return 0 - else - if ((!in_range(src, user) || !istype(src.loc, /turf))) - return 0 - - var/mob/living/carbon/human/H = user - if (istype(H)) - if(H.getBrainLoss() >= 60) - for(var/mob/M in viewers(src, null)) - M << "\red [H] stares cluelessly at [src] and drools." - return 0 - else if(prob(H.getBrainLoss())) - user << "\red You momentarily forget how to use [src]." - return 0 - return 1 - -/obj/machinery/power/apc/Topic(href, href_list) - if(..()) - return 0 - - if(!can_use(usr, 1)) - return 0 - - if (href_list["lock"]) - coverlocked = !coverlocked - - else if (href_list["breaker"]) - toggle_breaker() - - else if (href_list["cmode"]) - chargemode = !chargemode - if(!chargemode) - charging = 0 - update_icon() - - else if (href_list["eqp"]) - var/val = text2num(href_list["eqp"]) - equipment = setsubsystem(val) - update_icon() - update() - - else if (href_list["lgt"]) - var/val = text2num(href_list["lgt"]) - lighting = setsubsystem(val) - update_icon() - update() - - else if (href_list["env"]) - var/val = text2num(href_list["env"]) - environ = setsubsystem(val) - update_icon() - update() - - else if (href_list["overload"]) - if(istype(usr, /mob/living/silicon)) - src.overload_lighting() - - else if (href_list["malfhack"]) - var/mob/living/silicon/ai/malfai = usr - if(get_malf_status(malfai)==1) - if (malfai.malfhacking) - malfai << "You are already hacking an APC." - return 1 - malfai << "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process." - malfai.malfhack = src - malfai.malfhacking = 1 - sleep(600) - if(src) - if (!src.aidisabled) - malfai.malfhack = null - malfai.malfhacking = 0 - locked = 1 - if (ticker.mode.config_tag == "malfunction") - if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas)) - ticker.mode:apcs++ - if(usr:parent) - src.malfai = usr:parent - else - src.malfai = usr - malfai << "Hack complete. The APC is now under your exclusive control." - update_icon() - - else if (href_list["occupyapc"]) - if(get_malf_status(usr)) - malfoccupy(usr) - - else if (href_list["deoccupyapc"]) - if(get_malf_status(usr)) - malfvacate() - - else if (href_list["toggleaccess"]) - if(istype(usr, /mob/living/silicon)) - if(emagged || (stat & (BROKEN|MAINT))) - usr << "The APC does not respond to the command." - else - locked = !locked - update_icon() - - return 1 - -/obj/machinery/power/apc/proc/toggle_breaker() - operating = !operating - - if(malfai) - if (ticker.mode.config_tag == "malfunction") - if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas)) - operating ? ticker.mode:apcs++ : ticker.mode:apcs-- - - src.update() - update_icon() - -/obj/machinery/power/apc/proc/malfoccupy(var/mob/living/silicon/ai/malf) - if(!istype(malf)) - return - if(istype(malf.loc, /obj/machinery/power/apc)) // Already in an APC - malf << "You must evacuate your current apc first." - return - if(!malf.can_shunt) - malf << "You cannot shunt." - return - if(src.z != 1) - return - src.occupier = new /mob/living/silicon/ai(src,malf.laws,null,1) - src.occupier.adjustOxyLoss(malf.getOxyLoss()) - if(!findtext(src.occupier.name,"APC Copy")) - src.occupier.name = "[malf.name] APC Copy" - if(malf.parent) - src.occupier.parent = malf.parent - else - src.occupier.parent = malf - malf.mind.transfer_to(src.occupier) - src.occupier.eyeobj.name = "[src.occupier.name] (AI Eye)" - if(malf.parent) - del(malf) - src.occupier.verbs += /mob/living/silicon/ai/proc/corereturn - src.occupier.verbs += /datum/game_mode/malfunction/proc/takeover - src.occupier.cancel_camera() - if (seclevel2num(get_security_level()) == SEC_LEVEL_DELTA) - for(var/obj/item/weapon/pinpointer/point in world) - point.the_disk = src //the pinpointer will detect the shunted AI - - -/obj/machinery/power/apc/proc/malfvacate(var/forced) - if(!src.occupier) - return - if(src.occupier.parent && src.occupier.parent.stat != 2) - src.occupier.mind.transfer_to(src.occupier.parent) - src.occupier.parent.adjustOxyLoss(src.occupier.getOxyLoss()) - src.occupier.parent.cancel_camera() - del(src.occupier) - if (seclevel2num(get_security_level()) == SEC_LEVEL_DELTA) - for(var/obj/item/weapon/pinpointer/point in world) - for(var/datum/mind/AI_mind in ticker.mode.malf_ai) - var/mob/living/silicon/ai/A = AI_mind.current // the current mob the mind owns - if(A.stat != DEAD) - point.the_disk = A //The pinpointer tracks the AI back into its core. - - else - src.occupier << "\red Primary core damaged, unable to return core processes." - if(forced) - src.occupier.loc = src.loc - src.occupier.death() - src.occupier.gib() - for(var/obj/item/weapon/pinpointer/point in world) - point.the_disk = null //the pinpointer will go back to pointing at the nuke disc. - - -/obj/machinery/power/apc/proc/ion_act() - //intended to be exactly the same as an AI malf attack - if(!src.malfhack && src.z == 1) - if(prob(3)) - src.locked = 1 - if (src.cell.charge > 0) -// world << "\red blew APC in [src.loc.loc]" - src.cell.charge = 0 - cell.corrupt() - src.malfhack = 1 - update_icon() - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() - smoke.set_up(3, 0, src.loc) - smoke.attach(src) - smoke.start() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - for(var/mob/M in viewers(src)) - M.show_message("\red The [src.name] suddenly lets out a blast of smoke and some sparks!", 3, "\red You hear sizzling electronics.", 2) - - -/obj/machinery/power/apc/surplus() - if(terminal) - return terminal.surplus() - else - return 0 - -/obj/machinery/power/apc/add_load(var/amount) - if(terminal && terminal.powernet) - terminal.powernet.newload += amount - -/obj/machinery/power/apc/avail() - if(terminal) - return terminal.avail() - else - return 0 - -/obj/machinery/power/apc/process() - - if(stat & (BROKEN|MAINT)) - return - if(!area.requires_power) - return - - - /* - if (equipment > 1) // off=0, off auto=1, on=2, on auto=3 - use_power(src.equip_consumption, EQUIP) - if (lighting > 1) // off=0, off auto=1, on=2, on auto=3 - use_power(src.light_consumption, LIGHT) - if (environ > 1) // off=0, off auto=1, on=2, on auto=3 - use_power(src.environ_consumption, ENVIRON) - - area.calc_lighting() */ - - lastused_light = area.usage(LIGHT) - lastused_equip = area.usage(EQUIP) - lastused_environ = area.usage(ENVIRON) - area.clear_usage() - - lastused_total = lastused_light + lastused_equip + lastused_environ - - //store states to update icon if any change - var/last_lt = lighting - var/last_eq = equipment - var/last_en = environ - var/last_ch = charging - - var/excess = surplus() - - if(!src.avail()) - main_status = 0 - else if(excess < 0) - main_status = 1 - else - main_status = 2 - - var/perapc = 0 - if(terminal && terminal.powernet) - perapc = terminal.powernet.perapc - - //if(debug) - // world.log << "Status: [main_status] - Excess: [excess] - Last Equip: [lastused_equip] - Last Light: [lastused_light] - Longterm: [longtermpower]" - - if(cell && !shorted) - - - // draw power from cell as before - var/cellused = min(cell.charge, CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell - cell.use(cellused) - - if(excess > 0 || perapc > lastused_total) // if power excess, or enough anyway, recharge the cell - // by the same amount just used - cell.give(cellused) - add_load(cellused/CELLRATE) // add the load used to recharge the cell - - - else // no excess, and not enough per-apc - - if( (cell.charge/CELLRATE+perapc) >= lastused_total) // can we draw enough from cell+grid to cover last usage? - - cell.charge = min(cell.maxcharge, cell.charge + CELLRATE * perapc) //recharge with what we can - add_load(perapc) // so draw what we can from the grid - charging = 0 - - else // not enough power available to run the last tick! - charging = 0 - chargecount = 0 - // This turns everything off in the case that there is still a charge left on the battery, just not enough to run the room. - equipment = autoset(equipment, 0) - lighting = autoset(lighting, 0) - environ = autoset(environ, 0) - - - // set channels depending on how much charge we have left - - // Allow the APC to operate as normal if the cell can charge - if(charging && longtermpower < 10) - longtermpower += 1 - else if(longtermpower > -10) - longtermpower -= 2 - - if(cell.charge <= 0) // zero charge, turn all off - equipment = autoset(equipment, 0) - lighting = autoset(lighting, 0) - environ = autoset(environ, 0) - area.poweralert(0, src) - else if(cell.percent() < 15 && longtermpower < 0) // <15%, turn off lighting & equipment - equipment = autoset(equipment, 2) - lighting = autoset(lighting, 2) - environ = autoset(environ, 1) - area.poweralert(0, src) - else if(cell.percent() < 30 && longtermpower < 0) // <30%, turn off equipment - equipment = autoset(equipment, 2) - lighting = autoset(lighting, 1) - environ = autoset(environ, 1) - area.poweralert(0, src) - else // otherwise all can be on - equipment = autoset(equipment, 1) - lighting = autoset(lighting, 1) - environ = autoset(environ, 1) - area.poweralert(1, src) - if(cell.percent() > 75) - area.poweralert(1, src) - - // now trickle-charge the cell - - if(chargemode && charging == 1 && operating) - if(excess > 0) // check to make sure we have enough to charge - // Max charge is perapc share, capped to cell capacity, or % per second constant (Whichever is smallest) -/* var/ch = min(perapc, (cell.maxcharge - cell.charge), (cell.maxcharge*CHARGELEVEL)) - add_load(ch) // Removes the power we're taking from the grid - cell.give(ch) // actually recharge the cell -*/ - var/ch = min(perapc*CELLRATE, (cell.maxcharge - cell.charge), (cell.maxcharge*CHARGELEVEL)) - add_load(ch/CELLRATE) // Removes the power we're taking from the grid - cell.give(ch) // actually recharge the cell - - else - charging = 0 // stop charging - chargecount = 0 - - // show cell as fully charged if so - - if(cell.charge >= cell.maxcharge) - charging = 2 - - if(chargemode) - if(!charging) - if(excess > cell.maxcharge*CHARGELEVEL) - chargecount++ - else - chargecount = 0 - - if(chargecount == 10) - - chargecount = 0 - charging = 1 - - else // chargemode off - charging = 0 - chargecount = 0 - - else // no cell, switch everything off - - charging = 0 - chargecount = 0 - equipment = autoset(equipment, 0) - lighting = autoset(lighting, 0) - environ = autoset(environ, 0) - area.poweralert(0, src) - - // update icon & area power if anything changed - - if(last_lt != lighting || last_eq != equipment || last_en != environ) - queue_icon_update() - update() - else if (last_ch != charging) - queue_icon_update() - -// val 0=off, 1=off(auto) 2=on 3=on(auto) -// on 0=off, 1=on, 2=autooff - -obj/machinery/power/apc/proc/autoset(var/val, var/on) - if(on==0) - if(val==2) // if on, return off - return 0 - else if(val==3) // if auto-on, return auto-off - return 1 - - else if(on==1) - if(val==1) // if auto-off, return auto-on - return 3 - - else if(on==2) - if(val==3) // if auto-on, return auto-off - return 1 - - return val - -// damage and destruction acts - -/obj/machinery/power/apc/meteorhit(var/obj/O as obj) - - set_broken() - return - -/obj/machinery/power/apc/emp_act(severity) - if(cell) - cell.emp_act(severity) - if(occupier) - occupier.emp_act(severity) - lighting = 0 - equipment = 0 - environ = 0 - spawn(600) - equipment = 3 - environ = 3 - ..() - -/obj/machinery/power/apc/ex_act(severity) - - switch(severity) - if(1.0) - //set_broken() //now Del() do what we need - if (cell) - cell.ex_act(1.0) // more lags woohoo - del(src) - return - if(2.0) - if (prob(50)) - set_broken() - if (cell && prob(50)) - cell.ex_act(2.0) - if(3.0) - if (prob(25)) - set_broken() - if (cell && prob(25)) - cell.ex_act(3.0) - return - -/obj/machinery/power/apc/blob_act() - if (prob(75)) - set_broken() - if (cell && prob(5)) - cell.blob_act() - -/obj/machinery/power/apc/proc/set_broken() - if(malfai && operating) - if (ticker.mode.config_tag == "malfunction") - if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas)) - ticker.mode:apcs-- - stat |= BROKEN - operating = 0 - if(occupier) - malfvacate(1) - update_icon() - update() - -// overload all the lights in this APC area - -/obj/machinery/power/apc/proc/overload_lighting() - if(/* !get_connection() || */ !operating || shorted) - return - if( cell && cell.charge>=20) - cell.use(20); - spawn(0) - for(var/area/A in area.related) - for(var/obj/machinery/light/L in A) - L.on = 1 - L.broken() - sleep(1) - -/obj/machinery/power/apc/Del() - if(malfai && operating) - if (ticker.mode.config_tag == "malfunction") - if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas)) - ticker.mode:apcs-- - area.power_light = 0 - area.power_equip = 0 - area.power_environ = 0 - area.power_change() - if(occupier) - malfvacate(1) - ..() - -/obj/machinery/power/apc/proc/shock(mob/user, prb) - if(!prob(prb)) - return 0 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - if(isalien(user)) - return 0 - if (electrocute_mob(user, src, src)) - return 1 - else - return 0 - -/obj/machinery/power/apc/proc/setsubsystem(val) - if(cell && cell.charge > 0) - return (val==1) ? 0 : val - else if(val == 3) - return 1 - else - return 0 - -#undef APC_UPDATE_ICON_COOLDOWN +#define APC_WIRE_IDSCAN 1 +#define APC_WIRE_MAIN_POWER1 2 +#define APC_WIRE_MAIN_POWER2 3 +#define APC_WIRE_AI_CONTROL 4 + +//update_state +#define UPSTATE_CELL_IN 1 +#define UPSTATE_OPENED1 2 +#define UPSTATE_OPENED2 4 +#define UPSTATE_MAINT 8 +#define UPSTATE_BROKE 16 +#define UPSTATE_BLUESCREEN 32 +#define UPSTATE_WIREEXP 64 +#define UPSTATE_ALLGOOD 128 + +//update_overlay +#define APC_UPOVERLAY_CHARGEING0 1 +#define APC_UPOVERLAY_CHARGEING1 2 +#define APC_UPOVERLAY_CHARGEING2 4 +#define APC_UPOVERLAY_EQUIPMENT0 8 +#define APC_UPOVERLAY_EQUIPMENT1 16 +#define APC_UPOVERLAY_EQUIPMENT2 32 +#define APC_UPOVERLAY_LIGHTING0 64 +#define APC_UPOVERLAY_LIGHTING1 128 +#define APC_UPOVERLAY_LIGHTING2 256 +#define APC_UPOVERLAY_ENVIRON0 512 +#define APC_UPOVERLAY_ENVIRON1 1024 +#define APC_UPOVERLAY_ENVIRON2 2048 +#define APC_UPOVERLAY_LOCKED 4096 +#define APC_UPOVERLAY_OPERATING 8192 + + +#define APC_UPDATE_ICON_COOLDOWN 200 // 20 seconds + +// the Area Power Controller (APC), formerly Power Distribution Unit (PDU) +// one per area, needs wire conection to power network + +// controls power to devices in that area +// may be opened to change power cell +// three different channels (lighting/equipment/environ) - may each be set to on, off, or auto + + +//NOTE: STUFF STOLEN FROM AIRLOCK.DM thx + + +/obj/machinery/power/apc + name = "area power controller" + desc = "A control terminal for the area electrical systems." + + icon_state = "apc0" + anchored = 1 + use_power = 0 + req_access = list(access_engine_equip) + var/area/area + var/areastring = null + var/obj/item/weapon/stock_parts/cell/cell + var/start_charge = 90 // initial cell charge % + var/cell_type = 2500 // 0=no cell, 1=regular, 2=high-cap (x5) <- old, now it's just 0=no cell, otherwise dictate cellcapacity by changing this value. 1 used to be 1000, 2 was 2500 + var/opened = 0 //0=closed, 1=opened, 2=cover removed + var/shorted = 0 + var/lighting = 3 + var/equipment = 3 + var/environ = 3 + var/operating = 1 + var/charging = 0 + var/chargemode = 1 + var/chargecount = 0 + var/locked = 1 + var/coverlocked = 1 + var/aidisabled = 0 + var/tdir = null + var/obj/machinery/power/terminal/terminal = null + var/lastused_light = 0 + var/lastused_equip = 0 + var/lastused_environ = 0 + var/lastused_total = 0 + var/main_status = 0 + var/wiresexposed = 0 + powernet = 0 // set so that APCs aren't found as powernet nodes //Hackish, Horrible, was like this before I changed it :( + var/malfhack = 0 //New var for my changes to AI malf. --NeoFite + var/mob/living/silicon/ai/malfai = null //See above --NeoFite +// luminosity = 1 + var/has_electronics = 0 // 0 - none, 1 - plugged in, 2 - secured by screwdriver + var/overload = 1 //used for the Blackout malf module + var/beenhit = 0 // used for counting how many times it has been hit, used for Aliens at the moment + var/mob/living/silicon/ai/occupier = null + var/longtermpower = 10 + var/datum/wires/apc/wires = null + var/auto_name = 0 + var/update_state = -1 + var/update_overlay = -1 + var/global/status_overlays = 0 + var/updating_icon = 0 + var/global/list/status_overlays_lock + var/global/list/status_overlays_charging + var/global/list/status_overlays_equipment + var/global/list/status_overlays_lighting + var/global/list/status_overlays_environ + +/obj/machinery/power/apc/updateDialog() + if (stat & (BROKEN|MAINT)) + return + ..() + +/obj/machinery/power/apc/connect_to_network() + //Override because the APC does not directly connect to the network; it goes through a terminal. + //The terminal is what the power computer looks for anyway. + if(!terminal) + make_terminal() + if(terminal) + terminal.connect_to_network() + +/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0) + ..() + wires = new(src) + // offset 24 pixels in direction of dir + // this allows the APC to be embedded in a wall, yet still inside an area + if (building) + dir = ndir + src.tdir = dir // to fix Vars bug + dir = SOUTH + + if(auto_name) + name = "[get_area(src)] APC" + + pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24) + pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0 + if (building==0) + init() + else + area = src.loc.loc:master + opened = 1 + operating = 0 + name = "[area.name] APC" + stat |= MAINT + src.update_icon() + spawn(5) + src.update() + +/obj/machinery/power/apc/Destroy() + if(malfai && operating) + if (ticker.mode.config_tag == "malfunction") + if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas)) + ticker.mode:apcs-- + area.power_light = 0 + area.power_equip = 0 + area.power_environ = 0 + area.power_change() + if(occupier) + malfvacate(1) + del(wires) + if(cell) + qdel(cell) + if(terminal) + disconnect_terminal() + ..() + +/obj/machinery/power/apc/proc/make_terminal() + // create a terminal object at the same position as original turf loc + // wires will attach to this + terminal = new/obj/machinery/power/terminal(src.loc) + terminal.dir = tdir + terminal.master = src + +/obj/machinery/power/apc/proc/init() + has_electronics = 2 //installed and secured + // is starting with a power cell installed, create it and set its charge level + if(cell_type) + src.cell = new/obj/item/weapon/stock_parts/cell(src) + cell.maxcharge = cell_type // cell_type is maximum charge (old default was 1000 or 2500 (values one and two respectively) + cell.charge = start_charge * cell.maxcharge / 100.0 // (convert percentage to actual value) + + var/area/A = src.loc.loc + + //if area isn't specified use current + if(isarea(A) && src.areastring == null) + src.area = A + else + src.area = get_area_name(areastring) + update_icon() + + make_terminal() + + spawn(5) + src.update() + +/obj/machinery/power/apc/examine() + set src in oview(1) + + if(usr /*&& !usr.stat*/) + ..() + if(stat & BROKEN) + usr << "Looks broken." + return + if(opened) + if(has_electronics && terminal) + usr << "The cover is [opened==2?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"]." + else if (!has_electronics && terminal) + usr << "There are some wires but no any electronics." + else if (has_electronics && !terminal) + usr << "Electronics installed but not wired." + else /* if (!has_electronics && !terminal) */ + usr << "There is no electronics nor connected wires." + + else + if (stat & MAINT) + usr << "The cover is closed. Something wrong with it: it doesn't work." + else if (malfhack) + usr << "The cover is broken. It may be hard to force it open." + else + usr << "The cover is closed." + + +// update the APC icon to show the three base states +// also add overlays for indicator lights +/obj/machinery/power/apc/update_icon() + if (!status_overlays) + status_overlays = 1 + status_overlays_lock = new + status_overlays_charging = new + status_overlays_equipment = new + status_overlays_lighting = new + status_overlays_environ = new + + status_overlays_lock.len = 2 + status_overlays_charging.len = 3 + status_overlays_equipment.len = 4 + status_overlays_lighting.len = 4 + status_overlays_environ.len = 4 + + status_overlays_lock[1] = image(icon, "apcox-0") // 0=blue 1=red + status_overlays_lock[2] = image(icon, "apcox-1") + + status_overlays_charging[1] = image(icon, "apco3-0") + status_overlays_charging[2] = image(icon, "apco3-1") + status_overlays_charging[3] = image(icon, "apco3-2") + + status_overlays_equipment[1] = image(icon, "apco0-0") + status_overlays_equipment[2] = image(icon, "apco0-1") + status_overlays_equipment[3] = image(icon, "apco0-2") + status_overlays_equipment[4] = image(icon, "apco0-3") + + status_overlays_lighting[1] = image(icon, "apco1-0") + status_overlays_lighting[2] = image(icon, "apco1-1") + status_overlays_lighting[3] = image(icon, "apco1-2") + status_overlays_lighting[4] = image(icon, "apco1-3") + + status_overlays_environ[1] = image(icon, "apco2-0") + status_overlays_environ[2] = image(icon, "apco2-1") + status_overlays_environ[3] = image(icon, "apco2-2") + status_overlays_environ[4] = image(icon, "apco2-3") + + var/update = check_updates() //returns 0 if no need to update icons. + // 1 if we need to update the icon_state + // 2 if we need to update the overlays + if(!update) + return + + if(update & 1) // Updating the icon state + if(update_state & UPSTATE_ALLGOOD) + icon_state = "apc0" + else if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2)) + var/basestate = "apc[ cell ? "2" : "1" ]" + if(update_state & UPSTATE_OPENED1) + if(update_state & (UPSTATE_MAINT|UPSTATE_BROKE)) + icon_state = "apcmaint" //disabled APC cannot hold cell + else + icon_state = basestate + else if(update_state & UPSTATE_OPENED2) + if (update_state & UPSTATE_BROKE || malfhack) + icon_state = "[basestate]-b-nocover" + else + icon_state = "[basestate]-nocover" + else if(update_state & UPSTATE_BROKE) + icon_state = "apc-b" + else if(update_state & UPSTATE_BLUESCREEN) + icon_state = "apcemag" + else if(update_state & UPSTATE_WIREEXP) + icon_state = "apcewires" + + if(!(update_state & UPSTATE_ALLGOOD)) + if(overlays.len) + overlays = 0 + + if(update & 2) + if(overlays.len) + overlays.len = 0 + if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) + overlays += status_overlays_lock[locked+1] + overlays += status_overlays_charging[charging+1] + if(operating) + overlays += status_overlays_equipment[equipment+1] + overlays += status_overlays_lighting[lighting+1] + overlays += status_overlays_environ[environ+1] + + +/obj/machinery/power/apc/proc/check_updates() + + var/last_update_state = update_state + var/last_update_overlay = update_overlay + update_state = 0 + update_overlay = 0 + + if(cell) + update_state |= UPSTATE_CELL_IN + if(stat & BROKEN) + update_state |= UPSTATE_BROKE + if(stat & MAINT) + update_state |= UPSTATE_MAINT + if(opened) + if(opened==1) + update_state |= UPSTATE_OPENED1 + if(opened==2) + update_state |= UPSTATE_OPENED2 + else if(emagged || malfai) + update_state |= UPSTATE_BLUESCREEN + else if(wiresexposed) + update_state |= UPSTATE_WIREEXP + if(update_state <= 1) + update_state |= UPSTATE_ALLGOOD + + if(operating) + update_overlay |= APC_UPOVERLAY_OPERATING + + if(update_state & UPSTATE_ALLGOOD) + if(locked) + update_overlay |= APC_UPOVERLAY_LOCKED + + if(!charging) + update_overlay |= APC_UPOVERLAY_CHARGEING0 + else if(charging == 1) + update_overlay |= APC_UPOVERLAY_CHARGEING1 + else if(charging == 2) + update_overlay |= APC_UPOVERLAY_CHARGEING2 + + if (!equipment) + update_overlay |= APC_UPOVERLAY_EQUIPMENT0 + else if(equipment == 1) + update_overlay |= APC_UPOVERLAY_EQUIPMENT1 + else if(equipment == 2) + update_overlay |= APC_UPOVERLAY_EQUIPMENT2 + + if(!lighting) + update_overlay |= APC_UPOVERLAY_LIGHTING0 + else if(lighting == 1) + update_overlay |= APC_UPOVERLAY_LIGHTING1 + else if(lighting == 2) + update_overlay |= APC_UPOVERLAY_LIGHTING2 + + if(!environ) + update_overlay |= APC_UPOVERLAY_ENVIRON0 + else if(environ==1) + update_overlay |= APC_UPOVERLAY_ENVIRON1 + else if(environ==2) + update_overlay |= APC_UPOVERLAY_ENVIRON2 + + + var/results = 0 + if(last_update_state == update_state && last_update_overlay == update_overlay) + return 0 + if(last_update_state != update_state) + results += 1 + if(last_update_overlay != update_overlay) + results += 2 + return results + +// Used in process so it doesn't update the icon too much +/obj/machinery/power/apc/proc/queue_icon_update() + + if(!updating_icon) + updating_icon = 1 + // Start the update + spawn(APC_UPDATE_ICON_COOLDOWN) + update_icon() + updating_icon = 0 + +//attack with an item - open/close cover, insert cell, or (un)lock interface + +/obj/machinery/power/apc/attackby(obj/item/W, mob/user) + + if (istype(user, /mob/living/silicon) && get_dist(src,user)>1) + return src.attack_hand(user) + if (istype(W, /obj/item/weapon/crowbar) && opened) + if (has_electronics==1) + if (terminal) + user << "\red Disconnect wires first." + return + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + user << "You are trying to remove the power control board..." //lpeters - fixed grammar issues + if(do_after(user, 50)) + has_electronics = 0 + if ((stat & BROKEN) || malfhack) + user.visible_message(\ + "\red [user.name] has broken the power control board inside [src.name]!",\ + "You broke the charred power control board and remove the remains.", + "You hear a crack!") + //ticker.mode:apcs-- //XSI said no and I agreed. -rastaf0 + else + user.visible_message(\ + "\red [user.name] has removed the power control board from [src.name]!",\ + "You remove the power control board.") + new /obj/item/weapon/module/power_control(loc) + else if (opened!=2) //cover isn't removed + opened = 0 + update_icon() + else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) ) + if(coverlocked && !(stat & MAINT)) + user << "\red The cover is locked and cannot be opened." + return + else + opened = 1 + update_icon() + else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside + if(cell) + user << "There is a power cell already installed." + return + else + if (stat & MAINT) + user << "\red There is no connector for your power cell." + return + user.drop_item() + W.loc = src + cell = W + user.visible_message(\ + "\red [user.name] has inserted the power cell to [src.name]!",\ + "You insert the power cell.") + chargecount = 0 + update_icon() + else if (istype(W, /obj/item/weapon/screwdriver)) // haxing + if(opened) + if (cell) + user << "\red Close the APC first." //Less hints more mystery! + return + else + if (has_electronics==1 && terminal) + has_electronics = 2 + stat &= ~MAINT + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You screw the circuit electronics into place." + else if (has_electronics==2) + has_electronics = 1 + stat |= MAINT + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You unfasten the electronics." + else /* has_electronics==0 */ + user << "\red There is nothing to secure." + return + update_icon() + else if(emagged) + user << "The interface is broken." + else + wiresexposed = !wiresexposed + user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" + update_icon() + + else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card + if(emagged) + user << "The interface is broken." + else if(opened) + user << "You must close the cover to swipe an ID card." + else if(wiresexposed) + user << "You must close the panel" + else if(stat & (BROKEN|MAINT)) + user << "Nothing happens." + else + if(src.allowed(usr) && !isWireCut(APC_WIRE_IDSCAN)) + locked = !locked + user << "You [ locked ? "lock" : "unlock"] the APC interface." + update_icon() + else + user << "\red Access denied." + else if (istype(W, /obj/item/weapon/card/emag) && !(emagged || malfhack)) // trying to unlock with an emag card + if(opened) + user << "You must close the cover to swipe an ID card." + else if(wiresexposed) + user << "You must close the panel first" + else if(stat & (BROKEN|MAINT)) + user << "Nothing happens." + else + flick("apc-spark", src) + if (do_after(user,6)) + if(prob(50)) + emagged = 1 + locked = 0 + user << "You emag the APC interface." + update_icon() + else + user << "You fail to [ locked ? "unlock" : "lock"] the APC interface." + else if (istype(W, /obj/item/stack/cable_coil) && !terminal && opened && has_electronics!=2) + if (src.loc:intact) + user << "\red You must remove the floor plating in front of the APC first." + return + var/obj/item/stack/cable_coil/C = W + if(C.amount < 10) + user << "\red You need more wires." + return + user << "You start adding cables to the APC frame..." + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + if(do_after(user, 20) && C.amount >= 10) + var/turf/T = get_turf(src) + var/obj/structure/cable/N = T.get_cable_node() + if (prob(50) && electrocute_mob(usr, N, N)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + return + C.use(10) + user.visible_message(\ + "\red [user.name] has added cables to the APC frame!",\ + "You add cables to the APC frame.") + make_terminal() + terminal.connect_to_network() + else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2) + if (src.loc:intact) + user << "\red You must remove the floor plating in front of the APC first." + return + user << "You begin to cut the cables..." + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + if(do_after(user, 50)) + if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + return + new /obj/item/stack/cable_coil(loc,10) + user.visible_message(\ + "\red [user.name] cut the cables and dismantled the power terminal.",\ + "You cut the cables and dismantle the power terminal.") + qdel(terminal) + else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack)) + user << "You trying to insert the power control board into the frame..." + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + if(do_after(user, 10)) + has_electronics = 1 + user << "You place the power control board inside the frame." + qdel(W) + else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && ((stat & BROKEN) || malfhack)) + user << "\red You cannot put the board inside, the frame is damaged." + return + else if (istype(W, /obj/item/weapon/weldingtool) && opened && has_electronics==0 && !terminal) + var/obj/item/weapon/weldingtool/WT = W + if (WT.get_fuel() < 3) + user << "\blue You need more welding fuel to complete this task." + return + user << "You start welding the APC frame..." + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) + if(do_after(user, 50)) + if(!src || !WT.remove_fuel(3, user)) return + if (emagged || malfhack || (stat & BROKEN) || opened==2) + new /obj/item/stack/sheet/metal(loc) + user.visible_message(\ + "\red [src] has been cut apart by [user.name] with the weldingtool.",\ + "You disassembled the broken APC frame.",\ + "\red You hear welding.") + else + new /obj/item/apc_frame(loc) + user.visible_message(\ + "\red [src] has been cut from the wall by [user.name] with the weldingtool.",\ + "You cut the APC frame from the wall.",\ + "\red You hear welding.") + qdel(src) + return + else if (istype(W, /obj/item/apc_frame) && opened && emagged) + emagged = 0 + if (opened==2) + opened = 1 + user.visible_message(\ + "\red [user.name] has replaced the damaged APC frontal panel with a new one.",\ + "You replace the damaged APC frontal panel with a new one.") + qdel(W) + update_icon() + else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || malfhack)) + if (has_electronics) + user << "You cannot repair this APC until you remove the electronics still inside." + return + user << "You begin to replace the damaged APC frame..." + if(do_after(user, 50)) + user.visible_message(\ + "\red [user.name] has replaced the damaged APC frame with new one.",\ + "You replace the damaged APC frame with new one.") + qdel(W) + stat &= ~BROKEN + malfai = null + malfhack = 0 + if (opened==2) + opened = 1 + update_icon() + else + if ( ((stat & BROKEN) || malfhack) \ + && !opened \ + && W.force >= 5 \ + && W.w_class >= 3.0 \ + && prob(20) ) + opened = 2 + user.visible_message("\red The APC cover was knocked down with the [W.name] by [user.name]!", \ + "\red You knock down the APC cover with your [W.name]!", \ + "You hear bang") + update_icon() + else + if (istype(user, /mob/living/silicon)) + return src.attack_hand(user) + if (!opened && wiresexposed && \ + (istype(W, /obj/item/device/multitool) || \ + istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/assembly/signaler))) + return src.attack_hand(user) + user.visible_message("\red The [src.name] has been hit with the [W.name] by [user.name]!", \ + "\red You hit the [src.name] with your [W.name]!", \ + "You hear bang") + +// attack with hand - remove cell (if cover open) or interact with the APC + +/obj/machinery/power/apc/attack_hand(mob/user) +// if (!can_use(user)) This already gets called in interact() and in topic() +// return + if(!user) + return + src.add_fingerprint(user) + if(usr == user && opened && (!issilicon(user))) + if(cell) + user.put_in_hands(cell) + cell.add_fingerprint(user) + cell.updateicon() + + src.cell = null + user.visible_message("\red [user.name] removes the power cell from [src.name]!", "You remove the power cell.") + //user << "You remove the power cell." + charging = 0 + src.update_icon() + return + if(stat & (BROKEN|MAINT)) + return + // do APC interaction + src.interact(user) + +/obj/machinery/power/apc/attack_alien(mob/living/carbon/alien/humanoid/user) + if(!user) + return + user.visible_message("\red [user.name] slashes at the [src.name]!", "\blue You slash at the [src.name]!") + playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) + + var/allcut = wires.IsAllCut() + + if(beenhit >= pick(3, 4) && wiresexposed != 1) + wiresexposed = 1 + src.update_icon() + src.visible_message("\red The [src.name]'s cover flies open, exposing the wires!") + + else if(wiresexposed == 1 && allcut == 0) + wires.CutAll() + src.update_icon() + src.visible_message("\red The [src.name]'s wires are shredded!") + else + beenhit += 1 + return + + +/obj/machinery/power/apc/interact(mob/user) + if(!user) + return + + if(wiresexposed /*&& (!istype(user, /mob/living/silicon))*/) //Commented out the typecheck to allow engiborgs to repair damaged apcs. + wires.Interact(user) + + return ui_interact(user) + + +/obj/machinery/power/apc/proc/get_malf_status(mob/user) + if (ticker && ticker.mode && (user.mind in ticker.mode.malf_ai) && istype(user, /mob/living/silicon/ai)) + if (src.malfai == (user:parent ? user:parent : user)) + if (src.occupier == user) + return 3 // 3 = User is shunted in this APC + else if (istype(user.loc, /obj/machinery/power/apc)) + return 4 // 4 = User is shunted in another APC + else + return 2 // 2 = APC hacked by user, and user is in its core. + else + return 1 // 1 = APC not hacked. + else + return 0 // 0 = User is not a Malf AI + + +/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) + if(!user) + return + + var/list/data = list( + "locked" = locked, + "isOperating" = operating, + "externalPower" = main_status, + "powerCellStatus" = cell ? cell.percent() : null, + "chargeMode" = chargemode, + "chargingStatus" = charging, + "totalLoad" = lastused_equip + lastused_light + lastused_environ, + "coverLocked" = coverlocked, + "siliconUser" = istype(user, /mob/living/silicon), + "malfStatus" = get_malf_status(user), + + "powerChannels" = list( + list( + "title" = "Equipment", + "powerLoad" = lastused_equip, + "status" = equipment, + "topicParams" = list( + "auto" = list("eqp" = 3), + "on" = list("eqp" = 2), + "off" = list("eqp" = 1) + ) + ), + list( + "title" = "Lighting", + "powerLoad" = lastused_light, + "status" = lighting, + "topicParams" = list( + "auto" = list("lgt" = 3), + "on" = list("lgt" = 2), + "off" = list("lgt" = 1) + ) + ), + list( + "title" = "Environment", + "powerLoad" = lastused_environ, + "status" = environ, + "topicParams" = list( + "auto" = list("env" = 3), + "on" = list("env" = 2), + "off" = list("env" = 1) + ) + ) + ) + ) + + // update the ui if it exists, returns null if no ui is passed/found + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) + 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, "apc.tmpl", "[area.name] - APC", 520, data["siliconUser"] ? 465 : 420) + // when the ui is first opened this is the data it will use + ui.set_initial_data(data) + // open the new ui window + ui.open() + // auto update every Master Controller tick + ui.set_auto_update(1) + +/obj/machinery/power/apc/proc/report() + return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_equip+lastused_light+lastused_environ]) : [cell? cell.percent() : "N/C"] ([charging])" + +/obj/machinery/power/apc/proc/update() + if(operating && !shorted) + area.power_light = (lighting > 1) + area.power_equip = (equipment > 1) + area.power_environ = (environ > 1) +// if (area.name == "AI Chamber") +// spawn(10) +// world << " [area.name] [area.power_equip]" + else + area.power_light = 0 + area.power_equip = 0 + area.power_environ = 0 +// if (area.name == "AI Chamber") +// world << "[area.power_equip]" + area.power_change() + +/obj/machinery/power/apc/proc/isWireCut(var/wireIndex) + return wires.IsIndexCut(wireIndex) + + +/obj/machinery/power/apc/proc/can_use(mob/user as mob, var/loud = 0) //used by attack_hand() and Topic() + if (user.stat) + user << "\red You must be conscious to use this [src]!" + return 0 + if(!user.client) + return 0 + if ( ! (istype(user, /mob/living/carbon/human) || \ + istype(user, /mob/living/silicon) || \ + istype(user, /mob/living/carbon/monkey) /*&& ticker && ticker.mode.name == "monkey"*/) ) + user << "\red You don't have the dexterity to use this [src]!" + return 0 + if(user.restrained()) + user << "\red You must have free hands to use this [src]" + return 0 + if(user.lying) + user << "\red You must stand to use this [src]!" + return 0 + if (istype(user, /mob/living/silicon)) + var/mob/living/silicon/ai/AI = user + var/mob/living/silicon/robot/robot = user + if ( \ + src.aidisabled || \ + malfhack && istype(malfai) && \ + ( \ + (istype(AI) && (malfai!=AI && malfai != AI.parent)) || \ + (istype(robot) && (robot in malfai.connected_robots)) \ + ) \ + ) + if(!loud) + user << "\red \The [src] have AI control disabled!" + return 0 + else + if ((!in_range(src, user) || !istype(src.loc, /turf))) + return 0 + + var/mob/living/carbon/human/H = user + if (istype(H)) + if(H.getBrainLoss() >= 60) + for(var/mob/M in viewers(src, null)) + M << "\red [H] stares cluelessly at [src] and drools." + return 0 + else if(prob(H.getBrainLoss())) + user << "\red You momentarily forget how to use [src]." + return 0 + return 1 + +/obj/machinery/power/apc/Topic(href, href_list) + if(..()) + return 0 + + if(!can_use(usr, 1)) + return 0 + + if (href_list["lock"]) + coverlocked = !coverlocked + + else if (href_list["breaker"]) + toggle_breaker() + + else if (href_list["cmode"]) + chargemode = !chargemode + if(!chargemode) + charging = 0 + update_icon() + + else if (href_list["eqp"]) + var/val = text2num(href_list["eqp"]) + equipment = setsubsystem(val) + update_icon() + update() + + else if (href_list["lgt"]) + var/val = text2num(href_list["lgt"]) + lighting = setsubsystem(val) + update_icon() + update() + + else if (href_list["env"]) + var/val = text2num(href_list["env"]) + environ = setsubsystem(val) + update_icon() + update() + + else if (href_list["overload"]) + if(istype(usr, /mob/living/silicon)) + src.overload_lighting() + + else if (href_list["malfhack"]) + var/mob/living/silicon/ai/malfai = usr + if(get_malf_status(malfai)==1) + if (malfai.malfhacking) + malfai << "You are already hacking an APC." + return 1 + malfai << "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process." + malfai.malfhack = src + malfai.malfhacking = 1 + sleep(600) + if(src) + if (!src.aidisabled) + malfai.malfhack = null + malfai.malfhacking = 0 + locked = 1 + if (ticker.mode.config_tag == "malfunction") + if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas)) + ticker.mode:apcs++ + if(usr:parent) + src.malfai = usr:parent + else + src.malfai = usr + malfai << "Hack complete. The APC is now under your exclusive control." + update_icon() + + else if (href_list["occupyapc"]) + if(get_malf_status(usr)) + malfoccupy(usr) + + else if (href_list["deoccupyapc"]) + if(get_malf_status(usr)) + malfvacate() + + else if (href_list["toggleaccess"]) + if(istype(usr, /mob/living/silicon)) + if(emagged || (stat & (BROKEN|MAINT))) + usr << "The APC does not respond to the command." + else + locked = !locked + update_icon() + + return 1 + +/obj/machinery/power/apc/proc/toggle_breaker() + operating = !operating + + if(malfai) + if (ticker.mode.config_tag == "malfunction") + if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas)) + operating ? ticker.mode:apcs++ : ticker.mode:apcs-- + + src.update() + update_icon() + +/obj/machinery/power/apc/proc/malfoccupy(var/mob/living/silicon/ai/malf) + if(!istype(malf)) + return + if(istype(malf.loc, /obj/machinery/power/apc)) // Already in an APC + malf << "You must evacuate your current apc first." + return + if(!malf.can_shunt) + malf << "You cannot shunt." + return + if(src.z != 1) + return + src.occupier = new /mob/living/silicon/ai(src,malf.laws,null,1) + src.occupier.adjustOxyLoss(malf.getOxyLoss()) + if(!findtext(src.occupier.name,"APC Copy")) + src.occupier.name = "[malf.name] APC Copy" + if(malf.parent) + src.occupier.parent = malf.parent + else + src.occupier.parent = malf + malf.mind.transfer_to(src.occupier) + src.occupier.eyeobj.name = "[src.occupier.name] (AI Eye)" + if(malf.parent) + qdel(malf) + src.occupier.verbs += /mob/living/silicon/ai/proc/corereturn + src.occupier.verbs += /datum/game_mode/malfunction/proc/takeover + src.occupier.cancel_camera() + if (seclevel2num(get_security_level()) == SEC_LEVEL_DELTA) + for(var/obj/item/weapon/pinpointer/point in world) + point.the_disk = src //the pinpointer will detect the shunted AI + + +/obj/machinery/power/apc/proc/malfvacate(var/forced) + if(!src.occupier) + return + if(src.occupier.parent && src.occupier.parent.stat != 2) + src.occupier.mind.transfer_to(src.occupier.parent) + src.occupier.parent.adjustOxyLoss(src.occupier.getOxyLoss()) + src.occupier.parent.cancel_camera() + qdel(src.occupier) + if (seclevel2num(get_security_level()) == SEC_LEVEL_DELTA) + for(var/obj/item/weapon/pinpointer/point in world) + for(var/datum/mind/AI_mind in ticker.mode.malf_ai) + var/mob/living/silicon/ai/A = AI_mind.current // the current mob the mind owns + if(A.stat != DEAD) + point.the_disk = A //The pinpointer tracks the AI back into its core. + + else + src.occupier << "\red Primary core damaged, unable to return core processes." + if(forced) + src.occupier.loc = src.loc + src.occupier.death() + src.occupier.gib() + for(var/obj/item/weapon/pinpointer/point in world) + point.the_disk = null //the pinpointer will go back to pointing at the nuke disc. + + +/obj/machinery/power/apc/proc/ion_act() + //intended to be exactly the same as an AI malf attack + if(!src.malfhack && src.z == 1) + if(prob(3)) + src.locked = 1 + if (src.cell.charge > 0) +// world << "\red blew APC in [src.loc.loc]" + src.cell.charge = 0 + cell.corrupt() + src.malfhack = 1 + update_icon() + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + smoke.set_up(3, 0, src.loc) + smoke.attach(src) + smoke.start() + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + for(var/mob/M in viewers(src)) + M.show_message("\red The [src.name] suddenly lets out a blast of smoke and some sparks!", 3, "\red You hear sizzling electronics.", 2) + + +/obj/machinery/power/apc/surplus() + if(terminal) + return terminal.surplus() + else + return 0 + +/obj/machinery/power/apc/add_load(var/amount) + if(terminal && terminal.powernet) + terminal.powernet.newload += amount + +/obj/machinery/power/apc/avail() + if(terminal) + return terminal.avail() + else + return 0 + +/obj/machinery/power/apc/process() + + if(stat & (BROKEN|MAINT)) + return + if(!area.requires_power) + return + + + /* + if (equipment > 1) // off=0, off auto=1, on=2, on auto=3 + use_power(src.equip_consumption, EQUIP) + if (lighting > 1) // off=0, off auto=1, on=2, on auto=3 + use_power(src.light_consumption, LIGHT) + if (environ > 1) // off=0, off auto=1, on=2, on auto=3 + use_power(src.environ_consumption, ENVIRON) + + area.calc_lighting() */ + + lastused_light = area.usage(LIGHT) + lastused_equip = area.usage(EQUIP) + lastused_environ = area.usage(ENVIRON) + area.clear_usage() + + lastused_total = lastused_light + lastused_equip + lastused_environ + + //store states to update icon if any change + var/last_lt = lighting + var/last_eq = equipment + var/last_en = environ + var/last_ch = charging + + var/excess = surplus() + + if(!src.avail()) + main_status = 0 + else if(excess < 0) + main_status = 1 + else + main_status = 2 + + var/perapc = 0 + if(terminal && terminal.powernet) + perapc = terminal.powernet.perapc + + //if(debug) + // world.log << "Status: [main_status] - Excess: [excess] - Last Equip: [lastused_equip] - Last Light: [lastused_light] - Longterm: [longtermpower]" + + if(cell && !shorted) + + + // draw power from cell as before + var/cellused = min(cell.charge, CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell + cell.use(cellused) + + if(excess > 0 || perapc > lastused_total) // if power excess, or enough anyway, recharge the cell + // by the same amount just used + cell.give(cellused) + add_load(cellused/CELLRATE) // add the load used to recharge the cell + + + else // no excess, and not enough per-apc + + if( (cell.charge/CELLRATE+perapc) >= lastused_total) // can we draw enough from cell+grid to cover last usage? + + cell.charge = min(cell.maxcharge, cell.charge + CELLRATE * perapc) //recharge with what we can + add_load(perapc) // so draw what we can from the grid + charging = 0 + + else // not enough power available to run the last tick! + charging = 0 + chargecount = 0 + // This turns everything off in the case that there is still a charge left on the battery, just not enough to run the room. + equipment = autoset(equipment, 0) + lighting = autoset(lighting, 0) + environ = autoset(environ, 0) + + + // set channels depending on how much charge we have left + + // Allow the APC to operate as normal if the cell can charge + if(charging && longtermpower < 10) + longtermpower += 1 + else if(longtermpower > -10) + longtermpower -= 2 + + if(cell.charge <= 0) // zero charge, turn all off + equipment = autoset(equipment, 0) + lighting = autoset(lighting, 0) + environ = autoset(environ, 0) + area.poweralert(0, src) + else if(cell.percent() < 15 && longtermpower < 0) // <15%, turn off lighting & equipment + equipment = autoset(equipment, 2) + lighting = autoset(lighting, 2) + environ = autoset(environ, 1) + area.poweralert(0, src) + else if(cell.percent() < 30 && longtermpower < 0) // <30%, turn off equipment + equipment = autoset(equipment, 2) + lighting = autoset(lighting, 1) + environ = autoset(environ, 1) + area.poweralert(0, src) + else // otherwise all can be on + equipment = autoset(equipment, 1) + lighting = autoset(lighting, 1) + environ = autoset(environ, 1) + area.poweralert(1, src) + if(cell.percent() > 75) + area.poweralert(1, src) + + // now trickle-charge the cell + + if(chargemode && charging == 1 && operating) + if(excess > 0) // check to make sure we have enough to charge + // Max charge is perapc share, capped to cell capacity, or % per second constant (Whichever is smallest) +/* var/ch = min(perapc, (cell.maxcharge - cell.charge), (cell.maxcharge*CHARGELEVEL)) + add_load(ch) // Removes the power we're taking from the grid + cell.give(ch) // actually recharge the cell +*/ + var/ch = min(perapc*CELLRATE, (cell.maxcharge - cell.charge), (cell.maxcharge*CHARGELEVEL)) + add_load(ch/CELLRATE) // Removes the power we're taking from the grid + cell.give(ch) // actually recharge the cell + + else + charging = 0 // stop charging + chargecount = 0 + + // show cell as fully charged if so + + if(cell.charge >= cell.maxcharge) + charging = 2 + + if(chargemode) + if(!charging) + if(excess > cell.maxcharge*CHARGELEVEL) + chargecount++ + else + chargecount = 0 + + if(chargecount == 10) + + chargecount = 0 + charging = 1 + + else // chargemode off + charging = 0 + chargecount = 0 + + else // no cell, switch everything off + + charging = 0 + chargecount = 0 + equipment = autoset(equipment, 0) + lighting = autoset(lighting, 0) + environ = autoset(environ, 0) + area.poweralert(0, src) + + // update icon & area power if anything changed + + if(last_lt != lighting || last_eq != equipment || last_en != environ) + queue_icon_update() + update() + else if (last_ch != charging) + queue_icon_update() + +// val 0=off, 1=off(auto) 2=on 3=on(auto) +// on 0=off, 1=on, 2=autooff + +obj/machinery/power/apc/proc/autoset(var/val, var/on) + if(on==0) + if(val==2) // if on, return off + return 0 + else if(val==3) // if auto-on, return auto-off + return 1 + + else if(on==1) + if(val==1) // if auto-off, return auto-on + return 3 + + else if(on==2) + if(val==3) // if auto-on, return auto-off + return 1 + + return val + +// damage and destruction acts + +/obj/machinery/power/apc/meteorhit(var/obj/O as obj) + + set_broken() + return + +/obj/machinery/power/apc/emp_act(severity) + if(cell) + cell.emp_act(severity) + if(occupier) + occupier.emp_act(severity) + lighting = 0 + equipment = 0 + environ = 0 + spawn(600) + equipment = 3 + environ = 3 + ..() + +/obj/machinery/power/apc/ex_act(severity) + + switch(severity) + if(1.0) + //set_broken() //now Del() do what we need + if (cell) + cell.ex_act(1.0) // more lags woohoo + qdel(src) + return + if(2.0) + if (prob(50)) + set_broken() + if (cell && prob(50)) + cell.ex_act(2.0) + if(3.0) + if (prob(25)) + set_broken() + if (cell && prob(25)) + cell.ex_act(3.0) + return + +/obj/machinery/power/apc/blob_act() + if (prob(75)) + set_broken() + if (cell && prob(5)) + cell.blob_act() + +/obj/machinery/power/apc/disconnect_terminal() + if(terminal) + terminal.master = null + terminal = null + +/obj/machinery/power/apc/proc/set_broken() + if(malfai && operating) + if (ticker.mode.config_tag == "malfunction") + if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas)) + ticker.mode:apcs-- + stat |= BROKEN + operating = 0 + if(occupier) + malfvacate(1) + update_icon() + update() + +// overload all the lights in this APC area + +/obj/machinery/power/apc/proc/overload_lighting() + if(/* !get_connection() || */ !operating || shorted) + return + if( cell && cell.charge>=20) + cell.use(20); + spawn(0) + for(var/area/A in area.related) + for(var/obj/machinery/light/L in A) + L.on = 1 + L.broken() + sleep(1) + +/obj/machinery/power/apc/proc/shock(mob/user, prb) + if(!prob(prb)) + return 0 + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + if(isalien(user)) + return 0 + if (electrocute_mob(user, src, src)) + return 1 + else + return 0 + +/obj/machinery/power/apc/proc/setsubsystem(val) + if(cell && cell.charge > 0) + return (val==1) ? 0 : val + else if(val == 3) + return 1 + else + return 0 + +#undef APC_UPDATE_ICON_COOLDOWN diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index ea78170cf41..ba011c6777c 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -1,640 +1,635 @@ -// attach a wire to a power machine - leads from the turf you are standing on - -/obj/machinery/power/attackby(obj/item/weapon/W, mob/user) - - if(istype(W, /obj/item/stack/cable_coil)) - - var/obj/item/stack/cable_coil/coil = W - - var/turf/T = user.loc - - if(T.intact || !istype(T, /turf/simulated/floor)) - return - - if(get_dist(src, user) > 1) - return - - if(!directwired) // only for attaching to directwired machines - return - - coil.turf_place(T, user) - return - else - ..() - return - -/obj/structure/cable - level = 1 - anchored =1 - var/datum/powernet/powernet - name = "power cable" - desc = "A flexible superconducting cable for heavy-duty power transfer" - icon = 'icons/obj/power_cond/power_cond_red.dmi' - icon_state = "0-1" - var/d1 = 0 - var/d2 = 1 - layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 - var/cable_color = "red" - var/obj/structure/powerswitch/power_switch - -/obj/structure/cable/yellow - cable_color = "yellow" - icon = 'icons/obj/power_cond/power_cond_yellow.dmi' - -/obj/structure/cable/green - cable_color = "green" - icon = 'icons/obj/power_cond/power_cond_green.dmi' - -/obj/structure/cable/blue - cable_color = "blue" - icon = 'icons/obj/power_cond/power_cond_blue.dmi' - -/obj/structure/cable/pink - cable_color = "pink" - icon = 'icons/obj/power_cond/power_cond_pink.dmi' - -/obj/structure/cable/orange - cable_color = "orange" - icon = 'icons/obj/power_cond/power_cond_orange.dmi' - -/obj/structure/cable/cyan - cable_color = "cyan" - icon = 'icons/obj/power_cond/power_cond_cyan.dmi' - -/obj/structure/cable/white - cable_color = "white" - icon = 'icons/obj/power_cond/power_cond_white.dmi' - -// the power cable object - -/obj/structure/cable/New() - ..() - - - // ensure d1 & d2 reflect the icon_state for entering and exiting cable - - var/dash = findtext(icon_state, "-") - - d1 = text2num( copytext( icon_state, 1, dash ) ) - - d2 = text2num( copytext( icon_state, dash+1 ) ) - - var/turf/T = src.loc // hide if turf is not intact - - if(level==1) hide(T.intact) - cable_list += src - - -/obj/structure/cable/Del() // called when a cable is deleted - if(!defer_powernet_rebuild) // set if network will be rebuilt manually - if(powernet) - powernet.cut_cable(src) // update the powernets - cable_list -= src - ..() // then go ahead and delete the cable - -/obj/structure/cable/hide(var/i) - - if(level == 1 && istype(loc, /turf)) - invisibility = i ? 101 : 0 - updateicon() - -/obj/structure/cable/proc/updateicon() - if(invisibility) - icon_state = "[d1]-[d2]-f" - else - icon_state = "[d1]-[d2]" - - -// returns the powernet this cable belongs to -/obj/structure/cable/proc/get_powernet() //TODO: remove this as it is obsolete - return powernet - -/obj/structure/cable/attack_tk(mob/user) - return - -/obj/structure/cable/attackby(obj/item/W, mob/user) - - var/turf/T = src.loc - if(T.intact) - return - - if(istype(W, /obj/item/weapon/wirecutters)) - -// if(power_switch) -// user << "\red This piece of cable is tied to a power switch. Flip the switch to remove it." -// return - - if (shock(user, 50)) - return - - if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long - new/obj/item/stack/cable_coil(T, 2, cable_color) - else - new/obj/item/stack/cable_coil(T, 1, cable_color) - - for(var/mob/O in viewers(src, null)) - O.show_message("\red [user] cuts the cable.", 1) - - investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires") - - del(src) - return - - - else if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/coil = W - coil.cable_join(src, user) - - else if(istype(W, /obj/item/device/multitool)) - - var/datum/powernet/PN = get_powernet() // find the powernet - - if(PN && (PN.avail > 0)) // is it powered? - user << "\red [PN.avail]W in power network." - - else - user << "\red The cable is not powered." - - shock(user, 5, 0.2) - - else - if (W.flags & CONDUCT) - shock(user, 50, 0.7) - - src.add_fingerprint(user) - -// shock the user with probability prb - -/obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0) - if(!prob(prb)) - return 0 - if (electrocute_mob(user, powernet, src, siemens_coeff)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - return 1 - else - return 0 - -/obj/structure/cable/ex_act(severity) - switch(severity) - if(1.0) - del(src) - if(2.0) - if (prob(50)) - new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, cable_color) - del(src) - - if(3.0) - if (prob(25)) - new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, cable_color) - del(src) - return - -// the cable coil object, used for laying cable - -#define MAXCOIL 30 -/obj/item/stack/cable_coil - name = "cable coil" - icon = 'icons/obj/power.dmi' - icon_state = "coil_red" - item_state = "coil_red" - amount = MAXCOIL - item_color = "red" - desc = "A coil of power cable." - throwforce = 0 - w_class = 2.0 - throw_speed = 3 - throw_range = 5 - m_amt = 50 - g_amt = 20 - flags = CONDUCT - slot_flags = SLOT_BELT - attack_verb = list("whipped", "lashed", "disciplined", "flogged") - - suicide_act(mob/user) - if(locate(/obj/structure/stool) in user.loc) - viewers(user) << "[user] is making a noose with the [src.name]! It looks like \he's trying to commit suicide." - else - viewers(user) << "[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide." - return(OXYLOSS) - -/obj/item/stack/cable_coil/attack(mob/living/carbon/human/H, mob/user) - if(!istype(H)) - return ..() - - var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting)) - if(affecting.status == ORGAN_ROBOTIC) - src.item_heal_robotic(H, user, 0, 30) - src.use(1) - return - else - return ..() - -/obj/item/stack/cable_coil/New(loc, amount = MAXCOIL, var/param_color = null) - ..() - src.amount = amount - if (param_color) - item_color = param_color - pixel_x = rand(-2,2) - pixel_y = rand(-2,2) - update_icon() - -/obj/item/stack/cable_coil/update_icon() - if (!item_color) - item_color = pick("red", "yellow", "blue", "green") - if(amount == 1) - icon_state = "coil_[item_color]1" - name = "cable piece" - else if(amount == 2) - icon_state = "coil_[item_color]2" - name = "cable piece" - else - icon_state = "coil_[item_color]" - name = "cable coil" - -/obj/item/stack/cable_coil/examine() - set src in view(1) - - if(amount == 1) - usr << "A short piece of power cable." - else if(amount == 2) - usr << "A piece of power cable." - else - usr << "A coil of power cable. There are [amount] lengths of cable in the coil." - -/obj/item/stack/cable_coil/verb/make_restraint() - set name = "Make Cable Restraints" - set category = "Object" - var/mob/M = usr - - if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned) - if(!istype(usr.loc,/turf)) return - if(src.amount <= 14) - usr << "\red You need at least 15 lengths to make restraints!" - return - var/obj/item/weapon/handcuffs/cable/B = new /obj/item/weapon/handcuffs/cable(usr.loc) - B.icon_state = "cuff_[item_color]" - usr << "\blue You wind some cable together to make some restraints." - src.use(15) - else - usr << "\blue You cannot do that." - ..() - -/obj/item/stack/cable_coil/attackby(obj/item/weapon/W, mob/user) - ..() - if( istype(W, /obj/item/weapon/wirecutters) && src.amount > 1) - src.amount-- - new/obj/item/stack/cable_coil(user.loc, 1,item_color) - user << "You cut a piece off the cable coil." - src.update_icon() - return - - else if( istype(W, /obj/item/stack/cable_coil) ) - var/obj/item/stack/cable_coil/C = W - if(C.amount >= MAXCOIL) - user << "The coil is too long, you cannot add any more cable to it." - return - - if( (C.amount + src.amount <= MAXCOIL) ) - user << "You join the cable coils together." - C.give(src.amount) // give it cable - src.use(src.amount) // make sure this one cleans up right - return - - else - var/amt = MAXCOIL - C.amount - user << "You transfer [amt] length\s of cable from one coil to the other." - C.give(amt) - src.use(amt) - return - -/obj/item/stack/cable_coil/use(var/used) - if(src.amount < used) - return 0 - else if (src.amount == used) - .=1 //Because del(src) stops the proc, set the default return value to 1 - if(ismob(loc)) //handle mob icon update - var/mob/M = loc - M.unEquip(src) - del(src) - else - amount -= used - update_icon() - return 1 - -/obj/item/stack/cable_coil/proc/give(var/extra) - if(amount + extra > MAXCOIL) - amount = MAXCOIL - else - amount += extra - update_icon() - -// called when cable_coil is clicked on a turf/simulated/floor - -/obj/item/stack/cable_coil/proc/turf_place(turf/simulated/floor/F, mob/user) - - if(!isturf(user.loc)) - return - - if(get_dist(F,user) > 1) - user << "You can't lay cable at a place that far away." - return - - if(F.intact) // if floor is intact, complain - user << "You can't lay cable there unless the floor tiles are removed." - return - - else - var/dirn - - if(user.loc == F) - dirn = user.dir // if laying on the tile we're on, lay in the direction we're facing - else - dirn = get_dir(F, user) - - for(var/obj/structure/cable/LC in F) - if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0)) - user << "There's already a cable at that position." - return - - var/obj/structure/cable/C = new(F) - - C.cableColor(item_color) - - C.d1 = 0 - C.d2 = dirn - C.add_fingerprint(user) - C.updateicon() - - C.powernet = new() - powernets += C.powernet - C.powernet.cables += C - - C.mergeConnectedNetworks(C.d2) - C.mergeConnectedNetworksOnTurf() - - - use(1) - if (C.shock(user, 50)) - if (prob(50)) //fail - new/obj/item/stack/cable_coil(C.loc, 1, C.cable_color) - del(C) - //src.laying = 1 - //last = C - - -// called when cable_coil is click on an installed obj/cable - -/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user) - - var/turf/U = user.loc - if(!isturf(U)) - return - - var/turf/T = C.loc - - if(!isturf(T) || T.intact) // sanity checks, also stop use interacting with T-scanner revealed cable - return - - if(get_dist(C, user) > 1) // make sure it's close enough - user << "You can't lay cable at a place that far away." - return - - - if(U == T) // do nothing if we clicked a cable we're standing on - return // may change later if can think of something logical to do - - var/dirn = get_dir(C, user) - - if(C.d1 == dirn || C.d2 == dirn) // one end of the clicked cable is pointing towards us - if(U.intact) // can't place a cable if the floor is complete - user << "You can't lay cable there unless the floor tiles are removed." - return - else - // cable is pointing at us, we're standing on an open tile - // so create a stub pointing at the clicked cable on our tile - - var/fdirn = turn(dirn, 180) // the opposite direction - - for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already - if(LC.d1 == fdirn || LC.d2 == fdirn) - user << "There's already a cable at that position." - return - - var/obj/structure/cable/NC = new(U) - NC.cableColor(item_color) - - NC.d1 = 0 - NC.d2 = fdirn - NC.add_fingerprint() - NC.updateicon() - - if(C.powernet) - NC.powernet = C.powernet - NC.powernet.cables += NC - NC.mergeConnectedNetworks(NC.d2) - NC.mergeConnectedNetworksOnTurf() - use(1) - if (NC.shock(user, 50)) - if (prob(50)) //fail - new/obj/item/stack/cable_coil(NC.loc, 1, NC.cable_color) - del(NC) - - return - else if(C.d1 == 0) // exisiting cable doesn't point at our position, so see if it's a stub - // if so, make it a full cable pointing from it's old direction to our dirn - var/nd1 = C.d2 // these will be the new directions - var/nd2 = dirn - - - if(nd1 > nd2) // swap directions to match icons/states - nd1 = dirn - nd2 = C.d2 - - - for(var/obj/structure/cable/LC in T) // check to make sure there's no matching cable - if(LC == C) // skip the cable we're interacting with - continue - if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction - user << "There's already a cable at that position." - return - - - C.cableColor(item_color) - - C.d1 = nd1 - C.d2 = nd2 - - C.add_fingerprint() - C.updateicon() - - - C.mergeConnectedNetworks(C.d1) - C.mergeConnectedNetworks(C.d2) - C.mergeConnectedNetworksOnTurf() - - use(1) - if (C.shock(user, 50)) - if (prob(50)) //fail - new/obj/item/stack/cable_coil(C.loc, 2, C.cable_color) - del(C) - return - - C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets. - return - -/obj/structure/cable/proc/mergeConnectedNetworks(var/direction) - var/turf/TB - if(!(d1 == direction || d2 == direction)) - return - TB = get_step(src, direction) - - for(var/obj/structure/cable/TC in TB) - - if(!TC) - continue - - if(src == TC) - continue - - var/fdir = (!direction)? 0 : turn(direction, 180) - - if(TC.d1 == fdir || TC.d2 == fdir) - - if(!TC.powernet) - TC.powernet = new() - powernets += TC.powernet - TC.powernet.cables += TC - - if(powernet) - merge_powernets(powernet,TC.powernet) - else - powernet = TC.powernet - powernet.cables += src - - - - -/obj/structure/cable/proc/mergeConnectedNetworksOnTurf() - if(!powernet) - powernet = new() - powernets += powernet - powernet.cables += src - - for(var/AM in loc) - if(istype(AM,/obj/structure/cable)) - var/obj/structure/cable/C = AM - if(C.d1 == 0 && d1==0) //only connected if they are both "nodes" - if(C.powernet == powernet) continue - if(C.powernet) - merge_powernets(powernet, C.powernet) - else - C.powernet = powernet - powernet.cables += C - - else if(istype(AM,/obj/machinery/power/apc)) - var/obj/machinery/power/apc/N = AM - if(!N.terminal) continue - if(N.terminal.powernet) - merge_powernets(powernet, N.terminal.powernet) - else - N.terminal.powernet = powernet - powernet.nodes[N.terminal] = N.terminal - - else if(istype(AM,/obj/machinery/power)) - var/obj/machinery/power/M = AM - if(M.powernet == powernet) continue - if(M.powernet) - merge_powernets(powernet, M.powernet) - else - M.powernet = powernet - powernet.nodes[M] = M - - -obj/structure/cable/proc/cableColor(var/colorC) - var/color_n = "red" - if(colorC) - color_n = colorC - cable_color = color_n - switch(colorC) - if("red") - icon = 'icons/obj/power_cond/power_cond_red.dmi' - if("yellow") - icon = 'icons/obj/power_cond/power_cond_yellow.dmi' - if("green") - icon = 'icons/obj/power_cond/power_cond_green.dmi' - if("blue") - icon = 'icons/obj/power_cond/power_cond_blue.dmi' - if("pink") - icon = 'icons/obj/power_cond/power_cond_pink.dmi' - if("orange") - icon = 'icons/obj/power_cond/power_cond_orange.dmi' - if("cyan") - icon = 'icons/obj/power_cond/power_cond_cyan.dmi' - if("white") - icon = 'icons/obj/power_cond/power_cond_white.dmi' - -obj/structure/cable/proc/add_avail(var/amount) - if(powernet) - powernet.newavail += amount - -obj/structure/cable/proc/add_load(var/amount) - if(powernet) - powernet.newload += amount - -obj/structure/cable/proc/surplus() - if(powernet) - return powernet.avail-powernet.load - else - return 0 - -obj/structure/cable/proc/avail() - if(powernet) - return powernet.avail - else - return 0 - -/obj/item/stack/cable_coil/cut - item_state = "coil_red2" - -/obj/item/stack/cable_coil/cut/New(loc) - ..() - src.amount = rand(1,2) - pixel_x = rand(-2,2) - pixel_y = rand(-2,2) - update_icon() - -/obj/item/stack/cable_coil/yellow - item_color = "yellow" - icon_state = "coil_yellow" - -/obj/item/stack/cable_coil/blue - item_color = "blue" - icon_state = "coil_blue" - item_state = "coil_blue" - -/obj/item/stack/cable_coil/green - item_color = "green" - icon_state = "coil_green" - -/obj/item/stack/cable_coil/pink - item_color = "pink" - icon_state = "coil_pink" - -/obj/item/stack/cable_coil/orange - item_color = "orange" - icon_state = "coil_orange" - -/obj/item/stack/cable_coil/cyan - item_color = "cyan" - icon_state = "coil_cyan" - -/obj/item/stack/cable_coil/white - item_color = "white" - icon_state = "coil_white" - -/obj/item/stack/cable_coil/random/New() - item_color = pick("red","yellow","green","blue","pink") - icon_state = "coil_[item_color]" - ..() +// attach a wire to a power machine - leads from the turf you are standing on + +/obj/machinery/power/attackby(obj/item/weapon/W, mob/user) + + if(istype(W, /obj/item/stack/cable_coil)) + + var/obj/item/stack/cable_coil/coil = W + + var/turf/T = user.loc + + if(T.intact || !istype(T, /turf/simulated/floor)) + return + + if(get_dist(src, user) > 1) + return + + if(!directwired) // only for attaching to directwired machines + return + + coil.turf_place(T, user) + return + else + ..() + return + +/obj/structure/cable + level = 1 + anchored =1 + var/datum/powernet/powernet + name = "power cable" + desc = "A flexible superconducting cable for heavy-duty power transfer" + icon = 'icons/obj/power_cond/power_cond_red.dmi' + icon_state = "0-1" + var/d1 = 0 + var/d2 = 1 + layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 + var/cable_color = "red" + +/obj/structure/cable/yellow + cable_color = "yellow" + icon = 'icons/obj/power_cond/power_cond_yellow.dmi' + +/obj/structure/cable/green + cable_color = "green" + icon = 'icons/obj/power_cond/power_cond_green.dmi' + +/obj/structure/cable/blue + cable_color = "blue" + icon = 'icons/obj/power_cond/power_cond_blue.dmi' + +/obj/structure/cable/pink + cable_color = "pink" + icon = 'icons/obj/power_cond/power_cond_pink.dmi' + +/obj/structure/cable/orange + cable_color = "orange" + icon = 'icons/obj/power_cond/power_cond_orange.dmi' + +/obj/structure/cable/cyan + cable_color = "cyan" + icon = 'icons/obj/power_cond/power_cond_cyan.dmi' + +/obj/structure/cable/white + cable_color = "white" + icon = 'icons/obj/power_cond/power_cond_white.dmi' + +// the power cable object + +/obj/structure/cable/New() + ..() + + + // ensure d1 & d2 reflect the icon_state for entering and exiting cable + + var/dash = findtext(icon_state, "-") + + d1 = text2num( copytext( icon_state, 1, dash ) ) + + d2 = text2num( copytext( icon_state, dash+1 ) ) + + var/turf/T = src.loc // hide if turf is not intact + + if(level==1) hide(T.intact) + cable_list += src + + +/obj/structure/cable/Destroy() // called when a cable is deleted +// if(!defer_powernet_rebuild) // set if network will be rebuilt manually + if(powernet) + powernet.cut_cable(src) // update the powernets + cable_list -= src + ..() // then go ahead and delete the cable + +/obj/structure/cable/hide(var/i) + + if(level == 1 && istype(loc, /turf)) + invisibility = i ? 101 : 0 + updateicon() + +/obj/structure/cable/proc/updateicon() + if(invisibility) + icon_state = "[d1]-[d2]-f" + else + icon_state = "[d1]-[d2]" + + +// returns the powernet this cable belongs to +/obj/structure/cable/proc/get_powernet() //TODO: remove this as it is obsolete + return powernet + +/obj/structure/cable/attack_tk(mob/user) + return + +/obj/structure/cable/attackby(obj/item/W, mob/user) + + var/turf/T = src.loc + if(T.intact) + return + + if(istype(W, /obj/item/weapon/wirecutters)) + + if (shock(user, 50)) + return + + if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long + new/obj/item/stack/cable_coil(T, 2, cable_color) + else + new/obj/item/stack/cable_coil(T, 1, cable_color) + + for(var/mob/O in viewers(src, null)) + O.show_message("\red [user] cuts the cable.", 1) + + investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires") + + qdel(src) + return + + + else if(istype(W, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/coil = W + coil.cable_join(src, user) + + else if(istype(W, /obj/item/device/multitool)) + + var/datum/powernet/PN = get_powernet() // find the powernet + + if(PN && (PN.avail > 0)) // is it powered? + user << "\red [PN.avail]W in power network." + + else + user << "\red The cable is not powered." + + shock(user, 5, 0.2) + + else + if (W.flags & CONDUCT) + shock(user, 50, 0.7) + + src.add_fingerprint(user) + +// shock the user with probability prb + +/obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0) + if(!prob(prb)) + return 0 + if (electrocute_mob(user, powernet, src, siemens_coeff)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + return 1 + else + return 0 + +/obj/structure/cable/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + if(2.0) + if (prob(50)) + new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, cable_color) + qdel(src) + + if(3.0) + if (prob(25)) + new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, cable_color) + qdel(src) + return + +// the cable coil object, used for laying cable + +#define MAXCOIL 30 +/obj/item/stack/cable_coil + name = "cable coil" + icon = 'icons/obj/power.dmi' + icon_state = "coil_red" + item_state = "coil_red" + amount = MAXCOIL + item_color = "red" + desc = "A coil of power cable." + throwforce = 0 + w_class = 2.0 + throw_speed = 3 + throw_range = 5 + m_amt = 50 + g_amt = 20 + flags = CONDUCT + slot_flags = SLOT_BELT + attack_verb = list("whipped", "lashed", "disciplined", "flogged") + + suicide_act(mob/user) + if(locate(/obj/structure/stool) in user.loc) + viewers(user) << "[user] is making a noose with the [src.name]! It looks like \he's trying to commit suicide." + else + viewers(user) << "[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide." + return(OXYLOSS) + +/obj/item/stack/cable_coil/attack(mob/living/carbon/human/H, mob/user) + if(!istype(H)) + return ..() + + var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting)) + if(affecting.status == ORGAN_ROBOTIC) + src.item_heal_robotic(H, user, 0, 30) + src.use(1) + return + else + return ..() + +/obj/item/stack/cable_coil/New(loc, amount = MAXCOIL, var/param_color = null) + ..() + src.amount = amount + if (param_color) + item_color = param_color + pixel_x = rand(-2,2) + pixel_y = rand(-2,2) + update_icon() + +/obj/item/stack/cable_coil/update_icon() + if (!item_color) + item_color = pick("red", "yellow", "blue", "green") + if(amount == 1) + icon_state = "coil_[item_color]1" + name = "cable piece" + else if(amount == 2) + icon_state = "coil_[item_color]2" + name = "cable piece" + else + icon_state = "coil_[item_color]" + name = "cable coil" + +/obj/item/stack/cable_coil/examine() + set src in view(1) + + if(amount == 1) + usr << "A short piece of power cable." + else if(amount == 2) + usr << "A piece of power cable." + else + usr << "A coil of power cable. There are [amount] lengths of cable in the coil." + +/obj/item/stack/cable_coil/verb/make_restraint() + set name = "Make Cable Restraints" + set category = "Object" + var/mob/M = usr + + if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned) + if(!istype(usr.loc,/turf)) return + if(src.amount <= 14) + usr << "\red You need at least 15 lengths to make restraints!" + return + var/obj/item/weapon/handcuffs/cable/B = new /obj/item/weapon/handcuffs/cable(usr.loc) + B.icon_state = "cuff_[item_color]" + usr << "\blue You wind some cable together to make some restraints." + src.use(15) + else + usr << "\blue You cannot do that." + ..() + +/obj/item/stack/cable_coil/attackby(obj/item/weapon/W, mob/user) + ..() + if( istype(W, /obj/item/weapon/wirecutters) && src.amount > 1) + src.amount-- + new/obj/item/stack/cable_coil(user.loc, 1,item_color) + user << "You cut a piece off the cable coil." + src.update_icon() + return + + else if( istype(W, /obj/item/stack/cable_coil) ) + var/obj/item/stack/cable_coil/C = W + if(C.amount >= MAXCOIL) + user << "The coil is too long, you cannot add any more cable to it." + return + + if( (C.amount + src.amount <= MAXCOIL) ) + user << "You join the cable coils together." + C.give(src.amount) // give it cable + src.use(src.amount) // make sure this one cleans up right + return + + else + var/amt = MAXCOIL - C.amount + user << "You transfer [amt] length\s of cable from one coil to the other." + C.give(amt) + src.use(amt) + return + +/obj/item/stack/cable_coil/use(var/used) + if(src.amount < used) + return 0 + else if (src.amount == used) + if(ismob(loc)) //handle mob icon update + var/mob/M = loc + M.unEquip(src) + qdel(src) + return 1 + else + amount -= used + update_icon() + return 1 + +/obj/item/stack/cable_coil/proc/give(var/extra) + if(amount + extra > MAXCOIL) + amount = MAXCOIL + else + amount += extra + update_icon() + +// called when cable_coil is clicked on a turf/simulated/floor + +/obj/item/stack/cable_coil/proc/turf_place(turf/simulated/floor/F, mob/user) + + if(!isturf(user.loc)) + return + + if(get_dist(F,user) > 1) + user << "You can't lay cable at a place that far away." + return + + if(F.intact) // if floor is intact, complain + user << "You can't lay cable there unless the floor tiles are removed." + return + + else + var/dirn + + if(user.loc == F) + dirn = user.dir // if laying on the tile we're on, lay in the direction we're facing + else + dirn = get_dir(F, user) + + for(var/obj/structure/cable/LC in F) + if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0)) + user << "There's already a cable at that position." + return + + var/obj/structure/cable/C = new(F) + + C.cableColor(item_color) + + C.d1 = 0 + C.d2 = dirn + C.add_fingerprint(user) + C.updateicon() + + C.powernet = new() + powernets += C.powernet + C.powernet.cables += C + + C.mergeConnectedNetworks(C.d2) + C.mergeConnectedNetworksOnTurf() + + + use(1) + if (C.shock(user, 50)) + if (prob(50)) //fail + new/obj/item/stack/cable_coil(C.loc, 1, C.cable_color) + qdel(C) + //src.laying = 1 + //last = C + + +// called when cable_coil is click on an installed obj/cable + +/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user) + + var/turf/U = user.loc + if(!isturf(U)) + return + + var/turf/T = C.loc + + if(!isturf(T) || T.intact) // sanity checks, also stop use interacting with T-scanner revealed cable + return + + if(get_dist(C, user) > 1) // make sure it's close enough + user << "You can't lay cable at a place that far away." + return + + + if(U == T) // do nothing if we clicked a cable we're standing on + return // may change later if can think of something logical to do + + var/dirn = get_dir(C, user) + + if(C.d1 == dirn || C.d2 == dirn) // one end of the clicked cable is pointing towards us + if(U.intact) // can't place a cable if the floor is complete + user << "You can't lay cable there unless the floor tiles are removed." + return + else + // cable is pointing at us, we're standing on an open tile + // so create a stub pointing at the clicked cable on our tile + + var/fdirn = turn(dirn, 180) // the opposite direction + + for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already + if(LC.d1 == fdirn || LC.d2 == fdirn) + user << "There's already a cable at that position." + return + + var/obj/structure/cable/NC = new(U) + NC.cableColor(item_color) + + NC.d1 = 0 + NC.d2 = fdirn + NC.add_fingerprint() + NC.updateicon() + + if(C.powernet) + NC.powernet = C.powernet + NC.powernet.cables += NC + NC.mergeConnectedNetworks(NC.d2) + NC.mergeConnectedNetworksOnTurf() + use(1) + if (NC.shock(user, 50)) + if (prob(50)) //fail + new/obj/item/stack/cable_coil(NC.loc, 1, NC.cable_color) + qdel(NC) + + return + else if(C.d1 == 0) // exisiting cable doesn't point at our position, so see if it's a stub + // if so, make it a full cable pointing from it's old direction to our dirn + var/nd1 = C.d2 // these will be the new directions + var/nd2 = dirn + + + if(nd1 > nd2) // swap directions to match icons/states + nd1 = dirn + nd2 = C.d2 + + + for(var/obj/structure/cable/LC in T) // check to make sure there's no matching cable + if(LC == C) // skip the cable we're interacting with + continue + if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction + user << "There's already a cable at that position." + return + + + C.cableColor(item_color) + + C.d1 = nd1 + C.d2 = nd2 + + C.add_fingerprint() + C.updateicon() + + + C.mergeConnectedNetworks(C.d1) + C.mergeConnectedNetworks(C.d2) + C.mergeConnectedNetworksOnTurf() + + use(1) + if (C.shock(user, 50)) + if (prob(50)) //fail + new/obj/item/stack/cable_coil(C.loc, 2, C.cable_color) + qdel(C) + return + + C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets. + return + +/obj/structure/cable/proc/mergeConnectedNetworks(var/direction) + var/turf/TB + if(!(d1 == direction || d2 == direction)) + return + TB = get_step(src, direction) + + for(var/obj/structure/cable/TC in TB) + + if(!TC) + continue + + if(src == TC) + continue + + var/fdir = (!direction)? 0 : turn(direction, 180) + + if(TC.d1 == fdir || TC.d2 == fdir) + + if(!TC.powernet) + TC.powernet = new() + powernets += TC.powernet + TC.powernet.cables += TC + + if(powernet) + merge_powernets(powernet,TC.powernet) + else + powernet = TC.powernet + powernet.cables += src + + + + +/obj/structure/cable/proc/mergeConnectedNetworksOnTurf() + if(!powernet) + powernet = new() + powernets += powernet + powernet.cables += src + + for(var/AM in loc) + if(istype(AM,/obj/structure/cable)) + var/obj/structure/cable/C = AM + if(C.d1 == 0 && d1==0) //only connected if they are both "nodes" + if(C.powernet == powernet) continue + if(C.powernet) + merge_powernets(powernet, C.powernet) + else + C.powernet = powernet + powernet.cables += C + + else if(istype(AM,/obj/machinery/power/apc)) + var/obj/machinery/power/apc/N = AM + if(!N.terminal) continue + if(N.terminal.powernet) + merge_powernets(powernet, N.terminal.powernet) + else + N.terminal.powernet = powernet + powernet.nodes[N.terminal] = N.terminal + + else if(istype(AM,/obj/machinery/power)) + var/obj/machinery/power/M = AM + if(M.powernet == powernet) continue + if(M.powernet) + merge_powernets(powernet, M.powernet) + else + M.powernet = powernet + powernet.nodes[M] = M + + +obj/structure/cable/proc/cableColor(var/colorC) + var/color_n = "red" + if(colorC) + color_n = colorC + cable_color = color_n + switch(colorC) + if("red") + icon = 'icons/obj/power_cond/power_cond_red.dmi' + if("yellow") + icon = 'icons/obj/power_cond/power_cond_yellow.dmi' + if("green") + icon = 'icons/obj/power_cond/power_cond_green.dmi' + if("blue") + icon = 'icons/obj/power_cond/power_cond_blue.dmi' + if("pink") + icon = 'icons/obj/power_cond/power_cond_pink.dmi' + if("orange") + icon = 'icons/obj/power_cond/power_cond_orange.dmi' + if("cyan") + icon = 'icons/obj/power_cond/power_cond_cyan.dmi' + if("white") + icon = 'icons/obj/power_cond/power_cond_white.dmi' + +obj/structure/cable/proc/add_avail(var/amount) + if(powernet) + powernet.newavail += amount + +obj/structure/cable/proc/add_load(var/amount) + if(powernet) + powernet.newload += amount + +obj/structure/cable/proc/surplus() + if(powernet) + return powernet.avail-powernet.load + else + return 0 + +obj/structure/cable/proc/avail() + if(powernet) + return powernet.avail + else + return 0 + +/obj/item/stack/cable_coil/cut + item_state = "coil_red2" + +/obj/item/stack/cable_coil/cut/New(loc) + ..() + src.amount = rand(1,2) + pixel_x = rand(-2,2) + pixel_y = rand(-2,2) + update_icon() + +/obj/item/stack/cable_coil/yellow + item_color = "yellow" + icon_state = "coil_yellow" + +/obj/item/stack/cable_coil/blue + item_color = "blue" + icon_state = "coil_blue" + item_state = "coil_blue" + +/obj/item/stack/cable_coil/green + item_color = "green" + icon_state = "coil_green" + +/obj/item/stack/cable_coil/pink + item_color = "pink" + icon_state = "coil_pink" + +/obj/item/stack/cable_coil/orange + item_color = "orange" + icon_state = "coil_orange" + +/obj/item/stack/cable_coil/cyan + item_color = "cyan" + icon_state = "coil_cyan" + +/obj/item/stack/cable_coil/white + item_color = "white" + icon_state = "coil_white" + +/obj/item/stack/cable_coil/random/New() + item_color = pick("red","yellow","green","blue","pink") + icon_state = "coil_[item_color]" + ..() diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 313439b656e..bc6cad2a655 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -103,8 +103,7 @@ //explosion(T, 0, 1, 2, 2) explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range) - spawn(1) - del(src) + qdel(src) /obj/item/weapon/stock_parts/cell/proc/corrupt() charge /= 2 @@ -124,17 +123,17 @@ switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if (prob(50)) corrupt() if(3.0) if (prob(25)) - del(src) + qdel(src) return if (prob(25)) corrupt() diff --git a/code/modules/power/engine.dm b/code/modules/power/engine.dm index 2cfe16fd87a..fddff6a34c2 100644 --- a/code/modules/power/engine.dm +++ b/code/modules/power/engine.dm @@ -8,12 +8,12 @@ switch(severity) if(1.0) ChangeTurf(/turf/space) - del(src) + qdel(src) return if(2.0) if (prob(50)) ChangeTurf(/turf/space) - del(src) + qdel(src) return else return @@ -21,6 +21,6 @@ /turf/simulated/floor/engine/blob_act() if (prob(25)) ChangeTurf(/turf/space) - del(src) + qdel(src) return return \ No newline at end of file diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 367ff166b29..f0e7168ad13 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -1,140 +1,392 @@ -// It.. uses a lot of power. Everything under power is engineering stuff, at least. -/obj/machinery/computer/gravity_control_computer - name = "Gravity Generator Control" - desc = "A computer to control a local gravity generator. Qualified personnel only." - icon = 'icons/obj/computer.dmi' - icon_state = "airtunnel0e" - anchored = 1 - density = 1 - var/obj/machinery/gravity_generator = null +// +// Gravity Generator +// +var/list/gravity_generators = list() // We will keep track of this by adding new gravity generators to the list, and keying it with the z level. -/obj/machinery/gravity_generator/ - name = "Gravitational Generator" +var/const/POWER_IDLE = 0 +var/const/POWER_UP = 1 +var/const/POWER_DOWN = 2 + +var/const/GRAV_NEEDS_SCREWDRIVER = 0 +var/const/GRAV_NEEDS_WELDING = 1 +var/const/GRAV_NEEDS_PLASTEEL = 2 +var/const/GRAV_NEEDS_WRENCH = 3 + +// +// Abstract Generator +// + +/obj/machinery/gravity_generator + name = "gravitational generator" desc = "A device which produces a gravaton field when set up." - icon = 'icons/obj/singularity.dmi' - icon_state = "TheSingGen" + icon = 'icons/obj/machines/gravity_generator.dmi' anchored = 1 density = 1 + use_power = 0 + unacidable = 1 + var/sprite_number = 0 + +/obj/machinery/gravity_generator/ex_act(severity) + if(severity == 1) // Very sturdy. + set_broken() + +/obj/machinery/gravity_generator/meteorhit() + return + +/obj/machinery/gravity_generator/update_icon() + ..() + icon_state = "[get_status()]_[sprite_number]" + +/obj/machinery/gravity_generator/proc/get_status() + return "off" + +// You aren't allowed to move. +/obj/machinery/gravity_generator/Move() + ..() + qdel(src) + +/obj/machinery/gravity_generator/proc/set_broken() + stat |= BROKEN + +/obj/machinery/gravity_generator/proc/set_fix() + stat &= ~BROKEN + +/obj/machinery/gravity_generator/part/Destroy() + set_broken() + if(main_part) + qdel(main_part) + ..() + +// +// Part generator which is mostly there for looks +// + +/obj/machinery/gravity_generator/part + var/obj/machinery/gravity_generator/main/main_part = null + +/obj/machinery/gravity_generator/part/attackby(obj/item/I as obj, mob/user as mob) + return main_part.attackby(I, user) + +/obj/machinery/gravity_generator/part/get_status() + return main_part.get_status() + +/obj/machinery/gravity_generator/part/attack_hand(mob/user as mob) + return main_part.attack_hand(user) + +/obj/machinery/gravity_generator/part/set_broken() + ..() + if(main_part && !(main_part.stat & BROKEN)) + main_part.set_broken() + +// +// Generator which spawns with the station. +// + +/obj/machinery/gravity_generator/main/station/initialize() + setup_parts() + middle.overlays += "activated" + update_list() + +// +// Generator an admin can spawn +// + +/obj/machinery/gravity_generator/main/station/admin/New() + ..() + initialize() + +// +// Main Generator with the main code +// + +/obj/machinery/gravity_generator/main + icon_state = "on_8" + idle_power_usage = 0 + active_power_usage = 3000 + power_channel = ENVIRON + sprite_number = 8 use_power = 1 - idle_power_usage = 200 - active_power_usage = 1000 + interact_offline = 1 var/on = 1 - var/list/localareas = list() - var/effectiverange = 25 + var/breaker = 1 + var/list/parts = list() + var/obj/middle = null + var/charging_state = POWER_IDLE + var/charge_count = 100 + var/current_overlay = null + var/broken_state = 0 - // Borrows code from cloning computer -/obj/machinery/computer/gravity_control_computer/New() +/obj/machinery/gravity_generator/main/Destroy() // If we somehow get deleted, remove all of our other parts. + investigate_log("was destroyed!", "gravity") + on = 0 + update_list() + for(var/obj/machinery/gravity_generator/part/O in parts) + O.main_part = null + qdel(O) ..() - spawn(5) - updatemodules() - return - return -/obj/machinery/gravity_generator/New() +/obj/machinery/gravity_generator/main/proc/setup_parts() + var/turf/our_turf = get_turf(src) + // 9x9 block obtained from the bottom middle of the block + var/list/spawn_turfs = block(locate(our_turf.x - 1, our_turf.y + 2, our_turf.z), locate(our_turf.x + 1, our_turf.y, our_turf.z)) + var/count = 10 + for(var/turf/T in spawn_turfs) + count-- + if(T == our_turf) // Skip our turf. + continue + var/obj/machinery/gravity_generator/part/part = new(T) + if(count == 5) // Middle + middle = part + part.sprite_number = count; + part.main_part = src + parts += part + part.update_icon() + +/obj/machinery/gravity_generator/main/proc/connected_parts() + return parts.len == 8 + +/obj/machinery/gravity_generator/main/set_broken() ..() - spawn(5) - locatelocalareas() - return - return + for(var/obj/machinery/gravity_generator/M in parts) + if(!(M.stat & BROKEN)) + M.set_broken() + middle.overlays.Cut() + charge_count = 0 + breaker = 0 + set_power() + set_state(0) + investigate_log("has broken down.", "gravity") +/obj/machinery/gravity_generator/main/set_fix() + ..() + for(var/obj/machinery/gravity_generator/M in parts) + if(M.stat & BROKEN) + M.set_fix() + broken_state = 0 + update_icon() + set_power() +// Interaction -/obj/machinery/computer/gravity_control_computer/proc/updatemodules() - src.gravity_generator = findgenerator() - - - -/obj/machinery/gravity_generator/proc/locatelocalareas() - for(var/area/A in range(src,effectiverange)) - if(istype(A, /area/space)) - continue // No (de)gravitizing space. - if(A.master && !( A.master in localareas) ) - localareas += A.master - -/obj/machinery/computer/gravity_control_computer/proc/findgenerator() - var/obj/machinery/gravity_generator/foundgenerator = null - for(dir in list(NORTH,EAST,SOUTH,WEST)) - //world << "SEARCHING IN [dir]" - foundgenerator = locate(/obj/machinery/gravity_generator/, get_step(src, dir)) - if (!isnull(foundgenerator)) - //world << "FOUND" - break - return foundgenerator - - -/obj/machinery/computer/gravity_control_computer/attack_paw(mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer/gravity_control_computer/attack_ai(mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer/gravity_control_computer/attack_hand(mob/user as mob) - user.set_machine(src) - add_fingerprint(user) - - if(stat & (BROKEN|NOPOWER)) - return - - updatemodules() - - var/dat = "

    Generator Control System

    " - //dat += "Refresh" - if(gravity_generator) - if(gravity_generator:on) - dat += "
    Gravity Status: ON

    " +// Fixing the gravity generator. +/obj/machinery/gravity_generator/main/attackby(obj/item/I as obj, mob/user as mob) + var/old_broken_state = broken_state + switch(broken_state) + if(GRAV_NEEDS_SCREWDRIVER) + if(istype(I, /obj/item/weapon/screwdriver)) + user << "You secure the screws of the framework." + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + broken_state++ + if(GRAV_NEEDS_WELDING) + if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = I + if(WT.remove_fuel(1, user)) + user << "You mend the damaged framework." + playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) + broken_state++ + if(GRAV_NEEDS_PLASTEEL) + if(istype(I, /obj/item/stack/sheet/plasteel)) + var/obj/item/stack/sheet/plasteel/PS = I + if(PS.amount >= 10) + PS.use(10) + user << "You add the plating to the framework." + playsound(src.loc, 'sound/machines/click.ogg', 75, 1) + broken_state++ + else + user << "You need 10 sheets of plasteel." + if(GRAV_NEEDS_WRENCH) + if(istype(I, /obj/item/weapon/wrench)) + user << "You secure the plating to the framework." + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + set_fix() else - dat += "
    Gravity Status: OFF

    " + ..() + if(old_broken_state != broken_state) + update_icon() - dat += "
    Currently Supplying Gravitons To:
    " - - for(var/area/A in gravity_generator:localareas) - if(A.has_gravity && gravity_generator:on) - dat += "[A]
    " - - else if (A.has_gravity) - dat += "[A]
    " - - else - dat += "[A]
    " - - dat += "
    Maintainence Functions:
    " - if(gravity_generator:on) - dat += " TURN GRAVITY GENERATOR OFF. " - else - dat += " TURN GRAVITY GENERATOR ON. " +/obj/machinery/gravity_generator/main/attack_hand(mob/user as mob) + if(!..()) + return interact(user) +/obj/machinery/gravity_generator/main/interact(mob/user as mob) + if(stat & BROKEN) + return + var/dat = "Gravity Generator Breaker: " + if(breaker) + dat += "ON OFF" else - dat += "No local gravity generator detected!" + dat += "ON OFF " - user << browse(dat, "window=gravgen") - onclose(user, "gravgen") + dat += "
    Generator Status:
    " + if(charging_state != POWER_IDLE) + dat += "WARNING Radiation Detected.
    [charging_state == POWER_UP ? "Charging..." : "Discharging..."]" + else if(on) + dat += "Powered." + else + dat += "Unpowered." + + dat += "
    Gravity Charge: [charge_count]%
    " + + var/datum/browser/popup = new(user, "gravgen", name) + popup.set_content(dat) + popup.open() -/obj/machinery/computer/gravity_control_computer/Topic(href, href_list) - set background = BACKGROUND_ENABLED +/obj/machinery/gravity_generator/main/Topic(href, href_list) if(..()) return if(href_list["gentoggle"]) - if(gravity_generator:on) - gravity_generator:on = 0 - - for(var/area/A in gravity_generator:localareas) - var/obj/machinery/gravity_generator/G - for(G in world) - if((A.master in G.localareas) && (G.on)) - break - if(!G) - A.gravitychange(0) - - - else - for(var/area/A in gravity_generator:localareas) - gravity_generator:on = 1 - A.gravitychange(1) - + breaker = !breaker + investigate_log("was toggled [breaker ? "ON" : "OFF"] by [usr.key].", "gravity") + set_power() src.updateUsrDialog() - return \ No newline at end of file + +// Power and Icon States + +/obj/machinery/gravity_generator/main/power_change() + ..() + investigate_log("has [stat & NOPOWER ? "lost" : "regained"] power.", "gravity") + set_power() + +/obj/machinery/gravity_generator/main/get_status() + if(stat & BROKEN) + return "fix[min(broken_state, 3)]" + return on || charging_state != POWER_IDLE ? "on" : "off" + +/obj/machinery/gravity_generator/main/update_icon() + ..() + for(var/obj/O in parts) + O.update_icon() + +// Set the charging state based on power/breaker. +/obj/machinery/gravity_generator/main/proc/set_power() + var/new_state = 0 + if(stat & (NOPOWER|BROKEN) || !breaker) + new_state = 0 + else if(breaker) + new_state = 1 + + charging_state = new_state ? POWER_UP : POWER_DOWN // Startup sequence animation. + investigate_log("is now [charging_state == POWER_UP ? "charging" : "discharging"].", "gravity") + update_icon() + +// Set the state of the gravity. +/obj/machinery/gravity_generator/main/proc/set_state(var/new_state) + charging_state = POWER_IDLE + on = new_state + use_power = on ? 2 : 1 + // Sound the alert if gravity was just enabled or disabled. + var/alert = 0 + var/area/area = get_area(src) + if(new_state) // If we turned on + if(gravity_in_level() == 0) + alert = 1 + investigate_log("was brought online and is now producing gravity for this level.", "gravity") + message_admins("The gravity generator was brought online. ([area.name])") + else + if(gravity_in_level() == 1) + alert = 1 + investigate_log("was brought offline and there is now no gravity for this level.", "gravity") + message_admins("The gravity generator was brought offline with no backup generator. ([area.name])") + + update_icon() + update_list() + src.updateUsrDialog() + if(alert) + shake_everyone() + +// Charge/Discharge and turn on/off gravity when you reach 0/100 percent. +// Also emit radiation and handle the overlays. +/obj/machinery/gravity_generator/main/process() + if(stat & BROKEN) + return + if(charging_state != POWER_IDLE) + if(charging_state == POWER_UP && charge_count >= 100) + set_state(1) + else if(charging_state == POWER_DOWN && charge_count <= 0) + set_state(0) + else + if(charging_state == POWER_UP) + charge_count += 2 + else if(charging_state == POWER_DOWN) + charge_count -= 2 + + if(charge_count % 4 == 0 && prob(75)) // Let them know it is charging/discharging. + playsound(src.loc, 'sound/effects/EMPulse.ogg', 75, 1) + + updateDialog() + if(prob(25)) // To help stop "Your clothes feel warm" spam. + pulse_radiation() + + var/overlay_state = null + switch(charge_count) + if(0 to 20) + overlay_state = null + if(21 to 40) + overlay_state = "startup" + if(41 to 60) + overlay_state = "idle" + if(61 to 80) + overlay_state = "activating" + if(81 to 100) + overlay_state = "activated" + + if(overlay_state != current_overlay) + if(middle) + middle.overlays.Cut() + if(overlay_state) + middle.overlays += overlay_state + current_overlay = overlay_state + + +/obj/machinery/gravity_generator/main/proc/pulse_radiation() + for(var/mob/living/L in view(7, src)) + L.apply_effect(20, IRRADIATE) + +// Shake everyone on the z level to let them know that gravity was enagaged/disenagaged. +/obj/machinery/gravity_generator/main/proc/shake_everyone() + var/turf/our_turf = get_turf(src) + for(var/mob/M in player_list) + var/turf/their_turf = get_turf(M) + if(M.client && their_turf.z == our_turf.z) + shake_camera(M, 15, 1) + M.playsound_local(our_turf, 'sound/machines/signal.ogg', 100) + +/obj/machinery/gravity_generator/main/proc/gravity_in_level() + var/turf/T = get_turf(src) + if(!T) + return 0 + if(gravity_generators["[T.z]"]) + return length(gravity_generators["[T.z]"]) + return 0 + +/obj/machinery/gravity_generator/main/proc/update_list() + var/turf/T = get_turf(src.loc) + if(T) + if(!gravity_generators["[T.z]"]) + gravity_generators["[T.z]"] = list() + if(on) + gravity_generators["[T.z]"] |= src + else + gravity_generators["[T.z]"] -= src + +// Misc + +/obj/item/weapon/paper/gravity_gen + name = "paper- 'Generate your own gravity!'" + info = {"

    Gravity Generator Instructions For Dummies

    +

    Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of + energy and you have yourself gravity! You can turn the machine on or off when required but you must remember that the generator + will EMIT RADIATION when charging or discharging, you can tell it is charging or discharging by the noise it makes, so please WEAR PROTECTIVE CLOTHING.

    +
    +

    It blew up!

    +

    Don't panic! The gravity generator was designed to be easily repaired. If, somehow, the sturdy framework did not survive then + please proceed to panic; otherwise follow these steps.

      +
    1. Secure the screws of the framework with a screwdriver.
    2. +
    3. Mend the damaged framework with a welding tool.
    4. +
    5. Add additional plasteel plating.
    6. +
    7. Secure the additional plating with a wrench.
    "} diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 4d0fee71a46..36789ac7d87 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -1,743 +1,742 @@ -// The lighting system -// -// consists of light fixtures (/obj/machinery/light) and light tube/bulb items (/obj/item/weapon/light) - - -// status values shared between lighting fixtures and items -#define LIGHT_OK 0 -#define LIGHT_EMPTY 1 -#define LIGHT_BROKEN 2 -#define LIGHT_BURNED 3 - - - -/obj/item/light_fixture_frame - name = "light fixture frame" - desc = "Used for building lights." - icon = 'icons/obj/lighting.dmi' - icon_state = "tube-construct-item" - flags = CONDUCT - var/fixture_type = "tube" - var/obj/machinery/light/newlight = null - var/sheets_refunded = 2 - -/obj/item/light_fixture_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/wrench)) - new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded ) - del(src) - return - ..() - -/obj/item/light_fixture_frame/proc/try_build(turf/on_wall) - if (get_dist(on_wall,usr)>1) - return - var/ndir = get_dir(usr,on_wall) - if (!(ndir in cardinal)) - return - var/turf/loc = get_turf(usr) - if (!istype(loc, /turf/simulated/floor)) - usr << "\red [src.name] cannot be placed on this spot." - return - usr << "Attaching [src] to the wall." - playsound(src.loc, 'sound/machines/click.ogg', 75, 1) - var/constrdir = usr.dir - var/constrloc = usr.loc - if (!do_after(usr, 30)) - return - switch(fixture_type) - if("bulb") - newlight = new /obj/machinery/light_construct/small(constrloc) - if("tube") - newlight = new /obj/machinery/light_construct(constrloc) - newlight.dir = constrdir - newlight.fingerprints = src.fingerprints - newlight.fingerprintshidden = src.fingerprintshidden - newlight.fingerprintslast = src.fingerprintslast - - usr.visible_message("[usr.name] attaches [src] to the wall.", \ - "You attach [src] to the wall.") - del(src) - -/obj/item/light_fixture_frame/small - name = "small light fixture frame" - desc = "Used for building small lights." - icon = 'icons/obj/lighting.dmi' - icon_state = "bulb-construct-item" - flags = CONDUCT - fixture_type = "bulb" - sheets_refunded = 1 - -/obj/machinery/light_construct - name = "light fixture frame" - desc = "A light fixture under construction." - icon = 'icons/obj/lighting.dmi' - icon_state = "tube-construct-stage1" - anchored = 1 - layer = 5 - var/stage = 1 - var/fixture_type = "tube" - var/sheets_refunded = 2 - var/obj/machinery/light/newlight = null - -/obj/machinery/light_construct/New() - ..() - if (fixture_type == "bulb") - icon_state = "bulb-construct-stage1" - -/obj/machinery/light_construct/examine() - set src in view() - ..() - if (!(usr in view(2))) return - switch(src.stage) - if(1) - usr << "It's an empty frame." - return - if(2) - usr << "It's wired." - return - if(3) - usr << "The casing is closed." - return - -/obj/machinery/light_construct/attackby(obj/item/weapon/W as obj, mob/user as mob) - src.add_fingerprint(user) - if (istype(W, /obj/item/weapon/wrench)) - if (src.stage == 1) - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - usr << "You begin deconstructing [src]." - if (!do_after(usr, 30)) - return - new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded ) - user.visible_message("[user.name] deconstructs [src].", \ - "You deconstruct [src].", "You hear a noise.") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1) - del(src) - if (src.stage == 2) - usr << "You have to remove the wires first." - return - - if (src.stage == 3) - usr << "You have to unscrew the case first." - return - - if(istype(W, /obj/item/weapon/wirecutters)) - if (src.stage != 2) return - src.stage = 1 - switch(fixture_type) - if ("tube") - src.icon_state = "tube-construct-stage1" - if("bulb") - src.icon_state = "bulb-construct-stage1" - new /obj/item/stack/cable_coil(get_turf(src.loc), 1, "red") - user.visible_message("[user.name] removes the wiring from [src].", \ - "You remove the wiring from [src].", "You hear a noise.") - playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - return - - if(istype(W, /obj/item/stack/cable_coil)) - if (src.stage != 1) return - var/obj/item/stack/cable_coil/coil = W - coil.use(1) - switch(fixture_type) - if ("tube") - src.icon_state = "tube-construct-stage2" - if("bulb") - src.icon_state = "bulb-construct-stage2" - src.stage = 2 - user.visible_message("[user.name] adds wires to [src].", \ - "You add wires to [src].") - return - - if(istype(W, /obj/item/weapon/screwdriver)) - if (src.stage == 2) - switch(fixture_type) - if ("tube") - src.icon_state = "tube-empty" - if("bulb") - src.icon_state = "bulb-empty" - src.stage = 3 - user.visible_message("[user.name] closes [src]'s casing.", \ - "You close [src]'s casing.", "You hear a noise.") - playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1) - - switch(fixture_type) - - if("tube") - newlight = new /obj/machinery/light/built(src.loc) - if ("bulb") - newlight = new /obj/machinery/light/small/built(src.loc) - - newlight.dir = src.dir - src.transfer_fingerprints_to(newlight) - del(src) - return - ..() - -/obj/machinery/light_construct/small - name = "small light fixture frame" - desc = "A small light fixture under construction." - icon = 'icons/obj/lighting.dmi' - icon_state = "bulb-construct-stage1" - anchored = 1 - layer = 5 - stage = 1 - fixture_type = "bulb" - sheets_refunded = 1 - -// the standard tube light fixture -/obj/machinery/light - name = "light fixture" - icon = 'icons/obj/lighting.dmi' - var/base_state = "tube" // base description and icon_state - icon_state = "tube1" - desc = "A lighting fixture." - anchored = 1 - layer = 5 // They were appearing under mobs which is a little weird - Ostaf - use_power = 2 - idle_power_usage = 2 - active_power_usage = 20 - power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list - var/on = 0 // 1 if on, 0 if off - var/on_gs = 0 - var/brightness = 8 // luminosity when on, also used in power calculation - var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN - var/flickering = 0 - var/light_type = /obj/item/weapon/light/tube // the type of light item - var/fitting = "tube" - var/switchcount = 0 // count of number of times switched on/off - // this is used to calc the probability the light burns out - - var/rigged = 0 // true if rigged to explode - -// the smaller bulb light fixture - -/obj/machinery/light/small - icon_state = "bulb1" - base_state = "bulb" - fitting = "bulb" - brightness = 4 - desc = "A small lighting fixture." - light_type = /obj/item/weapon/light/bulb - - -/obj/machinery/light/Move() - if(status != LIGHT_BROKEN) broken(1) - return ..() - -/obj/machinery/light/built/New() - status = LIGHT_EMPTY - update(0) - ..() - -/obj/machinery/light/small/built/New() - status = LIGHT_EMPTY - update(0) - ..() - - -// create a new lighting fixture -/obj/machinery/light/New() - ..() - spawn(2) - switch(fitting) - if("tube") - brightness = 8 - if(prob(2)) - broken(1) - if("bulb") - brightness = 4 - if(prob(5)) - broken(1) - spawn(1) - update(0) - -/obj/machinery/light/Del() - var/area/A = get_area(src) - if(A) - on = 0 -// A.update_lights() - ..() - -/obj/machinery/light/update_icon() - - switch(status) // set icon_states - if(LIGHT_OK) - icon_state = "[base_state][on]" - if(LIGHT_EMPTY) - icon_state = "[base_state]-empty" - on = 0 - if(LIGHT_BURNED) - icon_state = "[base_state]-burned" - on = 0 - if(LIGHT_BROKEN) - icon_state = "[base_state]-broken" - on = 0 - return - -// update the icon_state and luminosity of the light depending on its state -/obj/machinery/light/proc/update(var/trigger = 1) - - update_icon() - if(on) - if(luminosity != brightness) - switchcount++ - if(rigged) - if(status == LIGHT_OK && trigger) - explode() - else if( prob( min(60, switchcount*switchcount*0.01) ) ) - if(status == LIGHT_OK && trigger) - status = LIGHT_BURNED - icon_state = "[base_state]-burned" - on = 0 - SetLuminosity(0) - else - use_power = 2 - SetLuminosity(brightness) - else - use_power = 1 - SetLuminosity(0) - - active_power_usage = (luminosity * 10) - if(on != on_gs) - on_gs = on - - -// attempt to set the light's on/off status -// will not switch on if broken/burned/empty -/obj/machinery/light/proc/seton(var/s) - on = (s && status == LIGHT_OK) - update() - -// examine verb -/obj/machinery/light/examine() - set src in oview(1) - ..() - if(usr && !usr.stat) - switch(status) - if(LIGHT_OK) - usr << "It is turned [on? "on" : "off"]." - if(LIGHT_EMPTY) - usr << "The [fitting] has been removed." - if(LIGHT_BURNED) - usr << "The [fitting] is burnt out." - if(LIGHT_BROKEN) - usr << "The [fitting] has been smashed." - - - -// attack with item - insert light (if right type), otherwise try to break the light - -/obj/machinery/light/attackby(obj/item/W, mob/user) - - //Light replacer code - if(istype(W, /obj/item/device/lightreplacer)) - var/obj/item/device/lightreplacer/LR = W - if(isliving(user)) - var/mob/living/U = user - LR.ReplaceLight(src, U) - return - - // attempt to insert light - if(istype(W, /obj/item/weapon/light)) - if(status != LIGHT_EMPTY) - user << "There is a [fitting] already inserted." - return - else - src.add_fingerprint(user) - var/obj/item/weapon/light/L = W - if(istype(L, light_type)) - status = L.status - user << "You insert the [L.name]." - switchcount = L.switchcount - rigged = L.rigged - brightness = L.brightness - on = has_power() - update() - - user.drop_item() //drop the item to update overlays and such - del(L) - - if(on && rigged) - explode() - else - user << "This type of light requires a [fitting]." - return - - // attempt to break the light - //If xenos decide they want to smash a light bulb with a toolbox, who am I to stop them? /N - - else if(status != LIGHT_BROKEN && status != LIGHT_EMPTY) - - - if(prob(1+W.force * 5)) - - user << "You hit the light, and it smashes!" - for(var/mob/M in viewers(src)) - if(M == user) - continue - M.show_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) - if(on && (W.flags & CONDUCT)) - //if(!user.mutations & COLD_RESISTANCE) - if (prob(12)) - electrocute_mob(user, get_area(src), src, 0.3) - broken() - - else - user << "You hit the light!" - - // attempt to stick weapon into light socket - else if(status == LIGHT_EMPTY) - if(istype(W, /obj/item/weapon/screwdriver)) //If it's a screwdriver open it. - playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1) - user.visible_message("[user.name] opens [src]'s casing.", \ - "You open [src]'s casing.", "You hear a noise.") - var/obj/machinery/light_construct/newlight = null - switch(fitting) - if("tube") - newlight = new /obj/machinery/light_construct(src.loc) - newlight.icon_state = "tube-construct-stage2" - - if("bulb") - newlight = new /obj/machinery/light_construct/small(src.loc) - newlight.icon_state = "bulb-construct-stage2" - newlight.dir = src.dir - newlight.stage = 2 - newlight.fingerprints = src.fingerprints - newlight.fingerprintshidden = src.fingerprintshidden - newlight.fingerprintslast = src.fingerprintslast - del(src) - return - - user << "You stick \the [W] into the light socket!" - if(has_power() && (W.flags & CONDUCT)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - //if(!user.mutations & COLD_RESISTANCE) - if (prob(75)) - electrocute_mob(user, get_area(src), src, rand(0.7,1.0)) - - -// returns whether this light has power -// true if area has power and lightswitch is on -/obj/machinery/light/proc/has_power() - var/area/A = src.loc.loc - return A.master.lightswitch && A.master.power_light - -/obj/machinery/light/proc/flicker(var/amount = rand(10, 20)) - if(flickering) return - flickering = 1 - spawn(0) - if(on && status == LIGHT_OK) - for(var/i = 0; i < amount; i++) - if(status != LIGHT_OK) break - on = !on - update(0) - sleep(rand(5, 15)) - on = (status == LIGHT_OK) - update(0) - flickering = 0 - -// ai attack - make lights flicker, because why not - -/obj/machinery/light/attack_ai(mob/user) - src.flicker(1) - return - -// Aliens smash the bulb but do not get electrocuted./N -/obj/machinery/light/attack_alien(mob/living/carbon/alien/humanoid/user)//So larva don't go breaking light bulbs. - if(status == LIGHT_EMPTY||status == LIGHT_BROKEN) - user << "\green That object is useless to you." - return - else if (status == LIGHT_OK||status == LIGHT_BURNED) - for(var/mob/M in viewers(src)) - M.show_message("\red [user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) - broken() - return - -/obj/machinery/light/attack_animal(mob/living/simple_animal/M) - if(M.melee_damage_upper == 0) return - if(status == LIGHT_EMPTY||status == LIGHT_BROKEN) - M << "\red That object is useless to you." - return - else if (status == LIGHT_OK||status == LIGHT_BURNED) - for(var/mob/O in viewers(src)) - O.show_message("\red [M.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) - broken() - return -// attack with hand - remove tube/bulb -// if hands aren't protected and the light is on, burn the player - -/obj/machinery/light/attack_hand(mob/user) - - add_fingerprint(user) - - if(status == LIGHT_EMPTY) - user << "There is no [fitting] in this light." - return - - // make it burn hands if not wearing fire-insulated gloves - if(on) - var/prot = 0 - var/mob/living/carbon/human/H = user - - if(istype(H)) - - if(H.gloves) - var/obj/item/clothing/gloves/G = H.gloves - if(G.max_heat_protection_temperature) - prot = (G.max_heat_protection_temperature > 360) - else - prot = 1 - - if(prot > 0 || (COLD_RESISTANCE in user.mutations)) - user << "You remove the light [fitting]" - else if(TK in user.mutations) - user << "You telekinetically remove the light [fitting]." - else - user << "You try to remove the light [fitting], but you burn your hand on it!" - - var/obj/item/organ/limb/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm") - if(affecting.take_damage( 0, 5 )) // 5 burn damage - H.update_damage_overlays(0) - H.updatehealth() - return // if burned, don't remove the light - else - user << "You remove the light [fitting]." - // create a light tube/bulb item and put it in the user's hand - var/obj/item/weapon/light/L = new light_type() - L.status = status - L.rigged = rigged - L.brightness = brightness - - // light item inherits the switchcount, then zero it - L.switchcount = switchcount - switchcount = 0 - - L.update() - L.add_fingerprint(user) - L.loc = loc - - user.put_in_active_hand(L) //puts it in our active hand - - status = LIGHT_EMPTY - update() - -/obj/machinery/light/attack_tk(mob/user) - if(status == LIGHT_EMPTY) - user << "There is no [fitting] in this light." - return - - user << "You telekinetically remove the light [fitting]." - // create a light tube/bulb item and put it in the user's hand - var/obj/item/weapon/light/L = new light_type() - L.status = status - L.rigged = rigged - L.brightness = brightness - - // light item inherits the switchcount, then zero it - L.switchcount = switchcount - switchcount = 0 - - L.update() - L.add_fingerprint(user) - L.loc = loc - - status = LIGHT_EMPTY - update() - -// break the light and make sparks if was on - -/obj/machinery/light/proc/broken(var/skip_sound_and_sparks = 0) - if(status == LIGHT_EMPTY) - return - - if(!skip_sound_and_sparks) - if(status == LIGHT_OK || status == LIGHT_BURNED) - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) - if(on) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - status = LIGHT_BROKEN - update() - -/obj/machinery/light/proc/fix() - if(status == LIGHT_OK) - return - status = LIGHT_OK - brightness = initial(brightness) - on = 1 - update() - -// explosion effect -// destroy the whole light fixture or just shatter it - -/obj/machinery/light/ex_act(severity) - switch(severity) - if(1.0) - del(src) - return - if(2.0) - if (prob(75)) - broken() - if(3.0) - if (prob(50)) - broken() - return - -//blob effect - -/obj/machinery/light/blob_act() - if(prob(75)) - broken() - - -// timed process -// use power - -#define LIGHTING_POWER_FACTOR 20 //20W per unit luminosity - -/obj/machinery/light/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY - if(on) - use_power(luminosity * LIGHTING_POWER_FACTOR, LIGHT) - -// called when area power state changes -/obj/machinery/light/power_change() - spawn(10) - var/area/A = src.loc.loc - A = A.master - seton(A.lightswitch && A.power_light) - -// called when on fire - -/obj/machinery/light/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(prob(max(0, exposed_temperature - 673))) //0% at <400C, 100% at >500C - broken() - -// explode the light - -/obj/machinery/light/proc/explode() - var/turf/T = get_turf(src.loc) - spawn(0) - broken() // break it first to give a warning - sleep(2) - explosion(T, 0, 0, 2, 2) - sleep(1) - del(src) - -// the light item -// can be tube or bulb subtypes -// will fit into empty /obj/machinery/light of the corresponding type - -/obj/item/weapon/light - icon = 'icons/obj/lighting.dmi' - force = 2 - throwforce = 5 - w_class = 1 - var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN - var/base_state - var/switchcount = 0 // number of times switched - m_amt = 60 - var/rigged = 0 // true if rigged to explode - var/brightness = 2 //how much light it gives off - -/obj/item/weapon/light/tube - name = "light tube" - desc = "A replacement light tube." - icon_state = "ltube" - base_state = "ltube" - item_state = "c_tube" - g_amt = 100 - brightness = 8 - -/obj/item/weapon/light/tube/large - w_class = 2 - name = "large light tube" - brightness = 15 - -/obj/item/weapon/light/bulb - name = "light bulb" - desc = "A replacement light bulb." - icon_state = "lbulb" - base_state = "lbulb" - item_state = "contvapour" - g_amt = 100 - brightness = 5 - -/obj/item/weapon/light/throw_impact(atom/hit_atom) - ..() - shatter() - -/obj/item/weapon/light/bulb/fire - name = "fire bulb" - desc = "A replacement fire bulb." - icon_state = "fbulb" - base_state = "fbulb" - item_state = "egg4" - g_amt = 100 - brightness = 5 - -// update the icon state and description of the light - -/obj/item/weapon/light/proc/update() - switch(status) - if(LIGHT_OK) - icon_state = base_state - desc = "A replacement [name]." - if(LIGHT_BURNED) - icon_state = "[base_state]-burned" - desc = "A burnt-out [name]." - if(LIGHT_BROKEN) - icon_state = "[base_state]-broken" - desc = "A broken [name]." - - -/obj/item/weapon/light/New() - ..() - switch(name) - if("light tube") - brightness = rand(6,9) - if("light bulb") - brightness = rand(4,6) - update() - - -// attack bulb/tube with object -// if a syringe, can inject plasma to make it explode -/obj/item/weapon/light/attackby(var/obj/item/I, var/mob/user) - ..() - if(istype(I, /obj/item/weapon/reagent_containers/syringe)) - var/obj/item/weapon/reagent_containers/syringe/S = I - - user << "You inject the solution into the [src]." - - if(S.reagents.has_reagent("plasma", 5)) - - rigged = 1 - - S.reagents.clear_reagents() - else - ..() - return - -// called after an attack with a light item -// shatter light, unless it was an attempt to put it in a light socket -// now only shatter if the intent was harm - -/obj/item/weapon/light/afterattack(atom/target, mob/user,proximity) - if(!proximity) return - if(istype(target, /obj/machinery/light)) - return - if(user.a_intent != "harm") - return - - shatter() - -/obj/item/weapon/light/proc/shatter() - if(status == LIGHT_OK || status == LIGHT_BURNED) - src.visible_message("\red [name] shatters.","\red You hear a small glass object shatter.") - status = LIGHT_BROKEN - force = 5 - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) - update() +// The lighting system +// +// consists of light fixtures (/obj/machinery/light) and light tube/bulb items (/obj/item/weapon/light) + + +// status values shared between lighting fixtures and items +#define LIGHT_OK 0 +#define LIGHT_EMPTY 1 +#define LIGHT_BROKEN 2 +#define LIGHT_BURNED 3 + + + +/obj/item/light_fixture_frame + name = "light fixture frame" + desc = "Used for building lights." + icon = 'icons/obj/lighting.dmi' + icon_state = "tube-construct-item" + flags = CONDUCT + var/fixture_type = "tube" + var/obj/machinery/light/newlight = null + var/sheets_refunded = 2 + +/obj/item/light_fixture_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/wrench)) + new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded ) + qdel(src) + return + ..() + +/obj/item/light_fixture_frame/proc/try_build(turf/on_wall) + if (get_dist(on_wall,usr)>1) + return + var/ndir = get_dir(usr,on_wall) + if (!(ndir in cardinal)) + return + var/turf/loc = get_turf(usr) + if (!istype(loc, /turf/simulated/floor)) + usr << "\red [src.name] cannot be placed on this spot." + return + usr << "Attaching [src] to the wall." + playsound(src.loc, 'sound/machines/click.ogg', 75, 1) + var/constrdir = usr.dir + var/constrloc = usr.loc + if (!do_after(usr, 30)) + return + switch(fixture_type) + if("bulb") + newlight = new /obj/machinery/light_construct/small(constrloc) + if("tube") + newlight = new /obj/machinery/light_construct(constrloc) + newlight.dir = constrdir + newlight.fingerprints = src.fingerprints + newlight.fingerprintshidden = src.fingerprintshidden + newlight.fingerprintslast = src.fingerprintslast + + usr.visible_message("[usr.name] attaches [src] to the wall.", \ + "You attach [src] to the wall.") + qdel(src) + +/obj/item/light_fixture_frame/small + name = "small light fixture frame" + desc = "Used for building small lights." + icon = 'icons/obj/lighting.dmi' + icon_state = "bulb-construct-item" + flags = CONDUCT + fixture_type = "bulb" + sheets_refunded = 1 + +/obj/machinery/light_construct + name = "light fixture frame" + desc = "A light fixture under construction." + icon = 'icons/obj/lighting.dmi' + icon_state = "tube-construct-stage1" + anchored = 1 + layer = 5 + var/stage = 1 + var/fixture_type = "tube" + var/sheets_refunded = 2 + var/obj/machinery/light/newlight = null + +/obj/machinery/light_construct/New() + ..() + if (fixture_type == "bulb") + icon_state = "bulb-construct-stage1" + +/obj/machinery/light_construct/examine() + set src in view() + ..() + if (!(usr in view(2))) return + switch(src.stage) + if(1) + usr << "It's an empty frame." + return + if(2) + usr << "It's wired." + return + if(3) + usr << "The casing is closed." + return + +/obj/machinery/light_construct/attackby(obj/item/weapon/W as obj, mob/user as mob) + src.add_fingerprint(user) + if (istype(W, /obj/item/weapon/wrench)) + if (src.stage == 1) + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + usr << "You begin deconstructing [src]." + if (!do_after(usr, 30)) + return + new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded ) + user.visible_message("[user.name] deconstructs [src].", \ + "You deconstruct [src].", "You hear a noise.") + playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1) + qdel(src) + if (src.stage == 2) + usr << "You have to remove the wires first." + return + + if (src.stage == 3) + usr << "You have to unscrew the case first." + return + + if(istype(W, /obj/item/weapon/wirecutters)) + if (src.stage != 2) return + src.stage = 1 + switch(fixture_type) + if ("tube") + src.icon_state = "tube-construct-stage1" + if("bulb") + src.icon_state = "bulb-construct-stage1" + new /obj/item/stack/cable_coil(get_turf(src.loc), 1, "red") + user.visible_message("[user.name] removes the wiring from [src].", \ + "You remove the wiring from [src].", "You hear a noise.") + playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) + return + + if(istype(W, /obj/item/stack/cable_coil)) + if (src.stage != 1) return + var/obj/item/stack/cable_coil/coil = W + coil.use(1) + switch(fixture_type) + if ("tube") + src.icon_state = "tube-construct-stage2" + if("bulb") + src.icon_state = "bulb-construct-stage2" + src.stage = 2 + user.visible_message("[user.name] adds wires to [src].", \ + "You add wires to [src].") + return + + if(istype(W, /obj/item/weapon/screwdriver)) + if (src.stage == 2) + switch(fixture_type) + if ("tube") + src.icon_state = "tube-empty" + if("bulb") + src.icon_state = "bulb-empty" + src.stage = 3 + user.visible_message("[user.name] closes [src]'s casing.", \ + "You close [src]'s casing.", "You hear a noise.") + playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1) + + switch(fixture_type) + + if("tube") + newlight = new /obj/machinery/light/built(src.loc) + if ("bulb") + newlight = new /obj/machinery/light/small/built(src.loc) + + newlight.dir = src.dir + src.transfer_fingerprints_to(newlight) + qdel(src) + return + ..() + +/obj/machinery/light_construct/small + name = "small light fixture frame" + desc = "A small light fixture under construction." + icon = 'icons/obj/lighting.dmi' + icon_state = "bulb-construct-stage1" + anchored = 1 + layer = 5 + stage = 1 + fixture_type = "bulb" + sheets_refunded = 1 + +// the standard tube light fixture +/obj/machinery/light + name = "light fixture" + icon = 'icons/obj/lighting.dmi' + var/base_state = "tube" // base description and icon_state + icon_state = "tube1" + desc = "A lighting fixture." + anchored = 1 + layer = 5 // They were appearing under mobs which is a little weird - Ostaf + use_power = 2 + idle_power_usage = 2 + active_power_usage = 20 + power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list + var/on = 0 // 1 if on, 0 if off + var/on_gs = 0 + var/brightness = 8 // luminosity when on, also used in power calculation + var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN + var/flickering = 0 + var/light_type = /obj/item/weapon/light/tube // the type of light item + var/fitting = "tube" + var/switchcount = 0 // count of number of times switched on/off + // this is used to calc the probability the light burns out + + var/rigged = 0 // true if rigged to explode + +// the smaller bulb light fixture + +/obj/machinery/light/small + icon_state = "bulb1" + base_state = "bulb" + fitting = "bulb" + brightness = 4 + desc = "A small lighting fixture." + light_type = /obj/item/weapon/light/bulb + + +/obj/machinery/light/Move() + if(status != LIGHT_BROKEN) broken(1) + return ..() + +/obj/machinery/light/built/New() + status = LIGHT_EMPTY + update(0) + ..() + +/obj/machinery/light/small/built/New() + status = LIGHT_EMPTY + update(0) + ..() + + +// create a new lighting fixture +/obj/machinery/light/New() + ..() + spawn(2) + switch(fitting) + if("tube") + brightness = 8 + if(prob(2)) + broken(1) + if("bulb") + brightness = 4 + if(prob(5)) + broken(1) + spawn(1) + update(0) + +/obj/machinery/light/Destroy() + var/area/A = get_area(src) + if(A) + on = 0 +// A.update_lights() + ..() + +/obj/machinery/light/update_icon() + + switch(status) // set icon_states + if(LIGHT_OK) + icon_state = "[base_state][on]" + if(LIGHT_EMPTY) + icon_state = "[base_state]-empty" + on = 0 + if(LIGHT_BURNED) + icon_state = "[base_state]-burned" + on = 0 + if(LIGHT_BROKEN) + icon_state = "[base_state]-broken" + on = 0 + return + +// update the icon_state and luminosity of the light depending on its state +/obj/machinery/light/proc/update(var/trigger = 1) + + update_icon() + if(on) + if(luminosity != brightness) + switchcount++ + if(rigged) + if(status == LIGHT_OK && trigger) + explode() + else if( prob( min(60, switchcount*switchcount*0.01) ) ) + if(status == LIGHT_OK && trigger) + status = LIGHT_BURNED + icon_state = "[base_state]-burned" + on = 0 + SetLuminosity(0) + else + use_power = 2 + SetLuminosity(brightness) + else + use_power = 1 + SetLuminosity(0) + + active_power_usage = (luminosity * 10) + if(on != on_gs) + on_gs = on + + +// attempt to set the light's on/off status +// will not switch on if broken/burned/empty +/obj/machinery/light/proc/seton(var/s) + on = (s && status == LIGHT_OK) + update() + +// examine verb +/obj/machinery/light/examine() + set src in oview(1) + ..() + if(usr && !usr.stat) + switch(status) + if(LIGHT_OK) + usr << "It is turned [on? "on" : "off"]." + if(LIGHT_EMPTY) + usr << "The [fitting] has been removed." + if(LIGHT_BURNED) + usr << "The [fitting] is burnt out." + if(LIGHT_BROKEN) + usr << "The [fitting] has been smashed." + + + +// attack with item - insert light (if right type), otherwise try to break the light + +/obj/machinery/light/attackby(obj/item/W, mob/user) + + //Light replacer code + if(istype(W, /obj/item/device/lightreplacer)) + var/obj/item/device/lightreplacer/LR = W + if(isliving(user)) + var/mob/living/U = user + LR.ReplaceLight(src, U) + return + + // attempt to insert light + if(istype(W, /obj/item/weapon/light)) + if(status != LIGHT_EMPTY) + user << "There is a [fitting] already inserted." + return + else + src.add_fingerprint(user) + var/obj/item/weapon/light/L = W + if(istype(L, light_type)) + status = L.status + user << "You insert the [L.name]." + switchcount = L.switchcount + rigged = L.rigged + brightness = L.brightness + on = has_power() + update() + + user.drop_item() //drop the item to update overlays and such + qdel(L) + + if(on && rigged) + explode() + else + user << "This type of light requires a [fitting]." + return + + // attempt to break the light + //If xenos decide they want to smash a light bulb with a toolbox, who am I to stop them? /N + + else if(status != LIGHT_BROKEN && status != LIGHT_EMPTY) + + + if(prob(1+W.force * 5)) + + user << "You hit the light, and it smashes!" + for(var/mob/M in viewers(src)) + if(M == user) + continue + M.show_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) + if(on && (W.flags & CONDUCT)) + //if(!user.mutations & COLD_RESISTANCE) + if (prob(12)) + electrocute_mob(user, get_area(src), src, 0.3) + broken() + + else + user << "You hit the light!" + + // attempt to stick weapon into light socket + else if(status == LIGHT_EMPTY) + if(istype(W, /obj/item/weapon/screwdriver)) //If it's a screwdriver open it. + playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1) + user.visible_message("[user.name] opens [src]'s casing.", \ + "You open [src]'s casing.", "You hear a noise.") + var/obj/machinery/light_construct/newlight = null + switch(fitting) + if("tube") + newlight = new /obj/machinery/light_construct(src.loc) + newlight.icon_state = "tube-construct-stage2" + + if("bulb") + newlight = new /obj/machinery/light_construct/small(src.loc) + newlight.icon_state = "bulb-construct-stage2" + newlight.dir = src.dir + newlight.stage = 2 + newlight.fingerprints = src.fingerprints + newlight.fingerprintshidden = src.fingerprintshidden + newlight.fingerprintslast = src.fingerprintslast + qdel(src) + return + + user << "You stick \the [W] into the light socket!" + if(has_power() && (W.flags & CONDUCT)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + //if(!user.mutations & COLD_RESISTANCE) + if (prob(75)) + electrocute_mob(user, get_area(src), src, rand(0.7,1.0)) + + +// returns whether this light has power +// true if area has power and lightswitch is on +/obj/machinery/light/proc/has_power() + var/area/A = src.loc.loc + return A.master.lightswitch && A.master.power_light + +/obj/machinery/light/proc/flicker(var/amount = rand(10, 20)) + if(flickering) return + flickering = 1 + spawn(0) + if(on && status == LIGHT_OK) + for(var/i = 0; i < amount; i++) + if(status != LIGHT_OK) break + on = !on + update(0) + sleep(rand(5, 15)) + on = (status == LIGHT_OK) + update(0) + flickering = 0 + +// ai attack - make lights flicker, because why not + +/obj/machinery/light/attack_ai(mob/user) + src.flicker(1) + return + +// Aliens smash the bulb but do not get electrocuted./N +/obj/machinery/light/attack_alien(mob/living/carbon/alien/humanoid/user)//So larva don't go breaking light bulbs. + if(status == LIGHT_EMPTY||status == LIGHT_BROKEN) + user << "\green That object is useless to you." + return + else if (status == LIGHT_OK||status == LIGHT_BURNED) + for(var/mob/M in viewers(src)) + M.show_message("\red [user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) + broken() + return + +/obj/machinery/light/attack_animal(mob/living/simple_animal/M) + if(M.melee_damage_upper == 0) return + if(status == LIGHT_EMPTY||status == LIGHT_BROKEN) + M << "\red That object is useless to you." + return + else if (status == LIGHT_OK||status == LIGHT_BURNED) + for(var/mob/O in viewers(src)) + O.show_message("\red [M.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) + broken() + return +// attack with hand - remove tube/bulb +// if hands aren't protected and the light is on, burn the player + +/obj/machinery/light/attack_hand(mob/user) + + add_fingerprint(user) + + if(status == LIGHT_EMPTY) + user << "There is no [fitting] in this light." + return + + // make it burn hands if not wearing fire-insulated gloves + if(on) + var/prot = 0 + var/mob/living/carbon/human/H = user + + if(istype(H)) + + if(H.gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(G.max_heat_protection_temperature) + prot = (G.max_heat_protection_temperature > 360) + else + prot = 1 + + if(prot > 0 || (COLD_RESISTANCE in user.mutations)) + user << "You remove the light [fitting]" + else if(TK in user.mutations) + user << "You telekinetically remove the light [fitting]." + else + user << "You try to remove the light [fitting], but you burn your hand on it!" + + var/obj/item/organ/limb/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm") + if(affecting.take_damage( 0, 5 )) // 5 burn damage + H.update_damage_overlays(0) + H.updatehealth() + return // if burned, don't remove the light + else + user << "You remove the light [fitting]." + // create a light tube/bulb item and put it in the user's hand + var/obj/item/weapon/light/L = new light_type() + L.status = status + L.rigged = rigged + L.brightness = brightness + + // light item inherits the switchcount, then zero it + L.switchcount = switchcount + switchcount = 0 + + L.update() + L.add_fingerprint(user) + L.loc = loc + + user.put_in_active_hand(L) //puts it in our active hand + + status = LIGHT_EMPTY + update() + +/obj/machinery/light/attack_tk(mob/user) + if(status == LIGHT_EMPTY) + user << "There is no [fitting] in this light." + return + + user << "You telekinetically remove the light [fitting]." + // create a light tube/bulb item and put it in the user's hand + var/obj/item/weapon/light/L = new light_type() + L.status = status + L.rigged = rigged + L.brightness = brightness + + // light item inherits the switchcount, then zero it + L.switchcount = switchcount + switchcount = 0 + + L.update() + L.add_fingerprint(user) + L.loc = loc + + status = LIGHT_EMPTY + update() + +// break the light and make sparks if was on + +/obj/machinery/light/proc/broken(var/skip_sound_and_sparks = 0) + if(status == LIGHT_EMPTY) + return + + if(!skip_sound_and_sparks) + if(status == LIGHT_OK || status == LIGHT_BURNED) + playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + if(on) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + status = LIGHT_BROKEN + update() + +/obj/machinery/light/proc/fix() + if(status == LIGHT_OK) + return + status = LIGHT_OK + brightness = initial(brightness) + on = 1 + update() + +// explosion effect +// destroy the whole light fixture or just shatter it + +/obj/machinery/light/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if (prob(75)) + broken() + if(3.0) + if (prob(50)) + broken() + return + +//blob effect + +/obj/machinery/light/blob_act() + if(prob(75)) + broken() + + +// timed process +// use power + +#define LIGHTING_POWER_FACTOR 20 //20W per unit luminosity + +/obj/machinery/light/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY + if(on) + use_power(luminosity * LIGHTING_POWER_FACTOR, LIGHT) + +// called when area power state changes +/obj/machinery/light/power_change() + var/area/A = get_area(src) + A = A.master + seton(A.lightswitch && A.power_light) + +// called when on fire + +/obj/machinery/light/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(prob(max(0, exposed_temperature - 673))) //0% at <400C, 100% at >500C + broken() + +// explode the light + +/obj/machinery/light/proc/explode() + var/turf/T = get_turf(src.loc) + spawn(0) + broken() // break it first to give a warning + sleep(2) + explosion(T, 0, 0, 2, 2) + sleep(1) + qdel(src) + +// the light item +// can be tube or bulb subtypes +// will fit into empty /obj/machinery/light of the corresponding type + +/obj/item/weapon/light + icon = 'icons/obj/lighting.dmi' + force = 2 + throwforce = 5 + w_class = 1 + var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN + var/base_state + var/switchcount = 0 // number of times switched + m_amt = 60 + var/rigged = 0 // true if rigged to explode + var/brightness = 2 //how much light it gives off + +/obj/item/weapon/light/tube + name = "light tube" + desc = "A replacement light tube." + icon_state = "ltube" + base_state = "ltube" + item_state = "c_tube" + g_amt = 100 + brightness = 8 + +/obj/item/weapon/light/tube/large + w_class = 2 + name = "large light tube" + brightness = 15 + +/obj/item/weapon/light/bulb + name = "light bulb" + desc = "A replacement light bulb." + icon_state = "lbulb" + base_state = "lbulb" + item_state = "contvapour" + g_amt = 100 + brightness = 5 + +/obj/item/weapon/light/throw_impact(atom/hit_atom) + ..() + shatter() + +/obj/item/weapon/light/bulb/fire + name = "fire bulb" + desc = "A replacement fire bulb." + icon_state = "fbulb" + base_state = "fbulb" + item_state = "egg4" + g_amt = 100 + brightness = 5 + +// update the icon state and description of the light + +/obj/item/weapon/light/proc/update() + switch(status) + if(LIGHT_OK) + icon_state = base_state + desc = "A replacement [name]." + if(LIGHT_BURNED) + icon_state = "[base_state]-burned" + desc = "A burnt-out [name]." + if(LIGHT_BROKEN) + icon_state = "[base_state]-broken" + desc = "A broken [name]." + + +/obj/item/weapon/light/New() + ..() + switch(name) + if("light tube") + brightness = rand(6,9) + if("light bulb") + brightness = rand(4,6) + update() + + +// attack bulb/tube with object +// if a syringe, can inject plasma to make it explode +/obj/item/weapon/light/attackby(var/obj/item/I, var/mob/user) + ..() + if(istype(I, /obj/item/weapon/reagent_containers/syringe)) + var/obj/item/weapon/reagent_containers/syringe/S = I + + user << "You inject the solution into the [src]." + + if(S.reagents.has_reagent("plasma", 5)) + + rigged = 1 + + S.reagents.clear_reagents() + else + ..() + return + +// called after an attack with a light item +// shatter light, unless it was an attempt to put it in a light socket +// now only shatter if the intent was harm + +/obj/item/weapon/light/afterattack(atom/target, mob/user,proximity) + if(!proximity) return + if(istype(target, /obj/machinery/light)) + return + if(user.a_intent != "harm") + return + + shatter() + +/obj/item/weapon/light/proc/shatter() + if(status == LIGHT_OK || status == LIGHT_BURNED) + src.visible_message("\red [name] shatters.","\red You hear a small glass object shatter.") + status = LIGHT_BROKEN + force = 5 + playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + update() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index b9f56b84ce7..92db2f7aaf8 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -1,337 +1,337 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - -/* new portable generator - work in progress - -/obj/machinery/power/port_gen - name = "portable generator" - desc = "A portable generator used for emergency backup power." - icon = 'generator.dmi' - icon_state = "off" - density = 1 - anchored = 0 - directwired = 0 - var/t_status = 0 - var/t_per = 5000 - var/filter = 1 - var/tank = null - var/turf/inturf - var/starter = 0 - var/rpm = 0 - var/rpmtarget = 0 - var/capacity = 1e6 - var/turf/outturf - var/lastgen - - -/obj/machinery/power/port_gen/process() -ideally we're looking to generate 5000 - -/obj/machinery/power/port_gen/attackby(obj/item/weapon/W, mob/user) -tank [un]loading stuff - -/obj/machinery/power/port_gen/attack_hand(mob/user) -turn on/off - -/obj/machinery/power/port_gen/examine() -display round(lastgen) and plasmatank amount - -*/ - -//Previous code been here forever, adding new framework for portable generators - - -//Baseline portable generator. Has all the default handling. Not intended to be used on it's own (since it generates unlimited power). -/obj/machinery/power/port_gen - name = "portable generator" - desc = "A portable generator for emergency backup power" - icon = 'icons/obj/power.dmi' - icon_state = "portgen0" - density = 1 - anchored = 0 - directwired = 0 - use_power = 0 - - var/active = 0 - var/power_gen = 5000 - var/recent_fault = 0 - var/power_output = 1 - var/consumption = 0 - -/obj/machinery/power/port_gen/proc/HasFuel() //Placeholder for fuel check. - return 1 - -/obj/machinery/power/port_gen/proc/UseFuel() //Placeholder for fuel use. - return - -/obj/machinery/power/port_gen/proc/DropFuel() - return - -/obj/machinery/power/port_gen/proc/handleInactive() - return - -/obj/machinery/power/port_gen/process() - if(active && HasFuel() && !crit_fail && anchored && powernet) - add_avail(power_gen * power_output) - UseFuel() - src.updateDialog() - - else - active = 0 - icon_state = initial(icon_state) - handleInactive() - -/obj/machinery/power/port_gen/attack_hand(mob/user as mob) - if(..()) - return - if(!anchored) - return - -/obj/machinery/power/port_gen/examine() - set src in oview(1) - ..() - if(active) - usr << "It is running." - else - usr << "It isn't running." - -/obj/machinery/power/port_gen/pacman - name = "\improper P.A.C.M.A.N.-type portable generator" - var/sheets = 0 - var/max_sheets = 100 - var/sheet_name = "" - var/sheet_path = /obj/item/stack/sheet/mineral/plasma - var/board_path = "/obj/item/weapon/circuitboard/pacman" - var/sheet_left = 0 // How much is left of the sheet - var/time_per_sheet = 260 - var/heat = 0 - -/obj/machinery/power/port_gen/pacman/initialize() - ..() - if(anchored) - connect_to_network() - -/obj/machinery/power/port_gen/pacman/New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) - component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) - component_parts += new /obj/item/stack/cable_coil(src, 1) - component_parts += new /obj/item/stack/cable_coil(src, 1) - component_parts += new /obj/item/weapon/stock_parts/capacitor(src) - component_parts += new board_path(src) - var/obj/sheet = new sheet_path(null) - sheet_name = sheet.name - RefreshParts() - -/obj/machinery/power/port_gen/pacman/Del() - DropFuel() - ..() - -/obj/machinery/power/port_gen/pacman/RefreshParts() - var/temp_rating = 0 - var/temp_reliability = 0 - var/consumption_coeff = 0 - for(var/obj/item/weapon/stock_parts/SP in component_parts) - if(istype(SP, /obj/item/weapon/stock_parts/matter_bin)) - max_sheets = SP.rating * SP.rating * 50 - else if(istype(SP, /obj/item/weapon/stock_parts/capacitor)) - temp_rating += SP.rating - else - consumption_coeff += SP.rating - for(var/obj/item/weapon/CP in component_parts) - temp_reliability += CP.reliability - reliability = min(round(temp_reliability / 4), 100) - power_gen = round(initial(power_gen) * temp_rating * 2) - consumption = consumption_coeff - -/obj/machinery/power/port_gen/pacman/examine() - ..() - usr << "\blue The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle." - if(crit_fail) usr << "\red The generator seems to have broken down." - -/obj/machinery/power/port_gen/pacman/HasFuel() - if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left) - return 1 - return 0 - -/obj/machinery/power/port_gen/pacman/DropFuel() - if(sheets) - var/fail_safe = 0 - while(sheets > 0 && fail_safe < 100) - fail_safe += 1 - var/obj/item/stack/sheet/S = new sheet_path(loc) - var/amount = min(sheets, S.max_amount) - S.amount = amount - sheets -= amount - -/obj/machinery/power/port_gen/pacman/UseFuel() - var/needed_sheets = 1 / (time_per_sheet * consumption / power_output) - var/temp = min(needed_sheets, sheet_left) - needed_sheets -= temp - sheet_left -= temp - sheets -= round(needed_sheets) - needed_sheets -= round(needed_sheets) - if (sheet_left <= 0 && sheets > 0) - sheet_left = 1 - needed_sheets - sheets-- - - var/lower_limit = 56 + power_output * 10 - var/upper_limit = 76 + power_output * 10 - var/bias = 0 - if (power_output > 4) - upper_limit = 400 - bias = power_output - consumption * (4 - consumption) - if (heat < lower_limit) - heat += 4 - consumption - else - heat += rand(-7 + bias, 7 + bias) - if (heat < lower_limit) - heat = lower_limit - if (heat > upper_limit) - heat = upper_limit - - if (heat > 300) - overheat() - del(src) - return - -/obj/machinery/power/port_gen/pacman/handleInactive() - - if (heat > 0) - heat = max(heat - 2, 0) - src.updateDialog() - -/obj/machinery/power/port_gen/pacman/proc/overheat() - explosion(src.loc, 2, 5, 2, -1) - -/obj/machinery/power/port_gen/pacman/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, sheet_path)) - var/obj/item/stack/addstack = O - var/amount = min((max_sheets - sheets), addstack.amount) - if(amount < 1) - user << "\blue The [src.name] is full!" - return - user << "\blue You add [amount] sheets to the [src.name]." - sheets += amount - addstack.use(amount) - updateUsrDialog() - return - else if (istype(O, /obj/item/weapon/card/emag)) - emagged = 1 - emp_act(1) - else if(!active) - - if(exchange_parts(user, O)) - return - - if(istype(O, /obj/item/weapon/wrench)) - - if(!anchored && !isinspace()) - connect_to_network() - user << "\blue You secure the generator to the floor." - anchored = 1 - else if(anchored) - disconnect_from_network() - user << "\blue You unsecure the generator from the floor." - anchored = 0 - - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - - else if(istype(O, /obj/item/weapon/screwdriver)) - panel_open = !panel_open - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(panel_open) - user << "\blue You open the access panel." - else - user << "\blue You close the access panel." - else if(istype(O, /obj/item/weapon/crowbar) && panel_open) - default_deconstruction_crowbar(O) - -/obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob) - ..() - if (!anchored) - return - - interact(user) - -/obj/machinery/power/port_gen/pacman/attack_ai(mob/user as mob) - interact(user) - -/obj/machinery/power/port_gen/pacman/attack_paw(mob/user as mob) - interact(user) - -/obj/machinery/power/port_gen/pacman/interact(mob/user) - if (get_dist(src, user) > 1 ) - if (!istype(user, /mob/living/silicon/ai)) - user.unset_machine() - user << browse(null, "window=port_gen") - return - - user.set_machine(src) - - var/dat = text("[name]
    ") - if (active) - dat += text("Generator: On
    ") - else - dat += text("Generator: Off
    ") - dat += text("[capitalize(sheet_name)]: [sheets] - Eject
    ") - var/stack_percent = round(sheet_left * 100, 1) - dat += text("Current stack: [stack_percent]%
    ") - dat += text("Power output: - [power_gen * power_output] +
    ") - dat += text("Power current: [(powernet == null ? "Unconnected" : "[avail()]")]
    ") - dat += text("Heat: [heat]
    ") - dat += "
    Close" - user << browse("[dat]", "window=port_gen") - onclose(user, "port_gen") - -/obj/machinery/power/port_gen/pacman/Topic(href, href_list) - if(..()) - return - - src.add_fingerprint(usr) - if(href_list["action"]) - if(href_list["action"] == "enable") - if(!active && HasFuel() && !crit_fail) - active = 1 - icon_state = "portgen1" - src.updateUsrDialog() - if(href_list["action"] == "disable") - if (active) - active = 0 - icon_state = "portgen0" - src.updateUsrDialog() - if(href_list["action"] == "eject") - if(!active) - DropFuel() - src.updateUsrDialog() - if(href_list["action"] == "lower_power") - if (power_output > 1) - power_output-- - src.updateUsrDialog() - if (href_list["action"] == "higher_power") - if (power_output < 4 || emagged) - power_output++ - src.updateUsrDialog() - if (href_list["action"] == "close") - usr << browse(null, "window=port_gen") - usr.unset_machine() - -/obj/machinery/power/port_gen/pacman/super - name = "\improper S.U.P.E.R.P.A.C.M.A.N.-type portable generator" - icon_state = "portgen1" - sheet_path = /obj/item/stack/sheet/mineral/uranium - power_gen = 15000 - time_per_sheet = 85 - board_path = "/obj/item/weapon/circuitboard/pacman/super" - overheat() - explosion(src.loc, 3, 3, 3, -1) - -/obj/machinery/power/port_gen/pacman/mrs - name = "\improper M.R.S.P.A.C.M.A.N.-type portable generator" - icon_state = "portgen2" - sheet_path = /obj/item/stack/sheet/mineral/diamond - power_gen = 40000 - time_per_sheet = 80 - board_path = "/obj/item/weapon/circuitboard/pacman/mrs" - overheat() - explosion(src.loc, 4, 4, 4, -1) +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 + +/* new portable generator - work in progress + +/obj/machinery/power/port_gen + name = "portable generator" + desc = "A portable generator used for emergency backup power." + icon = 'generator.dmi' + icon_state = "off" + density = 1 + anchored = 0 + directwired = 0 + var/t_status = 0 + var/t_per = 5000 + var/filter = 1 + var/tank = null + var/turf/inturf + var/starter = 0 + var/rpm = 0 + var/rpmtarget = 0 + var/capacity = 1e6 + var/turf/outturf + var/lastgen + + +/obj/machinery/power/port_gen/process() +ideally we're looking to generate 5000 + +/obj/machinery/power/port_gen/attackby(obj/item/weapon/W, mob/user) +tank [un]loading stuff + +/obj/machinery/power/port_gen/attack_hand(mob/user) +turn on/off + +/obj/machinery/power/port_gen/examine() +display round(lastgen) and plasmatank amount + +*/ + +//Previous code been here forever, adding new framework for portable generators + + +//Baseline portable generator. Has all the default handling. Not intended to be used on it's own (since it generates unlimited power). +/obj/machinery/power/port_gen + name = "portable generator" + desc = "A portable generator for emergency backup power" + icon = 'icons/obj/power.dmi' + icon_state = "portgen0" + density = 1 + anchored = 0 + directwired = 0 + use_power = 0 + + var/active = 0 + var/power_gen = 5000 + var/recent_fault = 0 + var/power_output = 1 + var/consumption = 0 + +/obj/machinery/power/port_gen/proc/HasFuel() //Placeholder for fuel check. + return 1 + +/obj/machinery/power/port_gen/proc/UseFuel() //Placeholder for fuel use. + return + +/obj/machinery/power/port_gen/proc/DropFuel() + return + +/obj/machinery/power/port_gen/proc/handleInactive() + return + +/obj/machinery/power/port_gen/process() + if(active && HasFuel() && !crit_fail && anchored && powernet) + add_avail(power_gen * power_output) + UseFuel() + src.updateDialog() + + else + active = 0 + icon_state = initial(icon_state) + handleInactive() + +/obj/machinery/power/port_gen/attack_hand(mob/user as mob) + if(..()) + return + if(!anchored) + return + +/obj/machinery/power/port_gen/examine() + set src in oview(1) + ..() + if(active) + usr << "It is running." + else + usr << "It isn't running." + +/obj/machinery/power/port_gen/pacman + name = "\improper P.A.C.M.A.N.-type portable generator" + var/sheets = 0 + var/max_sheets = 100 + var/sheet_name = "" + var/sheet_path = /obj/item/stack/sheet/mineral/plasma + var/board_path = "/obj/item/weapon/circuitboard/pacman" + var/sheet_left = 0 // How much is left of the sheet + var/time_per_sheet = 260 + var/heat = 0 + +/obj/machinery/power/port_gen/pacman/initialize() + ..() + if(anchored) + connect_to_network() + +/obj/machinery/power/port_gen/pacman/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) + component_parts += new /obj/item/stack/cable_coil(src, 1) + component_parts += new /obj/item/stack/cable_coil(src, 1) + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new board_path(src) + var/obj/sheet = new sheet_path(null) + sheet_name = sheet.name + RefreshParts() + +/obj/machinery/power/port_gen/pacman/Destroy() + DropFuel() + ..() + +/obj/machinery/power/port_gen/pacman/RefreshParts() + var/temp_rating = 0 + var/temp_reliability = 0 + var/consumption_coeff = 0 + for(var/obj/item/weapon/stock_parts/SP in component_parts) + if(istype(SP, /obj/item/weapon/stock_parts/matter_bin)) + max_sheets = SP.rating * SP.rating * 50 + else if(istype(SP, /obj/item/weapon/stock_parts/capacitor)) + temp_rating += SP.rating + else + consumption_coeff += SP.rating + for(var/obj/item/weapon/CP in component_parts) + temp_reliability += CP.reliability + reliability = min(round(temp_reliability / 4), 100) + power_gen = round(initial(power_gen) * temp_rating * 2) + consumption = consumption_coeff + +/obj/machinery/power/port_gen/pacman/examine() + ..() + usr << "\blue The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle." + if(crit_fail) usr << "\red The generator seems to have broken down." + +/obj/machinery/power/port_gen/pacman/HasFuel() + if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left) + return 1 + return 0 + +/obj/machinery/power/port_gen/pacman/DropFuel() + if(sheets) + var/fail_safe = 0 + while(sheets > 0 && fail_safe < 100) + fail_safe += 1 + var/obj/item/stack/sheet/S = new sheet_path(loc) + var/amount = min(sheets, S.max_amount) + S.amount = amount + sheets -= amount + +/obj/machinery/power/port_gen/pacman/UseFuel() + var/needed_sheets = 1 / (time_per_sheet * consumption / power_output) + var/temp = min(needed_sheets, sheet_left) + needed_sheets -= temp + sheet_left -= temp + sheets -= round(needed_sheets) + needed_sheets -= round(needed_sheets) + if (sheet_left <= 0 && sheets > 0) + sheet_left = 1 - needed_sheets + sheets-- + + var/lower_limit = 56 + power_output * 10 + var/upper_limit = 76 + power_output * 10 + var/bias = 0 + if (power_output > 4) + upper_limit = 400 + bias = power_output - consumption * (4 - consumption) + if (heat < lower_limit) + heat += 4 - consumption + else + heat += rand(-7 + bias, 7 + bias) + if (heat < lower_limit) + heat = lower_limit + if (heat > upper_limit) + heat = upper_limit + + if (heat > 300) + overheat() + qdel(src) + return + +/obj/machinery/power/port_gen/pacman/handleInactive() + + if (heat > 0) + heat = max(heat - 2, 0) + src.updateDialog() + +/obj/machinery/power/port_gen/pacman/proc/overheat() + explosion(src.loc, 2, 5, 2, -1) + +/obj/machinery/power/port_gen/pacman/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(istype(O, sheet_path)) + var/obj/item/stack/addstack = O + var/amount = min((max_sheets - sheets), addstack.amount) + if(amount < 1) + user << "\blue The [src.name] is full!" + return + user << "\blue You add [amount] sheets to the [src.name]." + sheets += amount + addstack.use(amount) + updateUsrDialog() + return + else if (istype(O, /obj/item/weapon/card/emag)) + emagged = 1 + emp_act(1) + else if(!active) + + if(exchange_parts(user, O)) + return + + if(istype(O, /obj/item/weapon/wrench)) + + if(!anchored && !isinspace()) + connect_to_network() + user << "\blue You secure the generator to the floor." + anchored = 1 + else if(anchored) + disconnect_from_network() + user << "\blue You unsecure the generator from the floor." + anchored = 0 + + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + + else if(istype(O, /obj/item/weapon/screwdriver)) + panel_open = !panel_open + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + if(panel_open) + user << "\blue You open the access panel." + else + user << "\blue You close the access panel." + else if(istype(O, /obj/item/weapon/crowbar) && panel_open) + default_deconstruction_crowbar(O) + +/obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob) + ..() + if (!anchored) + return + + interact(user) + +/obj/machinery/power/port_gen/pacman/attack_ai(mob/user as mob) + interact(user) + +/obj/machinery/power/port_gen/pacman/attack_paw(mob/user as mob) + interact(user) + +/obj/machinery/power/port_gen/pacman/interact(mob/user) + if (get_dist(src, user) > 1 ) + if (!istype(user, /mob/living/silicon/ai)) + user.unset_machine() + user << browse(null, "window=port_gen") + return + + user.set_machine(src) + + var/dat = text("[name]
    ") + if (active) + dat += text("Generator: On
    ") + else + dat += text("Generator: Off
    ") + dat += text("[capitalize(sheet_name)]: [sheets] - Eject
    ") + var/stack_percent = round(sheet_left * 100, 1) + dat += text("Current stack: [stack_percent]%
    ") + dat += text("Power output: - [power_gen * power_output] +
    ") + dat += text("Power current: [(powernet == null ? "Unconnected" : "[avail()]")]
    ") + dat += text("Heat: [heat]
    ") + dat += "
    Close" + user << browse("[dat]", "window=port_gen") + onclose(user, "port_gen") + +/obj/machinery/power/port_gen/pacman/Topic(href, href_list) + if(..()) + return + + src.add_fingerprint(usr) + if(href_list["action"]) + if(href_list["action"] == "enable") + if(!active && HasFuel() && !crit_fail) + active = 1 + icon_state = "portgen1" + src.updateUsrDialog() + if(href_list["action"] == "disable") + if (active) + active = 0 + icon_state = "portgen0" + src.updateUsrDialog() + if(href_list["action"] == "eject") + if(!active) + DropFuel() + src.updateUsrDialog() + if(href_list["action"] == "lower_power") + if (power_output > 1) + power_output-- + src.updateUsrDialog() + if (href_list["action"] == "higher_power") + if (power_output < 4 || emagged) + power_output++ + src.updateUsrDialog() + if (href_list["action"] == "close") + usr << browse(null, "window=port_gen") + usr.unset_machine() + +/obj/machinery/power/port_gen/pacman/super + name = "\improper S.U.P.E.R.P.A.C.M.A.N.-type portable generator" + icon_state = "portgen1" + sheet_path = /obj/item/stack/sheet/mineral/uranium + power_gen = 15000 + time_per_sheet = 85 + board_path = "/obj/item/weapon/circuitboard/pacman/super" + overheat() + explosion(src.loc, 3, 3, 3, -1) + +/obj/machinery/power/port_gen/pacman/mrs + name = "\improper M.R.S.P.A.C.M.A.N.-type portable generator" + icon_state = "portgen2" + sheet_path = /obj/item/stack/sheet/mineral/diamond + power_gen = 40000 + time_per_sheet = 80 + board_path = "/obj/item/weapon/circuitboard/pacman/mrs" + overheat() + explosion(src.loc, 4, 4, 4, -1) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index bc7b1eb8547..f07cd84d7b6 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -9,7 +9,7 @@ idle_power_usage = 0 active_power_usage = 0 -/obj/machinery/power/Del() +/obj/machinery/power/Destroy() disconnect_from_network() ..() @@ -34,6 +34,9 @@ else return 0 +/obj/machinery/power/proc/disconnect_terminal() // machines without a terminal will just return, no harm no fowl. + return + // returns true if the area has power on given channel (or doesn't require power). // defaults to power_channel @@ -55,7 +58,7 @@ // increment the power usage stats for an area /obj/machinery/proc/use_power(var/amount, var/chan = -1) // defaults to power_channel - var/area/A = src.loc.loc // make sure it's in an area + var/area/A = get_area(src) // make sure it's in an area if(!A || !isarea(A) || !A.master) return if(chan == -1) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 84cf31648e3..2d3ceab2d87 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -21,7 +21,7 @@ var/global/list/rad_collectors = list() ..() rad_collectors += src -/obj/machinery/power/rad_collector/Del() +/obj/machinery/power/rad_collector/Destroy() rad_collectors -= src ..() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index f488da64e29..ca45409875b 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -14,7 +14,7 @@ var/obj/machinery/field/generator/FG1 = null var/obj/machinery/field/generator/FG2 = null -/obj/machinery/field/containment/Del() +/obj/machinery/field/containment/Destroy() if(FG1 && !FG1.clean_up) FG1.cleanup() if(FG2 && !FG2.clean_up) @@ -52,7 +52,7 @@ /obj/machinery/field/containment/shock(mob/living/user as mob) if(!FG1 || !FG2) - del(src) + qdel(src) return 0 ..() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 9a141f3849e..b249672db3f 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -39,7 +39,7 @@ connect_to_network() src.directwired = 1 -/obj/machinery/power/emitter/Del() +/obj/machinery/power/emitter/Destroy() if(ticker && ticker.current_state == GAME_STATE_PLAYING) message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1) log_game("Emitter deleted at ([x],[y],[z])") diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 3aa61ef49b9..3cb5edc8fee 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -169,7 +169,7 @@ field_generator power level display return 0 -/obj/machinery/field/generator/Del() +/obj/machinery/field/generator/Destroy() src.cleanup() ..() @@ -327,7 +327,7 @@ field_generator power level display for (var/obj/machinery/field/containment/F in fields) if (isnull(F)) continue - del(F) + qdel(F) fields = list() for(var/obj/machinery/field/generator/FG in connected_gens) if (isnull(FG)) diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index 08181a3d7b6..d618cd54eef 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -13,7 +13,7 @@ var/turf/T = get_turf(src) if(src.energy >= 200) new /obj/machinery/singularity/(T, 50) - if(src) del(src) + if(src) qdel(src) /obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/wrench)) diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 65de436a9d7..2e037f8e76e 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -1,416 +1,416 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - -/*Composed of 7 parts -3 Particle emitters -proc -emit_particle() - -1 power box -the only part of this thing that uses power, can hack to mess with the pa/make it better - -1 fuel chamber -contains procs for mixing gas and whatever other fuel it uses -mix_gas() - -1 gas holder WIP -acts like a tank valve on the ground that you wrench gas tanks onto -proc -extract_gas() -return_gas() -attach_tank() -remove_tank() -get_available_mix() - -1 End Cap - -1 Control computer -interface for the pa, acts like a computer with an html menu for diff parts and a status report -all other parts contain only a ref to this -a /machine/, tells the others to do work -contains ref for all parts -proc -process() -check_build() - -Setup map - |EC| -CC|FC| - |PB| -PE|PE|PE - - -Icon Addemdum -Icon system is much more robust, and the icons are all variable based. -Each part has a reference string, powered, strength, and contruction values. -Using this the update_icon() proc is simplified a bit (using for absolutely was problematic with naming), -so the icon_state comes out be: -"[reference][strength]", with a switch controlling construction_states and ensuring that it doesn't -power on while being contructed, and all these variables are set by the computer through it's scan list -Essential order of the icons: -Standard - [reference] -Wrenched - [reference] -Wired - [reference]w -Closed - [reference]c -Powered - [reference]p[strength] -Strength being set by the computer and a null strength (Computer is powered off or inactive) returns a 'null', counting as empty -So, hopefully this is helpful if any more icons are to be added/changed/wondering what the hell is going on here - -*/ - -/obj/structure/particle_accelerator - name = "Particle Accelerator" - desc = "Part of a Particle Accelerator." - icon = 'icons/obj/machines/particle_accelerator.dmi' - icon_state = "none" - anchored = 0 - density = 1 - var/obj/machinery/particle_accelerator/control_box/master = null - var/construction_state = 0 - var/reference = null - var/powered = 0 - var/strength = null - var/desc_holder = null - -/obj/structure/particle_accelerator/Del() - construction_state = 0 - if(master) - master.part_scan() - ..() - -/obj/structure/particle_accelerator/end_cap - name = "Alpha Particle Generation Array" - desc_holder = "This is where Alpha particles are generated from \[REDACTED\]" - icon_state = "end_cap" - reference = "end_cap" - -/obj/structure/particle_accelerator/update_icon() - ..() - return - - -/obj/structure/particle_accelerator/verb/rotate() - set name = "Rotate Clockwise" - set category = "Object" - set src in oview(1) - - if (src.anchored || usr:stat) - usr << "It is fastened to the floor!" - return 0 - src.dir = turn(src.dir, 270) - return 1 - -/obj/structure/particle_accelerator/verb/rotateccw() - set name = "Rotate Counter Clockwise" - set category = "Object" - set src in oview(1) - - if (src.anchored || usr:stat) - usr << "It is fastened to the floor!" - return 0 - src.dir = turn(src.dir, 90) - return 1 - -/obj/structure/particle_accelerator/examine() - switch(src.construction_state) - if(0) - src.desc = text("A [name], looks like it's not attached to the flooring") - if(1) - src.desc = text("A [name], it is missing some cables") - if(2) - src.desc = text("A [name], the panel is open") - if(3) - src.desc = text("The [name] is assembled") - if(powered) - src.desc = src.desc_holder - ..() - return - - -/obj/structure/particle_accelerator/attackby(obj/item/W, mob/user) - if(istool(W)) - if(src.process_tool_hit(W,user)) - return - ..() - return - - -/obj/structure/particle_accelerator/Move() - ..() - if(master && master.active) - master.toggle_power() - investigate_log("was moved whilst active; it powered down.","singulo") - -/obj/structure/particle_accelerator/ex_act(severity) - switch(severity) - if(1.0) - del(src) - return - if(2.0) - if (prob(50)) - del(src) - return - if(3.0) - if (prob(25)) - del(src) - return - else - return - - -/obj/structure/particle_accelerator/blob_act() - if(prob(50)) - del(src) - return - - -/obj/structure/particle_accelerator/meteorhit() - if(prob(50)) - del(src) - return - -/obj/structure/particle_accelerator/update_icon() - switch(construction_state) - if(0,1) - icon_state="[reference]" - if(2) - icon_state="[reference]w" - if(3) - if(powered) - icon_state="[reference]p[strength]" - else - icon_state="[reference]c" - return - -/obj/structure/particle_accelerator/proc/update_state() - if(master) - master.update_state() - return 0 - - -/obj/structure/particle_accelerator/proc/report_ready(var/obj/O) - if(O && (O == master)) - if(construction_state >= 3) - return 1 - return 0 - - -/obj/structure/particle_accelerator/proc/report_master() - if(master) - return master - return 0 - - -/obj/structure/particle_accelerator/proc/connect_master(var/obj/O) - if(O && istype(O,/obj/machinery/particle_accelerator/control_box)) - if(O.dir == src.dir) - master = O - return 1 - return 0 - - -/obj/structure/particle_accelerator/proc/process_tool_hit(var/obj/O, var/mob/user) - if(!(O) || !(user)) - return 0 - if(!ismob(user) || !isobj(O)) - return 0 - var/temp_state = src.construction_state - - switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps - if(0) - if(istype(O, /obj/item/weapon/wrench) && !isinspace()) - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - src.anchored = 1 - user.visible_message("[user.name] secures the [src.name] to the floor.", \ - "You secure the external bolts.") - temp_state++ - if(1) - if(istype(O, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - src.anchored = 0 - user.visible_message("[user.name] detaches the [src.name] from the floor.", \ - "You remove the external bolts.") - temp_state-- - else if(istype(O, /obj/item/stack/cable_coil)) - if(O:use(1,user)) - user.visible_message("[user.name] adds wires to the [src.name].", \ - "You add some wires.") - temp_state++ - if(2) - if(istype(O, /obj/item/weapon/wirecutters))//TODO:Shock user if its on? - user.visible_message("[user.name] removes some wires from the [src.name].", \ - "You remove some wires.") - temp_state-- - else if(istype(O, /obj/item/weapon/screwdriver)) - user.visible_message("[user.name] closes the [src.name]'s access panel.", \ - "You close the access panel.") - temp_state++ - if(3) - if(istype(O, /obj/item/weapon/screwdriver)) - user.visible_message("[user.name] opens the [src.name]'s access panel.", \ - "You open the access panel.") - temp_state-- - if(temp_state == src.construction_state)//Nothing changed - return 0 - else - src.construction_state = temp_state - if(src.construction_state < 3)//Was taken apart, update state - update_state() - update_icon() - return 1 - return 0 - - - -/obj/machinery/particle_accelerator - name = "Particle Accelerator" - desc = "Part of a Particle Accelerator." - icon = 'icons/obj/machines/particle_accelerator.dmi' - icon_state = "none" - anchored = 0 - density = 1 - use_power = 0 - idle_power_usage = 0 - active_power_usage = 0 - var/construction_state = 0 - var/active = 0 - var/reference = null - var/powered = null - var/strength = 0 - var/desc_holder = null - - -/obj/machinery/particle_accelerator/verb/rotate() - set name = "Rotate Clockwise" - set category = "Object" - set src in oview(1) - - if (src.anchored || usr:stat) - usr << "It is fastened to the floor!" - return 0 - src.dir = turn(src.dir, 270) - return 1 - -/obj/machinery/particle_accelerator/verb/rotateccw() - set name = "Rotate Counter-Clockwise" - set category = "Object" - set src in oview(1) - - if (src.anchored || usr:stat) - usr << "It is fastened to the floor!" - return 0 - src.dir = turn(src.dir, 90) - return 1 - -/obj/machinery/particle_accelerator/update_icon() - return - -/obj/machinery/particle_accelerator/examine() - switch(src.construction_state) - if(0) - src.desc = text("A [name], looks like it's not attached to the flooring") - if(1) - src.desc = text("A [name], it is missing some cables") - if(2) - src.desc = text("A [name], the panel is open") - if(3) - src.desc = text("The [name] is assembled") - if(powered) - src.desc = src.desc_holder - ..() - return - - -/obj/machinery/particle_accelerator/attackby(obj/item/W, mob/user) - if(istool(W)) - if(src.process_tool_hit(W,user)) - return - ..() - return - -/obj/machinery/particle_accelerator/ex_act(severity) - switch(severity) - if(1.0) - del(src) - return - if(2.0) - if (prob(50)) - del(src) - return - if(3.0) - if (prob(25)) - del(src) - return - else - return - - -/obj/machinery/particle_accelerator/blob_act() - if(prob(50)) - del(src) - return - - -/obj/machinery/particle_accelerator/meteorhit() - if(prob(50)) - del(src) - return - - -/obj/machinery/particle_accelerator/proc/update_state() - return 0 - - -/obj/machinery/particle_accelerator/proc/process_tool_hit(var/obj/O, var/mob/user) - if(!(O) || !(user)) - return 0 - if(!ismob(user) || !isobj(O)) - return 0 - var/temp_state = src.construction_state - switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps - if(0) - if(istype(O, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - src.anchored = 1 - user.visible_message("[user.name] secures the [src.name] to the floor.", \ - "You secure the external bolts.") - temp_state++ - if(1) - if(istype(O, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - src.anchored = 0 - user.visible_message("[user.name] detaches the [src.name] from the floor.", \ - "You remove the external bolts.") - temp_state-- - else if(istype(O, /obj/item/stack/cable_coil)) - if(O:use(1)) - user.visible_message("[user.name] adds wires to the [src.name].", \ - "You add some wires.") - temp_state++ - if(2) - if(istype(O, /obj/item/weapon/wirecutters))//TODO:Shock user if its on? - user.visible_message("[user.name] removes some wires from the [src.name].", \ - "You remove some wires.") - temp_state-- - else if(istype(O, /obj/item/weapon/screwdriver)) - user.visible_message("[user.name] closes the [src.name]'s access panel.", \ - "You close the access panel.") - temp_state++ - if(3) - if(istype(O, /obj/item/weapon/screwdriver)) - user.visible_message("[user.name] opens the [src.name]'s access panel.", \ - "You open the access panel.") - temp_state-- - active = 0 - if(temp_state == src.construction_state)//Nothing changed - return 0 - else - if(src.construction_state < 3)//Was taken apart, update state - update_state() - if(use_power) - use_power = 0 - src.construction_state = temp_state - if(src.construction_state >= 3) - use_power = 1 - update_icon() - return 1 - return 0 +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 + +/*Composed of 7 parts +3 Particle emitters +proc +emit_particle() + +1 power box +the only part of this thing that uses power, can hack to mess with the pa/make it better + +1 fuel chamber +contains procs for mixing gas and whatever other fuel it uses +mix_gas() + +1 gas holder WIP +acts like a tank valve on the ground that you wrench gas tanks onto +proc +extract_gas() +return_gas() +attach_tank() +remove_tank() +get_available_mix() + +1 End Cap + +1 Control computer +interface for the pa, acts like a computer with an html menu for diff parts and a status report +all other parts contain only a ref to this +a /machine/, tells the others to do work +contains ref for all parts +proc +process() +check_build() + +Setup map + |EC| +CC|FC| + |PB| +PE|PE|PE + + +Icon Addemdum +Icon system is much more robust, and the icons are all variable based. +Each part has a reference string, powered, strength, and contruction values. +Using this the update_icon() proc is simplified a bit (using for absolutely was problematic with naming), +so the icon_state comes out be: +"[reference][strength]", with a switch controlling construction_states and ensuring that it doesn't +power on while being contructed, and all these variables are set by the computer through it's scan list +Essential order of the icons: +Standard - [reference] +Wrenched - [reference] +Wired - [reference]w +Closed - [reference]c +Powered - [reference]p[strength] +Strength being set by the computer and a null strength (Computer is powered off or inactive) returns a 'null', counting as empty +So, hopefully this is helpful if any more icons are to be added/changed/wondering what the hell is going on here + +*/ + +/obj/structure/particle_accelerator + name = "Particle Accelerator" + desc = "Part of a Particle Accelerator." + icon = 'icons/obj/machines/particle_accelerator.dmi' + icon_state = "none" + anchored = 0 + density = 1 + var/obj/machinery/particle_accelerator/control_box/master = null + var/construction_state = 0 + var/reference = null + var/powered = 0 + var/strength = null + var/desc_holder = null + +/obj/structure/particle_accelerator/Destroy() + construction_state = 0 + if(master) + master.part_scan() + ..() + +/obj/structure/particle_accelerator/end_cap + name = "Alpha Particle Generation Array" + desc_holder = "This is where Alpha particles are generated from \[REDACTED\]" + icon_state = "end_cap" + reference = "end_cap" + +/obj/structure/particle_accelerator/update_icon() + ..() + return + + +/obj/structure/particle_accelerator/verb/rotate() + set name = "Rotate Clockwise" + set category = "Object" + set src in oview(1) + + if (src.anchored || usr:stat) + usr << "It is fastened to the floor!" + return 0 + src.dir = turn(src.dir, 270) + return 1 + +/obj/structure/particle_accelerator/verb/rotateccw() + set name = "Rotate Counter Clockwise" + set category = "Object" + set src in oview(1) + + if (src.anchored || usr:stat) + usr << "It is fastened to the floor!" + return 0 + src.dir = turn(src.dir, 90) + return 1 + +/obj/structure/particle_accelerator/examine() + switch(src.construction_state) + if(0) + src.desc = text("A [name], looks like it's not attached to the flooring") + if(1) + src.desc = text("A [name], it is missing some cables") + if(2) + src.desc = text("A [name], the panel is open") + if(3) + src.desc = text("The [name] is assembled") + if(powered) + src.desc = src.desc_holder + ..() + return + + +/obj/structure/particle_accelerator/attackby(obj/item/W, mob/user) + if(istool(W)) + if(src.process_tool_hit(W,user)) + return + ..() + return + + +/obj/structure/particle_accelerator/Move() + ..() + if(master && master.active) + master.toggle_power() + investigate_log("was moved whilst active; it powered down.","singulo") + +/obj/structure/particle_accelerator/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if (prob(50)) + qdel(src) + return + if(3.0) + if (prob(25)) + qdel(src) + return + else + return + + +/obj/structure/particle_accelerator/blob_act() + if(prob(50)) + qdel(src) + return + + +/obj/structure/particle_accelerator/meteorhit() + if(prob(50)) + qdel(src) + return + +/obj/structure/particle_accelerator/update_icon() + switch(construction_state) + if(0,1) + icon_state="[reference]" + if(2) + icon_state="[reference]w" + if(3) + if(powered) + icon_state="[reference]p[strength]" + else + icon_state="[reference]c" + return + +/obj/structure/particle_accelerator/proc/update_state() + if(master) + master.update_state() + return 0 + + +/obj/structure/particle_accelerator/proc/report_ready(var/obj/O) + if(O && (O == master)) + if(construction_state >= 3) + return 1 + return 0 + + +/obj/structure/particle_accelerator/proc/report_master() + if(master) + return master + return 0 + + +/obj/structure/particle_accelerator/proc/connect_master(var/obj/O) + if(O && istype(O,/obj/machinery/particle_accelerator/control_box)) + if(O.dir == src.dir) + master = O + return 1 + return 0 + + +/obj/structure/particle_accelerator/proc/process_tool_hit(var/obj/O, var/mob/user) + if(!(O) || !(user)) + return 0 + if(!ismob(user) || !isobj(O)) + return 0 + var/temp_state = src.construction_state + + switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps + if(0) + if(istype(O, /obj/item/weapon/wrench) && !isinspace()) + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + src.anchored = 1 + user.visible_message("[user.name] secures the [src.name] to the floor.", \ + "You secure the external bolts.") + temp_state++ + if(1) + if(istype(O, /obj/item/weapon/wrench)) + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + src.anchored = 0 + user.visible_message("[user.name] detaches the [src.name] from the floor.", \ + "You remove the external bolts.") + temp_state-- + else if(istype(O, /obj/item/stack/cable_coil)) + if(O:use(1,user)) + user.visible_message("[user.name] adds wires to the [src.name].", \ + "You add some wires.") + temp_state++ + if(2) + if(istype(O, /obj/item/weapon/wirecutters))//TODO:Shock user if its on? + user.visible_message("[user.name] removes some wires from the [src.name].", \ + "You remove some wires.") + temp_state-- + else if(istype(O, /obj/item/weapon/screwdriver)) + user.visible_message("[user.name] closes the [src.name]'s access panel.", \ + "You close the access panel.") + temp_state++ + if(3) + if(istype(O, /obj/item/weapon/screwdriver)) + user.visible_message("[user.name] opens the [src.name]'s access panel.", \ + "You open the access panel.") + temp_state-- + if(temp_state == src.construction_state)//Nothing changed + return 0 + else + src.construction_state = temp_state + if(src.construction_state < 3)//Was taken apart, update state + update_state() + update_icon() + return 1 + return 0 + + + +/obj/machinery/particle_accelerator + name = "Particle Accelerator" + desc = "Part of a Particle Accelerator." + icon = 'icons/obj/machines/particle_accelerator.dmi' + icon_state = "none" + anchored = 0 + density = 1 + use_power = 0 + idle_power_usage = 0 + active_power_usage = 0 + var/construction_state = 0 + var/active = 0 + var/reference = null + var/powered = null + var/strength = 0 + var/desc_holder = null + + +/obj/machinery/particle_accelerator/verb/rotate() + set name = "Rotate Clockwise" + set category = "Object" + set src in oview(1) + + if (src.anchored || usr:stat) + usr << "It is fastened to the floor!" + return 0 + src.dir = turn(src.dir, 270) + return 1 + +/obj/machinery/particle_accelerator/verb/rotateccw() + set name = "Rotate Counter-Clockwise" + set category = "Object" + set src in oview(1) + + if (src.anchored || usr:stat) + usr << "It is fastened to the floor!" + return 0 + src.dir = turn(src.dir, 90) + return 1 + +/obj/machinery/particle_accelerator/update_icon() + return + +/obj/machinery/particle_accelerator/examine() + switch(src.construction_state) + if(0) + src.desc = text("A [name], looks like it's not attached to the flooring") + if(1) + src.desc = text("A [name], it is missing some cables") + if(2) + src.desc = text("A [name], the panel is open") + if(3) + src.desc = text("The [name] is assembled") + if(powered) + src.desc = src.desc_holder + ..() + return + + +/obj/machinery/particle_accelerator/attackby(obj/item/W, mob/user) + if(istool(W)) + if(src.process_tool_hit(W,user)) + return + ..() + return + +/obj/machinery/particle_accelerator/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if (prob(50)) + qdel(src) + return + if(3.0) + if (prob(25)) + qdel(src) + return + else + return + + +/obj/machinery/particle_accelerator/blob_act() + if(prob(50)) + qdel(src) + return + + +/obj/machinery/particle_accelerator/meteorhit() + if(prob(50)) + qdel(src) + return + + +/obj/machinery/particle_accelerator/proc/update_state() + return 0 + + +/obj/machinery/particle_accelerator/proc/process_tool_hit(var/obj/O, var/mob/user) + if(!(O) || !(user)) + return 0 + if(!ismob(user) || !isobj(O)) + return 0 + var/temp_state = src.construction_state + switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps + if(0) + if(istype(O, /obj/item/weapon/wrench)) + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + src.anchored = 1 + user.visible_message("[user.name] secures the [src.name] to the floor.", \ + "You secure the external bolts.") + temp_state++ + if(1) + if(istype(O, /obj/item/weapon/wrench)) + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + src.anchored = 0 + user.visible_message("[user.name] detaches the [src.name] from the floor.", \ + "You remove the external bolts.") + temp_state-- + else if(istype(O, /obj/item/stack/cable_coil)) + if(O:use(1)) + user.visible_message("[user.name] adds wires to the [src.name].", \ + "You add some wires.") + temp_state++ + if(2) + if(istype(O, /obj/item/weapon/wirecutters))//TODO:Shock user if its on? + user.visible_message("[user.name] removes some wires from the [src.name].", \ + "You remove some wires.") + temp_state-- + else if(istype(O, /obj/item/weapon/screwdriver)) + user.visible_message("[user.name] closes the [src.name]'s access panel.", \ + "You close the access panel.") + temp_state++ + if(3) + if(istype(O, /obj/item/weapon/screwdriver)) + user.visible_message("[user.name] opens the [src.name]'s access panel.", \ + "You open the access panel.") + temp_state-- + active = 0 + if(temp_state == src.construction_state)//Nothing changed + return 0 + else + if(src.construction_state < 3)//Was taken apart, update state + update_state() + if(use_power) + use_power = 0 + src.construction_state = temp_state + if(src.construction_state >= 3) + use_power = 1 + update_icon() + return 1 + return 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 5cb6f3f4a6d..afaac0be300 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -26,7 +26,7 @@ connected_parts = list() ..() -/obj/machinery/particle_accelerator/control_box/Del() +/obj/machinery/particle_accelerator/control_box/Destroy() if(active) toggle_power() ..() diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 84961507e58..f6c7e141680 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -38,9 +38,6 @@ var/global/list/uneatable = list( admin_investigate_setup() src.energy = starting_energy - if(temp) - spawn(temp) - del(src) ..() for(var/obj/machinery/singularity_beacon/singubeacon in world) if(singubeacon.active) @@ -63,7 +60,7 @@ var/global/list/uneatable = list( if(1.0) if(prob(25)) investigate_log("has been destroyed by an explosion.","singulo") - del(src) + qdel(src) return else energy += 50 @@ -191,7 +188,7 @@ var/global/list/uneatable = list( /obj/machinery/singularity/proc/check_energy() if(energy <= 0) investigate_log("collapsed.","singulo") - del(src) + qdel(src) return 0 switch(energy)//Some of these numbers might need to be changed up later -Mport if(1 to 199) @@ -211,8 +208,8 @@ var/global/list/uneatable = list( /obj/machinery/singularity/proc/eat() set background = BACKGROUND_ENABLED - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 1 +// if(defer_powernet_rebuild != 2) +// defer_powernet_rebuild = 1 // Let's just make this one loop. for(var/atom/X in orange(grav_pull,src)) var/dist = get_dist(X, src) @@ -244,8 +241,8 @@ var/global/list/uneatable = list( else if(dist <= consume_range && (isturf(X) || istype(X, /atom/movable))) consume(X) - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 0 +// if(defer_powernet_rebuild != 2) +// defer_powernet_rebuild = 0 return @@ -279,7 +276,7 @@ var/global/list/uneatable = list( if(istype(A, /obj/machinery/singularity))//Welp now you did it var/obj/machinery/singularity/S = A src.energy += (S.energy/2)//Absorb most of it - del(S) + qdel(S) var/dist = max((current_size - 2),1) explosion(src.loc,(dist),(dist*2),(dist*4)) return//Quits here, the obj should be gone, hell we might be @@ -291,7 +288,8 @@ var/global/list/uneatable = list( O.z = 2 else A.ex_act(1.0) - if(A) del(A) + if(A && isnull(A.gc_destroyed)) + qdel(A) gain = 2 else if(isturf(A)) var/turf/T = A @@ -517,7 +515,7 @@ var/global/list/uneatable = list( if(istype(A,/obj/)) var/obj/O = A O.ex_act(1.0) - if(O) del(O) + if(O) qdel(O) else if(isturf(A)) var/turf/T = A @@ -605,11 +603,11 @@ var/global/list/uneatable = list( /obj/machinery/singularity/narsie/wizard/eat() set background = BACKGROUND_ENABLED - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 1 +// if(defer_powernet_rebuild != 2) +// defer_powernet_rebuild = 1 for(var/atom/X in orange(consume_range,src)) if(isturf(X) || istype(X, /atom/movable)) consume(X) - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 0 +// if(defer_powernet_rebuild != 2) +// defer_powernet_rebuild = 0 return diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 247c1e61a0a..f5c6b0f1274 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -97,14 +97,22 @@ default_deconstruction_crowbar(I) -/obj/machinery/power/smes/Del() +/obj/machinery/power/smes/Destroy() if(ticker && ticker.current_state == GAME_STATE_PLAYING) var/area/area = get_area(src) message_admins("SMES deleted at ([area.name])") log_game("SMES deleted at ([area.name])") investigate_log("deleted at ([area.name])","singulo") + if(terminal) + disconnect_terminal() ..() +/obj/machinery/power/smes/disconnect_terminal() + if(terminal) + terminal.master = null + terminal = null + + /obj/machinery/power/smes/update_icon() overlays.Cut() if(stat & BROKEN) return @@ -293,7 +301,8 @@ if("custom") var/custom = input(usr, "What rate would you like this SMES to attempt to charge at? Max is [input_level_max].") as null|num if(isnum(custom)) - input_level = custom + href_list["set_input_level"] = custom + .() if("plus") input_level += 10000 if("minus") @@ -313,7 +322,8 @@ if("custom") var/custom = input(usr, "What rate would you like this SMES to attempt to output at? Max is [output_level_max].") as null|num if(isnum(custom)) - output_level = custom + href_list["set_output_level"] = custom + .() if("plus") output_level += 10000 if("minus") diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 98c6771296f..fa40707236e 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -72,7 +72,7 @@ var/list/solars_list = list() S.give_glass() playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] takes the glass off the solar panel.") - del(src) + qdel(src) return else if (W) src.add_fingerprint(user) @@ -94,7 +94,7 @@ var/list/solars_list = list() else new /obj/item/weapon/shard(src.loc) new /obj/item/weapon/shard(src.loc) - del(src) + qdel(src) return return @@ -151,20 +151,20 @@ var/list/solars_list = list() if(stat & !BROKEN) broken() else - del(src) + qdel(src) /obj/machinery/power/solar/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) if(prob(15)) new /obj/item/weapon/shard( src.loc ) return if(2.0) if (prob(25)) new /obj/item/weapon/shard( src.loc ) - del(src) + qdel(src) return if (prob(50)) broken() @@ -247,7 +247,7 @@ var/list/solars_list = list() if(istype(W, /obj/item/weapon/tracker_electronics)) tracker = 1 user.drop_item() - del(W) + qdel(W) user.visible_message("[user] inserts the electronics into the solar assembly.") return 1 else @@ -346,7 +346,7 @@ var/list/solars_list = list() A.state = 3 A.icon_state = "3" A.anchored = 1 - del(src) + qdel(src) else user << "\blue You disconnect the monitor." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) @@ -357,7 +357,7 @@ var/list/solars_list = list() A.state = 4 A.icon_state = "4" A.anchored = 1 - del(src) + qdel(src) else src.attack_hand(user) return @@ -491,7 +491,7 @@ var/list/solars_list = list() switch(severity) if(1.0) //SN src = null - del(src) + qdel(src) return if(2.0) if (prob(50)) diff --git a/code/modules/power/switch.dm b/code/modules/power/switch.dm index e4899acdf23..844c88a0b83 100644 --- a/code/modules/power/switch.dm +++ b/code/modules/power/switch.dm @@ -80,5 +80,5 @@ else icon_state = icon_state_off for(var/obj/structure/cable/C in src.loc) - del(C) + qdel(C) */ \ No newline at end of file diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index f739ba93fda..c87d48e8ad3 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -21,6 +21,10 @@ if(level==1) hide(T.intact) return +/obj/machinery/power/terminal/Destroy() + if(master) + master.disconnect_terminal() + return ..() /obj/machinery/power/terminal/hide(var/i) if(i) diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 24895c8b350..29f715b368d 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -65,7 +65,7 @@ S.give_glass() playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] takes the glass off the tracker.") - del(src) + qdel(src) return ..() diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index 90834ff8489..aa0d1f84412 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -1,118 +1,118 @@ -/obj/item/ammo_casing/energy - name = "energy weapon lens" - desc = "The part of the gun that makes the laser go pew" - caliber = "energy" - projectile_type = /obj/item/projectile/energy - var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot. - var/select_name = "energy" - var/mod_name = null - var/fire_sound = 'sound/weapons/Laser.ogg' - -/obj/item/ammo_casing/energy/laser - projectile_type = /obj/item/projectile/beam - select_name = "kill" - -/obj/item/ammo_casing/energy/laser/practice - projectile_type = /obj/item/projectile/practice - select_name = "practice" - -/obj/item/ammo_casing/energy/laser/scatter - projectile_type = /obj/item/projectile/beam/scatter - pellets = 5 - variance = 0.8 - select_name = "scatter" - -/obj/item/ammo_casing/energy/laser/heavy - projectile_type = /obj/item/projectile/beam/heavylaser - select_name = "anti-vehicle" - fire_sound = 'sound/weapons/lasercannonfire.ogg' - -/obj/item/ammo_casing/energy/laser/pulse - projectile_type = /obj/item/projectile/beam/pulse - e_cost = 200 - select_name = "DESTROY" - fire_sound = 'sound/weapons/pulse.ogg' - -/obj/item/ammo_casing/energy/laser/bluetag - projectile_type = /obj/item/projectile/lasertag/bluetag - select_name = "bluetag" - -/obj/item/ammo_casing/energy/laser/redtag - projectile_type = /obj/item/projectile/lasertag/redtag - select_name = "redtag" - -/obj/item/ammo_casing/energy/bolt - projectile_type = /obj/item/projectile/energy/bolt - select_name = "bolt" - fire_sound = 'sound/weapons/Genhit.ogg' - -/obj/item/ammo_casing/energy/bolt/large - projectile_type = /obj/item/projectile/energy/bolt/large - select_name = "heavy bolt" - -/obj/item/ammo_casing/energy/xray - projectile_type = /obj/item/projectile/beam/xray - e_cost = 50 - fire_sound = 'sound/weapons/laser3.ogg' - -/obj/item/ammo_casing/energy/electrode - projectile_type = /obj/item/projectile/energy/electrode - select_name = "stun" - fire_sound = 'sound/weapons/taser.ogg' - -/obj/item/ammo_casing/energy/electrode/gun - fire_sound = 'sound/weapons/gunshot.ogg' - -/obj/item/ammo_casing/energy/ion - projectile_type = /obj/item/projectile/ion - select_name = "ion" - fire_sound = 'sound/weapons/Laser.ogg' - -/obj/item/ammo_casing/energy/declone - projectile_type = /obj/item/projectile/energy/declone - select_name = "declone" - fire_sound = 'sound/weapons/pulse3.ogg' - -/obj/item/ammo_casing/energy/mindflayer - projectile_type = /obj/item/projectile/beam/mindflayer - select_name = "MINDFUCK" - fire_sound = 'sound/weapons/Laser.ogg' - -/obj/item/ammo_casing/energy/flora - fire_sound = 'sound/effects/stealthoff.ogg' - -/obj/item/ammo_casing/energy/flora/yield - projectile_type = /obj/item/projectile/energy/florayield - select_name = "increase yield" - mod_name = "yield" - -/obj/item/ammo_casing/energy/flora/mut - projectile_type = /obj/item/projectile/energy/floramut - select_name = "induce mutations" - mod_name = "mut" - -/obj/item/ammo_casing/energy/temp - projectile_type = /obj/item/projectile/temp - select_name = "freeze" - e_cost = 250 - fire_sound = 'sound/weapons/pulse3.ogg' - -/obj/item/ammo_casing/energy/temp/hot - projectile_type = /obj/item/projectile/temp/hot - select_name = "bake" - -/obj/item/ammo_casing/energy/meteor - projectile_type = /obj/item/projectile/meteor - select_name = "goddamn meteor" - -/obj/item/ammo_casing/energy/kinetic - projectile_type = /obj/item/projectile/kinetic - select_name = "kinetic" - e_cost = 500 - fire_sound = 'sound/weapons/Gunshot4.ogg' - -/obj/item/ammo_casing/energy/disabler - projectile_type = /obj/item/projectile/energy/disabler - select_name = "disable" - e_cost = 50 +/obj/item/ammo_casing/energy + name = "energy weapon lens" + desc = "The part of the gun that makes the laser go pew" + caliber = "energy" + projectile_type = /obj/item/projectile/energy + var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot. + var/select_name = "energy" + var/mod_name = null + var/fire_sound = 'sound/weapons/Laser.ogg' + +/obj/item/ammo_casing/energy/laser + projectile_type = /obj/item/projectile/beam + select_name = "kill" + +/obj/item/ammo_casing/energy/laser/practice + projectile_type = /obj/item/projectile/practice + select_name = "practice" + +/obj/item/ammo_casing/energy/laser/scatter + projectile_type = /obj/item/projectile/beam/scatter + pellets = 5 + variance = 0.8 + select_name = "scatter" + +/obj/item/ammo_casing/energy/laser/heavy + projectile_type = /obj/item/projectile/beam/heavylaser + select_name = "anti-vehicle" + fire_sound = 'sound/weapons/lasercannonfire.ogg' + +/obj/item/ammo_casing/energy/laser/pulse + projectile_type = /obj/item/projectile/beam/pulse + e_cost = 200 + select_name = "DESTROY" + fire_sound = 'sound/weapons/pulse.ogg' + +/obj/item/ammo_casing/energy/laser/bluetag + projectile_type = /obj/item/projectile/lasertag/bluetag + select_name = "bluetag" + +/obj/item/ammo_casing/energy/laser/redtag + projectile_type = /obj/item/projectile/lasertag/redtag + select_name = "redtag" + +/obj/item/ammo_casing/energy/bolt + projectile_type = /obj/item/projectile/energy/bolt + select_name = "bolt" + fire_sound = 'sound/weapons/Genhit.ogg' + +/obj/item/ammo_casing/energy/bolt/large + projectile_type = /obj/item/projectile/energy/bolt/large + select_name = "heavy bolt" + +/obj/item/ammo_casing/energy/xray + projectile_type = /obj/item/projectile/beam/xray + e_cost = 50 + fire_sound = 'sound/weapons/laser3.ogg' + +/obj/item/ammo_casing/energy/electrode + projectile_type = /obj/item/projectile/energy/electrode + select_name = "stun" + fire_sound = 'sound/weapons/taser.ogg' + +/obj/item/ammo_casing/energy/electrode/gun + fire_sound = 'sound/weapons/gunshot.ogg' + +/obj/item/ammo_casing/energy/ion + projectile_type = /obj/item/projectile/ion + select_name = "ion" + fire_sound = 'sound/weapons/Laser.ogg' + +/obj/item/ammo_casing/energy/declone + projectile_type = /obj/item/projectile/energy/declone + select_name = "declone" + fire_sound = 'sound/weapons/pulse3.ogg' + +/obj/item/ammo_casing/energy/mindflayer + projectile_type = /obj/item/projectile/beam/mindflayer + select_name = "MINDFUCK" + fire_sound = 'sound/weapons/Laser.ogg' + +/obj/item/ammo_casing/energy/flora + fire_sound = 'sound/effects/stealthoff.ogg' + +/obj/item/ammo_casing/energy/flora/yield + projectile_type = /obj/item/projectile/energy/florayield + select_name = "increase yield" + mod_name = "yield" + +/obj/item/ammo_casing/energy/flora/mut + projectile_type = /obj/item/projectile/energy/floramut + select_name = "induce mutations" + mod_name = "mut" + +/obj/item/ammo_casing/energy/temp + projectile_type = /obj/item/projectile/temp + select_name = "freeze" + e_cost = 250 + fire_sound = 'sound/weapons/pulse3.ogg' + +/obj/item/ammo_casing/energy/temp/hot + projectile_type = /obj/item/projectile/temp/hot + select_name = "bake" + +/obj/item/ammo_casing/energy/meteor + projectile_type = /obj/item/projectile/meteor + select_name = "goddamn meteor" + +/obj/item/ammo_casing/energy/kinetic + projectile_type = /obj/item/projectile/kinetic + select_name = "kinetic" + e_cost = 500 + fire_sound = 'sound/weapons/Gunshot4.ogg' + +/obj/item/ammo_casing/energy/disabler + projectile_type = /obj/item/projectile/energy/disabler + select_name = "disable" + e_cost = 50 fire_sound = "sound/weapons/taser.ogg" \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 81b6af92124..1e44c1c7c73 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -1,161 +1,161 @@ -////////////////INTERNAL MAGAZINES////////////////////// -/obj/item/ammo_box/magazine/internal/cylinder - name = "revolver cylinder" - desc = "Oh god, this shouldn't be here" - ammo_type = /obj/item/ammo_casing/a357 - caliber = "357" - max_ammo = 7 - -/obj/item/ammo_box/magazine/internal/cylinder/ammo_count(var/countempties = 1) - if (!countempties) - var/boolets = 0 - for (var/i = 1, i <= stored_ammo.len, i++) - var/obj/item/ammo_casing/bullet = stored_ammo[i] - if (bullet.BB) - boolets++ - return boolets - else - return ..() - -/obj/item/ammo_box/magazine/internal/cylinder/rus357 - name = "russian revolver cylinder" - desc = "Oh god, this shouldn't be here" - ammo_type = /obj/item/ammo_casing/a357 - caliber = "357" - max_ammo = 6 - multiload = 0 - -/obj/item/ammo_box/magazine/internal/cylinder/rus357/New() - stored_ammo += new ammo_type(src) - -/obj/item/ammo_box/magazine/internal/cylinder/rev38 - name = "d-tiv revolver cylinder" - desc = "Oh god, this shouldn't be here" - ammo_type = /obj/item/ammo_casing/c38 - caliber = "38" - max_ammo = 6 - -/obj/item/ammo_box/magazine/internal/shot - name = "shotgun internal magazine" - desc = "Oh god, this shouldn't be here" - ammo_type = /obj/item/ammo_casing/shotgun/beanbag - caliber = "shotgun" - max_ammo = 4 - multiload = 0 - -/obj/item/ammo_box/magazine/internal/shotcom - name = "combat shotgun internal magazine" - desc = "Oh god, this shouldn't be here" - ammo_type = /obj/item/ammo_casing/shotgun/buckshot - caliber = "shotgun" - max_ammo = 8 - multiload = 0 - -/obj/item/ammo_box/magazine/internal/cylinder/dualshot - name = "double-barrel shotgun internal magazine" - desc = "This doesn't even exist" - ammo_type = /obj/item/ammo_casing/shotgun/beanbag - caliber = "shotgun" - max_ammo = 2 - multiload = 0 - -///////////EXTERNAL MAGAZINES//////////////// -/obj/item/ammo_box/magazine/m9mm - name = "magazine (9mm)" - icon_state = "9x19p" - origin_tech = "combat=2" - ammo_type = /obj/item/ammo_casing/c9mm - caliber = "9mm" - max_ammo = 8 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/msmg9mm - name = "SMG magazine (9mm)" - icon_state = "smg9mm" - ammo_type = /obj/item/ammo_casing/c9mm - caliber = "9mm" - max_ammo = 18 - -/obj/item/ammo_box/magazine/msmg9mm/update_icon() - ..() - icon_state = "[initial(icon_state)]-[round(ammo_count(),3)]" - -/obj/item/ammo_box/magazine/m10mm - name = "magazine (10mm)" - icon_state = "9x19p" - origin_tech = "combat=2" - ammo_type = /obj/item/ammo_casing/c10mm - caliber = "10mm" - max_ammo = 8 - multiple_sprites = 2 - -/obj/item/ammo_box/magazine/m12mm - name = "magazine (12mm)" - icon_state = "12mm" - origin_tech = "combat=2" - ammo_type = /obj/item/ammo_casing/a12mm - caliber = "12mm" - max_ammo = 20 - -/obj/item/ammo_box/magazine/m12mm/update_icon() - ..() - icon_state = "[initial(icon_state)]-[round(ammo_count(),2)]" - -/obj/item/ammo_box/magazine/sm45 - name = "magazine (.45)" - icon_state = "9x19p" - ammo_type = /obj/item/ammo_casing/c45 - caliber = ".45" - max_ammo = 12 - -/obj/item/ammo_box/magazine/sm45/update_icon() - ..() - icon_state = "[initial(icon_state)]-[ammo_count() ? "8" : "0"]" - -/obj/item/ammo_box/magazine/uzim45 - name = "Uzi magazine (.45)" - icon_state = "uzi45" - ammo_type = /obj/item/ammo_casing/c45 - caliber = ".45" - max_ammo = 16 - -/obj/item/ammo_box/magazine/uzim45/update_icon() - ..() - icon_state = "[initial(icon_state)]-[round(ammo_count(),2)]" - -obj/item/ammo_box/magazine/tommygunm45 - name = "tommy gun drum (.45)" - icon_state = "drum45" - ammo_type = /obj/item/ammo_casing/c45 - caliber = ".45" - max_ammo = 50 - -/obj/item/ammo_box/magazine/m50 - name = "magazine (.50ae)" - icon_state = "50ae" - origin_tech = "combat=2" - ammo_type = /obj/item/ammo_casing/a50 - caliber = ".50" - max_ammo = 7 - multiple_sprites = 1 - -/obj/item/ammo_box/magazine/m75 - name = "magazine (.75)" - icon_state = "75" - ammo_type = /obj/item/ammo_casing/caseless/a75 - caliber = "75" - multiple_sprites = 2 - max_ammo = 8 - -/obj/item/ammo_box/magazine/m762 - name = "magazine (7.62mm)" - icon_state = "a762" - origin_tech = "combat=2" - ammo_type = /obj/item/ammo_casing/a762 - caliber = "a762" - max_ammo = 50 - - -/obj/item/ammo_box/magazine/m762/update_icon() - ..() +////////////////INTERNAL MAGAZINES////////////////////// +/obj/item/ammo_box/magazine/internal/cylinder + name = "revolver cylinder" + desc = "Oh god, this shouldn't be here" + ammo_type = /obj/item/ammo_casing/a357 + caliber = "357" + max_ammo = 7 + +/obj/item/ammo_box/magazine/internal/cylinder/ammo_count(var/countempties = 1) + if (!countempties) + var/boolets = 0 + for (var/i = 1, i <= stored_ammo.len, i++) + var/obj/item/ammo_casing/bullet = stored_ammo[i] + if (bullet.BB) + boolets++ + return boolets + else + return ..() + +/obj/item/ammo_box/magazine/internal/cylinder/rus357 + name = "russian revolver cylinder" + desc = "Oh god, this shouldn't be here" + ammo_type = /obj/item/ammo_casing/a357 + caliber = "357" + max_ammo = 6 + multiload = 0 + +/obj/item/ammo_box/magazine/internal/cylinder/rus357/New() + stored_ammo += new ammo_type(src) + +/obj/item/ammo_box/magazine/internal/cylinder/rev38 + name = "d-tiv revolver cylinder" + desc = "Oh god, this shouldn't be here" + ammo_type = /obj/item/ammo_casing/c38 + caliber = "38" + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/shot + name = "shotgun internal magazine" + desc = "Oh god, this shouldn't be here" + ammo_type = /obj/item/ammo_casing/shotgun/beanbag + caliber = "shotgun" + max_ammo = 4 + multiload = 0 + +/obj/item/ammo_box/magazine/internal/shotcom + name = "combat shotgun internal magazine" + desc = "Oh god, this shouldn't be here" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + caliber = "shotgun" + max_ammo = 8 + multiload = 0 + +/obj/item/ammo_box/magazine/internal/cylinder/dualshot + name = "double-barrel shotgun internal magazine" + desc = "This doesn't even exist" + ammo_type = /obj/item/ammo_casing/shotgun/beanbag + caliber = "shotgun" + max_ammo = 2 + multiload = 0 + +///////////EXTERNAL MAGAZINES//////////////// +/obj/item/ammo_box/magazine/m9mm + name = "magazine (9mm)" + icon_state = "9x19p" + origin_tech = "combat=2" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + max_ammo = 8 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/msmg9mm + name = "SMG magazine (9mm)" + icon_state = "smg9mm" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + max_ammo = 18 + +/obj/item/ammo_box/magazine/msmg9mm/update_icon() + ..() + icon_state = "[initial(icon_state)]-[round(ammo_count(),3)]" + +/obj/item/ammo_box/magazine/m10mm + name = "magazine (10mm)" + icon_state = "9x19p" + origin_tech = "combat=2" + ammo_type = /obj/item/ammo_casing/c10mm + caliber = "10mm" + max_ammo = 8 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/m12mm + name = "magazine (12mm)" + icon_state = "12mm" + origin_tech = "combat=2" + ammo_type = /obj/item/ammo_casing/a12mm + caliber = "12mm" + max_ammo = 20 + +/obj/item/ammo_box/magazine/m12mm/update_icon() + ..() + icon_state = "[initial(icon_state)]-[round(ammo_count(),2)]" + +/obj/item/ammo_box/magazine/sm45 + name = "magazine (.45)" + icon_state = "9x19p" + ammo_type = /obj/item/ammo_casing/c45 + caliber = ".45" + max_ammo = 12 + +/obj/item/ammo_box/magazine/sm45/update_icon() + ..() + icon_state = "[initial(icon_state)]-[ammo_count() ? "8" : "0"]" + +/obj/item/ammo_box/magazine/uzim45 + name = "Uzi magazine (.45)" + icon_state = "uzi45" + ammo_type = /obj/item/ammo_casing/c45 + caliber = ".45" + max_ammo = 16 + +/obj/item/ammo_box/magazine/uzim45/update_icon() + ..() + icon_state = "[initial(icon_state)]-[round(ammo_count(),2)]" + +obj/item/ammo_box/magazine/tommygunm45 + name = "tommy gun drum (.45)" + icon_state = "drum45" + ammo_type = /obj/item/ammo_casing/c45 + caliber = ".45" + max_ammo = 50 + +/obj/item/ammo_box/magazine/m50 + name = "magazine (.50ae)" + icon_state = "50ae" + origin_tech = "combat=2" + ammo_type = /obj/item/ammo_casing/a50 + caliber = ".50" + max_ammo = 7 + multiple_sprites = 1 + +/obj/item/ammo_box/magazine/m75 + name = "magazine (.75)" + icon_state = "75" + ammo_type = /obj/item/ammo_casing/caseless/a75 + caliber = "75" + multiple_sprites = 2 + max_ammo = 8 + +/obj/item/ammo_box/magazine/m762 + name = "magazine (7.62mm)" + icon_state = "a762" + origin_tech = "combat=2" + ammo_type = /obj/item/ammo_casing/a762 + caliber = "a762" + max_ammo = 50 + + +/obj/item/ammo_box/magazine/m762/update_icon() + ..() icon_state = "[initial(icon_state)]-[round(ammo_count(),10)]" \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm index e530d7c2fca..fb68b624499 100644 --- a/code/modules/projectiles/ammunition/special.dm +++ b/code/modules/projectiles/ammunition/special.dm @@ -24,6 +24,13 @@ /obj/item/ammo_casing/magic/fireball projectile_type = /obj/item/projectile/magic/fireball +/obj/item/ammo_casing/magic/chaos + projectile_type = /obj/item/projectile/magic + +/obj/item/ammo_casing/magic/chaos/newshot() + projectile_type = pick(typesof(/obj/item/projectile/magic)) + ..() + /obj/item/ammo_casing/syringegun name = "syringe gun spring" desc = "A high-power spring that throws syringes." diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index c4e70ca153c..ed755495b46 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -1,61 +1,61 @@ -/obj/item/ammo_casing/proc/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, var/distro, var/quiet) - distro += variance - for (var/i = max(1, pellets), i > 0, i--) - var/curloc = user.loc - var/targloc = get_turf(target) - ready_proj(target, user, quiet) - if(distro) - targloc = spread(targloc, curloc, distro) - if(!throw_proj(targloc, user, params)) - return 0 - if(i > 1) - newshot() - user.next_move = world.time + 4 - update_icon() - return 1 - -/obj/item/ammo_casing/proc/ready_proj(atom/target as mob|obj|turf, mob/living/user, var/quiet) - if (!BB) - return - BB.original = target - BB.firer = user - BB.def_zone = user.zone_sel.selecting - BB.silenced = quiet - - if(reagents && BB.reagents) - reagents.trans_to(BB, reagents.total_volume) //For chemical darts/bullets - reagents.delete() - return - -/obj/item/ammo_casing/proc/throw_proj(var/turf/targloc, mob/living/user as mob|obj, params) - var/turf/curloc = user.loc - if (!istype(targloc) || !istype(curloc) || !BB) - return 0 - if(targloc == curloc) //Fire the projectile - user.bullet_act(BB) - del(BB) - return 1 - BB.loc = get_turf(user) - BB.starting = get_turf(user) - BB.current = curloc - BB.yo = targloc.y - curloc.y - BB.xo = targloc.x - curloc.x - - if(params) - var/list/mouse_control = params2list(params) - if(mouse_control["icon-x"]) - BB.p_x = text2num(mouse_control["icon-x"]) - if(mouse_control["icon-y"]) - BB.p_y = text2num(mouse_control["icon-y"]) - - if(BB) - BB.process() - BB = null - return 1 - -/obj/item/ammo_casing/proc/spread(var/turf/target, var/turf/current, var/distro) - var/dx = abs(target.x - current.x) - var/dy = abs(target.y - current.y) - return locate(target.x + round(gaussian(0, distro) * (dy+2)/8, 1), target.y + round(gaussian(0, distro) * (dx+2)/8, 1), target.z) - +/obj/item/ammo_casing/proc/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, var/distro, var/quiet) + distro += variance + for (var/i = max(1, pellets), i > 0, i--) + var/curloc = user.loc + var/targloc = get_turf(target) + ready_proj(target, user, quiet) + if(distro) + targloc = spread(targloc, curloc, distro) + if(!throw_proj(targloc, user, params)) + return 0 + if(i > 1) + newshot() + user.next_move = world.time + 4 + update_icon() + return 1 + +/obj/item/ammo_casing/proc/ready_proj(atom/target as mob|obj|turf, mob/living/user, var/quiet) + if (!BB) + return + BB.original = target + BB.firer = user + BB.def_zone = user.zone_sel.selecting + BB.silenced = quiet + + if(reagents && BB.reagents) + reagents.trans_to(BB, reagents.total_volume) //For chemical darts/bullets + reagents.delete() + return + +/obj/item/ammo_casing/proc/throw_proj(var/turf/targloc, mob/living/user as mob|obj, params) + var/turf/curloc = user.loc + if (!istype(targloc) || !istype(curloc) || !BB) + return 0 + if(targloc == curloc) //Fire the projectile + user.bullet_act(BB) + qdel(BB) + return 1 + BB.loc = get_turf(user) + BB.starting = get_turf(user) + BB.current = curloc + BB.yo = targloc.y - curloc.y + BB.xo = targloc.x - curloc.x + + if(params) + var/list/mouse_control = params2list(params) + if(mouse_control["icon-x"]) + BB.p_x = text2num(mouse_control["icon-x"]) + if(mouse_control["icon-y"]) + BB.p_y = text2num(mouse_control["icon-y"]) + + if(BB) + BB.process() + BB = null + return 1 + +/obj/item/ammo_casing/proc/spread(var/turf/target, var/turf/current, var/distro) + var/dx = abs(target.x - current.x) + var/dy = abs(target.y - current.y) + return locate(target.x + round(gaussian(0, distro) * (dy+2)/8, 1), target.y + round(gaussian(0, distro) * (dx+2)/8, 1), target.z) + // gaussian(0, distro) \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 284c49f2f91..b9afac39484 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1,99 +1,99 @@ -/obj/item/weapon/gun - name = "gun" - desc = "It's a gun. It's pretty terrible, though." - icon = 'icons/obj/gun.dmi' - icon_state = "detective" - item_state = "gun" - flags = CONDUCT - slot_flags = SLOT_BELT - m_amt = 2000 - w_class = 3.0 - throwforce = 5 - throw_speed = 3 - throw_range = 5 - force = 5.0 - origin_tech = "combat=1" - attack_verb = list("struck", "hit", "bashed") - - var/fire_sound = "gunshot" - var/silenced = 0 - var/recoil = 0 - var/clumsy_check = 1 - var/obj/item/ammo_casing/chambered = null - var/trigger_guard = 1 - - proc/process_chamber() - return 0 - - proc/special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver. - return 1 - - proc/shoot_with_empty_chamber(mob/living/user as mob|obj) - user << "*click*" - return - - proc/shoot_live_shot(mob/living/user as mob|obj) - if(recoil) - spawn() - shake_camera(user, recoil + 1, recoil) - - if(silenced) - playsound(user, fire_sound, 10, 1) - else - playsound(user, fire_sound, 50, 1) - user.visible_message("[user] fires [src]!", "You fire [src]!", "You hear a [istype(src, /obj/item/weapon/gun/energy) ? "laser blast" : "gunshot"]!") - - emp_act(severity) - for(var/obj/O in contents) - O.emp_act(severity) - - - afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params)//TODO: go over this - if(flag) //It's adjacent, is the user, or is on the user's person - return - - //Exclude lasertag guns from the CLUMSY check. - if(clumsy_check) - if(istype(user, /mob/living)) - var/mob/living/M = user - if ((CLUMSY in M.mutations) && prob(40)) - M << "You shoot yourself in the foot with \the [src]!" - afterattack(user, user) - M.drop_item() - return - - if (!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" - return - - if(trigger_guard) - if(istype(user, /mob/living)) - var/mob/living/M = user - if (HULK in M.mutations) - M << "Your meaty finger is much too large for the trigger guard!" - return - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna && H.dna.mutantrace == "adamantine") - user << "Your metal fingers don't fit in the trigger guard!" - return - - add_fingerprint(user) - - if(!special_check(user)) - return - if(chambered) - if(!chambered.fire(target, user, params, , silenced)) - shoot_with_empty_chamber(user) - else - shoot_live_shot(user) - else - shoot_with_empty_chamber(user) - process_chamber() - update_icon() - - if(user.hand) - user.update_inv_l_hand(0) - else - user.update_inv_r_hand(0) - +/obj/item/weapon/gun + name = "gun" + desc = "It's a gun. It's pretty terrible, though." + icon = 'icons/obj/gun.dmi' + icon_state = "detective" + item_state = "gun" + flags = CONDUCT + slot_flags = SLOT_BELT + m_amt = 2000 + w_class = 3.0 + throwforce = 5 + throw_speed = 3 + throw_range = 5 + force = 5.0 + origin_tech = "combat=1" + attack_verb = list("struck", "hit", "bashed") + + var/fire_sound = "gunshot" + var/silenced = 0 + var/recoil = 0 + var/clumsy_check = 1 + var/obj/item/ammo_casing/chambered = null + var/trigger_guard = 1 + + proc/process_chamber() + return 0 + + proc/special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver. + return 1 + + proc/shoot_with_empty_chamber(mob/living/user as mob|obj) + user << "*click*" + return + + proc/shoot_live_shot(mob/living/user as mob|obj) + if(recoil) + spawn() + shake_camera(user, recoil + 1, recoil) + + if(silenced) + playsound(user, fire_sound, 10, 1) + else + playsound(user, fire_sound, 50, 1) + user.visible_message("[user] fires [src]!", "You fire [src]!", "You hear a [istype(src, /obj/item/weapon/gun/energy) ? "laser blast" : "gunshot"]!") + + emp_act(severity) + for(var/obj/O in contents) + O.emp_act(severity) + + + afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params)//TODO: go over this + if(flag) //It's adjacent, is the user, or is on the user's person + return + + //Exclude lasertag guns from the CLUMSY check. + if(clumsy_check) + if(istype(user, /mob/living)) + var/mob/living/M = user + if ((CLUMSY in M.mutations) && prob(40)) + M << "You shoot yourself in the foot with \the [src]!" + afterattack(user, user) + M.drop_item() + return + + if (!user.IsAdvancedToolUser()) + user << "You don't have the dexterity to do this!" + return + + if(trigger_guard) + if(istype(user, /mob/living)) + var/mob/living/M = user + if (HULK in M.mutations) + M << "Your meaty finger is much too large for the trigger guard!" + return + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.dna && H.dna.mutantrace == "adamantine") + user << "Your metal fingers don't fit in the trigger guard!" + return + + add_fingerprint(user) + + if(!special_check(user)) + return + if(chambered) + if(!chambered.fire(target, user, params, , silenced)) + shoot_with_empty_chamber(user) + else + shoot_live_shot(user) + else + shoot_with_empty_chamber(user) + process_chamber() + update_icon() + + if(user.hand) + user.update_inv_l_hand(0) + else + user.update_inv_r_hand(0) + diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index cfb0e93b773..ff99769f629 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -34,7 +34,7 @@ obj/item/weapon/gun/energy/laser/retro processing_objects.Add(src) - Del() + Destroy() processing_objects.Remove(src) ..() @@ -110,7 +110,7 @@ obj/item/weapon/gun/energy/laser/retro processing_objects.Add(src) - Del() + Destroy() processing_objects.Remove(src) ..() @@ -147,7 +147,7 @@ obj/item/weapon/gun/energy/laser/retro processing_objects.Add(src) - Del() + Destroy() processing_objects.Remove(src) ..() diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 9bc774e8095..69b2ec82bbd 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -27,7 +27,7 @@ processing_objects.Add(src) - Del() + Destroy() processing_objects.Remove(src) ..() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index f97a0fd8e73..37ad30a4144 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -31,7 +31,7 @@ processing_objects.Add(src) - Del() + Destroy() processing_objects.Remove(src) ..() @@ -67,7 +67,7 @@ processing_objects.Add(src) - Del() + Destroy() processing_objects.Remove(src) ..() diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index f816fc591d4..c510c4294e3 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -21,7 +21,7 @@ processing_objects.Add(src) - Del() + Destroy() processing_objects.Remove(src) ..() @@ -71,7 +71,7 @@ processing_objects.Add(src) - Del() + Destroy() processing_objects.Remove(src) ..() diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index cfee0eb3e0c..570ae8e60f2 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -1,54 +1,54 @@ -/obj/item/weapon/gun/magic - name = "staff of nothing" - desc = "This staff is boring to watch because even though it came first you've seen everything it can do in other staves for years." - icon = 'icons/obj/gun.dmi' - icon_state = "staffofnothing" - item_state = "staff" - fire_sound = 'sound/weapons/emitter.ogg' - flags = CONDUCT - w_class = 5 - var/max_charges = 6 - var/charges = 0 - var/recharge_rate = 4 - var/charge_tick = 0 - var/can_charge = 1 - var/ammo_type - origin_tech = null - clumsy_check = 0 - trigger_guard = 0 - -/obj/item/weapon/gun/magic/afterattack(atom/target as mob, mob/living/user as mob, flag) - newshot() - ..() - -/obj/item/weapon/gun/magic/proc/newshot() - if (charges && chambered) - chambered.newshot() - charges-- - return - -/obj/item/weapon/gun/magic/New() - ..() - charges = max_charges - chambered = new ammo_type(src) - if(can_charge) processing_objects.Add(src) - - -/obj/item/weapon/gun/magic/Del() - if(can_charge) processing_objects.Remove(src) - ..() - - -/obj/item/weapon/gun/magic/process() - charge_tick++ - if(charge_tick < recharge_rate || charges >= max_charges) return 0 - charge_tick = 0 - charges++ - return 1 - -/obj/item/weapon/gun/magic/update_icon() - return - -/obj/item/weapon/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj) - user << "The [name] whizzles quietly." +/obj/item/weapon/gun/magic + name = "staff of nothing" + desc = "This staff is boring to watch because even though it came first you've seen everything it can do in other staves for years." + icon = 'icons/obj/gun.dmi' + icon_state = "staffofnothing" + item_state = "staff" + fire_sound = 'sound/weapons/emitter.ogg' + flags = CONDUCT + w_class = 5 + var/max_charges = 6 + var/charges = 0 + var/recharge_rate = 4 + var/charge_tick = 0 + var/can_charge = 1 + var/ammo_type + origin_tech = null + clumsy_check = 0 + trigger_guard = 0 + +/obj/item/weapon/gun/magic/afterattack(atom/target as mob, mob/living/user as mob, flag) + newshot() + ..() + +/obj/item/weapon/gun/magic/proc/newshot() + if (charges && chambered) + chambered.newshot() + charges-- + return + +/obj/item/weapon/gun/magic/New() + ..() + charges = max_charges + chambered = new ammo_type(src) + if(can_charge) processing_objects.Add(src) + + +/obj/item/weapon/gun/magic/Destroy() + if(can_charge) processing_objects.Remove(src) + ..() + + +/obj/item/weapon/gun/magic/process() + charge_tick++ + if(charge_tick < recharge_rate || charges >= max_charges) return 0 + charge_tick = 0 + charges++ + return 1 + +/obj/item/weapon/gun/magic/update_icon() + return + +/obj/item/weapon/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj) + user << "The [name] whizzles quietly." return \ No newline at end of file diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index a07ea02d7c9..9c6f0209e69 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -21,3 +21,22 @@ obj/item/weapon/gun/magic/staff/healing ammo_type = /obj/item/ammo_casing/magic/heal icon_state = "staffofhealing" item_state = "staffofhealing" + +obj/item/weapon/gun/magic/staff/chaos + name = "staff of chaos" + desc = "An artefact that spits bolts of chaotic magic that can potentially do anything." + ammo_type = /obj/item/ammo_casing/magic/chaos + icon_state = "staffofhealing" + item_state = "staffofhealing" + max_charges = 10 + recharge_rate = 2 + +obj/item/weapon/gun/magic/staff/door + name = "staff of door creation" + desc = "An artefact that spits bolts of transformative magic that can create doors in walls." + ammo_type = /obj/item/ammo_casing/magic/door + icon_state = "staffofhealing" + item_state = "staffofhealing" + max_charges = 10 + recharge_rate = 2 + diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index b25e68c4aa6..4efb2c10d62 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -1,124 +1,124 @@ -/obj/item/weapon/gun/magic/wand/ - name = "wand of nothing" - desc = "It's not just a stick, it's a MAGIC stick!" - ammo_type = /obj/item/ammo_casing/magic - icon_state = "nothingwand" - item_state = "wand" - w_class = 2 - can_charge = 0 - max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths) - var/variable_charges = 1 - -/obj/item/weapon/gun/magic/wand/New() - if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges - if(prob(33)) - max_charges = Ceiling(max_charges / 3) - else - max_charges = Ceiling(max_charges / 2) - ..() - -/obj/item/weapon/gun/magic/wand/examine() - ..() - usr << "Has [charges] charge\s remaining." - return - -/obj/item/weapon/gun/magic/wand/update_icon() - icon_state = "[initial(icon_state)][charges ? "" : "-drained"]" - -/obj/item/weapon/gun/magic/wand/attack(atom/target as mob, mob/living/user as mob) - if(target == user) - return - ..() - -/obj/item/weapon/gun/magic/wand/afterattack(atom/target as mob, mob/living/user as mob) - if(!charges) - shoot_with_empty_chamber(user) - return - if(target == user) - zap_self(user) - else - ..() - update_icon() - - -/obj/item/weapon/gun/magic/wand/proc/zap_self(mob/living/user as mob) - user.visible_message("[user] zaps \himself with [src]!") - playsound(user, fire_sound, 50, 1) - user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] zapped \himself with a [src]" - -/obj/item/weapon/gun/magic/wand/death - name = "wand of death" - desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail." - ammo_type = /obj/item/ammo_casing/magic/death - icon_state = "deathwand" - max_charges = 3 //3, 2, 2, 1 - -/obj/item/weapon/gun/magic/wand/death/zap_self(mob/living/user as mob) - var/message ="You irradiate yourself with pure energy! " - message += pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?") - user << message - user.adjustOxyLoss(500) - charges-- - ..() - -/obj/item/weapon/gun/magic/wand/resurrection - name = "wand of healing" - desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason." - ammo_type = /obj/item/ammo_casing/magic/heal - icon_state = "revivewand" - max_charges = 10 //10, 5, 5, 4 - -/obj/item/weapon/gun/magic/wand/resurrection/zap_self(mob/living/user as mob) - user.revive() - user << "You feel great!" - charges-- - ..() - -/obj/item/weapon/gun/magic/wand/polymorph - name = "wand of polymorph" - desc = "This wand is attuned to chaos and will radically alter the victim's form." - ammo_type = /obj/item/ammo_casing/magic/change - icon_state = "polywand" - max_charges = 10 //10, 5, 5, 4 - -/obj/item/weapon/gun/magic/wand/polymorph/zap_self(mob/living/user as mob) - ..() //because the user mob ceases to exists by the time wabbajack fully resolves - wabbajack(user) - charges-- - -/obj/item/weapon/gun/magic/wand/teleport - name = "wand of teleportation" - desc = "This wand will wrench targets through space and time to move them somewhere else." - ammo_type = /obj/item/ammo_casing/magic/teleport - icon_state = "telewand" - max_charges = 10 //10, 5, 5, 4 - -/obj/item/weapon/gun/magic/wand/teleport/zap_self(mob/living/user as mob) - do_teleport(user, user, 10) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() - smoke.set_up(10, 0, user.loc) - smoke.start() - charges-- - ..() - -/obj/item/weapon/gun/magic/wand/door - name = "wand of door creation" - desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics." - ammo_type = /obj/item/ammo_casing/magic/door - icon_state = "doorwand" - max_charges = 20 //20, 10, 10, 7 - -/obj/item/weapon/gun/magic/wand/door/zap_self() - return - -/obj/item/weapon/gun/magic/wand/fireball - name = "wand of fireball" - desc = "This wand shoots scorching balls of fire that explode into destructive flames." - ammo_type = /obj/item/ammo_casing/magic/fireball - icon_state = "firewand" - max_charges = 8 //8, 4, 4, 3 - -/obj/item/weapon/gun/magic/wand/fireball/zap_self(mob/living/user as mob) - explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) - charges-- +/obj/item/weapon/gun/magic/wand/ + name = "wand of nothing" + desc = "It's not just a stick, it's a MAGIC stick!" + ammo_type = /obj/item/ammo_casing/magic + icon_state = "nothingwand" + item_state = "wand" + w_class = 2 + can_charge = 0 + max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths) + var/variable_charges = 1 + +/obj/item/weapon/gun/magic/wand/New() + if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges + if(prob(33)) + max_charges = Ceiling(max_charges / 3) + else + max_charges = Ceiling(max_charges / 2) + ..() + +/obj/item/weapon/gun/magic/wand/examine() + ..() + usr << "Has [charges] charge\s remaining." + return + +/obj/item/weapon/gun/magic/wand/update_icon() + icon_state = "[initial(icon_state)][charges ? "" : "-drained"]" + +/obj/item/weapon/gun/magic/wand/attack(atom/target as mob, mob/living/user as mob) + if(target == user) + return + ..() + +/obj/item/weapon/gun/magic/wand/afterattack(atom/target as mob, mob/living/user as mob) + if(!charges) + shoot_with_empty_chamber(user) + return + if(target == user) + zap_self(user) + else + ..() + update_icon() + + +/obj/item/weapon/gun/magic/wand/proc/zap_self(mob/living/user as mob) + user.visible_message("[user] zaps \himself with [src]!") + playsound(user, fire_sound, 50, 1) + user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] zapped \himself with a [src]" + +/obj/item/weapon/gun/magic/wand/death + name = "wand of death" + desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail." + ammo_type = /obj/item/ammo_casing/magic/death + icon_state = "deathwand" + max_charges = 3 //3, 2, 2, 1 + +/obj/item/weapon/gun/magic/wand/death/zap_self(mob/living/user as mob) + var/message ="You irradiate yourself with pure energy! " + message += pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...
    ","Do you want your possessions identified?
    ") + user << message + user.adjustOxyLoss(500) + charges-- + ..() + +/obj/item/weapon/gun/magic/wand/resurrection + name = "wand of healing" + desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason." + ammo_type = /obj/item/ammo_casing/magic/heal + icon_state = "revivewand" + max_charges = 10 //10, 5, 5, 4 + +/obj/item/weapon/gun/magic/wand/resurrection/zap_self(mob/living/user as mob) + user.revive() + user << "You feel great!" + charges-- + ..() + +/obj/item/weapon/gun/magic/wand/polymorph + name = "wand of polymorph" + desc = "This wand is attuned to chaos and will radically alter the victim's form." + ammo_type = /obj/item/ammo_casing/magic/change + icon_state = "polywand" + max_charges = 10 //10, 5, 5, 4 + +/obj/item/weapon/gun/magic/wand/polymorph/zap_self(mob/living/user as mob) + ..() //because the user mob ceases to exists by the time wabbajack fully resolves + wabbajack(user) + charges-- + +/obj/item/weapon/gun/magic/wand/teleport + name = "wand of teleportation" + desc = "This wand will wrench targets through space and time to move them somewhere else." + ammo_type = /obj/item/ammo_casing/magic/teleport + icon_state = "telewand" + max_charges = 10 //10, 5, 5, 4 + +/obj/item/weapon/gun/magic/wand/teleport/zap_self(mob/living/user as mob) + do_teleport(user, user, 10) + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + smoke.set_up(10, 0, user.loc) + smoke.start() + charges-- + ..() + +/obj/item/weapon/gun/magic/wand/door + name = "wand of door creation" + desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics." + ammo_type = /obj/item/ammo_casing/magic/door + icon_state = "doorwand" + max_charges = 20 //20, 10, 10, 7 + +/obj/item/weapon/gun/magic/wand/door/zap_self() + return + +/obj/item/weapon/gun/magic/wand/fireball + name = "wand of fireball" + desc = "This wand shoots scorching balls of fire that explode into destructive flames." + ammo_type = /obj/item/ammo_casing/magic/fireball + icon_state = "firewand" + max_charges = 8 //8, 4, 4, 3 + +/obj/item/weapon/gun/magic/wand/fireball/zap_self(mob/living/user as mob) + explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) + charges-- ..() \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index a76b6e19cd9..eb8a702762a 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -63,7 +63,7 @@ M << "[src] blows up in your face!" M.take_organ_damage(0,20) M.drop_item() - del(src) + qdel(src) return 0 return 1 diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 21bc7bf5ce6..f5accf497e1 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -116,11 +116,11 @@ proc/wabbajack(mob/living/M) if(istype(M, /mob/living/silicon/robot)) var/mob/living/silicon/robot/Robot = M - if(Robot.mmi) del(Robot.mmi) + if(Robot.mmi) qdel(Robot.mmi) else for(var/obj/item/W in M) if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something - del(W) + qdel(W) continue W.layer = initial(W.layer) W.loc = M.loc @@ -166,12 +166,14 @@ proc/wabbajack(mob/living/M) new_mob.universal_speak = 1*/ if("animal") if(prob(50)) - var/beast = pick("carp","bear","mushroom","statue") + var/beast = pick("carp","bear","mushroom","statue", "bat", "goat") switch(beast) if("carp") new_mob = new /mob/living/simple_animal/hostile/carp(M.loc) if("bear") new_mob = new /mob/living/simple_animal/hostile/bear(M.loc) if("mushroom") new_mob = new /mob/living/simple_animal/hostile/mushroom(M.loc) if("statue") new_mob = new /mob/living/simple_animal/hostile/statue(M.loc) + if("bat") new_mob = new /mob/living/simple_animal/hostile/retaliate/bat(M.loc) + if("goat") new_mob = new /mob/living/simple_animal/hostile/retaliate/goat(M.loc) else var/animal = pick("parrot","corgi","crab","pug","cat","tomato","mouse","chicken","cow","lizard","chick") switch(animal) @@ -212,7 +214,7 @@ proc/wabbajack(mob/living/M) new_mob << "Your form morphs into that of a [randomize]." - del(M) + qdel(M) return new_mob /obj/item/projectile/magic/animate @@ -228,16 +230,17 @@ proc/wabbajack(mob/living/M) if(istype(change, /obj/item) || istype(change, /obj/structure) && !is_type_in_list(change, protected_objects)) if(istype(change, /obj/structure/closet/statue)) for(var/mob/living/carbon/human/H in change.contents) - var/mob/living/simple_animal/hostile/statue/S = new /mob/living/simple_animal/hostile/statue(change.loc) + var/mob/living/simple_animal/hostile/statue/S = new /mob/living/simple_animal/hostile/statue(change.loc, firer) S.name = "statue of [H.name]" S.faction = "\ref[firer]" S.icon = change.icon if(H.mind) H.mind.transfer_to(S) S << "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [firer.name], your creator." - del(H) - del(change) - del(src) + H = change + H.loc = S + qdel(src) + return else var/obj/O = change new /mob/living/simple_animal/hostile/mimic/copy(O.loc, O, firer) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index d1ce1991beb..c5ffc4bf95f 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -177,4 +177,4 @@ obj/item/projectile/kinetic/New() /obj/item/effect/kinetic_blast/New() spawn(4) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 3463dfa4bb5..c21f82abaf0 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -53,19 +53,19 @@ /obj/machinery/chem_dispenser/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return /obj/machinery/chem_dispenser/blob_act() if (prob(50)) - del(src) + qdel(src) /obj/machinery/chem_dispenser/meteorhit() - del(src) + qdel(src) return /** @@ -265,19 +265,19 @@ /obj/machinery/chem_master/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return /obj/machinery/chem_master/blob_act() if (prob(50)) - del(src) + qdel(src) /obj/machinery/chem_master/meteorhit() - del(src) + qdel(src) return /obj/machinery/chem_master/power_change() @@ -1097,7 +1097,7 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime) /obj/machinery/reagentgrinder/proc/remove_object(var/obj/item/O) holdingitems -= O - del(O) + qdel(O) /obj/machinery/reagentgrinder/proc/juice() power_change() diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 154474e3c85..796251956a3 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -226,7 +226,7 @@ datum lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) lowertemp.react() T.assume_air(lowertemp) - del(hotspot) + qdel(hotspot) return reaction_obj(var/obj/O, var/volume) src = null @@ -237,7 +237,7 @@ datum lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) lowertemp.react() T.assume_air(lowertemp) - del(hotspot) + qdel(hotspot) if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O if(!cube.wrapped) @@ -278,7 +278,7 @@ datum if(!istype(T)) return if(volume>=10) for(var/obj/effect/rune/R in T) - del R + qdel(R) T.Bless() lube @@ -761,7 +761,7 @@ datum reaction_obj(var/obj/O, var/volume) if(istype(O,/obj/effect/decal/cleanable)) - del(O) + qdel(O) else if(O) O.clean_blood() @@ -769,7 +769,7 @@ datum if(volume >= 1) T.clean_blood() for(var/obj/effect/decal/cleanable/C in T) - del(C) + qdel(C) for(var/mob/living/carbon/slime/M in T) M.adjustToxLoss(rand(5,10)) @@ -1451,9 +1451,9 @@ datum alien_weeds.health -= rand(15,35) // Kills alien weeds pretty fast alien_weeds.healthcheck() else if(istype(O,/obj/effect/glowshroom)) //even a small amount is enough to kill it - del(O) + qdel(O) else if(istype(O,/obj/effect/spacevine)) - if(prob(50)) del(O) //Kills kudzu too. + if(prob(50)) qdel(O) //Kills kudzu too. // Damage that is done to growing plants is separately at code/game/machinery/hydroponics at obj/item/hydroponics reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) @@ -1599,7 +1599,7 @@ datum if(H.head) if(prob(meltprob) && !H.head.unacidable) H << "Your headgear melts away but protects you from the acid!" - del(H.head) + qdel(H.head) H.update_inv_head(0) H.update_hair(0) else @@ -1609,7 +1609,7 @@ datum if(H.wear_mask) if(prob(meltprob) && !H.wear_mask.unacidable) H << "Your mask melts away but protects you from the acid!" - del (H.wear_mask) + qdel(H.wear_mask) H.update_inv_wear_mask(0) H.update_hair(0) else @@ -1619,7 +1619,7 @@ datum if(H.glasses) //Doesn't protect you from the acid but can melt anyways! if(prob(meltprob) && !H.glasses.unacidable) H << "Your glasses melts away!" - del (H.glasses) + qdel(H.glasses) H.update_inv_glasses(0) else if(ismonkey(M)) @@ -1627,7 +1627,7 @@ datum if(MK.wear_mask) if(!MK.wear_mask.unacidable) MK << "Your mask melts away but protects you from the acid!" - del (MK.wear_mask) + qdel(MK.wear_mask) MK.update_inv_wear_mask(0) else MK << "Your mask protects you from the acid." @@ -1659,7 +1659,7 @@ datum I.desc = "Looks like this was \an [O] some time ago." for(var/mob/M in viewers(5, O)) M << "\red \the [O] melts." - del(O) + qdel(O) toxin/acid/polyacid name = "Polytrinic acid" @@ -2073,7 +2073,7 @@ datum lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) lowertemp.react() T.assume_air(lowertemp) - del(hotspot) + qdel(hotspot) enzyme name = "Universal Enzyme" @@ -2830,6 +2830,12 @@ datum ..() return + ethanol/beer/greenbeer + name = "Green Beer" + id = "greenbeer" + description = "An alcoholic beverage made from malted grains, hops, yeast, and water. Dyed a festive green." + color = "#A8E61D" + ethanol/kahlua name = "Kahlua" id = "kahlua" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 6d51acf9f65..a14e88f1947 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -807,7 +807,7 @@ datum/chemical_reaction/pestkiller M.client.screen += blueeffect sleep(20) M.client.screen -= blueeffect - del(blueeffect) + qdel(blueeffect) /datum/chemical_reaction/slimecrit name = "Slime Crit" id = "m_tele" @@ -1802,6 +1802,13 @@ datum/chemical_reaction/pestkiller required_reagents = list ("beer" = 1, "ale" = 2) result_amount = 3 +/datum/chemical_reaction/greenbeer + name = "Green Beer" + id = "greenbeer" + result = "greenbeer" + required_reagents = list("greencrayonpowder" = 1, "beer" = 10) + result_amount = 10 + /datum/chemical_reaction/hooch name = "Hooch" id = "hooch" diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 643db71b524..89742ffce5a 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -41,7 +41,7 @@ Borg Hypospray processing_objects.Add(src) -/obj/item/weapon/reagent_containers/borghypo/Del() +/obj/item/weapon/reagent_containers/borghypo/Destroy() processing_objects.Remove(src) ..() diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index a85453571d8..48fc1e39ff6 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -1,219 +1,219 @@ - -///////////////////////////////////////////////Condiments -//Notes by Darem: The condiments food-subtype is for stuff you don't actually eat but you use to modify existing food. They all -// leave empty containers when used up and can be filled/re-filled with other items. Formatting for first section is identical -// to mixed-drinks code. If you want an object that starts pre-loaded, you need to make it in addition to the other code. - -//Food items that aren't eaten normally and leave an empty container behind. -/obj/item/weapon/reagent_containers/food/condiment - name = "Condiment Container" - desc = "Just your average condiment container." - icon = 'icons/obj/food.dmi' - icon_state = "emptycondiment" - flags = OPENCONTAINER - possible_transfer_amounts = list(1,5,10) - volume = 50 - //Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change() to change names, descs and sprites. - var/list/possible_states = list("ketchup" = list("ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "enzyme" = list("enzyme", "Universal Enzyme", "Used in cooking various dishes"), "soysauce" = list("soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("coldsauce", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("saltshaker", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("pepermillsmall", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("oliveoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("emptycondiment", "Sugar", "Tasty spacey sugar!")) - -/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/weapon/W as obj, mob/user as mob) - return - -/obj/item/weapon/reagent_containers/food/condiment/attack_self(mob/user as mob) - return - -/obj/item/weapon/reagent_containers/food/condiment/attack(mob/M as mob, mob/user as mob, def_zone) - var/datum/reagents/R = src.reagents - - if(!R || !R.total_volume) - user << "None of [src] left, oh no!" - return 0 - - if(M == user) - M << "You swallow some of contents of the [src]." - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - reagents.trans_to(M, 10) - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 - - else if( istype(M, /mob/living/carbon/human) ) - for(var/mob/O in viewers(world.view, user)) - O.show_message("[user] attempts to feed [M] [src].", 1) - if(!do_mob(user, M)) return - for(var/mob/O in viewers(world.view, user)) - O.show_message("[user] feeds [M] [src].", 1) - - add_logs(user, M, "fed", object="[reagentlist(src)]") - - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - reagents.trans_to(M, 10) - - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 - return 0 - -/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/I as obj, mob/user as mob) - return - -/obj/item/weapon/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity) - if(!proximity) return - if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. - - if(!target.reagents.total_volume) - user << "[target] is empty." - return - - if(reagents.total_volume >= reagents.maximum_volume) - user << "[src] is full." - return - - var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) - user << "You fill [src] with [trans] units of the contents of [target]." - - //Something like a glass or a food item. Player probably wants to transfer TO it. - else if(target.is_open_container() || istype(target, /obj/item/weapon/reagent_containers/food/snacks)) - if(!reagents.total_volume) - user << "[src] is empty." - return - if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "you can't add anymore to [target]." - return - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - user << "You transfer [trans] units of the condiment to [target]." - -/obj/item/weapon/reagent_containers/food/condiment/on_reagent_change() - if(icon_state == "saltshakersmall" || icon_state == "peppermillsmall") - return - if(reagents.reagent_list.len > 0) - var/main_reagent = reagents.get_master_reagent_id() - if(main_reagent in possible_states) - var/list/temp_list = possible_states[main_reagent] - icon_state = temp_list[1] - name = temp_list[2] - desc = temp_list[3] - - else - name = "misc Condiment Bottle" - main_reagent = reagents.get_master_reagent_name() - if (reagents.reagent_list.len==1) - desc = "Looks like it is [lowertext(main_reagent)], but you are not sure." - else - desc = "A mixture of various condiments. [lowertext(main_reagent)] is one of them." - icon_state = "mixedcondiments" - else - icon_state = "emptycondiment" - name = "condiment Bottle" - desc = "An empty condiment bottle." - return - -/obj/item/weapon/reagent_containers/food/condiment/enzyme - name = "Universal Enzyme" - desc = "Used in cooking various dishes." - icon_state = "enzyme" - - New() - ..() - reagents.add_reagent("enzyme", 50) - -/obj/item/weapon/reagent_containers/food/condiment/sugar - - New() - ..() - reagents.add_reagent("sugar", 50) - -/obj/item/weapon/reagent_containers/food/condiment/saltshaker //Seperate from above since it's a small shaker rather then - name = "Salt Shaker" // a large one. - desc = "Salt. From space oceans, presumably." - icon_state = "saltshakersmall" - possible_transfer_amounts = list(1,20) //for clown turning the lid off - amount_per_transfer_from_this = 1 - volume = 20 - - New() - ..() - reagents.add_reagent("sodiumchloride", 20) - -/obj/item/weapon/reagent_containers/food/condiment/peppermill - name = "Pepper Mill" - desc = "Often used to flavor food or make people sneeze." - icon_state = "peppermillsmall" - possible_transfer_amounts = list(1,20) //for clown turning the lid off - amount_per_transfer_from_this = 1 - volume = 20 - - New() - ..() - reagents.add_reagent("blackpepper", 20) - -//Food packs. To easily apply deadly toxi... delicious sauces to your food! -/obj/item/weapon/reagent_containers/food/condiment/pack - name = "condiment pack" - desc = "A small plastic pack with condiments to put on your food" - icon_state = "condi_empty" - volume = 10 - amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(10) - possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!")) - var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters. - -/obj/item/weapon/reagent_containers/food/condiment/pack/New() - ..() - pixel_x = rand(-7, 7) - pixel_y = rand(-7, 7) - -/obj/item/weapon/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly. - return - -/obj/item/weapon/reagent_containers/food/condiment/pack/afterattack(obj/target, mob/user , proximity) - if(!proximity) return - - //You can tear the bag open above food to put the condiments on it, obviously. - if(istype(target, /obj/item/weapon/reagent_containers/food/snacks)) - if(!reagents.total_volume) - user << "You tear open [src], but there's nothing in it." - del src - return - if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "You tear open [src], but [target] is stacked so high that it just drips off!" //Not sure if food can ever be full, but better safe than sorry. - del src - return - else - user << "You tear open [src] above [target] and the condiments drip onto it." - src.reagents.trans_to(target, amount_per_transfer_from_this) - del src - -/obj/item/weapon/reagent_containers/food/condiment/pack/on_reagent_change() - if(reagents.reagent_list.len > 0) - var/main_reagent = reagents.get_master_reagent_id() - if(main_reagent in possible_states) - var/list/temp_list = possible_states[main_reagent] - icon_state = temp_list[1] - desc = temp_list[3] - else - icon_state = "condi_mixed" - desc = "A small condiment pack. The label says it contains [originalname]" - else - icon_state = "condi_empty" - desc = "A small condiment pack. It is empty." - -//Ketchup -/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup - name = "ketchup pack" - originalname = "ketchup" - -/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup/New() - ..() - reagents.add_reagent("ketchup", 10) - -//Hot sauce -/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce - name = "hotsauce pack" - originalname = "hotsauce" - -/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce/New() - ..() - reagents.add_reagent("capsaicin", 10) + +///////////////////////////////////////////////Condiments +//Notes by Darem: The condiments food-subtype is for stuff you don't actually eat but you use to modify existing food. They all +// leave empty containers when used up and can be filled/re-filled with other items. Formatting for first section is identical +// to mixed-drinks code. If you want an object that starts pre-loaded, you need to make it in addition to the other code. + +//Food items that aren't eaten normally and leave an empty container behind. +/obj/item/weapon/reagent_containers/food/condiment + name = "Condiment Container" + desc = "Just your average condiment container." + icon = 'icons/obj/food.dmi' + icon_state = "emptycondiment" + flags = OPENCONTAINER + possible_transfer_amounts = list(1,5,10) + volume = 50 + //Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change() to change names, descs and sprites. + var/list/possible_states = list("ketchup" = list("ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "enzyme" = list("enzyme", "Universal Enzyme", "Used in cooking various dishes"), "soysauce" = list("soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("coldsauce", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("saltshaker", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("pepermillsmall", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("oliveoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("emptycondiment", "Sugar", "Tasty spacey sugar!")) + +/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/weapon/W as obj, mob/user as mob) + return + +/obj/item/weapon/reagent_containers/food/condiment/attack_self(mob/user as mob) + return + +/obj/item/weapon/reagent_containers/food/condiment/attack(mob/M as mob, mob/user as mob, def_zone) + var/datum/reagents/R = src.reagents + + if(!R || !R.total_volume) + user << "None of [src] left, oh no!" + return 0 + + if(M == user) + M << "You swallow some of contents of the [src]." + if(reagents.total_volume) + reagents.reaction(M, INGEST) + spawn(5) + reagents.trans_to(M, 10) + playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) + return 1 + + else if( istype(M, /mob/living/carbon/human) ) + for(var/mob/O in viewers(world.view, user)) + O.show_message("[user] attempts to feed [M] [src].", 1) + if(!do_mob(user, M)) return + for(var/mob/O in viewers(world.view, user)) + O.show_message("[user] feeds [M] [src].", 1) + + add_logs(user, M, "fed", object="[reagentlist(src)]") + + if(reagents.total_volume) + reagents.reaction(M, INGEST) + spawn(5) + reagents.trans_to(M, 10) + + playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) + return 1 + return 0 + +/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/I as obj, mob/user as mob) + return + +/obj/item/weapon/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity) + if(!proximity) return + if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. + + if(!target.reagents.total_volume) + user << "[target] is empty." + return + + if(reagents.total_volume >= reagents.maximum_volume) + user << "[src] is full." + return + + var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) + user << "You fill [src] with [trans] units of the contents of [target]." + + //Something like a glass or a food item. Player probably wants to transfer TO it. + else if(target.is_open_container() || istype(target, /obj/item/weapon/reagent_containers/food/snacks)) + if(!reagents.total_volume) + user << "[src] is empty." + return + if(target.reagents.total_volume >= target.reagents.maximum_volume) + user << "you can't add anymore to [target]." + return + var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) + user << "You transfer [trans] units of the condiment to [target]." + +/obj/item/weapon/reagent_containers/food/condiment/on_reagent_change() + if(icon_state == "saltshakersmall" || icon_state == "peppermillsmall") + return + if(reagents.reagent_list.len > 0) + var/main_reagent = reagents.get_master_reagent_id() + if(main_reagent in possible_states) + var/list/temp_list = possible_states[main_reagent] + icon_state = temp_list[1] + name = temp_list[2] + desc = temp_list[3] + + else + name = "misc Condiment Bottle" + main_reagent = reagents.get_master_reagent_name() + if (reagents.reagent_list.len==1) + desc = "Looks like it is [lowertext(main_reagent)], but you are not sure." + else + desc = "A mixture of various condiments. [lowertext(main_reagent)] is one of them." + icon_state = "mixedcondiments" + else + icon_state = "emptycondiment" + name = "condiment Bottle" + desc = "An empty condiment bottle." + return + +/obj/item/weapon/reagent_containers/food/condiment/enzyme + name = "Universal Enzyme" + desc = "Used in cooking various dishes." + icon_state = "enzyme" + + New() + ..() + reagents.add_reagent("enzyme", 50) + +/obj/item/weapon/reagent_containers/food/condiment/sugar + + New() + ..() + reagents.add_reagent("sugar", 50) + +/obj/item/weapon/reagent_containers/food/condiment/saltshaker //Seperate from above since it's a small shaker rather then + name = "Salt Shaker" // a large one. + desc = "Salt. From space oceans, presumably." + icon_state = "saltshakersmall" + possible_transfer_amounts = list(1,20) //for clown turning the lid off + amount_per_transfer_from_this = 1 + volume = 20 + + New() + ..() + reagents.add_reagent("sodiumchloride", 20) + +/obj/item/weapon/reagent_containers/food/condiment/peppermill + name = "Pepper Mill" + desc = "Often used to flavor food or make people sneeze." + icon_state = "peppermillsmall" + possible_transfer_amounts = list(1,20) //for clown turning the lid off + amount_per_transfer_from_this = 1 + volume = 20 + + New() + ..() + reagents.add_reagent("blackpepper", 20) + +//Food packs. To easily apply deadly toxi... delicious sauces to your food! +/obj/item/weapon/reagent_containers/food/condiment/pack + name = "condiment pack" + desc = "A small plastic pack with condiments to put on your food" + icon_state = "condi_empty" + volume = 10 + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list(10) + possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!")) + var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters. + +/obj/item/weapon/reagent_containers/food/condiment/pack/New() + ..() + pixel_x = rand(-7, 7) + pixel_y = rand(-7, 7) + +/obj/item/weapon/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly. + return + +/obj/item/weapon/reagent_containers/food/condiment/pack/afterattack(obj/target, mob/user , proximity) + if(!proximity) return + + //You can tear the bag open above food to put the condiments on it, obviously. + if(istype(target, /obj/item/weapon/reagent_containers/food/snacks)) + if(!reagents.total_volume) + user << "You tear open [src], but there's nothing in it." + qdel(src) + return + if(target.reagents.total_volume >= target.reagents.maximum_volume) + user << "You tear open [src], but [target] is stacked so high that it just drips off!" //Not sure if food can ever be full, but better safe than sorry. + qdel(src) + return + else + user << "You tear open [src] above [target] and the condiments drip onto it." + src.reagents.trans_to(target, amount_per_transfer_from_this) + qdel(src) + +/obj/item/weapon/reagent_containers/food/condiment/pack/on_reagent_change() + if(reagents.reagent_list.len > 0) + var/main_reagent = reagents.get_master_reagent_id() + if(main_reagent in possible_states) + var/list/temp_list = possible_states[main_reagent] + icon_state = temp_list[1] + desc = temp_list[3] + else + icon_state = "condi_mixed" + desc = "A small condiment pack. The label says it contains [originalname]" + else + icon_state = "condi_empty" + desc = "A small condiment pack. It is empty." + +//Ketchup +/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup + name = "ketchup pack" + originalname = "ketchup" + +/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup/New() + ..() + reagents.add_reagent("ketchup", 10) + +//Hot sauce +/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce + name = "hotsauce pack" + originalname = "hotsauce" + +/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce/New() + ..() + reagents.add_reagent("capsaicin", 10) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index aa65a77fc81..84836d8a96d 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -295,7 +295,7 @@ playsound(user.loc,'sound/weapons/pierce.ogg', rand(10,50), 1) var/obj/item/trash/can/crushed_can = new /obj/item/trash/can(user.loc) crushed_can.icon_state = icon_state - del(src) + qdel(src) ..() /obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 3879daa66b7..e2fa2916623 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -30,7 +30,7 @@ user.put_in_active_hand(B) src.transfer_fingerprints_to(B) - del(src) + qdel(src) /obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target as mob, mob/living/user as mob) diff --git a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm index 0a3acf04f16..6351d497b16 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm @@ -8,15 +8,7 @@ volume = 50 on_reagent_change() - /*if(reagents.reagent_list.len > 1 ) - icon_state = "glass_brown" - name = "Glass of Hooch" - desc = "Two or more drinks, mixed together."*/ - /*else if(reagents.reagent_list.len == 1) - for(var/datum/reagent/R in reagents.reagent_list) - switch(R.id)*/ if (reagents.reagent_list.len > 0) - //mrid = R.get_master_reagent_id() switch(reagents.get_master_reagent_id()) if("beer") icon_state = "beerglass" @@ -26,6 +18,10 @@ icon_state = "beerglass" name = "Beer glass" desc = "A freezing pint of beer" + if("greenbeer") + icon_state = "greenbeerglass" + name = "Green beer glass" + desc = "A freezing pint of green beer. Festive." if("ale") icon_state = "aleglass" name = "Ale glass" @@ -38,14 +34,26 @@ icon_state = "glass_white" name = "Glass of cream" desc = "Ewwww..." - if("chocolate") + if("hot_coco") icon_state = "chocolateglass" name = "Glass of chocolate" desc = "Tasty" - if("lemon") + if("lemonjuice") icon_state = "lemonglass" name = "Glass of lemon" desc = "Sour..." + if("holywater") + icon_state = "glass_clear" + name = "Glass of Holy Water" + desc = "A glass of holy water." + if("potato") + icon_state = "glass_brown" + name = "Glass of Potato juice" + desc = "Bleh..." + if("watermelonjuice") + icon_state = "glass_red" + name = "Glass of Watermelon juice" + desc = "A glass of watermelon juice." if("cola") icon_state = "glass_brown" name = "Glass of Space Cola" diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 75ce2979889..b32a18371b6 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -29,7 +29,7 @@ usr.put_in_hands(TrashItem) else if(istype(trash,/obj/item)) usr.put_in_hands(trash) - del(src) + qdel(src) return @@ -43,7 +43,7 @@ if(!reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it. user << "None of [src] left, oh no!" M.unEquip(src) //so icons update :[ - del(src) + qdel(src) return 0 if(istype(M, /mob/living/carbon)) if(M == user) //If you're eating it yourself. @@ -179,10 +179,10 @@ for(var/i=1 to (slices_num-slices_lost)) var/obj/slice = new slice_path (src.loc) reagents.trans_to(slice,reagents_per_slice) - del(src) // so long and thanks for all the fish + qdel(src) // so long and thanks for all the fish -/obj/item/weapon/reagent_containers/food/snacks/Del() +/obj/item/weapon/reagent_containers/food/snacks/Destroy() if(contents) for(var/atom/movable/something in contents) something.loc = get_turf(src) @@ -199,7 +199,7 @@ var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where the [src] was") if(sattisfaction_text) M.emote("[sattisfaction_text]") - del(src) + qdel(src) ////////////////////////////////////////////////// @@ -292,9 +292,9 @@ bitesize = 2 New() ..() - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("sugar", 5) - reagents.add_reagent("coco", 5) + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sugar", 2) + reagents.add_reagent("coco", 2) attack_self(mob/user) if(wrapped) @@ -320,7 +320,7 @@ icon_state = "chocolateegg" New() ..() - reagents.add_reagent("nutriment", 3) + reagents.add_reagent("nutriment", 4) reagents.add_reagent("sugar", 2) reagents.add_reagent("coco", 2) bitesize = 2 @@ -434,7 +434,7 @@ ..() new/obj/effect/decal/cleanable/egg_smudge(src.loc) reagents.reaction(hit_atom, TOUCH) - del(src) + qdel(src) attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype( W, /obj/item/toy/crayon )) @@ -515,7 +515,7 @@ /obj/item/weapon/reagent_containers/food/snacks/carpmeat name = "carp fillet" - desc = "A fillet of spess carp meat" + desc = "A fillet of spess carp meat." icon_state = "fishfillet" New() ..() @@ -545,16 +545,16 @@ New() ..() reagents.add_reagent("nutriment", 3) - src.bitesize = 6 + src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tomatomeat name = "tomato slice" - desc = "A slice from a huge tomato" + desc = "A slice from a huge tomato." icon_state = "tomatomeat" New() ..() reagents.add_reagent("nutriment", 3) - src.bitesize = 6 + src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/bearmeat name = "bear meat" @@ -573,7 +573,7 @@ New() ..() reagents.add_reagent("nutriment", 3) - src.bitesize = 6 + src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/spidermeat name = "spider meat" @@ -595,6 +595,16 @@ reagents.add_reagent("toxin", 2) bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/cornedbeef + name = "corned beef and cabbage" + desc = "Now you can feel like a real tourist vacationing in Ireland." + icon_state = "cornedbeef" + trash = /obj/item/trash/plate + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 3 + /obj/item/weapon/reagent_containers/food/snacks/faggot name = "faggot" desc = "A great meal all round. Not a cord of wood." @@ -642,7 +652,7 @@ /obj/item/weapon/reagent_containers/food/snacks/burger/ghost name = "ghost burger" desc = "Too Spooky!" - icon_state = "ghostburger" + alpha = 125 /obj/item/weapon/reagent_containers/food/snacks/burger name = "burger" @@ -737,7 +747,7 @@ ) reagents.remove_reagent("nutriment", 1) if(reagents.total_volume <= 0) - del(src) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/muffin name = "muffin" @@ -755,7 +765,8 @@ /obj/item/weapon/reagent_containers/food/snacks/muffin/booberry name = "booberry muffin" - icon_state = "booberrymuffin" + icon_state = "berrymuffin" + alpha = 125 desc = "My stomach is a graveyard! No living being can quench my bloodthirst!" /obj/item/weapon/reagent_containers/food/snacks/pie @@ -772,7 +783,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pie/throw_impact(atom/hit_atom) ..() new/obj/effect/decal/cleanable/pie_smudge(src.loc) - del(src) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/berryclafoutis name = "berry clafoutis" @@ -787,7 +798,7 @@ /obj/item/weapon/reagent_containers/food/snacks/waffles name = "waffles" - desc = "Mmm, waffles" + desc = "Mmm, waffles." icon_state = "waffles" trash = /obj/item/trash/waffles New() @@ -1016,7 +1027,7 @@ /obj/item/weapon/reagent_containers/food/snacks/fries name = "space fries" - desc = "AKA: French Fries, Freedom Fries, etc" + desc = "AKA: French Fries, Freedom Fries, etc." icon_state = "fries" trash = /obj/item/trash/plate New() @@ -1087,7 +1098,7 @@ /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff name = "spacy liberty duff" - desc = "Jello gelatin, from Alfred Hubbard's cookbook" + desc = "Jello gelatin, from Alfred Hubbard's cookbook." icon_state = "spacylibertyduff" trash = /obj/item/trash/snack_bowl New() @@ -1098,7 +1109,7 @@ /obj/item/weapon/reagent_containers/food/snacks/amanitajelly name = "amanita jelly" - desc = "Looks curiously toxic" + desc = "Looks curiously toxic." icon_state = "amanitajelly" trash = /obj/item/trash/snack_bowl New() @@ -1143,7 +1154,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bloodsoup name = "tomato soup" - desc = "Smells like copper" + desc = "Smells like copper." icon_state = "tomatosoup" New() ..() @@ -1167,7 +1178,7 @@ /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup name = "vegetable soup" - desc = "A true vegan meal" + desc = "A true vegan meal." icon_state = "vegetablesoup" trash = /obj/item/trash/snack_bowl New() @@ -1320,7 +1331,7 @@ proc/Expand() visible_message("[src] expands!") new /mob/living/carbon/monkey(get_turf(src)) - del(src) + qdel(src) proc/Unwrap(mob/user) icon_state = "monkeycube" @@ -1563,7 +1574,7 @@ /obj/item/weapon/reagent_containers/food/snacks/spesslaw name = "spesslaw" - desc = "A lawyers favourite" + desc = "A lawyers favourite." icon_state = "spesslaw" New() ..() @@ -1830,7 +1841,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread name = "Tofubread" - icon_state = "Like meatbread but for vegetarians. Not guaranteed to give superpowers." + desc = "Like meatbread but for vegetarians. Not guaranteed to give superpowers." icon_state = "tofubread" slice_path = /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice slices_num = 5 @@ -1898,7 +1909,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice name = "cheese cake slice" - desc = "Slice of pure cheestisfaction" + desc = "Slice of pure cheestisfaction." icon_state = "cheesecake_slice" trash = /obj/item/trash/plate bitesize = 2 @@ -1973,7 +1984,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake name = "chocolate cake" - desc = "A cake with added chocolate" + desc = "A cake with added chocolate." icon_state = "chocolatecake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice slices_num = 5 @@ -2026,7 +2037,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/bread name = "bread" - icon_state = "Some plain old Earthen bread." + desc = "Some plain old Earthen bread." icon_state = "bread" slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice slices_num = 5 @@ -2071,7 +2082,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake name = "apple cake" - desc = "A cake centred with Apple" + desc = "A cake centred with Apple." icon_state = "applecake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/applecakeslice slices_num = 5 @@ -2112,7 +2123,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita name = "margherita" - desc = "The most cheezy pizza in galaxy" + desc = "The most cheezy pizza in galaxy." icon_state = "pizzamargherita" slice_path = /obj/item/weapon/reagent_containers/food/snacks/margheritaslice slices_num = 6 @@ -2124,13 +2135,13 @@ /obj/item/weapon/reagent_containers/food/snacks/margheritaslice name = "margherita slice" - desc = "A slice of the most cheezy pizza in galaxy" + desc = "A slice of the most cheezy pizza in galaxy." icon_state = "pizzamargheritaslice" bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza name = "meatpizza" - desc = "" //TODO: + desc = "Greasy pizza with delicious meat." icon_state = "meatpizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice slices_num = 6 @@ -2142,13 +2153,13 @@ /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice name = "meatpizza slice" - desc = "A slice of " //TODO: + desc = "A nutritious slice of meatpizza." icon_state = "meatpizzaslice" bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza name = "mushroom pizza" - desc = "Very special pizza" + desc = "Very special pizza." icon_state = "mushroompizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice slices_num = 6 @@ -2165,7 +2176,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza name = "vegetable pizza" - desc = "No one of Tomatos Sapiens were harmed during making this pizza" + desc = "No one of Tomatos Sapiens were harmed during making this pizza." icon_state = "vegetablepizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice slices_num = 6 @@ -2178,7 +2189,7 @@ /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice name = "vegetable pizza slice" - desc = "A slice of the most green pizza of all pizzas not containing green ingredients " + desc = "A slice of the most green pizza of all pizzas not containing green ingredients." icon_state = "vegetablepizzaslice" bitesize = 2 @@ -2374,7 +2385,7 @@ icon_state = "benedict" New() ..() - reagents.add_reagent("nutriment", 3) + reagents.add_reagent("nutriment", 6) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/hotdog @@ -2383,7 +2394,7 @@ icon_state = "hotdog" New() ..() - reagents.add_reagent("nutriment", 3) + reagents.add_reagent("nutriment", 6) reagents.add_reagent("ketchup", 3) bitesize = 3 @@ -2410,6 +2421,7 @@ name = "not-a-sandwich" desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache." icon_state = "notasandwich" + trash = /obj/item/trash/plate New() ..() reagents.add_reagent("nutriment", 6) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 28c9faea16d..65e59d2dca1 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -203,10 +203,10 @@ attackby(var/obj/D, mob/user as mob) if(isprox(D)) user << "You add [D] to [src]." - del(D) + qdel(D) user.put_in_hands(new /obj/item/weapon/bucket_sensor) user.unEquip(src) - del(src) + qdel(src) /* /obj/item/weapon/reagent_containers/glass/blender_jug diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 96deeb0e5cb..5aae7951a6d 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -26,9 +26,9 @@ reagents.reaction(M, INGEST) spawn(5) reagents.trans_to(M, reagents.total_volume) - del(src) + qdel(src) else - del(src) + qdel(src) return 1 else if(istype(M, /mob/living/carbon/human) ) @@ -47,9 +47,9 @@ reagents.reaction(M, INGEST) spawn(5) reagents.trans_to(M, reagents.total_volume) - del(src) + qdel(src) else - del(src) + qdel(src) return 1 @@ -66,7 +66,7 @@ O << "[user] slips something into [target]." reagents.trans_to(target, reagents.total_volume) spawn(5) - del(src) + qdel(src) //////////////////////////////////////////////////////////////////////////////// @@ -163,4 +163,4 @@ ..() reagents.add_reagent("hyperzine", 10) reagents.add_reagent("ethylredoxrazine", 10) - reagents.add_reagent("coffee", 30) + reagents.add_reagent("coffee", 30) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 0792b064641..a1de1580f42 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -57,7 +57,7 @@ for(var/atom/T in get_turf(D)) D.reagents.reaction(T) sleep(3) - del(D) + qdel(D) playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) @@ -211,7 +211,7 @@ for(var/atom/t in get_turf(D)) D.reagents.reaction(t) sleep(2) - del(D) + qdel(D) playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index c8d94e4365c..16e51d6ccd5 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -1,274 +1,274 @@ -//////////////////////////////////////////////////////////////////////////////// -/// Syringes. -//////////////////////////////////////////////////////////////////////////////// -#define SYRINGE_DRAW 0 -#define SYRINGE_INJECT 1 - -/obj/item/weapon/reagent_containers/syringe - name = "syringe" - desc = "A syringe that can hold up to 15 units." - icon = 'icons/obj/syringe.dmi' - item_state = "syringe_0" - icon_state = "0" - amount_per_transfer_from_this = 5 - possible_transfer_amounts = null //list(5, 10, 15) - volume = 15 - var/mode = SYRINGE_DRAW - g_amt = 20 - m_amt = 10 - - on_reagent_change() - update_icon() - - pickup(mob/user) - ..() - update_icon() - - dropped(mob/user) - ..() - update_icon() - - attack_self(mob/user) - mode = !mode - update_icon() - - attack_hand() - ..() - update_icon() - - attack_paw() - return attack_hand() - - attackby(obj/item/I, mob/user) - return - - afterattack(obj/target, mob/user , proximity) - if(!proximity) return - if(!target.reagents) return - - if(isliving(target)) - var/mob/living/M = target - if(!M.can_inject(user, 1)) - return - - switch(mode) - if(SYRINGE_DRAW) - - if(reagents.total_volume >= reagents.maximum_volume) - user << "The syringe is full." - return - - if(ismob(target)) //Blood! - if(reagents.has_reagent("blood")) - user << "There is already a blood sample in this syringe." - return - if(istype(target, /mob/living/carbon)) //maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea. - var/amount = src.reagents.maximum_volume - src.reagents.total_volume - var/mob/living/carbon/T = target - var/datum/reagent/B = new /datum/reagent/blood - if(!check_dna_integrity(T)) - user << "You are unable to locate any blood." - return - if(NOCLONE in T.mutations) //target done been et, no more blood in him - user << "You are unable to locate any blood." - return - B.holder = src - B.volume = amount - //set reagent data - B.data["donor"] = T - - /* - if(T.virus && T.virus.spread_type != SPECIAL) - B.data["virus"] = new T.virus.type(0) - */ - - for(var/datum/disease/D in T.viruses) - if(!B.data["viruses"]) - B.data["viruses"] = list() - - B.data["viruses"] += new D.type(0, D, 1) - - B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0) - if(T.resistances&&T.resistances.len) - B.data["resistances"] = T.resistances.Copy() - if(istype(target, /mob/living/carbon/human))//I wish there was some hasproperty operation... - var/mob/living/carbon/human/HT = target - B.data["blood_type"] = copytext(HT.dna.blood_type,1,0) - var/list/temp_chem = list() - for(var/datum/reagent/R in target.reagents.reagent_list) - temp_chem += R.name - temp_chem[R.name] = R.volume - B.data["trace_chem"] = list2params(temp_chem) - - reagents.reagent_list += B - reagents.update_total() - on_reagent_change() - reagents.handle_reactions() - user.visible_message("[user] takes a blood sample from [target].") - - else //if not mob - if(!target.reagents.total_volume) - user << "[target] is empty." - return - - if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract)) - user << "You cannot directly remove reagents from [target]." - return - - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares? - - user << "You fill [src] with [trans] units of the solution." - if (reagents.total_volume >= reagents.maximum_volume) - mode=!mode - update_icon() - - if(SYRINGE_INJECT) - if(!reagents.total_volume) - user << "[src] is empty." - return - if(istype(target, /obj/item/weapon/implantcase/chem)) - return - - if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes)) - user << "You cannot directly fill [target]." - return - if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "[target] is full." - return - - if(ismob(target) && target != user) - target.visible_message("[user] is trying to inject [target]!", \ - "[user] is trying to inject [target]!") - if(!do_mob(user, target)) return - target.visible_message("[user] injects [target] with the syringe!", \ - "[user] injects [target] with the syringe!") - //Attack log entries are produced here due to failure to produce elsewhere. Remove them here if you have doubles from normal syringes. - var/list/rinject = list() - for(var/datum/reagent/R in src.reagents.reagent_list) - rinject += R.name - var/contained = english_list(rinject) - var/mob/M = target - add_logs(user, M, "injected", object="[src.name]", addition="which had [contained]") - reagents.reaction(target, INGEST) - if(ismob(target) && target == user) - //Attack log entries are produced here due to failure to produce elsewhere. Remove them here if you have doubles from normal syringes. - var/list/rinject = list() - for(var/datum/reagent/R in src.reagents.reagent_list) - rinject += R.name - var/contained = english_list(rinject) - var/mob/M = target - log_attack("[user.name] ([user.ckey]) injected [M.name] ([M.ckey]) with [src.name], which had [contained] (INTENT: [uppertext(user.a_intent)])") - M.attack_log += text("\[[time_stamp()]\] Injected themselves ([contained]) with [src.name].") - - reagents.reaction(target, INGEST) - spawn(5) - target.add_fingerprint(user) - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - user << "You inject [trans] unit\s of the solution. [src] now contains [reagents.total_volume] unit\s." - if(reagents.total_volume <= 0 && mode == SYRINGE_INJECT) - mode = SYRINGE_DRAW - update_icon() - - - update_icon() - var/rounded_vol = round(reagents.total_volume,5) - overlays.Cut() - if(ismob(loc)) - var/injoverlay - switch(mode) - if (SYRINGE_DRAW) - injoverlay = "draw" - if (SYRINGE_INJECT) - injoverlay = "inject" - overlays += injoverlay - icon_state = "[rounded_vol]" - item_state = "syringe_[rounded_vol]" - - if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "syringe10") - - switch(rounded_vol) - if(5) filling.icon_state = "syringe5" - if(10) filling.icon_state = "syringe10" - if(15) filling.icon_state = "syringe15" - - filling.color = mix_color_from_reagents(reagents.reagent_list) - overlays += filling - - -/obj/item/weapon/reagent_containers/syringe/lethal - name = "lethal injection syringe" - desc = "A syringe used for lethal injections. It can hold up to 50 units." - amount_per_transfer_from_this = 50 - volume = 50 - -//////////////////////////////////////////////////////////////////////////////// -/// Syringes. END -//////////////////////////////////////////////////////////////////////////////// - - - -/obj/item/weapon/reagent_containers/syringe/inaprovaline - name = "syringe (inaprovaline)" - desc = "Contains inaprovaline - used to stabilize patients." - New() - ..() - reagents.add_reagent("inaprovaline", 15) - mode = SYRINGE_INJECT - update_icon() - -/obj/item/weapon/reagent_containers/syringe/antitoxin - name = "syringe (anti-toxin)" - desc = "Contains anti-toxins." - New() - ..() - reagents.add_reagent("anti_toxin", 15) - mode = SYRINGE_INJECT - update_icon() - -/obj/item/weapon/reagent_containers/syringe/antiviral - name = "syringe (spaceacillin)" - desc = "Contains antiviral agents." - New() - ..() - reagents.add_reagent("spaceacillin", 15) - mode = SYRINGE_INJECT - update_icon() - -/obj/item/weapon/reagent_containers/syringe/lethal/choral - New() - ..() - reagents.add_reagent("chloralhydrate", 50) - mode = SYRINGE_INJECT - update_icon() - - -//Robot syringes -//Not special in any way, code wise. They don't have added variables or procs. -/obj/item/weapon/reagent_containers/syringe/robot/antitoxin - name = "syringe (anti-toxin)" - desc = "Contains anti-toxins." - New() - ..() - reagents.add_reagent("anti_toxin", 15) - mode = SYRINGE_INJECT - update_icon() - -/obj/item/weapon/reagent_containers/syringe/robot/inoprovaline - name = "syringe (inoprovaline)" - desc = "Contains inaprovaline - used to stabilize patients." - New() - ..() - reagents.add_reagent("inaprovaline", 15) - mode = SYRINGE_INJECT - update_icon() - -/obj/item/weapon/reagent_containers/syringe/robot/mixed - name = "syringe (mixed)" - desc = "Contains inaprovaline & anti-toxins." - New() - ..() - reagents.add_reagent("inaprovaline", 7) - reagents.add_reagent("anti_toxin", 8) - mode = SYRINGE_INJECT - update_icon() +//////////////////////////////////////////////////////////////////////////////// +/// Syringes. +//////////////////////////////////////////////////////////////////////////////// +#define SYRINGE_DRAW 0 +#define SYRINGE_INJECT 1 + +/obj/item/weapon/reagent_containers/syringe + name = "syringe" + desc = "A syringe that can hold up to 15 units." + icon = 'icons/obj/syringe.dmi' + item_state = "syringe_0" + icon_state = "0" + amount_per_transfer_from_this = 5 + possible_transfer_amounts = null //list(5, 10, 15) + volume = 15 + var/mode = SYRINGE_DRAW + g_amt = 20 + m_amt = 10 + + on_reagent_change() + update_icon() + + pickup(mob/user) + ..() + update_icon() + + dropped(mob/user) + ..() + update_icon() + + attack_self(mob/user) + mode = !mode + update_icon() + + attack_hand() + ..() + update_icon() + + attack_paw() + return attack_hand() + + attackby(obj/item/I, mob/user) + return + + afterattack(obj/target, mob/user , proximity) + if(!proximity) return + if(!target.reagents) return + + if(isliving(target)) + var/mob/living/M = target + if(!M.can_inject(user, 1)) + return + + switch(mode) + if(SYRINGE_DRAW) + + if(reagents.total_volume >= reagents.maximum_volume) + user << "The syringe is full." + return + + if(ismob(target)) //Blood! + if(reagents.has_reagent("blood")) + user << "There is already a blood sample in this syringe." + return + if(istype(target, /mob/living/carbon)) //maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea. + var/amount = src.reagents.maximum_volume - src.reagents.total_volume + var/mob/living/carbon/T = target + var/datum/reagent/B = new /datum/reagent/blood + if(!check_dna_integrity(T)) + user << "You are unable to locate any blood." + return + if(NOCLONE in T.mutations) //target done been et, no more blood in him + user << "You are unable to locate any blood." + return + B.holder = src + B.volume = amount + //set reagent data + B.data["donor"] = T + + /* + if(T.virus && T.virus.spread_type != SPECIAL) + B.data["virus"] = new T.virus.type(0) + */ + + for(var/datum/disease/D in T.viruses) + if(!B.data["viruses"]) + B.data["viruses"] = list() + + B.data["viruses"] += new D.type(0, D, 1) + + B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0) + if(T.resistances&&T.resistances.len) + B.data["resistances"] = T.resistances.Copy() + if(istype(target, /mob/living/carbon/human))//I wish there was some hasproperty operation... + var/mob/living/carbon/human/HT = target + B.data["blood_type"] = copytext(HT.dna.blood_type,1,0) + var/list/temp_chem = list() + for(var/datum/reagent/R in target.reagents.reagent_list) + temp_chem += R.name + temp_chem[R.name] = R.volume + B.data["trace_chem"] = list2params(temp_chem) + + reagents.reagent_list += B + reagents.update_total() + on_reagent_change() + reagents.handle_reactions() + user.visible_message("[user] takes a blood sample from [target].") + + else //if not mob + if(!target.reagents.total_volume) + user << "[target] is empty." + return + + if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract)) + user << "You cannot directly remove reagents from [target]." + return + + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares? + + user << "You fill [src] with [trans] units of the solution." + if (reagents.total_volume >= reagents.maximum_volume) + mode=!mode + update_icon() + + if(SYRINGE_INJECT) + if(!reagents.total_volume) + user << "[src] is empty." + return + if(istype(target, /obj/item/weapon/implantcase/chem)) + return + + if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes)) + user << "You cannot directly fill [target]." + return + if(target.reagents.total_volume >= target.reagents.maximum_volume) + user << "[target] is full." + return + + if(ismob(target) && target != user) + target.visible_message("[user] is trying to inject [target]!", \ + "[user] is trying to inject [target]!") + if(!do_mob(user, target)) return + target.visible_message("[user] injects [target] with the syringe!", \ + "[user] injects [target] with the syringe!") + //Attack log entries are produced here due to failure to produce elsewhere. Remove them here if you have doubles from normal syringes. + var/list/rinject = list() + for(var/datum/reagent/R in src.reagents.reagent_list) + rinject += R.name + var/contained = english_list(rinject) + var/mob/M = target + add_logs(user, M, "injected", object="[src.name]", addition="which had [contained]") + reagents.reaction(target, INGEST) + if(ismob(target) && target == user) + //Attack log entries are produced here due to failure to produce elsewhere. Remove them here if you have doubles from normal syringes. + var/list/rinject = list() + for(var/datum/reagent/R in src.reagents.reagent_list) + rinject += R.name + var/contained = english_list(rinject) + var/mob/M = target + log_attack("[user.name] ([user.ckey]) injected [M.name] ([M.ckey]) with [src.name], which had [contained] (INTENT: [uppertext(user.a_intent)])") + M.attack_log += text("\[[time_stamp()]\] Injected themselves ([contained]) with [src.name].") + + reagents.reaction(target, INGEST) + spawn(5) + target.add_fingerprint(user) + var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) + user << "You inject [trans] unit\s of the solution. [src] now contains [reagents.total_volume] unit\s." + if(reagents.total_volume <= 0 && mode == SYRINGE_INJECT) + mode = SYRINGE_DRAW + update_icon() + + + update_icon() + var/rounded_vol = round(reagents.total_volume,5) + overlays.Cut() + if(ismob(loc)) + var/injoverlay + switch(mode) + if (SYRINGE_DRAW) + injoverlay = "draw" + if (SYRINGE_INJECT) + injoverlay = "inject" + overlays += injoverlay + icon_state = "[rounded_vol]" + item_state = "syringe_[rounded_vol]" + + if(reagents.total_volume) + var/image/filling = image('icons/obj/reagentfillings.dmi', src, "syringe10") + + switch(rounded_vol) + if(5) filling.icon_state = "syringe5" + if(10) filling.icon_state = "syringe10" + if(15) filling.icon_state = "syringe15" + + filling.color = mix_color_from_reagents(reagents.reagent_list) + overlays += filling + + +/obj/item/weapon/reagent_containers/syringe/lethal + name = "lethal injection syringe" + desc = "A syringe used for lethal injections. It can hold up to 50 units." + amount_per_transfer_from_this = 50 + volume = 50 + +//////////////////////////////////////////////////////////////////////////////// +/// Syringes. END +//////////////////////////////////////////////////////////////////////////////// + + + +/obj/item/weapon/reagent_containers/syringe/inaprovaline + name = "syringe (inaprovaline)" + desc = "Contains inaprovaline - used to stabilize patients." + New() + ..() + reagents.add_reagent("inaprovaline", 15) + mode = SYRINGE_INJECT + update_icon() + +/obj/item/weapon/reagent_containers/syringe/antitoxin + name = "syringe (anti-toxin)" + desc = "Contains anti-toxins." + New() + ..() + reagents.add_reagent("anti_toxin", 15) + mode = SYRINGE_INJECT + update_icon() + +/obj/item/weapon/reagent_containers/syringe/antiviral + name = "syringe (spaceacillin)" + desc = "Contains antiviral agents." + New() + ..() + reagents.add_reagent("spaceacillin", 15) + mode = SYRINGE_INJECT + update_icon() + +/obj/item/weapon/reagent_containers/syringe/lethal/choral + New() + ..() + reagents.add_reagent("chloralhydrate", 50) + mode = SYRINGE_INJECT + update_icon() + + +//Robot syringes +//Not special in any way, code wise. They don't have added variables or procs. +/obj/item/weapon/reagent_containers/syringe/robot/antitoxin + name = "syringe (anti-toxin)" + desc = "Contains anti-toxins." + New() + ..() + reagents.add_reagent("anti_toxin", 15) + mode = SYRINGE_INJECT + update_icon() + +/obj/item/weapon/reagent_containers/syringe/robot/inoprovaline + name = "syringe (inoprovaline)" + desc = "Contains inaprovaline - used to stabilize patients." + New() + ..() + reagents.add_reagent("inaprovaline", 15) + mode = SYRINGE_INJECT + update_icon() + +/obj/item/weapon/reagent_containers/syringe/robot/mixed + name = "syringe (mixed)" + desc = "Contains inaprovaline & anti-toxins." + New() + ..() + reagents.add_reagent("inaprovaline", 7) + reagents.add_reagent("anti_toxin", 8) + mode = SYRINGE_INJECT + update_icon() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index d5f664d8178..8544ea9bb72 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -13,22 +13,22 @@ /obj/structure/reagent_dispensers/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(5)) - del(src) + qdel(src) return else return /obj/structure/reagent_dispensers/blob_act() if(prob(50)) - del(src) + qdel(src) /obj/structure/reagent_dispensers/attackby(obj/item/weapon/W as obj, mob/user as mob) return @@ -72,17 +72,17 @@ /obj/structure/reagent_dispensers/watertank/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) new /obj/effect/effect/water(src.loc) - del(src) + qdel(src) return if(3.0) if (prob(5)) new /obj/effect/effect/water(src.loc) - del(src) + qdel(src) return else return @@ -90,7 +90,7 @@ /obj/structure/reagent_dispensers/watertank/blob_act() if(prob(50)) new /obj/effect/effect/water(src.loc) - del(src) + qdel(src) /obj/structure/reagent_dispensers/fueltank name = "fueltank" @@ -118,7 +118,7 @@ /obj/structure/reagent_dispensers/fueltank/ex_act() explosion(src.loc,-1,0,2, flame_range = 2) if(src) - del(src) + qdel(src) /obj/structure/reagent_dispensers/fueltank/fire_act() @@ -164,7 +164,7 @@ /obj/structure/reagent_dispensers/water_cooler/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/weapon/paper)) user.drop_item() - del I + qdel(I) cups++ return else diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/reagents/syringe_gun.dm index 55848e5d6f0..83c5f3dcfb4 100644 --- a/code/modules/reagents/syringe_gun.dm +++ b/code/modules/reagents/syringe_gun.dm @@ -29,7 +29,7 @@ chambered.BB.name = S.name syringes.Remove(S) - del(S) + qdel(S) return /obj/item/weapon/gun/syringe/process_chamber() diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 83dfd5f4bb2..f54574d5e93 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -252,7 +252,7 @@ src.transfer_fingerprints_to(P) P.dir = dir - del(src) + qdel(src) return else user << "You need more welding fuel to complete this task." diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index dd116b9c6d6..6ac6489f4b4 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -1,1341 +1,1341 @@ -// Disposal bin -// Holds items for disposal into pipe system -// Draws air from turf, gradually charges internal reservoir -// Once full (~1 atm), uses air resv to flush items into the pipes -// Automatically recharges air (unless off), will flush when ready if pre-set -// Can hold items and human size things, no other draggables -// Toilets are a type of disposal bin for small objects only and work on magic. By magic, I mean torque rotation -#define SEND_PRESSURE 0.05*ONE_ATMOSPHERE - -/obj/machinery/disposal - name = "disposal unit" - desc = "A pneumatic waste disposal unit." - icon = 'icons/obj/pipes/disposal.dmi' - icon_state = "disposal" - anchored = 1 - density = 1 - var/datum/gas_mixture/air_contents // internal reservoir - var/mode = 1 // item mode 0=off 1=charging 2=charged - var/flush = 0 // true if flush handle is pulled - var/obj/structure/disposalpipe/trunk/trunk = null // the attached pipe trunk - var/flushing = 0 // true if flushing in progress - var/flush_every_ticks = 30 //Every 30 ticks it will look whether it is ready to flush - var/flush_count = 0 //this var adds 1 once per tick. When it reaches flush_every_ticks it resets and tries to flush. - var/last_sound = 0 - - // create a new disposal - // find the attached trunk (if present) and init gas resvr. -/obj/machinery/disposal/New() - ..() - - trunk_check() - - air_contents = new/datum/gas_mixture() - //gas.volume = 1.05 * CELLSTANDARD - update() - -/obj/machinery/disposal/proc/trunk_check() - trunk = locate() in src.loc - if(!trunk) - mode = 0 - flush = 0 - else - mode = initial(mode) - flush = initial(flush) - trunk.linked = src // link the pipe trunk to self - -/obj/machinery/disposal/Del() - for(var/atom/movable/AM in contents) - AM.loc = src.loc - ..() - -/obj/machinery/disposal/initialize() - // this will get a copy of the air turf and take a SEND PRESSURE amount of air from it - var/atom/L = loc - var/datum/gas_mixture/env = new - env.copy_from(L.return_air()) - var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1) - air_contents.merge(removed) - trunk_check() - - // attack by item places it in to disposal -/obj/machinery/disposal/attackby(var/obj/item/I, var/mob/user) - if(stat & BROKEN || !I || !user || (I.flags & NODROP)) - return - - if(isrobot(user) && !istype(I, /obj/item/weapon/storage/bag/trash)) - return - src.add_fingerprint(user) - if(mode<=0) // It's off - if(istype(I, /obj/item/weapon/screwdriver)) - if(contents.len > 0) - user << "Eject the items first!" - return - if(mode==0) // It's off but still not unscrewed - mode=-1 // Set it to doubleoff l0l - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You remove the screws around the power connection." - return - else if(mode==-1) - mode=0 - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You attach the screws around the power connection." - return - else if(istype(I,/obj/item/weapon/weldingtool) && mode==-1) - if(contents.len > 0) - user << "Eject the items first!" - return - var/obj/item/weapon/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the floorweld off \the [src]." - - if(do_after(user,20)) - if(!src || !W.isOn()) return - user << "You slice the floorweld off \the [src]." - var/obj/structure/disposalconstruct/C = new (src.loc) - src.transfer_fingerprints_to(C) - C.ptype = 6 // 6 = disposal unit - C.anchored = 1 - C.density = 1 - C.update() - del(src) - return - else - user << "You need more welding fuel to complete this task." - return - - if(istype(I, /obj/item/weapon/melee/energy/blade)) - user << "You can't place \the [I] into \the [src]." - return - - if(istype(I, /obj/item/weapon/storage/bag/trash)) - var/obj/item/weapon/storage/bag/trash/T = I - user << "\blue You empty the bag." - for(var/obj/item/O in T.contents) - T.remove_from_storage(O,src) - T.update_icon() - update() - return - - var/obj/item/weapon/grab/G = I - if(istype(G)) // handle grabbed mob - if(ismob(G.affecting)) - var/mob/GM = G.affecting - for (var/mob/V in viewers(usr)) - V.show_message("[usr] starts putting [GM.name] into \the [src].", 3) - if(do_after(usr, 20)) - if (GM.client) - GM.client.perspective = EYE_PERSPECTIVE - GM.client.eye = src - GM.loc = src - for (var/mob/C in viewers(src)) - C.show_message("\red [GM.name] has been placed in \the [src] by [user].", 3) - del(G) - return - - if(!I) return - - user.drop_item() - if(I) - I.loc = src - - user << "You place \the [I] into \the [src]." - for(var/mob/M in viewers(src)) - if(M == user) - continue - M.show_message("[user.name] places \the [I] into \the [src].", 3) - - update() - -// mouse drop another mob or self -// -/obj/machinery/disposal/MouseDrop_T(mob/target, mob/user) - if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai)) - return - src.add_fingerprint(user) - var/target_loc = target.loc - var/msg - for (var/mob/V in viewers(usr)) - if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) - V.show_message("[usr] starts climbing into \the [src].", 3) - if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) - if(target.anchored) return - if(!ishuman(user) && !ismonkey(user)) return - V.show_message("[usr] starts stuffing [target.name] into \the [src].", 3) - if(!do_after(usr, 20)) - return - if(target_loc != target.loc) - return - if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) // if drop self, then climbed in - // must be awake, not stunned or whatever - msg = "[user.name] climbs into \the [src]." - user << "You climb into \the [src]." - else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) - msg = "[user.name] stuffs [target.name] into \the [src]!" - user << "You stuff [target.name] into \the [src]!" - else - return - if (target.client) - target.client.perspective = EYE_PERSPECTIVE - target.client.eye = src - target.loc = src - - for (var/mob/C in viewers(src)) - if(C == user) - continue - C.show_message(msg, 3) - - update() - return - -// can breath normally in the disposal -/obj/machinery/disposal/alter_health() - return get_turf(src) - -/obj/machinery/disposal/relaymove(mob/user as mob) - attempt_escape(user) - -// resist to escape the bin -/obj/machinery/disposal/container_resist() - attempt_escape(usr) - -/obj/machinery/disposal/proc/attempt_escape(mob/user as mob) - if(src.flushing) - return - go_out(user) - return - -// leave the disposal -/obj/machinery/disposal/proc/go_out(mob/user) - - if (user.client) - user.client.eye = user.client.mob - user.client.perspective = MOB_PERSPECTIVE - user.loc = src.loc - update() - return - - -// monkeys can only pull the flush lever -/obj/machinery/disposal/attack_paw(mob/user as mob) - if(stat & BROKEN) - return - - flush = !flush - update() - return - -// ai as human but can't flush -/obj/machinery/disposal/attack_ai(mob/user as mob) - interact(user, 1) - -// human interact with machine -/obj/machinery/disposal/attack_hand(mob/user as mob) - if(user && user.loc == src) - usr << "\red You cannot reach the controls from inside." - return - /* - if(mode==-1) - usr << "\red The disposal units power is disabled." - return - */ - interact(user, 0) - -// hostile mob escape from disposals -/obj/machinery/disposal/attack_animal(var/mob/living/simple_animal/M) - if(M.environment_smash) - visible_message("[M.name] smashes \the [src] apart!") - del(src) - return - -// user interaction -/obj/machinery/disposal/interact(mob/user, var/ai=0) - - src.add_fingerprint(user) - if(stat & BROKEN) - user.unset_machine() - return - - var/dat = "Waste Disposal UnitWaste Disposal Unit
    " - - if(!ai) // AI can't pull flush handle - if(flush) - dat += "Disposal handle: Disengage Engaged" - else - dat += "Disposal handle: Disengaged Engage" - - dat += "

    Eject contents
    " - - if(mode <= 0) - dat += "Pump: Off On
    " - else if(mode == 1) - dat += "Pump: Off On (pressurizing)
    " - else - dat += "Pump: Off On (idle)
    " - - var/per = Clamp(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 100) - - dat += "Pressure: [round(per, 1)]%
    " - - - user.set_machine(src) - user << browse(dat, "window=disposal;size=360x170") - onclose(user, "disposal") - -// handle machine interaction - -/obj/machinery/disposal/Topic(href, href_list) - if(..()) - return - if(usr.loc == src) - usr << "\red You cannot reach the controls from inside." - return - - if(mode==-1 && !href_list["eject"]) // only allow ejecting if mode is -1 - usr << "\red \The [src]'s power is disabled." - return - ..() - usr.set_machine(src) - - if(href_list["close"]) - usr.unset_machine() - usr << browse(null, "window=disposal") - return - - if(href_list["pump"]) - if(text2num(href_list["pump"])) - mode = 1 - else - mode = 0 - update() - - if(href_list["handle"]) - flush = text2num(href_list["handle"]) - update() - - if(href_list["eject"]) - eject() - return - -// eject the contents of the disposal unit -/obj/machinery/disposal/proc/eject() - for(var/atom/movable/AM in src) - AM.loc = src.loc - AM.pipe_eject(0) - update() - -// update the icon & overlays to reflect mode & status -/obj/machinery/disposal/proc/update() - overlays.Cut() - if(stat & BROKEN) - icon_state = "disposal-broken" - mode = 0 - flush = 0 - return - - // flush handle - if(flush) - overlays += image('icons/obj/pipes/disposal.dmi', "dispover-handle") - - // only handle is shown if no power - if(stat & NOPOWER || mode == -1) - return - - // check for items in disposal - occupied light - if(contents.len > 0) - overlays += image('icons/obj/pipes/disposal.dmi', "dispover-full") - - // charging and ready light - if(mode == 1) - overlays += image('icons/obj/pipes/disposal.dmi', "dispover-charge") - else if(mode == 2) - overlays += image('icons/obj/pipes/disposal.dmi', "dispover-ready") - -// timed process -// charge the gas reservoir and perform flush if ready -/obj/machinery/disposal/process() - if(stat & BROKEN) // nothing can happen if broken - return - - flush_count++ - if( flush_count >= flush_every_ticks ) - if( contents.len ) - if(mode == 2) - spawn(0) - feedback_inc("disposal_auto_flush",1) - flush() - flush_count = 0 - - src.updateDialog() - - if(flush && air_contents.return_pressure() >= SEND_PRESSURE ) // flush can happen even without power - spawn(0) - flush() - - if(stat & NOPOWER) // won't charge if no power - return - - use_power(100) // base power usage - - if(mode != 1) // if off or ready, no need to charge - return - - // otherwise charge - use_power(500) // charging power usage - - var/atom/L = loc // recharging from loc turf - - var/datum/gas_mixture/env = L.return_air() - var/pressure_delta = (SEND_PRESSURE*1.01) - air_contents.return_pressure() - - if(env.temperature > 0) - var/transfer_moles = 0.1 * pressure_delta*air_contents.volume/(env.temperature * R_IDEAL_GAS_EQUATION) - - //Actually transfer the gas - var/datum/gas_mixture/removed = env.remove(transfer_moles) - air_contents.merge(removed) - air_update_turf() - - - // if full enough, switch to ready mode - if(air_contents.return_pressure() >= SEND_PRESSURE) - mode = 2 - update() - return - -// perform a flush -/obj/machinery/disposal/proc/flush() - - flushing = 1 - flick("[icon_state]-flush", src) - - var/wrapcheck = 0 - var/obj/structure/disposalholder/H = new() // virtual holder object which actually - // travels through the pipes. - for(var/obj/item/smallDelivery/O in src) - wrapcheck = 1 - - if(wrapcheck == 1) - H.tomail = 1 - - sleep(10) - if(last_sound < world.time + 1) - playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0) - last_sound = world.time - sleep(5) // wait for animation to finish - - H.init(src) // copy the contents of disposer to holder - air_contents = new() // new empty gas resv. - - H.start(src) // start the holder processing movement - flushing = 0 - // now reset disposal state - flush = 0 - if(mode == 2) // if was ready, - mode = 1 // switch to charging - update() - return - - -// called when area power changes -/obj/machinery/disposal/power_change() - ..() // do default setting/reset of stat NOPOWER bit - update() // update icon - return - - -// called when holder is expelled from a disposal -// should usually only occur if the pipe network is modified -/obj/machinery/disposal/proc/expel(var/obj/structure/disposalholder/H) - - var/turf/target - playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) - if(H) // Somehow, someone managed to flush a window which broke mid-transit and caused the disposal to go in an infinite loop trying to expel null, hopefully this fixes it - for(var/atom/movable/AM in H) - target = get_offset_target_turf(src.loc, rand(5)-rand(5), rand(5)-rand(5)) - - AM.loc = src.loc - AM.pipe_eject(0) - spawn(1) - if(AM) - AM.throw_at(target, 5, 1) - - H.vent_gas(loc) - del(H) - -/obj/machinery/disposal/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if (istype(mover,/obj/item) && mover.throwing) - var/obj/item/I = mover - if(istype(I, /obj/item/projectile)) - return - if(prob(75)) - I.loc = src - for(var/mob/M in viewers(src)) - M.show_message("\the [I] lands in \the [src].", 3) - else - for(var/mob/M in viewers(src)) - M.show_message("\the [I] bounces off of \the [src]'s rim!.", 3) - return 0 - else - return ..(mover, target, height, air_group) - -// virtual disposal object -// travels through pipes in lieu of actual items -// contents will be items flushed by the disposal -// this allows the gas flushed to be tracked - -/obj/structure/disposalholder - invisibility = 101 - var/datum/gas_mixture/gas = null // gas used to flush, will appear at exit point - var/active = 0 // true if the holder is moving, otherwise inactive - dir = 0 - var/count = 1000 //*** can travel 1000 steps before going inactive (in case of loops) - var/has_fat_guy = 0 // true if contains a fat person - var/destinationTag = 0 // changes if contains a delivery container - var/tomail = 0 //changes if contains wrapped package - var/hasmob = 0 //If it contains a mob - - - // initialize a holder from the contents of a disposal unit - proc/init(var/obj/machinery/disposal/D) - gas = D.air_contents// transfer gas resv. into holder object - - //Check for any living mobs trigger hasmob. - //hasmob effects whether the package goes to cargo or its tagged destination. - for(var/mob/living/M in D) - if(M && M.stat != 2) - hasmob = 1 - - //Checks 1 contents level deep. This means that players can be sent through disposals... - //...but it should require a second person to open the package. (i.e. person inside a wrapped locker) - for(var/obj/O in D) - if(O.contents) - for(var/mob/living/M in O.contents) - if(M && M.stat != 2) - hasmob = 1 - - // now everything inside the disposal gets put into the holder - // note AM since can contain mobs or objs - for(var/atom/movable/AM in D) - AM.loc = src - if(istype(AM, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = AM - if(FAT in H.mutations) // is a human and fat? - has_fat_guy = 1 // set flag on holder - if(istype(AM, /obj/structure/bigDelivery) && !hasmob) - var/obj/structure/bigDelivery/T = AM - src.destinationTag = T.sortTag - if(istype(AM, /obj/item/smallDelivery) && !hasmob) - var/obj/item/smallDelivery/T = AM - src.destinationTag = T.sortTag - - - // start the movement process - // argument is the disposal unit the holder started in - proc/start(var/obj/machinery/disposal/D) - if(!D.trunk) - D.expel(src) // no trunk connected, so expel immediately - return - - loc = D.trunk - active = 1 - dir = DOWN - spawn(1) - move() // spawn off the movement process - - return - - // movement process, persists while holder is moving through pipes - proc/move() - var/obj/structure/disposalpipe/last - while(active) - if(has_fat_guy && prob(2)) // chance of becoming stuck per segment if contains a fat guy - active = 0 - // find the fat guys - for(var/mob/living/carbon/human/H in src) - - break - sleep(1) // was 1 - var/obj/structure/disposalpipe/curr = loc - last = curr - curr = curr.transfer(src) - if(!curr) - last.expel(src, loc, dir) - - // - if(!(count--)) - active = 0 - return - - - - // find the turf which should contain the next pipe - proc/nextloc() - return get_step(loc,dir) - - // find a matching pipe on a turf - proc/findpipe(var/turf/T) - - if(!T) - return null - - var/fdir = turn(dir, 180) // flip the movement direction - for(var/obj/structure/disposalpipe/P in T) - if(fdir & P.dpdir) // find pipe direction mask that matches flipped dir - return P - // if no matching pipe, return null - return null - - // merge two holder objects - // used when a a holder meets a stuck holder - proc/merge(var/obj/structure/disposalholder/other) - for(var/atom/movable/AM in other) - AM.loc = src // move everything in other holder to this one - if(ismob(AM)) - var/mob/M = AM - if(M.client) // if a client mob, update eye to follow this holder - M.client.eye = src - - if(other.has_fat_guy) - has_fat_guy = 1 - del(other) - - - // called when player tries to move while in a pipe - relaymove(mob/user as mob) - if (user.stat) - return - if (src.loc) - for (var/mob/M in hearers(src.loc.loc)) - M << "CLONG, clong!" - - playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0) - - // called to vent all gas in holder to a location - proc/vent_gas(var/atom/location) - location.assume_air(gas) // vent all gas to turf - return - -// Disposal pipes - -/obj/structure/disposalpipe - icon = 'icons/obj/pipes/disposal.dmi' - name = "disposal pipe" - desc = "An underfloor disposal pipe." - anchored = 1 - density = 0 - - level = 1 // underfloor only - var/dpdir = 0 // bitmask of pipe directions - dir = 0 // dir will contain dominant direction for junction pipes - var/health = 10 // health points 0-10 - layer = 2.3 // slightly lower than wires and other pipes - var/base_icon_state // initial icon state on map - - // new pipe, set the icon_state as on map - New() - ..() - base_icon_state = icon_state - return - - - // pipe is deleted - // ensure if holder is present, it is expelled - Del() - var/obj/structure/disposalholder/H = locate() in src - if(H) - // holder was present - H.active = 0 - var/turf/T = src.loc - if(T.density) - // deleting pipe is inside a dense turf (wall) - // this is unlikely, but just dump out everything into the turf in case - - for(var/atom/movable/AM in H) - AM.loc = T - AM.pipe_eject(0) - del(H) - ..() - return - - // otherwise, do normal expel from turf - if(H) - expel(H, T, 0) - ..() - - // returns the direction of the next pipe object, given the entrance dir - // by default, returns the bitmask of remaining directions - proc/nextdir(var/fromdir) - return dpdir & (~turn(fromdir, 180)) - - // transfer the holder through this pipe segment - // overriden for special behaviour - // - proc/transfer(var/obj/structure/disposalholder/H) - var/nextdir = nextdir(H.dir) - H.dir = nextdir - var/turf/T = H.nextloc() - var/obj/structure/disposalpipe/P = H.findpipe(T) - - if(P) - // find other holder in next loc, if inactive merge it with current - var/obj/structure/disposalholder/H2 = locate() in P - if(H2 && !H2.active) - H.merge(H2) - - H.loc = P - else // if wasn't a pipe, then set loc to turf - H.loc = T - return null - - return P - - - // update the icon_state to reflect hidden status - proc/update() - var/turf/T = src.loc - hide(T.intact && !istype(T,/turf/space)) // space never hides pipes - - // hide called by levelupdate if turf intact status changes - // change visibility status and force update of icon - hide(var/intact) - invisibility = intact ? 101: 0 // hide if floor is intact - updateicon() - - // update actual icon_state depending on visibility - // if invisible, append "f" to icon_state to show faded version - // this will be revealed if a T-scanner is used - // if visible, use regular icon_state - proc/updateicon() - if(invisibility) - icon_state = "[base_icon_state]f" - else - icon_state = base_icon_state - return - - - // expel the held objects into a turf - // called when there is a break in the pipe - // - - proc/expel(var/obj/structure/disposalholder/H, var/turf/T, var/direction) - - var/turf/target - - if(istype(T, /turf/simulated/floor)) //intact floor, pop the tile - var/turf/simulated/floor/F = T - if(F.floor_tile) - F.floor_tile.loc = H //It took me a day to figure out this was the right way to do it. ¯\_(;_;)_/¯ - F.floor_tile = null //So it doesn't get deleted in make_plating() - F.make_plating() - - if(direction) // direction is specified - if(istype(T, /turf/space)) // if ended in space, then range is unlimited - target = get_edge_target_turf(T, direction) - else // otherwise limit to 10 tiles - target = get_ranged_target_turf(T, direction, 10) - - playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) - if(H) - for(var/atom/movable/AM in H) - AM.loc = T - AM.pipe_eject(direction) - spawn(1) - if(AM) - AM.throw_at(target, 100, 1) - - else // no specified direction, so throw in random direction - - playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) - if(H) - for(var/atom/movable/AM in H) - target = get_offset_target_turf(T, rand(5)-rand(5), rand(5)-rand(5)) - - AM.loc = T - AM.pipe_eject(0) - spawn(1) - if(AM) - AM.throw_at(target, 5, 1) - H.vent_gas(T) - del(H) - return - - // call to break the pipe - // will expel any holder inside at the time - // then delete the pipe - // remains : set to leave broken pipe pieces in place - proc/broken(var/remains = 0) - if(remains) - for(var/D in cardinal) - if(D & dpdir) - var/obj/structure/disposalpipe/broken/P = new(src.loc) - P.dir = D - - src.invisibility = 101 // make invisible (since we won't delete the pipe immediately) - var/obj/structure/disposalholder/H = locate() in src - if(H) - // holder was present - H.active = 0 - var/turf/T = src.loc - if(T.density) - // broken pipe is inside a dense turf (wall) - // this is unlikely, but just dump out everything into the turf in case - - for(var/atom/movable/AM in H) - AM.loc = T - AM.pipe_eject(0) - del(H) - return - - // otherwise, do normal expel from turf - if(H) - expel(H, T, 0) - - spawn(2) // delete pipe after 2 ticks to ensure expel proc finished - del(src) - - - // pipe affected by explosion - ex_act(severity) - - switch(severity) - if(1.0) - broken(0) - return - if(2.0) - health -= rand(5,15) - healthcheck() - return - if(3.0) - health -= rand(0,15) - healthcheck() - return - - - // test health for brokenness - proc/healthcheck() - if(health < -2) - broken(0) - else if(health<1) - broken(1) - return - - //attack by item - //weldingtool: unfasten and convert to obj/disposalconstruct - - attackby(var/obj/item/I, var/mob/user) - - var/turf/T = src.loc - if(T.intact) - return // prevent interaction with T-scanner revealed pipes - src.add_fingerprint(user) - if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/W = I - - if(W.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - // check if anything changed over 2 seconds - var/turf/uloc = user.loc - var/atom/wloc = W.loc - user << "Slicing the disposal pipe." - sleep(30) - if(!W.isOn()) return - if(user.loc == uloc && wloc == W.loc) - welded() - else - user << "You must stay still while welding the pipe." - else - user << "You need more welding fuel to cut the pipe." - return - - // called when pipe is cut with welder - proc/welded() - - var/obj/structure/disposalconstruct/C = new (src.loc) - switch(base_icon_state) - if("pipe-s") - C.ptype = 0 - if("pipe-c") - C.ptype = 1 - if("pipe-j1") - C.ptype = 2 - if("pipe-j2") - C.ptype = 3 - if("pipe-y") - C.ptype = 4 - if("pipe-t") - C.ptype = 5 - if("pipe-j1s") - C.ptype = 9 - if("pipe-j2s") - C.ptype = 10 - src.transfer_fingerprints_to(C) - C.dir = dir - C.density = 0 - C.anchored = 1 - C.update() - - del(src) - -// *** TEST verb -//client/verb/dispstop() -// for(var/obj/structure/disposalholder/H in world) -// H.active = 0 - -// a straight or bent segment -/obj/structure/disposalpipe/segment - icon_state = "pipe-s" - - New() - ..() - if(icon_state == "pipe-s") - dpdir = dir | turn(dir, 180) - else - dpdir = dir | turn(dir, -90) - - update() - return - - - - -//a three-way junction with dir being the dominant direction -/obj/structure/disposalpipe/junction - icon_state = "pipe-j1" - - New() - ..() - if(icon_state == "pipe-j1") - dpdir = dir | turn(dir, -90) | turn(dir,180) - else if(icon_state == "pipe-j2") - dpdir = dir | turn(dir, 90) | turn(dir,180) - else // pipe-y - dpdir = dir | turn(dir,90) | turn(dir, -90) - update() - return - - - // next direction to move - // if coming in from secondary dirs, then next is primary dir - // if coming in from primary dir, then next is equal chance of other dirs - - nextdir(var/fromdir) - var/flipdir = turn(fromdir, 180) - if(flipdir != dir) // came from secondary dir - return dir // so exit through primary - else // came from primary - // so need to choose either secondary exit - var/mask = ..(fromdir) - - // find a bit which is set - var/setbit = 0 - if(mask & NORTH) - setbit = NORTH - else if(mask & SOUTH) - setbit = SOUTH - else if(mask & EAST) - setbit = EAST - else - setbit = WEST - - if(prob(50)) // 50% chance to choose the found bit or the other one - return setbit - else - return mask & (~setbit) - -//a three-way junction that sorts objects -/obj/structure/disposalpipe/sortjunction - - icon_state = "pipe-j1s" - var/sortType = 0 //Look at the list called TAGGERLOCATIONS in setup.dm - var/posdir = 0 - var/negdir = 0 - var/sortdir = 0 - - proc/updatedesc() - desc = "An underfloor disposal pipe with a package sorting mechanism." - if(sortType>0) - var/tag = uppertext(TAGGERLOCATIONS[sortType]) - desc += "\nIt's tagged with [tag]" - - proc/updatedir() - posdir = dir - negdir = turn(posdir, 180) - - if(icon_state == "pipe-j1s") - sortdir = turn(posdir, -90) - else - icon_state = "pipe-j2s" - sortdir = turn(posdir, 90) - - dpdir = sortdir | posdir | negdir - - New() - ..() - updatedir() - updatedesc() - update() - return - - attackby(var/obj/item/I, var/mob/user) - if(..()) - return - - if(istype(I, /obj/item/device/destTagger)) - var/obj/item/device/destTagger/O = I - - if(O.currTag > 0)// Tag set - sortType = O.currTag - playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1) - var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) - user << "\blue Changed filter to [tag]" - updatedesc() - - - // next direction to move - // if coming in from negdir, then next is primary dir or sortdir - // if coming in from posdir, then flip around and go back to posdir - // if coming in from sortdir, go to posdir - - nextdir(var/fromdir, var/sortTag) - //var/flipdir = turn(fromdir, 180) - if(fromdir != sortdir) // probably came from the negdir - - if(src.sortType == sortTag) //if destination matches filtered type... - return sortdir // exit through sortdirection - else - return posdir - else // came from sortdir - // so go with the flow to positive direction - return posdir - - transfer(var/obj/structure/disposalholder/H) - var/nextdir = nextdir(H.dir, H.destinationTag) - H.dir = nextdir - var/turf/T = H.nextloc() - var/obj/structure/disposalpipe/P = H.findpipe(T) - - if(P) - // find other holder in next loc, if inactive merge it with current - var/obj/structure/disposalholder/H2 = locate() in P - if(H2 && !H2.active) - H.merge(H2) - - H.loc = P - else // if wasn't a pipe, then set loc to turf - H.loc = T - return null - - return P - - -//a three-way junction that sorts objects destined for the mail office mail table (tomail = 1) -/obj/structure/disposalpipe/wrapsortjunction - - desc = "An underfloor disposal pipe which sorts wrapped and unwrapped objects." - icon_state = "pipe-j1s" - var/posdir = 0 - var/negdir = 0 - var/sortdir = 0 - - New() - ..() - posdir = dir - if(icon_state == "pipe-j1s") - sortdir = turn(posdir, -90) - negdir = turn(posdir, 180) - else - icon_state = "pipe-j2s" - sortdir = turn(posdir, 90) - negdir = turn(posdir, 180) - dpdir = sortdir | posdir | negdir - - update() - return - - // next direction to move - // if coming in from negdir, then next is primary dir or sortdir - // if coming in from posdir, then flip around and go back to posdir - // if coming in from sortdir, go to posdir - - nextdir(var/fromdir, var/istomail) - //var/flipdir = turn(fromdir, 180) - if(fromdir != sortdir) // probably came from the negdir - - if(istomail) //if destination matches filtered type... - return sortdir // exit through sortdirection - else - return posdir - else // came from sortdir - // so go with the flow to positive direction - return posdir - - transfer(var/obj/structure/disposalholder/H) - var/nextdir = nextdir(H.dir, H.tomail) - H.dir = nextdir - var/turf/T = H.nextloc() - var/obj/structure/disposalpipe/P = H.findpipe(T) - - if(P) - // find other holder in next loc, if inactive merge it with current - var/obj/structure/disposalholder/H2 = locate() in P - if(H2 && !H2.active) - H.merge(H2) - - H.loc = P - else // if wasn't a pipe, then set loc to turf - H.loc = T - return null - - return P - - - - - -//a trunk joining to a disposal bin or outlet on the same turf -/obj/structure/disposalpipe/trunk - icon_state = "pipe-t" - var/obj/linked // the linked obj/machinery/disposal or obj/disposaloutlet - -/obj/structure/disposalpipe/trunk/New() - ..() - dpdir = dir - spawn(1) - getlinked() - - update() - return - -/obj/structure/disposalpipe/trunk/proc/getlinked() - linked = null - var/obj/machinery/disposal/D = locate() in src.loc - if(D) - linked = D - if (!D.trunk) - D.trunk = src - - var/obj/structure/disposaloutlet/O = locate() in src.loc - if(O) - linked = O - - update() - return - - // Override attackby so we disallow trunkremoval when somethings ontop -/obj/structure/disposalpipe/trunk/attackby(var/obj/item/I, var/mob/user) - - //Disposal bins or chutes - /* - These shouldn't be required - var/obj/machinery/disposal/D = locate() in src.loc - if(D && D.anchored) - return - - //Disposal outlet - var/obj/structure/disposaloutlet/O = locate() in src.loc - if(O && O.anchored) - return - */ - - //Disposal constructors - var/obj/structure/disposalconstruct/C = locate() in src.loc - if(C && C.anchored) - return - - var/turf/T = src.loc - if(T.intact) - return // prevent interaction with T-scanner revealed pipes - src.add_fingerprint(user) - if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/W = I - - if(linked) - user << "You need to deconstruct disposal machinery above this pipe." - return - - if(W.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - // check if anything changed over 2 seconds - var/turf/uloc = user.loc - var/atom/wloc = W.loc - user << "Slicing the disposal pipe." - sleep(30) - if(!W.isOn()) return - if(user.loc == uloc && wloc == W.loc) - welded() - else - user << "You must stay still while welding the pipe." - else - user << "You need more welding fuel to cut the pipe." - - return - - // would transfer to next pipe segment, but we are in a trunk - // if not entering from disposal bin, - // transfer to linked object (outlet or bin) - -/obj/structure/disposalpipe/trunk/transfer(var/obj/structure/disposalholder/H) - - if(H.dir == DOWN) // we just entered from a disposer - return ..() // so do base transfer proc - // otherwise, go to the linked object - if(linked) - var/obj/structure/disposaloutlet/O = linked - if(istype(O) && (H)) - O.expel(H) // expel at outlet - else - var/obj/machinery/disposal/D = linked - if(H) - D.expel(H) // expel at disposal - else - if(H) - src.expel(H, src.loc, 0) // expel at turf - return null - - // nextdir - -/obj/structure/disposalpipe/trunk/nextdir(var/fromdir) - if(fromdir == DOWN) - return dir - else - return 0 - -// a broken pipe -/obj/structure/disposalpipe/broken - icon_state = "pipe-b" - dpdir = 0 // broken pipes have dpdir=0 so they're not found as 'real' pipes - // i.e. will be treated as an empty turf - desc = "A broken piece of disposal pipe." - - New() - ..() - update() - return - - // called when welded - // for broken pipe, remove and turn into scrap - - welded() -// var/obj/item/scrap/S = new(src.loc) -// S.set_components(200,0,0) - del(src) - -// the disposal outlet machine - -/obj/structure/disposaloutlet - name = "disposal outlet" - desc = "An outlet for the pneumatic disposal system." - icon = 'icons/obj/pipes/disposal.dmi' - icon_state = "outlet" - density = 1 - anchored = 1 - var/active = 0 - var/turf/target // this will be where the output objects are 'thrown' to. - var/mode = 0 - var/start_eject = 0 - var/eject_range = 2 - - New() - ..() - - spawn(1) - target = get_ranged_target_turf(src, dir, 10) - - - var/obj/structure/disposalpipe/trunk/trunk = locate() in src.loc - if(trunk) - trunk.linked = src // link the pipe trunk to self - - // expel the contents of the holder object, then delete it - // called when the holder exits the outlet - proc/expel(var/obj/structure/disposalholder/H) - - flick("outlet-open", src) - if((start_eject + 30) < world.time) - start_eject = world.time - playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0) - sleep(20) - playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) - else - sleep(20) - if(H) - for(var/atom/movable/AM in H) - AM.loc = src.loc - AM.pipe_eject(dir) - spawn(5) - if(AM) - AM.throw_at(target, eject_range, 1) - H.vent_gas(src.loc) - del(H) - return - - attackby(var/obj/item/I, var/mob/user) - if(!I || !user) - return - src.add_fingerprint(user) - if(istype(I, /obj/item/weapon/screwdriver)) - if(mode==0) - mode=1 - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You remove the screws around the power connection." - return - else if(mode==1) - mode=0 - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You attach the screws around the power connection." - return - else if(istype(I,/obj/item/weapon/weldingtool) && mode==1) - var/obj/item/weapon/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the floorweld off \the [src]." - if(do_after(user,20)) - if(!src || !W.isOn()) return - user << "You slice the floorweld off \the [src]." - var/obj/structure/disposalconstruct/C = new (src.loc) - src.transfer_fingerprints_to(C) - C.ptype = 7 // 7 = outlet - C.update() - C.anchored = 1 - C.density = 1 - del(src) - return - else - user << "You need more welding fuel to complete this task." - return - - - -// called when movable is expelled from a disposal pipe or outlet -// by default does nothing, override for special behaviour - -/atom/movable/proc/pipe_eject(var/direction) - return - -// check if mob has client, if so restore client view on eject -/mob/pipe_eject(var/direction) - if (src.client) - src.client.perspective = MOB_PERSPECTIVE - src.client.eye = src - - return - -/obj/effect/decal/cleanable/blood/gibs/pipe_eject(var/direction) - var/list/dirs - if(direction) - dirs = list( direction, turn(direction, -45), turn(direction, 45)) - else - dirs = alldirs.Copy() - - src.streak(dirs) - -/obj/effect/decal/cleanable/robot_debris/gib/pipe_eject(var/direction) - var/list/dirs - if(direction) - dirs = list( direction, turn(direction, -45), turn(direction, 45)) - else - dirs = alldirs.Copy() - - src.streak(dirs) +// Disposal bin +// Holds items for disposal into pipe system +// Draws air from turf, gradually charges internal reservoir +// Once full (~1 atm), uses air resv to flush items into the pipes +// Automatically recharges air (unless off), will flush when ready if pre-set +// Can hold items and human size things, no other draggables +// Toilets are a type of disposal bin for small objects only and work on magic. By magic, I mean torque rotation +#define SEND_PRESSURE 0.05*ONE_ATMOSPHERE + +/obj/machinery/disposal + name = "disposal unit" + desc = "A pneumatic waste disposal unit." + icon = 'icons/obj/pipes/disposal.dmi' + icon_state = "disposal" + anchored = 1 + density = 1 + var/datum/gas_mixture/air_contents // internal reservoir + var/mode = 1 // item mode 0=off 1=charging 2=charged + var/flush = 0 // true if flush handle is pulled + var/obj/structure/disposalpipe/trunk/trunk = null // the attached pipe trunk + var/flushing = 0 // true if flushing in progress + var/flush_every_ticks = 30 //Every 30 ticks it will look whether it is ready to flush + var/flush_count = 0 //this var adds 1 once per tick. When it reaches flush_every_ticks it resets and tries to flush. + var/last_sound = 0 + + // create a new disposal + // find the attached trunk (if present) and init gas resvr. +/obj/machinery/disposal/New() + ..() + + trunk_check() + + air_contents = new/datum/gas_mixture() + //gas.volume = 1.05 * CELLSTANDARD + update() + +/obj/machinery/disposal/proc/trunk_check() + trunk = locate() in src.loc + if(!trunk) + mode = 0 + flush = 0 + else + mode = initial(mode) + flush = initial(flush) + trunk.linked = src // link the pipe trunk to self + +/obj/machinery/disposal/Destroy() + for(var/atom/movable/AM in contents) + AM.loc = src.loc + ..() + +/obj/machinery/disposal/initialize() + // this will get a copy of the air turf and take a SEND PRESSURE amount of air from it + var/atom/L = loc + var/datum/gas_mixture/env = new + env.copy_from(L.return_air()) + var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1) + air_contents.merge(removed) + trunk_check() + + // attack by item places it in to disposal +/obj/machinery/disposal/attackby(var/obj/item/I, var/mob/user) + if(stat & BROKEN || !I || !user || (I.flags & NODROP)) + return + + if(isrobot(user) && !istype(I, /obj/item/weapon/storage/bag/trash)) + return + src.add_fingerprint(user) + if(mode<=0) // It's off + if(istype(I, /obj/item/weapon/screwdriver)) + if(contents.len > 0) + user << "Eject the items first!" + return + if(mode==0) // It's off but still not unscrewed + mode=-1 // Set it to doubleoff l0l + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You remove the screws around the power connection." + return + else if(mode==-1) + mode=0 + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You attach the screws around the power connection." + return + else if(istype(I,/obj/item/weapon/weldingtool) && mode==-1) + if(contents.len > 0) + user << "Eject the items first!" + return + var/obj/item/weapon/weldingtool/W = I + if(W.remove_fuel(0,user)) + playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) + user << "You start slicing the floorweld off \the [src]." + + if(do_after(user,20)) + if(!src || !W.isOn()) return + user << "You slice the floorweld off \the [src]." + var/obj/structure/disposalconstruct/C = new (src.loc) + src.transfer_fingerprints_to(C) + C.ptype = 6 // 6 = disposal unit + C.anchored = 1 + C.density = 1 + C.update() + qdel(src) + return + else + user << "You need more welding fuel to complete this task." + return + + if(istype(I, /obj/item/weapon/melee/energy/blade)) + user << "You can't place \the [I] into \the [src]." + return + + if(istype(I, /obj/item/weapon/storage/bag/trash)) + var/obj/item/weapon/storage/bag/trash/T = I + user << "\blue You empty the bag." + for(var/obj/item/O in T.contents) + T.remove_from_storage(O,src) + T.update_icon() + update() + return + + var/obj/item/weapon/grab/G = I + if(istype(G)) // handle grabbed mob + if(ismob(G.affecting)) + var/mob/GM = G.affecting + for (var/mob/V in viewers(usr)) + V.show_message("[usr] starts putting [GM.name] into \the [src].", 3) + if(do_after(usr, 20)) + if (GM.client) + GM.client.perspective = EYE_PERSPECTIVE + GM.client.eye = src + GM.loc = src + for (var/mob/C in viewers(src)) + C.show_message("\red [GM.name] has been placed in \the [src] by [user].", 3) + qdel(G) + return + + if(!I) return + + user.drop_item() + if(I) + I.loc = src + + user << "You place \the [I] into \the [src]." + for(var/mob/M in viewers(src)) + if(M == user) + continue + M.show_message("[user.name] places \the [I] into \the [src].", 3) + + update() + +// mouse drop another mob or self +// +/obj/machinery/disposal/MouseDrop_T(mob/target, mob/user) + if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai)) + return + src.add_fingerprint(user) + var/target_loc = target.loc + var/msg + for (var/mob/V in viewers(usr)) + if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) + V.show_message("[usr] starts climbing into \the [src].", 3) + if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) + if(target.anchored) return + if(!ishuman(user) && !ismonkey(user)) return + V.show_message("[usr] starts stuffing [target.name] into \the [src].", 3) + if(!do_after(usr, 20)) + return + if(target_loc != target.loc) + return + if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) // if drop self, then climbed in + // must be awake, not stunned or whatever + msg = "[user.name] climbs into \the [src]." + user << "You climb into \the [src]." + else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) + msg = "[user.name] stuffs [target.name] into \the [src]!" + user << "You stuff [target.name] into \the [src]!" + else + return + if (target.client) + target.client.perspective = EYE_PERSPECTIVE + target.client.eye = src + target.loc = src + + for (var/mob/C in viewers(src)) + if(C == user) + continue + C.show_message(msg, 3) + + update() + return + +// can breath normally in the disposal +/obj/machinery/disposal/alter_health() + return get_turf(src) + +/obj/machinery/disposal/relaymove(mob/user as mob) + attempt_escape(user) + +// resist to escape the bin +/obj/machinery/disposal/container_resist() + attempt_escape(usr) + +/obj/machinery/disposal/proc/attempt_escape(mob/user as mob) + if(src.flushing) + return + go_out(user) + return + +// leave the disposal +/obj/machinery/disposal/proc/go_out(mob/user) + + if (user.client) + user.client.eye = user.client.mob + user.client.perspective = MOB_PERSPECTIVE + user.loc = src.loc + update() + return + + +// monkeys can only pull the flush lever +/obj/machinery/disposal/attack_paw(mob/user as mob) + if(stat & BROKEN) + return + + flush = !flush + update() + return + +// ai as human but can't flush +/obj/machinery/disposal/attack_ai(mob/user as mob) + interact(user, 1) + +// human interact with machine +/obj/machinery/disposal/attack_hand(mob/user as mob) + if(user && user.loc == src) + usr << "\red You cannot reach the controls from inside." + return + /* + if(mode==-1) + usr << "\red The disposal units power is disabled." + return + */ + interact(user, 0) + +// hostile mob escape from disposals +/obj/machinery/disposal/attack_animal(var/mob/living/simple_animal/M) + if(M.environment_smash) + visible_message("[M.name] smashes \the [src] apart!") + qdel(src) + return + +// user interaction +/obj/machinery/disposal/interact(mob/user, var/ai=0) + + src.add_fingerprint(user) + if(stat & BROKEN) + user.unset_machine() + return + + var/dat = "Waste Disposal UnitWaste Disposal Unit
    " + + if(!ai) // AI can't pull flush handle + if(flush) + dat += "Disposal handle: Disengage Engaged" + else + dat += "Disposal handle: Disengaged Engage" + + dat += "

    Eject contents
    " + + if(mode <= 0) + dat += "Pump: Off On
    " + else if(mode == 1) + dat += "Pump: Off On (pressurizing)
    " + else + dat += "Pump: Off On (idle)
    " + + var/per = Clamp(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 100) + + dat += "Pressure: [round(per, 1)]%
    " + + + user.set_machine(src) + user << browse(dat, "window=disposal;size=360x170") + onclose(user, "disposal") + +// handle machine interaction + +/obj/machinery/disposal/Topic(href, href_list) + if(..()) + return + if(usr.loc == src) + usr << "\red You cannot reach the controls from inside." + return + + if(mode==-1 && !href_list["eject"]) // only allow ejecting if mode is -1 + usr << "\red \The [src]'s power is disabled." + return + ..() + usr.set_machine(src) + + if(href_list["close"]) + usr.unset_machine() + usr << browse(null, "window=disposal") + return + + if(href_list["pump"]) + if(text2num(href_list["pump"])) + mode = 1 + else + mode = 0 + update() + + if(href_list["handle"]) + flush = text2num(href_list["handle"]) + update() + + if(href_list["eject"]) + eject() + return + +// eject the contents of the disposal unit +/obj/machinery/disposal/proc/eject() + for(var/atom/movable/AM in src) + AM.loc = src.loc + AM.pipe_eject(0) + update() + +// update the icon & overlays to reflect mode & status +/obj/machinery/disposal/proc/update() + overlays.Cut() + if(stat & BROKEN) + icon_state = "disposal-broken" + mode = 0 + flush = 0 + return + + // flush handle + if(flush) + overlays += image('icons/obj/pipes/disposal.dmi', "dispover-handle") + + // only handle is shown if no power + if(stat & NOPOWER || mode == -1) + return + + // check for items in disposal - occupied light + if(contents.len > 0) + overlays += image('icons/obj/pipes/disposal.dmi', "dispover-full") + + // charging and ready light + if(mode == 1) + overlays += image('icons/obj/pipes/disposal.dmi', "dispover-charge") + else if(mode == 2) + overlays += image('icons/obj/pipes/disposal.dmi', "dispover-ready") + +// timed process +// charge the gas reservoir and perform flush if ready +/obj/machinery/disposal/process() + if(stat & BROKEN) // nothing can happen if broken + return + + flush_count++ + if( flush_count >= flush_every_ticks ) + if( contents.len ) + if(mode == 2) + spawn(0) + feedback_inc("disposal_auto_flush",1) + flush() + flush_count = 0 + + src.updateDialog() + + if(flush && air_contents.return_pressure() >= SEND_PRESSURE ) // flush can happen even without power + spawn(0) + flush() + + if(stat & NOPOWER) // won't charge if no power + return + + use_power(100) // base power usage + + if(mode != 1) // if off or ready, no need to charge + return + + // otherwise charge + use_power(500) // charging power usage + + var/atom/L = loc // recharging from loc turf + + var/datum/gas_mixture/env = L.return_air() + var/pressure_delta = (SEND_PRESSURE*1.01) - air_contents.return_pressure() + + if(env.temperature > 0) + var/transfer_moles = 0.1 * pressure_delta*air_contents.volume/(env.temperature * R_IDEAL_GAS_EQUATION) + + //Actually transfer the gas + var/datum/gas_mixture/removed = env.remove(transfer_moles) + air_contents.merge(removed) + air_update_turf() + + + // if full enough, switch to ready mode + if(air_contents.return_pressure() >= SEND_PRESSURE) + mode = 2 + update() + return + +// perform a flush +/obj/machinery/disposal/proc/flush() + + flushing = 1 + flick("[icon_state]-flush", src) + + var/wrapcheck = 0 + var/obj/structure/disposalholder/H = new() // virtual holder object which actually + // travels through the pipes. + for(var/obj/item/smallDelivery/O in src) + wrapcheck = 1 + + if(wrapcheck == 1) + H.tomail = 1 + + sleep(10) + if(last_sound < world.time + 1) + playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0) + last_sound = world.time + sleep(5) // wait for animation to finish + + H.init(src) // copy the contents of disposer to holder + air_contents = new() // new empty gas resv. + + H.start(src) // start the holder processing movement + flushing = 0 + // now reset disposal state + flush = 0 + if(mode == 2) // if was ready, + mode = 1 // switch to charging + update() + return + + +// called when area power changes +/obj/machinery/disposal/power_change() + ..() // do default setting/reset of stat NOPOWER bit + update() // update icon + return + + +// called when holder is expelled from a disposal +// should usually only occur if the pipe network is modified +/obj/machinery/disposal/proc/expel(var/obj/structure/disposalholder/H) + + var/turf/target + playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) + if(H) // Somehow, someone managed to flush a window which broke mid-transit and caused the disposal to go in an infinite loop trying to expel null, hopefully this fixes it + for(var/atom/movable/AM in H) + target = get_offset_target_turf(src.loc, rand(5)-rand(5), rand(5)-rand(5)) + + AM.loc = src.loc + AM.pipe_eject(0) + spawn(1) + if(AM) + AM.throw_at(target, 5, 1) + + H.vent_gas(loc) + qdel(H) + +/obj/machinery/disposal/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if (istype(mover,/obj/item) && mover.throwing) + var/obj/item/I = mover + if(istype(I, /obj/item/projectile)) + return + if(prob(75)) + I.loc = src + for(var/mob/M in viewers(src)) + M.show_message("\the [I] lands in \the [src].", 3) + else + for(var/mob/M in viewers(src)) + M.show_message("\the [I] bounces off of \the [src]'s rim!.", 3) + return 0 + else + return ..(mover, target, height, air_group) + +// virtual disposal object +// travels through pipes in lieu of actual items +// contents will be items flushed by the disposal +// this allows the gas flushed to be tracked + +/obj/structure/disposalholder + invisibility = 101 + var/datum/gas_mixture/gas = null // gas used to flush, will appear at exit point + var/active = 0 // true if the holder is moving, otherwise inactive + dir = 0 + var/count = 1000 //*** can travel 1000 steps before going inactive (in case of loops) + var/has_fat_guy = 0 // true if contains a fat person + var/destinationTag = 0 // changes if contains a delivery container + var/tomail = 0 //changes if contains wrapped package + var/hasmob = 0 //If it contains a mob + + + // initialize a holder from the contents of a disposal unit + proc/init(var/obj/machinery/disposal/D) + gas = D.air_contents// transfer gas resv. into holder object + + //Check for any living mobs trigger hasmob. + //hasmob effects whether the package goes to cargo or its tagged destination. + for(var/mob/living/M in D) + if(M && M.stat != 2) + hasmob = 1 + + //Checks 1 contents level deep. This means that players can be sent through disposals... + //...but it should require a second person to open the package. (i.e. person inside a wrapped locker) + for(var/obj/O in D) + if(O.contents) + for(var/mob/living/M in O.contents) + if(M && M.stat != 2) + hasmob = 1 + + // now everything inside the disposal gets put into the holder + // note AM since can contain mobs or objs + for(var/atom/movable/AM in D) + AM.loc = src + if(istype(AM, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = AM + if(FAT in H.mutations) // is a human and fat? + has_fat_guy = 1 // set flag on holder + if(istype(AM, /obj/structure/bigDelivery) && !hasmob) + var/obj/structure/bigDelivery/T = AM + src.destinationTag = T.sortTag + if(istype(AM, /obj/item/smallDelivery) && !hasmob) + var/obj/item/smallDelivery/T = AM + src.destinationTag = T.sortTag + + + // start the movement process + // argument is the disposal unit the holder started in + proc/start(var/obj/machinery/disposal/D) + if(!D.trunk) + D.expel(src) // no trunk connected, so expel immediately + return + + loc = D.trunk + active = 1 + dir = DOWN + spawn(1) + move() // spawn off the movement process + + return + + // movement process, persists while holder is moving through pipes + proc/move() + var/obj/structure/disposalpipe/last + while(active) + if(has_fat_guy && prob(2)) // chance of becoming stuck per segment if contains a fat guy + active = 0 + // find the fat guys + for(var/mob/living/carbon/human/H in src) + + break + sleep(1) // was 1 + var/obj/structure/disposalpipe/curr = loc + last = curr + curr = curr.transfer(src) + if(!curr) + last.expel(src, loc, dir) + + // + if(!(count--)) + active = 0 + return + + + + // find the turf which should contain the next pipe + proc/nextloc() + return get_step(loc,dir) + + // find a matching pipe on a turf + proc/findpipe(var/turf/T) + + if(!T) + return null + + var/fdir = turn(dir, 180) // flip the movement direction + for(var/obj/structure/disposalpipe/P in T) + if(fdir & P.dpdir) // find pipe direction mask that matches flipped dir + return P + // if no matching pipe, return null + return null + + // merge two holder objects + // used when a a holder meets a stuck holder + proc/merge(var/obj/structure/disposalholder/other) + for(var/atom/movable/AM in other) + AM.loc = src // move everything in other holder to this one + if(ismob(AM)) + var/mob/M = AM + if(M.client) // if a client mob, update eye to follow this holder + M.client.eye = src + + if(other.has_fat_guy) + has_fat_guy = 1 + qdel(other) + + + // called when player tries to move while in a pipe + relaymove(mob/user as mob) + if (user.stat) + return + if (src.loc) + for (var/mob/M in hearers(src.loc.loc)) + M << "CLONG, clong!" + + playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0) + + // called to vent all gas in holder to a location + proc/vent_gas(var/atom/location) + location.assume_air(gas) // vent all gas to turf + return + +// Disposal pipes + +/obj/structure/disposalpipe + icon = 'icons/obj/pipes/disposal.dmi' + name = "disposal pipe" + desc = "An underfloor disposal pipe." + anchored = 1 + density = 0 + + level = 1 // underfloor only + var/dpdir = 0 // bitmask of pipe directions + dir = 0 // dir will contain dominant direction for junction pipes + var/health = 10 // health points 0-10 + layer = 2.3 // slightly lower than wires and other pipes + var/base_icon_state // initial icon state on map + + // new pipe, set the icon_state as on map + New() + ..() + base_icon_state = icon_state + return + + + // pipe is deleted + // ensure if holder is present, it is expelled + Destroy() + var/obj/structure/disposalholder/H = locate() in src + if(H) + // holder was present + H.active = 0 + var/turf/T = src.loc + if(T.density) + // deleting pipe is inside a dense turf (wall) + // this is unlikely, but just dump out everything into the turf in case + + for(var/atom/movable/AM in H) + AM.loc = T + AM.pipe_eject(0) + qdel(H) + ..() + return + + // otherwise, do normal expel from turf + if(H) + expel(H, T, 0) + ..() + + // returns the direction of the next pipe object, given the entrance dir + // by default, returns the bitmask of remaining directions + proc/nextdir(var/fromdir) + return dpdir & (~turn(fromdir, 180)) + + // transfer the holder through this pipe segment + // overriden for special behaviour + // + proc/transfer(var/obj/structure/disposalholder/H) + var/nextdir = nextdir(H.dir) + H.dir = nextdir + var/turf/T = H.nextloc() + var/obj/structure/disposalpipe/P = H.findpipe(T) + + if(P) + // find other holder in next loc, if inactive merge it with current + var/obj/structure/disposalholder/H2 = locate() in P + if(H2 && !H2.active) + H.merge(H2) + + H.loc = P + else // if wasn't a pipe, then set loc to turf + H.loc = T + return null + + return P + + + // update the icon_state to reflect hidden status + proc/update() + var/turf/T = src.loc + hide(T.intact && !istype(T,/turf/space)) // space never hides pipes + + // hide called by levelupdate if turf intact status changes + // change visibility status and force update of icon + hide(var/intact) + invisibility = intact ? 101: 0 // hide if floor is intact + updateicon() + + // update actual icon_state depending on visibility + // if invisible, append "f" to icon_state to show faded version + // this will be revealed if a T-scanner is used + // if visible, use regular icon_state + proc/updateicon() + if(invisibility) + icon_state = "[base_icon_state]f" + else + icon_state = base_icon_state + return + + + // expel the held objects into a turf + // called when there is a break in the pipe + // + + proc/expel(var/obj/structure/disposalholder/H, var/turf/T, var/direction) + + var/turf/target + + if(istype(T, /turf/simulated/floor)) //intact floor, pop the tile + var/turf/simulated/floor/F = T + if(F.floor_tile) + F.floor_tile.loc = H //It took me a day to figure out this was the right way to do it. ¯\_(;_;)_/¯ + F.floor_tile = null //So it doesn't get deleted in make_plating() + F.make_plating() + + if(direction) // direction is specified + if(istype(T, /turf/space)) // if ended in space, then range is unlimited + target = get_edge_target_turf(T, direction) + else // otherwise limit to 10 tiles + target = get_ranged_target_turf(T, direction, 10) + + playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) + if(H) + for(var/atom/movable/AM in H) + AM.loc = T + AM.pipe_eject(direction) + spawn(1) + if(AM) + AM.throw_at(target, 100, 1) + + else // no specified direction, so throw in random direction + + playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) + if(H) + for(var/atom/movable/AM in H) + target = get_offset_target_turf(T, rand(5)-rand(5), rand(5)-rand(5)) + + AM.loc = T + AM.pipe_eject(0) + spawn(1) + if(AM) + AM.throw_at(target, 5, 1) + H.vent_gas(T) + qdel(H) + return + + // call to break the pipe + // will expel any holder inside at the time + // then delete the pipe + // remains : set to leave broken pipe pieces in place + proc/broken(var/remains = 0) + if(remains) + for(var/D in cardinal) + if(D & dpdir) + var/obj/structure/disposalpipe/broken/P = new(src.loc) + P.dir = D + + src.invisibility = 101 // make invisible (since we won't delete the pipe immediately) + var/obj/structure/disposalholder/H = locate() in src + if(H) + // holder was present + H.active = 0 + var/turf/T = src.loc + if(T.density) + // broken pipe is inside a dense turf (wall) + // this is unlikely, but just dump out everything into the turf in case + + for(var/atom/movable/AM in H) + AM.loc = T + AM.pipe_eject(0) + qdel(H) + return + + // otherwise, do normal expel from turf + if(H) + expel(H, T, 0) + + spawn(2) // delete pipe after 2 ticks to ensure expel proc finished + qdel(src) + + + // pipe affected by explosion + ex_act(severity) + + switch(severity) + if(1.0) + broken(0) + return + if(2.0) + health -= rand(5,15) + healthcheck() + return + if(3.0) + health -= rand(0,15) + healthcheck() + return + + + // test health for brokenness + proc/healthcheck() + if(health < -2) + broken(0) + else if(health<1) + broken(1) + return + + //attack by item + //weldingtool: unfasten and convert to obj/disposalconstruct + + attackby(var/obj/item/I, var/mob/user) + + var/turf/T = src.loc + if(T.intact) + return // prevent interaction with T-scanner revealed pipes + src.add_fingerprint(user) + if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/W = I + + if(W.remove_fuel(0,user)) + playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) + // check if anything changed over 2 seconds + var/turf/uloc = user.loc + var/atom/wloc = W.loc + user << "Slicing the disposal pipe." + sleep(30) + if(!W.isOn()) return + if(user.loc == uloc && wloc == W.loc) + welded() + else + user << "You must stay still while welding the pipe." + else + user << "You need more welding fuel to cut the pipe." + return + + // called when pipe is cut with welder + proc/welded() + + var/obj/structure/disposalconstruct/C = new (src.loc) + switch(base_icon_state) + if("pipe-s") + C.ptype = 0 + if("pipe-c") + C.ptype = 1 + if("pipe-j1") + C.ptype = 2 + if("pipe-j2") + C.ptype = 3 + if("pipe-y") + C.ptype = 4 + if("pipe-t") + C.ptype = 5 + if("pipe-j1s") + C.ptype = 9 + if("pipe-j2s") + C.ptype = 10 + src.transfer_fingerprints_to(C) + C.dir = dir + C.density = 0 + C.anchored = 1 + C.update() + + qdel(src) + +// *** TEST verb +//client/verb/dispstop() +// for(var/obj/structure/disposalholder/H in world) +// H.active = 0 + +// a straight or bent segment +/obj/structure/disposalpipe/segment + icon_state = "pipe-s" + + New() + ..() + if(icon_state == "pipe-s") + dpdir = dir | turn(dir, 180) + else + dpdir = dir | turn(dir, -90) + + update() + return + + + + +//a three-way junction with dir being the dominant direction +/obj/structure/disposalpipe/junction + icon_state = "pipe-j1" + + New() + ..() + if(icon_state == "pipe-j1") + dpdir = dir | turn(dir, -90) | turn(dir,180) + else if(icon_state == "pipe-j2") + dpdir = dir | turn(dir, 90) | turn(dir,180) + else // pipe-y + dpdir = dir | turn(dir,90) | turn(dir, -90) + update() + return + + + // next direction to move + // if coming in from secondary dirs, then next is primary dir + // if coming in from primary dir, then next is equal chance of other dirs + + nextdir(var/fromdir) + var/flipdir = turn(fromdir, 180) + if(flipdir != dir) // came from secondary dir + return dir // so exit through primary + else // came from primary + // so need to choose either secondary exit + var/mask = ..(fromdir) + + // find a bit which is set + var/setbit = 0 + if(mask & NORTH) + setbit = NORTH + else if(mask & SOUTH) + setbit = SOUTH + else if(mask & EAST) + setbit = EAST + else + setbit = WEST + + if(prob(50)) // 50% chance to choose the found bit or the other one + return setbit + else + return mask & (~setbit) + +//a three-way junction that sorts objects +/obj/structure/disposalpipe/sortjunction + + icon_state = "pipe-j1s" + var/sortType = 0 //Look at the list called TAGGERLOCATIONS in setup.dm + var/posdir = 0 + var/negdir = 0 + var/sortdir = 0 + + proc/updatedesc() + desc = "An underfloor disposal pipe with a package sorting mechanism." + if(sortType>0) + var/tag = uppertext(TAGGERLOCATIONS[sortType]) + desc += "\nIt's tagged with [tag]" + + proc/updatedir() + posdir = dir + negdir = turn(posdir, 180) + + if(icon_state == "pipe-j1s") + sortdir = turn(posdir, -90) + else + icon_state = "pipe-j2s" + sortdir = turn(posdir, 90) + + dpdir = sortdir | posdir | negdir + + New() + ..() + updatedir() + updatedesc() + update() + return + + attackby(var/obj/item/I, var/mob/user) + if(..()) + return + + if(istype(I, /obj/item/device/destTagger)) + var/obj/item/device/destTagger/O = I + + if(O.currTag > 0)// Tag set + sortType = O.currTag + playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1) + var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) + user << "\blue Changed filter to [tag]" + updatedesc() + + + // next direction to move + // if coming in from negdir, then next is primary dir or sortdir + // if coming in from posdir, then flip around and go back to posdir + // if coming in from sortdir, go to posdir + + nextdir(var/fromdir, var/sortTag) + //var/flipdir = turn(fromdir, 180) + if(fromdir != sortdir) // probably came from the negdir + + if(src.sortType == sortTag) //if destination matches filtered type... + return sortdir // exit through sortdirection + else + return posdir + else // came from sortdir + // so go with the flow to positive direction + return posdir + + transfer(var/obj/structure/disposalholder/H) + var/nextdir = nextdir(H.dir, H.destinationTag) + H.dir = nextdir + var/turf/T = H.nextloc() + var/obj/structure/disposalpipe/P = H.findpipe(T) + + if(P) + // find other holder in next loc, if inactive merge it with current + var/obj/structure/disposalholder/H2 = locate() in P + if(H2 && !H2.active) + H.merge(H2) + + H.loc = P + else // if wasn't a pipe, then set loc to turf + H.loc = T + return null + + return P + + +//a three-way junction that sorts objects destined for the mail office mail table (tomail = 1) +/obj/structure/disposalpipe/wrapsortjunction + + desc = "An underfloor disposal pipe which sorts wrapped and unwrapped objects." + icon_state = "pipe-j1s" + var/posdir = 0 + var/negdir = 0 + var/sortdir = 0 + + New() + ..() + posdir = dir + if(icon_state == "pipe-j1s") + sortdir = turn(posdir, -90) + negdir = turn(posdir, 180) + else + icon_state = "pipe-j2s" + sortdir = turn(posdir, 90) + negdir = turn(posdir, 180) + dpdir = sortdir | posdir | negdir + + update() + return + + // next direction to move + // if coming in from negdir, then next is primary dir or sortdir + // if coming in from posdir, then flip around and go back to posdir + // if coming in from sortdir, go to posdir + + nextdir(var/fromdir, var/istomail) + //var/flipdir = turn(fromdir, 180) + if(fromdir != sortdir) // probably came from the negdir + + if(istomail) //if destination matches filtered type... + return sortdir // exit through sortdirection + else + return posdir + else // came from sortdir + // so go with the flow to positive direction + return posdir + + transfer(var/obj/structure/disposalholder/H) + var/nextdir = nextdir(H.dir, H.tomail) + H.dir = nextdir + var/turf/T = H.nextloc() + var/obj/structure/disposalpipe/P = H.findpipe(T) + + if(P) + // find other holder in next loc, if inactive merge it with current + var/obj/structure/disposalholder/H2 = locate() in P + if(H2 && !H2.active) + H.merge(H2) + + H.loc = P + else // if wasn't a pipe, then set loc to turf + H.loc = T + return null + + return P + + + + + +//a trunk joining to a disposal bin or outlet on the same turf +/obj/structure/disposalpipe/trunk + icon_state = "pipe-t" + var/obj/linked // the linked obj/machinery/disposal or obj/disposaloutlet + +/obj/structure/disposalpipe/trunk/New() + ..() + dpdir = dir + spawn(1) + getlinked() + + update() + return + +/obj/structure/disposalpipe/trunk/proc/getlinked() + linked = null + var/obj/machinery/disposal/D = locate() in src.loc + if(D) + linked = D + if (!D.trunk) + D.trunk = src + + var/obj/structure/disposaloutlet/O = locate() in src.loc + if(O) + linked = O + + update() + return + + // Override attackby so we disallow trunkremoval when somethings ontop +/obj/structure/disposalpipe/trunk/attackby(var/obj/item/I, var/mob/user) + + //Disposal bins or chutes + /* + These shouldn't be required + var/obj/machinery/disposal/D = locate() in src.loc + if(D && D.anchored) + return + + //Disposal outlet + var/obj/structure/disposaloutlet/O = locate() in src.loc + if(O && O.anchored) + return + */ + + //Disposal constructors + var/obj/structure/disposalconstruct/C = locate() in src.loc + if(C && C.anchored) + return + + var/turf/T = src.loc + if(T.intact) + return // prevent interaction with T-scanner revealed pipes + src.add_fingerprint(user) + if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/W = I + + if(linked) + user << "You need to deconstruct disposal machinery above this pipe." + return + + if(W.remove_fuel(0,user)) + playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) + // check if anything changed over 2 seconds + var/turf/uloc = user.loc + var/atom/wloc = W.loc + user << "Slicing the disposal pipe." + sleep(30) + if(!W.isOn()) return + if(user.loc == uloc && wloc == W.loc) + welded() + else + user << "You must stay still while welding the pipe." + else + user << "You need more welding fuel to cut the pipe." + + return + + // would transfer to next pipe segment, but we are in a trunk + // if not entering from disposal bin, + // transfer to linked object (outlet or bin) + +/obj/structure/disposalpipe/trunk/transfer(var/obj/structure/disposalholder/H) + + if(H.dir == DOWN) // we just entered from a disposer + return ..() // so do base transfer proc + // otherwise, go to the linked object + if(linked) + var/obj/structure/disposaloutlet/O = linked + if(istype(O) && (H)) + O.expel(H) // expel at outlet + else + var/obj/machinery/disposal/D = linked + if(H) + D.expel(H) // expel at disposal + else + if(H) + src.expel(H, src.loc, 0) // expel at turf + return null + + // nextdir + +/obj/structure/disposalpipe/trunk/nextdir(var/fromdir) + if(fromdir == DOWN) + return dir + else + return 0 + +// a broken pipe +/obj/structure/disposalpipe/broken + icon_state = "pipe-b" + dpdir = 0 // broken pipes have dpdir=0 so they're not found as 'real' pipes + // i.e. will be treated as an empty turf + desc = "A broken piece of disposal pipe." + + New() + ..() + update() + return + + // called when welded + // for broken pipe, remove and turn into scrap + + welded() +// var/obj/item/scrap/S = new(src.loc) +// S.set_components(200,0,0) + qdel(src) + +// the disposal outlet machine + +/obj/structure/disposaloutlet + name = "disposal outlet" + desc = "An outlet for the pneumatic disposal system." + icon = 'icons/obj/pipes/disposal.dmi' + icon_state = "outlet" + density = 1 + anchored = 1 + var/active = 0 + var/turf/target // this will be where the output objects are 'thrown' to. + var/mode = 0 + var/start_eject = 0 + var/eject_range = 2 + + New() + ..() + + spawn(1) + target = get_ranged_target_turf(src, dir, 10) + + + var/obj/structure/disposalpipe/trunk/trunk = locate() in src.loc + if(trunk) + trunk.linked = src // link the pipe trunk to self + + // expel the contents of the holder object, then delete it + // called when the holder exits the outlet + proc/expel(var/obj/structure/disposalholder/H) + + flick("outlet-open", src) + if((start_eject + 30) < world.time) + start_eject = world.time + playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0) + sleep(20) + playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) + else + sleep(20) + if(H) + for(var/atom/movable/AM in H) + AM.loc = src.loc + AM.pipe_eject(dir) + spawn(5) + if(AM) + AM.throw_at(target, eject_range, 1) + H.vent_gas(src.loc) + qdel(H) + return + + attackby(var/obj/item/I, var/mob/user) + if(!I || !user) + return + src.add_fingerprint(user) + if(istype(I, /obj/item/weapon/screwdriver)) + if(mode==0) + mode=1 + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You remove the screws around the power connection." + return + else if(mode==1) + mode=0 + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You attach the screws around the power connection." + return + else if(istype(I,/obj/item/weapon/weldingtool) && mode==1) + var/obj/item/weapon/weldingtool/W = I + if(W.remove_fuel(0,user)) + playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) + user << "You start slicing the floorweld off \the [src]." + if(do_after(user,20)) + if(!src || !W.isOn()) return + user << "You slice the floorweld off \the [src]." + var/obj/structure/disposalconstruct/C = new (src.loc) + src.transfer_fingerprints_to(C) + C.ptype = 7 // 7 = outlet + C.update() + C.anchored = 1 + C.density = 1 + qdel(src) + return + else + user << "You need more welding fuel to complete this task." + return + + + +// called when movable is expelled from a disposal pipe or outlet +// by default does nothing, override for special behaviour + +/atom/movable/proc/pipe_eject(var/direction) + return + +// check if mob has client, if so restore client view on eject +/mob/pipe_eject(var/direction) + if (src.client) + src.client.perspective = MOB_PERSPECTIVE + src.client.eye = src + + return + +/obj/effect/decal/cleanable/blood/gibs/pipe_eject(var/direction) + var/list/dirs + if(direction) + dirs = list( direction, turn(direction, -45), turn(direction, 45)) + else + dirs = alldirs.Copy() + + src.streak(dirs) + +/obj/effect/decal/cleanable/robot_debris/gib/pipe_eject(var/direction) + var/list/dirs + if(direction) + dirs = list( direction, turn(direction, -45), turn(direction, 45)) + else + dirs = alldirs.Copy() + + src.streak(dirs) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 1b4e584a9ec..043116087bf 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -10,9 +10,9 @@ /obj/structure/bigDelivery/attack_hand(mob/user as mob) - del(src) + qdel(src) -/obj/structure/bigDelivery/Del() +/obj/structure/bigDelivery/Destroy() if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 wrapped.loc = (get_turf(loc)) if(istype(wrapped, /obj/structure/closet)) @@ -66,7 +66,7 @@ else wrapped.loc = get_turf(src) - del(src) + qdel(src) attackby(obj/item/W as obj, mob/user as mob) @@ -156,7 +156,7 @@ user << "The object you are trying to wrap is unsuitable for the sorting machinery." if(amount <= 0) new /obj/item/weapon/c_tube( loc ) - del(src) + qdel(src) return return @@ -315,7 +315,7 @@ C.update() C.anchored = 1 C.density = 1 - del(src) + qdel(src) return else user << "You need more welding fuel to complete this task." diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 0203d34a07e..d2f0e73a597 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -41,10 +41,10 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). /obj/machinery/r_n_d/circuit_imprinter/blob_act() if (prob(50)) - del(src) + qdel(src) /obj/machinery/r_n_d/circuit_imprinter/meteorhit() - del(src) + qdel(src) return /obj/machinery/r_n_d/circuit_imprinter/proc/check_mat(datum/design/being_built, var/M) diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index be42adb48c7..3649c8ba438 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -29,7 +29,7 @@ Note: Must be placed within 3 tiles of the R&D Console decon_mod = T /obj/machinery/r_n_d/destructive_analyzer/meteorhit() - del(src) + qdel(src) return /obj/machinery/r_n_d/destructive_analyzer/proc/ConvertReqString2List(var/list/source_list) diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index cfc33660d10..884d4eb2f8b 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -66,7 +66,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() ..() return -/obj/machinery/message_server/Del() +/obj/machinery/message_server/Destroy() message_servers -= src ..() return @@ -200,10 +200,10 @@ var/obj/machinery/blackbox_recorder/blackbox /obj/machinery/blackbox_recorder/New() if(blackbox) if(istype(blackbox,/obj/machinery/blackbox_recorder)) - del(src) + qdel(src) blackbox = src -/obj/machinery/blackbox_recorder/Del() +/obj/machinery/blackbox_recorder/Destroy() var/turf/T = locate(1,1,2) if(T) blackbox = null diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 8fdfa403d14..085495d7b12 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -280,11 +280,11 @@ won't update every console in existence) but it's more of a hassle to do. Also, S.amount-- linked_destroy.loaded_item = S else - del(S) + qdel(S) linked_destroy.icon_state = "d_analyzer" else if(!(I in linked_destroy.component_parts)) - del(I) + qdel(I) linked_destroy.icon_state = "d_analyzer" use_power(250) updateUsrDialog() @@ -507,7 +507,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, sheet.amount = min(available_num_sheets, desired_num_sheets) linked_lathe.vars[res_amount] = max(0, (linked_lathe.vars[res_amount]-sheet.amount * sheet.perunit)) else - del sheet + qdel(sheet) else if(href_list["imprinter_ejectsheet"] && linked_imprinter) //Causes the protolathe to eject a sheet of material var/desired_num_sheets = text2num(href_list["imprinter_ejectsheet_amt"]) var/res_amount, type @@ -528,7 +528,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, sheet.amount = min(available_num_sheets, desired_num_sheets) linked_imprinter.vars[res_amount] = max(0, (linked_imprinter.vars[res_amount]-sheet.amount * sheet.perunit)) else - del sheet + qdel(sheet) else if(href_list["find_device"]) //The R&D console looks for devices nearby to link up with. screen = 0.0 diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index c5ecc05ef1e..ef765b17f9e 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -1,269 +1,269 @@ -/* -General Explination: -The research datum is the "folder" where all the research information is stored in a R&D console. It's also a holder for all the -various procs used to manipulate it. It has four variables and seven procs: - -Variables: -- possible_tech is a list of all the /datum/tech that can potentially be researched by the player. The RefreshResearch() proc -(explained later) only goes through those when refreshing what you know. Generally, possible_tech contains ALL of the existing tech -but it is possible to add tech to the game that DON'T start in it (example: Xeno tech). Generally speaking, you don't want to mess -with these since they should be the default version of the datums. They're actually stored in a list rather then using typesof to -refer to them since it makes it a bit easier to search through them for specific information. -- know_tech is the companion list to possible_tech. It's the tech you can actually research and improve. Until it's added to this -list, it can't be improved. All the tech in this list are visible to the player. -- possible_designs is functionally identical to possbile_tech except it's for /datum/design. -- known_designs is functionally identical to known_tech except it's for /datum/design - -Procs: -- TechHasReqs: Used by other procs (specifically RefreshResearch) to see whether all of a tech's requirements are currently in -known_tech and at a high enough level. -- DesignHasReqs: Same as TechHasReqs but for /datum/design and known_design. -- AddTech2Known: Adds a /datum/tech to known_tech. It checks to see whether it already has that tech (if so, it just replaces it). If -it doesn't have it, it adds it. Note: It does NOT check possible_tech at all. So if you want to add something strange to it (like -a player made tech?) you can. -- AddDesign2Known: Same as AddTech2Known except for /datum/design and known_designs. -- RefreshResearch: This is the workhorse of the R&D system. It updates the /datum/research holder and adds any unlocked tech paths -and designs you have reached the requirements for. It only checks through possible_tech and possible_designs, however, so it won't -accidentally add "secret" tech to it. -- UpdateTech is used as part of the actual researching process. It takes an ID and finds techs with that same ID in known_tech. When -it finds it, it checks to see whether it can improve it at all. If the known_tech's level is less then or equal to -the inputted level, it increases the known tech's level to the inputted level -1 or know tech's level +1 (whichever is higher). - -The tech datums are the actual "tech trees" that you improve through researching. Each one has five variables: -- Name: Pretty obvious. This is often viewable to the players. -- Desc: Pretty obvious. Also player viewable. -- ID: This is the unique ID of the tech that is used by the various procs to find and/or maniuplate it. -- Level: This is the current level of the tech. All techs start at 1 and have a max of 20. Devices and some techs require a certain -level in specific techs before you can produce them. -- Req_tech: This is a list of the techs required to unlock this tech path. If left blank, it'll automatically be loaded into the -research holder datum. - -*/ -/*************************************************************** -** Master Types ** -** Includes all the helper procs and basic tech processing. ** -***************************************************************/ - -/datum/research //Holder for all the existing, archived, and known tech. Individual to console. - - //Datum/tech go here. - var/list/possible_tech = list() //List of all tech in the game that players have access to (barring special events). - var/list/known_tech = list() //List of locally known tech. - var/list/possible_designs = list() //List of all designs (at base reliability). - var/list/known_designs = list() //List of available designs (at base reliability). - -/datum/research/New() //Insert techs into possible_tech here. Known_tech automatically updated. - for(var/T in typesof(/datum/tech) - /datum/tech) - possible_tech += new T(src) - for(var/D in typesof(/datum/design) - /datum/design) - possible_designs += new D(src) - RefreshResearch() - - - -//Checks to see if tech has all the required pre-reqs. -//Input: datum/tech; Output: 0/1 (false/true) -/datum/research/proc/TechHasReqs(var/datum/tech/T) - if(T.req_tech.len == 0) - return 1 - var/matches = 0 - for(var/req in T.req_tech) - for(var/datum/tech/known in known_tech) - if((req == known.id) && (known.level >= T.req_tech[req])) - matches++ - break - if(matches == T.req_tech.len) - return 1 - else - return 0 - -//Checks to see if design has all the required pre-reqs. -//Input: datum/design; Output: 0/1 (false/true) -/datum/research/proc/DesignHasReqs(var/datum/design/D)//Heavily optimized -Sieve - if(D.req_tech.len == 0) - return 1 - for(var/datum/tech/T in known_tech) - if((D.req_tech[T.id]) && (T.level < D.req_tech[T.id])) - return 0 - return 1 - -/* -//Checks to see if design has all the required pre-reqs. -//Input: datum/design; Output: 0/1 (false/true) -/datum/research/proc/DesignHasReqs(var/datum/design/D) - if(D.req_tech.len == 0) - return 1 - var/matches = 0 - for(var/req in D.req_tech) - for(var/datum/tech/known in known_tech) - if((req == known.id) && (known.level >= D.req_tech[req])) - matches++ - break - if(matches == D.req_tech.len) - return 1 - else - return 0 -*/ -//Adds a tech to known_tech list. Checks to make sure there aren't duplicates and updates existing tech's levels if needed. -//Input: datum/tech; Output: Null -/datum/research/proc/AddTech2Known(var/datum/tech/T) - for(var/datum/tech/known in known_tech) - if(T.id == known.id) - if(T.level > known.level) - known.level = T.level - return - known_tech += T - return - -/datum/research/proc/AddDesign2Known(var/datum/design/D) - for(var/datum/design/known in known_designs) - if(D.id == known.id) - if(D.reliability > known.reliability) - known.reliability = D.reliability - return - known_designs += D - return - -//Refreshes known_tech and known_designs list. Then updates the reliability vars of the designs in the known_designs list. -//Input/Output: n/a -/datum/research/proc/RefreshResearch() - for(var/datum/tech/PT in possible_tech) - if(TechHasReqs(PT)) - AddTech2Known(PT) - for(var/datum/design/PD in possible_designs) - if(DesignHasReqs(PD)) - AddDesign2Known(PD) - for(var/datum/tech/T in known_tech) - T = Clamp(T.level, 1, 20) - for(var/datum/design/D in known_designs) - D.CalcReliability(known_tech) - return - -//Refreshes the levels of a given tech. -//Input: Tech's ID and Level; Output: null -/datum/research/proc/UpdateTech(var/ID, var/level) - for(var/datum/tech/KT in known_tech) - if(KT.id == ID) - if(KT.level <= level) - KT.level = max((KT.level + 1), (level - 1)) - return - -/datum/research/proc/UpdateDesigns(var/obj/item/I, var/list/temp_tech) - for(var/T in temp_tech) - if(temp_tech[T] - 1 >= known_tech[T]) - for(var/datum/design/D in known_designs) - if(D.req_tech[T]) - D.reliability = min(100, D.reliability + 1) - if(D.build_path == I.type) - D.reliability = min(100, D.reliability + rand(1,3)) - if(I.crit_fail) - D.reliability = min(100, D.reliability + rand(3, 5)) - - -/*************************************************************** -** Technology Datums ** -** Includes all the various technoliges and what they make. ** -***************************************************************/ - -datum/tech //Datum of individual technologies. - var/name = "name" //Name of the technology. - var/desc = "description" //General description of what it does and what it makes. - var/id = "id" //An easily referenced ID. Must be alphanumeric, lower-case, and no symbols. - var/level = 1 //A simple number scale of the research level. Level 0 = Secret tech. - var/list/req_tech = list() //List of ids associated values of techs required to research this tech. "id" = # - - -//Trunk Technologies (don't require any other techs and you start knowning them). - -datum/tech/materials - name = "Materials Research" - desc = "Development of new and improved materials." - id = "materials" - -datum/tech/engineering - name = "Engineering Research" - desc = "Development of new and improved engineering parts and." - id = "engineering" - -datum/tech/plasmatech - name = "Plasma Research" - desc = "Research into the mysterious substance colloqually known as 'plasma'." - id = "plasmatech" - -datum/tech/powerstorage - name = "Power Manipulation Technology" - desc = "The various technologies behind the storage and generation of electicity." - id = "powerstorage" - -datum/tech/bluespace - name = "'Blue-space' Research" - desc = "Research into the sub-reality known as 'blue-space'" - id = "bluespace" - -datum/tech/biotech - name = "Biological Technology" - desc = "Research into the deeper mysteries of life and organic substances." - id = "biotech" - -datum/tech/combat - name = "Combat Systems Research" - desc = "The development of offensive and defensive systems." - id = "combat" - -datum/tech/magnets - name = "Electromagnetic Spectrum Research" - desc = "Research into the electromagnetic spectrum. No clue how they actually work, though." - id = "magnets" - -datum/tech/programming - name = "Data Theory Research" - desc = "The development of new computer and artificial intelligence and data storage systems." - id = "programming" - -datum/tech/syndicate - name = "Illegal Technologies Research" - desc = "The study of technologies that violate Nanotrassen regulations." - id = "syndicate" - -/* -datum/tech/arcane - name = "Arcane Research" - desc = "Research into the occult and arcane field for use in practical science" - id = "arcane" - level = 0 //It didn't become "secret" as advertised. - -//Branch Techs -datum/tech/explosives - name = "Explosives Research" - desc = "The creation and application of explosive materials." - id = "explosives" - req_tech = list("materials" = 3) - -datum/tech/generators - name = "Power Generation Technology" - desc = "Research into more powerful and more reliable sources." - id = "generators" - req_tech = list("powerstorage" = 2) - -datum/tech/robotics - name = "Robotics Technology" - desc = "The development of advanced automated, autonomous machines." - id = "robotics" - req_tech = list("materials" = 3, "programming" = 3) -*/ - - -/obj/item/weapon/disk/tech_disk - name = "Technology Disk" - desc = "A disk for storing technology data for further research." - icon = 'icons/obj/cloning.dmi' - icon_state = "datadisk2" - item_state = "card-id" - w_class = 1.0 - m_amt = 30 - g_amt = 10 - var/datum/tech/stored - -/obj/item/weapon/disk/tech_disk/New() - src.pixel_x = rand(-5.0, 5) +/* +General Explination: +The research datum is the "folder" where all the research information is stored in a R&D console. It's also a holder for all the +various procs used to manipulate it. It has four variables and seven procs: + +Variables: +- possible_tech is a list of all the /datum/tech that can potentially be researched by the player. The RefreshResearch() proc +(explained later) only goes through those when refreshing what you know. Generally, possible_tech contains ALL of the existing tech +but it is possible to add tech to the game that DON'T start in it (example: Xeno tech). Generally speaking, you don't want to mess +with these since they should be the default version of the datums. They're actually stored in a list rather then using typesof to +refer to them since it makes it a bit easier to search through them for specific information. +- know_tech is the companion list to possible_tech. It's the tech you can actually research and improve. Until it's added to this +list, it can't be improved. All the tech in this list are visible to the player. +- possible_designs is functionally identical to possbile_tech except it's for /datum/design. +- known_designs is functionally identical to known_tech except it's for /datum/design + +Procs: +- TechHasReqs: Used by other procs (specifically RefreshResearch) to see whether all of a tech's requirements are currently in +known_tech and at a high enough level. +- DesignHasReqs: Same as TechHasReqs but for /datum/design and known_design. +- AddTech2Known: Adds a /datum/tech to known_tech. It checks to see whether it already has that tech (if so, it just replaces it). If +it doesn't have it, it adds it. Note: It does NOT check possible_tech at all. So if you want to add something strange to it (like +a player made tech?) you can. +- AddDesign2Known: Same as AddTech2Known except for /datum/design and known_designs. +- RefreshResearch: This is the workhorse of the R&D system. It updates the /datum/research holder and adds any unlocked tech paths +and designs you have reached the requirements for. It only checks through possible_tech and possible_designs, however, so it won't +accidentally add "secret" tech to it. +- UpdateTech is used as part of the actual researching process. It takes an ID and finds techs with that same ID in known_tech. When +it finds it, it checks to see whether it can improve it at all. If the known_tech's level is less then or equal to +the inputted level, it increases the known tech's level to the inputted level -1 or know tech's level +1 (whichever is higher). + +The tech datums are the actual "tech trees" that you improve through researching. Each one has five variables: +- Name: Pretty obvious. This is often viewable to the players. +- Desc: Pretty obvious. Also player viewable. +- ID: This is the unique ID of the tech that is used by the various procs to find and/or maniuplate it. +- Level: This is the current level of the tech. All techs start at 1 and have a max of 20. Devices and some techs require a certain +level in specific techs before you can produce them. +- Req_tech: This is a list of the techs required to unlock this tech path. If left blank, it'll automatically be loaded into the +research holder datum. + +*/ +/*************************************************************** +** Master Types ** +** Includes all the helper procs and basic tech processing. ** +***************************************************************/ + +/datum/research //Holder for all the existing, archived, and known tech. Individual to console. + + //Datum/tech go here. + var/list/possible_tech = list() //List of all tech in the game that players have access to (barring special events). + var/list/known_tech = list() //List of locally known tech. + var/list/possible_designs = list() //List of all designs (at base reliability). + var/list/known_designs = list() //List of available designs (at base reliability). + +/datum/research/New() //Insert techs into possible_tech here. Known_tech automatically updated. + for(var/T in typesof(/datum/tech) - /datum/tech) + possible_tech += new T(src) + for(var/D in typesof(/datum/design) - /datum/design) + possible_designs += new D(src) + RefreshResearch() + + + +//Checks to see if tech has all the required pre-reqs. +//Input: datum/tech; Output: 0/1 (false/true) +/datum/research/proc/TechHasReqs(var/datum/tech/T) + if(T.req_tech.len == 0) + return 1 + var/matches = 0 + for(var/req in T.req_tech) + for(var/datum/tech/known in known_tech) + if((req == known.id) && (known.level >= T.req_tech[req])) + matches++ + break + if(matches == T.req_tech.len) + return 1 + else + return 0 + +//Checks to see if design has all the required pre-reqs. +//Input: datum/design; Output: 0/1 (false/true) +/datum/research/proc/DesignHasReqs(var/datum/design/D)//Heavily optimized -Sieve + if(D.req_tech.len == 0) + return 1 + for(var/datum/tech/T in known_tech) + if((D.req_tech[T.id]) && (T.level < D.req_tech[T.id])) + return 0 + return 1 + +/* +//Checks to see if design has all the required pre-reqs. +//Input: datum/design; Output: 0/1 (false/true) +/datum/research/proc/DesignHasReqs(var/datum/design/D) + if(D.req_tech.len == 0) + return 1 + var/matches = 0 + for(var/req in D.req_tech) + for(var/datum/tech/known in known_tech) + if((req == known.id) && (known.level >= D.req_tech[req])) + matches++ + break + if(matches == D.req_tech.len) + return 1 + else + return 0 +*/ +//Adds a tech to known_tech list. Checks to make sure there aren't duplicates and updates existing tech's levels if needed. +//Input: datum/tech; Output: Null +/datum/research/proc/AddTech2Known(var/datum/tech/T) + for(var/datum/tech/known in known_tech) + if(T.id == known.id) + if(T.level > known.level) + known.level = T.level + return + known_tech += T + return + +/datum/research/proc/AddDesign2Known(var/datum/design/D) + for(var/datum/design/known in known_designs) + if(D.id == known.id) + if(D.reliability > known.reliability) + known.reliability = D.reliability + return + known_designs += D + return + +//Refreshes known_tech and known_designs list. Then updates the reliability vars of the designs in the known_designs list. +//Input/Output: n/a +/datum/research/proc/RefreshResearch() + for(var/datum/tech/PT in possible_tech) + if(TechHasReqs(PT)) + AddTech2Known(PT) + for(var/datum/design/PD in possible_designs) + if(DesignHasReqs(PD)) + AddDesign2Known(PD) + for(var/datum/tech/T in known_tech) + T = Clamp(T.level, 1, 20) + for(var/datum/design/D in known_designs) + D.CalcReliability(known_tech) + return + +//Refreshes the levels of a given tech. +//Input: Tech's ID and Level; Output: null +/datum/research/proc/UpdateTech(var/ID, var/level) + for(var/datum/tech/KT in known_tech) + if(KT.id == ID) + if(KT.level <= level) + KT.level = max((KT.level + 1), (level - 1)) + return + +/datum/research/proc/UpdateDesigns(var/obj/item/I, var/list/temp_tech) + for(var/T in temp_tech) + if(temp_tech[T] - 1 >= known_tech[T]) + for(var/datum/design/D in known_designs) + if(D.req_tech[T]) + D.reliability = min(100, D.reliability + 1) + if(D.build_path == I.type) + D.reliability = min(100, D.reliability + rand(1,3)) + if(I.crit_fail) + D.reliability = min(100, D.reliability + rand(3, 5)) + + +/*************************************************************** +** Technology Datums ** +** Includes all the various technoliges and what they make. ** +***************************************************************/ + +datum/tech //Datum of individual technologies. + var/name = "name" //Name of the technology. + var/desc = "description" //General description of what it does and what it makes. + var/id = "id" //An easily referenced ID. Must be alphanumeric, lower-case, and no symbols. + var/level = 1 //A simple number scale of the research level. Level 0 = Secret tech. + var/list/req_tech = list() //List of ids associated values of techs required to research this tech. "id" = # + + +//Trunk Technologies (don't require any other techs and you start knowning them). + +datum/tech/materials + name = "Materials Research" + desc = "Development of new and improved materials." + id = "materials" + +datum/tech/engineering + name = "Engineering Research" + desc = "Development of new and improved engineering parts and." + id = "engineering" + +datum/tech/plasmatech + name = "Plasma Research" + desc = "Research into the mysterious substance colloqually known as 'plasma'." + id = "plasmatech" + +datum/tech/powerstorage + name = "Power Manipulation Technology" + desc = "The various technologies behind the storage and generation of electicity." + id = "powerstorage" + +datum/tech/bluespace + name = "'Blue-space' Research" + desc = "Research into the sub-reality known as 'blue-space'" + id = "bluespace" + +datum/tech/biotech + name = "Biological Technology" + desc = "Research into the deeper mysteries of life and organic substances." + id = "biotech" + +datum/tech/combat + name = "Combat Systems Research" + desc = "The development of offensive and defensive systems." + id = "combat" + +datum/tech/magnets + name = "Electromagnetic Spectrum Research" + desc = "Research into the electromagnetic spectrum. No clue how they actually work, though." + id = "magnets" + +datum/tech/programming + name = "Data Theory Research" + desc = "The development of new computer and artificial intelligence and data storage systems." + id = "programming" + +datum/tech/syndicate + name = "Illegal Technologies Research" + desc = "The study of technologies that violate Nanotrassen regulations." + id = "syndicate" + +/* +datum/tech/arcane + name = "Arcane Research" + desc = "Research into the occult and arcane field for use in practical science" + id = "arcane" + level = 0 //It didn't become "secret" as advertised. + +//Branch Techs +datum/tech/explosives + name = "Explosives Research" + desc = "The creation and application of explosive materials." + id = "explosives" + req_tech = list("materials" = 3) + +datum/tech/generators + name = "Power Generation Technology" + desc = "Research into more powerful and more reliable sources." + id = "generators" + req_tech = list("powerstorage" = 2) + +datum/tech/robotics + name = "Robotics Technology" + desc = "The development of advanced automated, autonomous machines." + id = "robotics" + req_tech = list("materials" = 3, "programming" = 3) +*/ + + +/obj/item/weapon/disk/tech_disk + name = "Technology Disk" + desc = "A disk for storing technology data for further research." + icon = 'icons/obj/cloning.dmi' + icon_state = "datadisk2" + item_state = "card-id" + w_class = 1.0 + m_amt = 30 + g_amt = 10 + var/datum/tech/stored + +/obj/item/weapon/disk/tech_disk/New() + src.pixel_x = rand(-5.0, 5) src.pixel_y = rand(-5.0, 5) \ No newline at end of file diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index dcd3d5c3cc2..bf53508cb38 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -24,7 +24,7 @@ RefreshParts() src.initialize(); //Agouri -/obj/machinery/r_n_d/server/Del() +/obj/machinery/r_n_d/server/Destroy() griefProtection() ..() diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 2676fefc3d5..8fadd57ba3f 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -1,121 +1,126 @@ -var/obj/list/shuttles = list(("escape" = new /datum/shuttle_manager(/area/shuttle/escape/centcom, 0)), ("pod1" = new /datum/shuttle_manager(/area/shuttle/escape_pod1/station, 0)), ("pod2" = new /datum/shuttle_manager(/area/shuttle/escape_pod2/station, 0)), ("pod3" = new /datum/shuttle_manager(/area/shuttle/escape_pod3/station, 0)), ("pod4" = new /datum/shuttle_manager(/area/shuttle/escape_pod4/station, 0)), ("mining" = new /datum/shuttle_manager(/area/shuttle/mining/station, 10)), ("laborcamp" = new /datum/shuttle_manager(/area/shuttle/laborcamp/station, 10)), ("ferry" = new /datum/shuttle_manager(/area/shuttle/transport1/centcom, 0))) - //Pre-made shuttles should have non-number keys, so that buildable shuttles can use numbered keys without allowing 'I build a shuttle console with the escape number as its ID.' -datum/shuttle_manager - var/tickstomove = 10 //How long does it take to move the shuttle? - var/moving = 0 //Is it moving? - var/area/shuttle/location //The current location of the actual shuttle - -datum/shuttle_manager/New(var/area, var/delay) //Create a new shuttle manager for the shuttle starting area, "area" and with a movement delay of tickstomove - location = area - tickstomove = delay - - -datum/shuttle_manager/proc/move_shuttle(var/override_delay) - if(moving) return 0 - moving = 1 - spawn(override_delay == null ? tickstomove*10 : override_delay) - var/area/shuttle/fromArea - var/area/shuttle/toArea - fromArea = locate(location) //the location of the shuttle - toArea = locate(fromArea.destination) - - var/list/dstturfs = list() - var/throwy = world.maxy - - for(var/turf/T in toArea) - dstturfs += T - if(T.y < throwy) - throwy = T.y - - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - // NOTE: Commenting this out to avoid recreating mass driver glitch - /* - spawn(0) - AM.throw_at(E, 1, 1) - return - */ - - if(istype(T, /turf/simulated)) - del(T) - - for(var/mob/living/carbon/bug in toArea) // If someone somehow is still in the shuttle's docking area... - bug.gib() - - fromArea.move_contents_to(toArea) - location = toArea.type - - for(var/obj/machinery/door/D in toArea) //Close any doors on the shuttle - spawn(0) - D.close() - - for(var/mob/M in toArea) - if(M.client) - spawn(0) - if(M.buckled) - shake_camera(M, 2, 1) // turn it down a bit come on - else - shake_camera(M, 7, 1) - if(istype(M, /mob/living/carbon)) - if(!M.buckled) - M.Weaken(3) - - moving = 0 - return 1 - - - - -/obj/machinery/computer/shuttle - name = "Shuttle Console" - icon = 'icons/obj/computer.dmi' - icon_state = "shuttle" - req_access = list( ) - circuit = /obj/item/weapon/circuitboard/shuttle - var/id - -/obj/machinery/computer/shuttle/attack_hand(user as mob) - if(..(user)) - return - src.add_fingerprint(usr) - var/dat - dat = text("
    Send Shuttle
    ") - //user << browse("[dat]", "window=miningshuttle;size=200x100") - var/datum/browser/popup = new(user, "miningshuttle", name, 200, 140) - popup.set_content(dat) - popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - -/obj/machinery/computer/shuttle/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - src.add_fingerprint(usr) - if(!allowed(usr)) - usr << "\red Access denied." - return - if(href_list["move"]) - if(id in shuttles) - var/datum/shuttle_manager/s = shuttles[id] - if (s.move_shuttle()) - usr << "\blue Shuttle recieved message and will be sent shortly." - else - usr << "\blue Shuttle is already moving." - else - usr << "\red Invalid shuttle requested." - - -/obj/machinery/computer/shuttle/attackby(I as obj, user as mob) - - if (istype(I, /obj/item/weapon/card/emag)) - src.req_access = list() - emagged = 1 - usr << "You fried the consoles ID checking system. It's now available to everyone!" - else - ..() +var/obj/list/shuttles = list(("escape" = new /datum/shuttle_manager(/area/shuttle/escape/centcom, 0)), ("pod1" = new /datum/shuttle_manager(/area/shuttle/escape_pod1/station, 0)), ("pod2" = new /datum/shuttle_manager(/area/shuttle/escape_pod2/station, 0)), ("pod3" = new /datum/shuttle_manager(/area/shuttle/escape_pod3/station, 0)), ("pod4" = new /datum/shuttle_manager(/area/shuttle/escape_pod4/station, 0)), ("mining" = new /datum/shuttle_manager(/area/shuttle/mining/station, 10)), ("laborcamp" = new /datum/shuttle_manager(/area/shuttle/laborcamp/station, 10)), ("ferry" = new /datum/shuttle_manager(/area/shuttle/transport1/centcom, 0))) + //Pre-made shuttles should have non-number keys, so that buildable shuttles can use numbered keys without allowing 'I build a shuttle console with the escape number as its ID.' +datum/shuttle_manager + var/tickstomove = 10 //How long does it take to move the shuttle? + var/moving = 0 //Is it moving? + var/area/shuttle/location //The current location of the actual shuttle + +datum/shuttle_manager/New(var/area, var/delay) //Create a new shuttle manager for the shuttle starting area, "area" and with a movement delay of tickstomove + location = area + tickstomove = delay + var/area/A = locate(location) + A.has_gravity = 1 + + +datum/shuttle_manager/proc/move_shuttle(var/override_delay) + if(moving) return 0 + moving = 1 + spawn(override_delay == null ? tickstomove*10 : override_delay) + var/area/shuttle/fromArea + var/area/shuttle/toArea + fromArea = locate(location) //the location of the shuttle + toArea = locate(fromArea.destination) + + var/list/dstturfs = list() + var/throwy = world.maxy + + for(var/turf/T in toArea) + dstturfs += T + if(T.y < throwy) + throwy = T.y + + // hey you, get out of the way! + for(var/turf/T in dstturfs) + // find the turf to move things to + var/turf/D = locate(T.x, throwy - 1, 1) + //var/turf/E = get_step(D, SOUTH) + for(var/atom/movable/AM as mob|obj in T) + AM.Move(D) + // NOTE: Commenting this out to avoid recreating mass driver glitch + /* + spawn(0) + AM.throw_at(E, 1, 1) + return + */ + + if(istype(T, /turf/simulated)) + del(T) + + for(var/mob/living/carbon/bug in toArea) // If someone somehow is still in the shuttle's docking area... + bug.gib() + + fromArea.move_contents_to(toArea) + location = toArea.type + + fromArea.has_gravity = 0 + toArea.has_gravity = 1 + + for(var/obj/machinery/door/D in toArea) //Close any doors on the shuttle + spawn(0) + D.close() + + for(var/mob/M in toArea) + if(M.client) + spawn(0) + if(M.buckled) + shake_camera(M, 2, 1) // turn it down a bit come on + else + shake_camera(M, 7, 1) + if(istype(M, /mob/living/carbon)) + if(!M.buckled) + M.Weaken(3) + + moving = 0 + return 1 + + + + +/obj/machinery/computer/shuttle + name = "Shuttle Console" + icon = 'icons/obj/computer.dmi' + icon_state = "shuttle" + req_access = list( ) + circuit = /obj/item/weapon/circuitboard/shuttle + var/id + +/obj/machinery/computer/shuttle/attack_hand(user as mob) + if(..(user)) + return + src.add_fingerprint(usr) + var/dat + dat = text("
    Send Shuttle
    ") + //user << browse("[dat]", "window=miningshuttle;size=200x100") + var/datum/browser/popup = new(user, "miningshuttle", name, 200, 140) + popup.set_content(dat) + popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/machinery/computer/shuttle/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + src.add_fingerprint(usr) + if(!allowed(usr)) + usr << "\red Access denied." + return + if(href_list["move"]) + if(id in shuttles) + var/datum/shuttle_manager/s = shuttles[id] + if (s.move_shuttle()) + usr << "\blue Shuttle recieved message and will be sent shortly." + else + usr << "\blue Shuttle is already moving." + else + usr << "\red Invalid shuttle requested." + + +/obj/machinery/computer/shuttle/attackby(I as obj, user as mob) + + if (istype(I, /obj/item/weapon/card/emag)) + src.req_access = list() + emagged = 1 + usr << "You fried the consoles ID checking system. It's now available to everyone!" + else + ..() return \ No newline at end of file diff --git a/code/modules/surgery/generic_steps.dm b/code/modules/surgery/generic_steps.dm index ea066277ed3..700d2b87e59 100644 --- a/code/modules/surgery/generic_steps.dm +++ b/code/modules/surgery/generic_steps.dm @@ -1,68 +1,68 @@ - -//make incision -/datum/surgery_step/incise - implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchenknife = 65, /obj/item/weapon/shard = 45) - time = 24 - -/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to make an incision in [target]'s [parse_zone(target_zone)].") - - - -//clamp bleeders -/datum/surgery_step/clamp_bleeders - implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/wirecutters = 60, /obj/item/stack/cable_coil = 15) - time = 48 - -/datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].") - - -//retract skin -/datum/surgery_step/retract_skin - implements = list(/obj/item/weapon/retractor = 100, /obj/item/weapon/screwdriver = 45, /obj/item/weapon/wirecutters = 35) - time = 32 - -/datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].") - - - -//close incision -/datum/surgery_step/close - implements = list(/obj/item/weapon/cautery = 100, /obj/item/weapon/weldingtool = 70, /obj/item/weapon/lighter = 45, /obj/item/weapon/match = 20) - time = 32 - -/datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].") - - -/datum/surgery_step/close/tool_check(mob/user, obj/item/tool) - if(istype(tool, /obj/item/weapon/cautery)) - return 1 - - if(istype(tool, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = tool - if(WT.isOn()) return 1 - - else if(istype(tool, /obj/item/weapon/lighter)) - var/obj/item/weapon/lighter/L = tool - if(L.lit) return 1 - - else if(istype(tool, /obj/item/weapon/match)) - var/obj/item/weapon/match/M = tool - if(M.lit) return 1 - - return 0 - - -//saw bone -/datum/surgery_step/saw - implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/butch = 25) - time = 64 - -/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].") - - - + +//make incision +/datum/surgery_step/incise + implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchenknife = 65, /obj/item/weapon/shard = 45) + time = 24 + +/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to make an incision in [target]'s [parse_zone(target_zone)].") + + + +//clamp bleeders +/datum/surgery_step/clamp_bleeders + implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/wirecutters = 60, /obj/item/stack/cable_coil = 15) + time = 48 + +/datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].") + + +//retract skin +/datum/surgery_step/retract_skin + implements = list(/obj/item/weapon/retractor = 100, /obj/item/weapon/screwdriver = 45, /obj/item/weapon/wirecutters = 35) + time = 32 + +/datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].") + + + +//close incision +/datum/surgery_step/close + implements = list(/obj/item/weapon/cautery = 100, /obj/item/weapon/weldingtool = 70, /obj/item/weapon/lighter = 45, /obj/item/weapon/match = 20) + time = 32 + +/datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].") + + +/datum/surgery_step/close/tool_check(mob/user, obj/item/tool) + if(istype(tool, /obj/item/weapon/cautery)) + return 1 + + if(istype(tool, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = tool + if(WT.isOn()) return 1 + + else if(istype(tool, /obj/item/weapon/lighter)) + var/obj/item/weapon/lighter/L = tool + if(L.lit) return 1 + + else if(istype(tool, /obj/item/weapon/match)) + var/obj/item/weapon/match/M = tool + if(M.lit) return 1 + + return 0 + + +//saw bone +/datum/surgery_step/saw + implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/butch = 25) + time = 64 + +/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].") + + + diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 55bd4a572dd..054ad9a19d7 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -28,7 +28,7 @@ user.visible_message("[user] successfully removes [I] from [target]'s [target_zone]!") if(istype(I, /obj/item/weapon/implant/loyalty)) target << "You feel a sense of liberation as Nanotrasen's grip on your mind fades away." - del(I) + qdel(I) else user.visible_message("[user] can't find anything in [target]'s [target_zone].") return 1 \ No newline at end of file diff --git a/code/modules/surgery/limb augmentation.dm b/code/modules/surgery/limb augmentation.dm index 80a308dad21..2fc12830566 100644 --- a/code/modules/surgery/limb augmentation.dm +++ b/code/modules/surgery/limb augmentation.dm @@ -1,76 +1,76 @@ - -/////AUGMENTATION SURGERIES////// - - -//SURGERY STEPS - -/datum/surgery_step/replace - implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/wirecutters = 55) - time = 32 - - -/datum/surgery_step/replace/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to sever the muscles on [target]'s [parse_zone(user.zone_sel.selecting)]!") - - -/datum/surgery_step/add_limb - implements = list(/obj/item/robot_parts = 100) - time = 32 - var/obj/item/organ/limb/L = null // L because "limb" - allowed_organs = list("r_arm","l_arm","r_leg","l_leg","chest","head") - - - -/datum/surgery_step/add_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - L = new_organ - if(L) - user.visible_message("[user] begins to augment [target]'s [parse_zone(user.zone_sel.selecting)].") - else - user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_sel.selecting)].") - - - -//ACTUAL SURGERIES - -/datum/surgery/augmentation - name = "augmentation" - steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/replace, /datum/surgery_step/saw, /datum/surgery_step/add_limb) - species = list(/mob/living/carbon/human) - location = "anywhere" //Check attempt_initate_surgery() (in code/modules/surgery/helpers) to see what this does if you can't tell - has_multi_loc = 1 //Multi location stuff, See multiple_location_example.dm - - -//SURGERY STEP SUCCESSES - -/datum/surgery_step/add_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(L) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - user.visible_message("[user] successfully augments [target]'s [parse_zone(user.zone_sel.selecting)]!") - L.loc = get_turf(target) - H.organs -= L - switch(user.zone_sel.selecting) //for the surgery to progress this MUST still be the original "location" so it's safe to do this. - if("r_leg") - H.organs += new /obj/item/organ/limb/robot/r_leg(src) - if("l_leg") - H.organs += new /obj/item/organ/limb/robot/l_leg(src) - if("r_arm") - H.organs += new /obj/item/organ/limb/robot/r_arm(src) - if("l_arm") - H.organs += new /obj/item/organ/limb/robot/l_arm(src) - if("head") - H.organs += new /obj/item/organ/limb/robot/head(src) - if("chest") - var/datum/surgery_step/xenomorph_removal/xeno_removal = new - xeno_removal.remove_xeno(user, target) // remove an alien if there is one - H.organs += new /obj/item/organ/limb/robot/chest(src) - for(var/datum/disease/appendicitis/A in H.viruses) //If they already have Appendicitis, Remove it - A.cure(1) - user.drop_item() - del(tool) - H.update_damage_overlays(0) - H.update_augments() //Gives them the Cyber limb overlay - add_logs(user, target, "augmented", addition="by giving him new [parse_zone(user.zone_sel.selecting)] INTENT: [uppertext(user.a_intent)]") - else - user.visible_message("[user] [target] has no organic [parse_zone(user.zone_sel.selecting)] there!") - return 1 + +/////AUGMENTATION SURGERIES////// + + +//SURGERY STEPS + +/datum/surgery_step/replace + implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/wirecutters = 55) + time = 32 + + +/datum/surgery_step/replace/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to sever the muscles on [target]'s [parse_zone(user.zone_sel.selecting)]!") + + +/datum/surgery_step/add_limb + implements = list(/obj/item/robot_parts = 100) + time = 32 + var/obj/item/organ/limb/L = null // L because "limb" + allowed_organs = list("r_arm","l_arm","r_leg","l_leg","chest","head") + + + +/datum/surgery_step/add_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + L = new_organ + if(L) + user.visible_message("[user] begins to augment [target]'s [parse_zone(user.zone_sel.selecting)].") + else + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_sel.selecting)].") + + + +//ACTUAL SURGERIES + +/datum/surgery/augmentation + name = "augmentation" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/replace, /datum/surgery_step/saw, /datum/surgery_step/add_limb) + species = list(/mob/living/carbon/human) + location = "anywhere" //Check attempt_initate_surgery() (in code/modules/surgery/helpers) to see what this does if you can't tell + has_multi_loc = 1 //Multi location stuff, See multiple_location_example.dm + + +//SURGERY STEP SUCCESSES + +/datum/surgery_step/add_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(L) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + user.visible_message("[user] successfully augments [target]'s [parse_zone(user.zone_sel.selecting)]!") + L.loc = get_turf(target) + H.organs -= L + switch(user.zone_sel.selecting) //for the surgery to progress this MUST still be the original "location" so it's safe to do this. + if("r_leg") + H.organs += new /obj/item/organ/limb/robot/r_leg(src) + if("l_leg") + H.organs += new /obj/item/organ/limb/robot/l_leg(src) + if("r_arm") + H.organs += new /obj/item/organ/limb/robot/r_arm(src) + if("l_arm") + H.organs += new /obj/item/organ/limb/robot/l_arm(src) + if("head") + H.organs += new /obj/item/organ/limb/robot/head(src) + if("chest") + var/datum/surgery_step/xenomorph_removal/xeno_removal = new + xeno_removal.remove_xeno(user, target) // remove an alien if there is one + H.organs += new /obj/item/organ/limb/robot/chest(src) + for(var/datum/disease/appendicitis/A in H.viruses) //If they already have Appendicitis, Remove it + A.cure(1) + user.drop_item() + qdel(tool) + H.update_damage_overlays(0) + H.update_augments() //Gives them the Cyber limb overlay + add_logs(user, target, "augmented", addition="by giving him new [parse_zone(user.zone_sel.selecting)] INTENT: [uppertext(user.a_intent)]") + else + user.visible_message("[user] [target] has no organic [parse_zone(user.zone_sel.selecting)] there!") + return 1 diff --git a/code/modules/surgery/multiple_location_example.dm b/code/modules/surgery/multiple_location_example.dm index 7a7dba5eaee..e5e331843e5 100644 --- a/code/modules/surgery/multiple_location_example.dm +++ b/code/modules/surgery/multiple_location_example.dm @@ -1,54 +1,54 @@ -/* -//CONTENTS// -Multiple location example surgery - - - -//THE SURGERY// -it is very similar to a normal surgery. -Location = "anywhere" is the unique difference. - -/datum/surgery/multiLocExample - name = "Multiple Location Surgery Example" - steps = list(/datum/surgery_step/multiLocExampleStep) - species = list(/mob/living/carbon) - location = "anywhere" //A Location "Anywhere" is handled in /code/modules/surgery/helpers attempt_initiate_surgery(), it is converted into a User.zone_sel.selecting. - has_multi_loc = 1 //Needed to handle Multilocation - -//THE STEPS// -The block of "If's" is necessary, add or remove so you have just the areas you want, and set them to convert L(or your subsitute) to what you want it to be -EG: a zone on a mob (where user is targetting) to the limb thats actually there. - - -/datum/surgery_step/multiLocExampleStep - implements = list() - time = 9001 - allowed_organs = list("r_arm","l_arm","r_leg","l_leg","chest","head", "etc") - // allowed_organs is a list of organs this operation works with, it is defined in the earliest instance of the surgery_step (Eg, datum/surgery_step/multiLocExampleStep) - // allowed_organs is handled in Handle_Multi_Loc() in surgery_step.dm - - -/datum/surgery_step/multiLocExampleStep/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - L = new_organ //new_organ is a variable in /datum/surgery_step, it is null by default, and is given a value in Handle_Multi_Loc() - //Although Handle_Multi_Loc() is /datum/surgery_step/SURGERYNAME/Handle_Multi_Loc() you do not need to rewrite it in the surgery - if(L) - user.visible_message("Generic Statement.") - else - user.visible_message("Generic Statement 2.") - - -/datum/surgery_step/multiLocExampleStep/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) -You can use whatever you substituted "L" for here for useful things, swapping limbs for other limbs, etc. -if the surgery is intended to be MultiLoc but should only be performable once per limb, add this -"surgery.invalid_locations += user.zone_sel.selecting" -Just after you have swapped limbs around, see limb augmentation for an example of this - -*/ - -//This file is commented out as to avoid: -// a snowflakey removal of it 100% of the time -// it's an example, it doesn't work perfectly due to just being the multiple locations section. -// It is also not set to compile, due to being Empty (according to the compiler) - -//Enjoy making Multi-location operations! (if you understood my Rambling) +/* +//CONTENTS// +Multiple location example surgery + + + +//THE SURGERY// +it is very similar to a normal surgery. +Location = "anywhere" is the unique difference. + +/datum/surgery/multiLocExample + name = "Multiple Location Surgery Example" + steps = list(/datum/surgery_step/multiLocExampleStep) + species = list(/mob/living/carbon) + location = "anywhere" //A Location "Anywhere" is handled in /code/modules/surgery/helpers attempt_initiate_surgery(), it is converted into a User.zone_sel.selecting. + has_multi_loc = 1 //Needed to handle Multilocation + +//THE STEPS// +The block of "If's" is necessary, add or remove so you have just the areas you want, and set them to convert L(or your subsitute) to what you want it to be +EG: a zone on a mob (where user is targetting) to the limb thats actually there. + + +/datum/surgery_step/multiLocExampleStep + implements = list() + time = 9001 + allowed_organs = list("r_arm","l_arm","r_leg","l_leg","chest","head", "etc") + // allowed_organs is a list of organs this operation works with, it is defined in the earliest instance of the surgery_step (Eg, datum/surgery_step/multiLocExampleStep) + // allowed_organs is handled in Handle_Multi_Loc() in surgery_step.dm + + +/datum/surgery_step/multiLocExampleStep/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + L = new_organ //new_organ is a variable in /datum/surgery_step, it is null by default, and is given a value in Handle_Multi_Loc() + //Although Handle_Multi_Loc() is /datum/surgery_step/SURGERYNAME/Handle_Multi_Loc() you do not need to rewrite it in the surgery + if(L) + user.visible_message("Generic Statement.") + else + user.visible_message("Generic Statement 2.") + + +/datum/surgery_step/multiLocExampleStep/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +You can use whatever you substituted "L" for here for useful things, swapping limbs for other limbs, etc. +if the surgery is intended to be MultiLoc but should only be performable once per limb, add this +"surgery.invalid_locations += user.zone_sel.selecting" +Just after you have swapped limbs around, see limb augmentation for an example of this + +*/ + +//This file is commented out as to avoid: +// a snowflakey removal of it 100% of the time +// it's an example, it doesn't work perfectly due to just being the multiple locations section. +// It is also not set to compile, due to being Empty (according to the compiler) + +//Enjoy making Multi-location operations! (if you understood my Rambling) //If you didn't understand this, Ask for RobRichards in Coderbus \ No newline at end of file diff --git a/code/modules/surgery/organs/augments.dm b/code/modules/surgery/organs/augments.dm index d3acb5135d9..263315aba1b 100644 --- a/code/modules/surgery/organs/augments.dm +++ b/code/modules/surgery/organs/augments.dm @@ -1,51 +1,51 @@ -/////AUGMENTATION\\\\\ -//See code/modules/surgery/organs/organ.dm for the parent "limb" - - -/obj/item/organ/limb/robot - name = "cyberlimb" - desc = "You should never be seeing this!" - status = ORGAN_ROBOTIC - -/obj/item/organ/limb/robot/chest - name = "chest" - desc = "A Robotic chest" - icon_state = "chest" - max_damage = 200 - body_part = CHEST - -/obj/item/organ/limb/robot/head - name = "head" - desc = "A Robotic head" - icon_state = "head" - max_damage = 200 - body_part = HEAD - -/obj/item/organ/limb/robot/l_arm - name = "l_arm" - desc = "A Robotic arm" - icon_state = "l_arm" - max_damage = 75 - body_part = ARM_LEFT - -/obj/item/organ/limb/robot/l_leg - name = "l_leg" - desc = "A Robotic leg" - icon_state = "l_leg" - max_damage = 75 - body_part = LEG_LEFT - -/obj/item/organ/limb/robot/r_arm - name = "r_arm" - desc = "A Robotic arm" - icon_state = "r_arm" - max_damage = 75 - body_part = ARM_RIGHT - -/obj/item/organ/limb/robot/r_leg - name = "r_leg" - desc = "A Robotic leg" - icon_state = "r_leg" - max_damage = 75 - body_part = LEG_RIGHT - +/////AUGMENTATION\\\\\ +//See code/modules/surgery/organs/organ.dm for the parent "limb" + + +/obj/item/organ/limb/robot + name = "cyberlimb" + desc = "You should never be seeing this!" + status = ORGAN_ROBOTIC + +/obj/item/organ/limb/robot/chest + name = "chest" + desc = "A Robotic chest" + icon_state = "chest" + max_damage = 200 + body_part = CHEST + +/obj/item/organ/limb/robot/head + name = "head" + desc = "A Robotic head" + icon_state = "head" + max_damage = 200 + body_part = HEAD + +/obj/item/organ/limb/robot/l_arm + name = "l_arm" + desc = "A Robotic arm" + icon_state = "l_arm" + max_damage = 75 + body_part = ARM_LEFT + +/obj/item/organ/limb/robot/l_leg + name = "l_leg" + desc = "A Robotic leg" + icon_state = "l_leg" + max_damage = 75 + body_part = LEG_LEFT + +/obj/item/organ/limb/robot/r_arm + name = "r_arm" + desc = "A Robotic arm" + icon_state = "r_arm" + max_damage = 75 + body_part = ARM_RIGHT + +/obj/item/organ/limb/robot/r_leg + name = "r_leg" + desc = "A Robotic leg" + icon_state = "r_leg" + max_damage = 75 + body_part = LEG_RIGHT + diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index d9e968f4daf..4cbb4573dc5 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -1,38 +1,38 @@ -// Bluespace crystals, used in telescience and when crushed it will blink you to a random turf. - -/obj/item/bluespace_crystal - name = "bluespace crystal" - desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate." - icon = 'icons/obj/telescience.dmi' - icon_state = "bluespace_crystal" - w_class = 1 - origin_tech = "bluespace=4;materials=3" - var/blink_range = 8 // The teleport range when crushed/thrown at someone. - -/obj/item/bluespace_crystal/New() - ..() - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) - -/obj/item/bluespace_crystal/attack_self(var/mob/user) - blink_mob(user) - user.drop_item() - user.visible_message("[user] crushes the [src]!") - del(src) - -/obj/item/bluespace_crystal/proc/blink_mob(var/mob/living/L) - do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg') - -/obj/item/bluespace_crystal/throw_impact(atom/hit_atom) - ..() - if(isliving(hit_atom)) - blink_mob(hit_atom) - del(src) - -// Artifical bluespace crystal, doesn't give you much research. - -/obj/item/bluespace_crystal/artificial - name = "artificial bluespace crystal" - desc = "An artificially made bluespace crystal, it looks delicate." - origin_tech = "bluespace=2" +// Bluespace crystals, used in telescience and when crushed it will blink you to a random turf. + +/obj/item/bluespace_crystal + name = "bluespace crystal" + desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate." + icon = 'icons/obj/telescience.dmi' + icon_state = "bluespace_crystal" + w_class = 1 + origin_tech = "bluespace=4;materials=3" + var/blink_range = 8 // The teleport range when crushed/thrown at someone. + +/obj/item/bluespace_crystal/New() + ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + +/obj/item/bluespace_crystal/attack_self(var/mob/user) + blink_mob(user) + user.drop_item() + user.visible_message("[user] crushes the [src]!") + qdel(src) + +/obj/item/bluespace_crystal/proc/blink_mob(var/mob/living/L) + do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg') + +/obj/item/bluespace_crystal/throw_impact(atom/hit_atom) + ..() + if(isliving(hit_atom)) + blink_mob(hit_atom) + qdel(src) + +// Artifical bluespace crystal, doesn't give you much research. + +/obj/item/bluespace_crystal/artificial + name = "artificial bluespace crystal" + desc = "An artificially made bluespace crystal, it looks delicate." + origin_tech = "bluespace=2" blink_range = 4 // Not as good as the organic stuff! \ No newline at end of file diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index 6c3fd66c025..883a6fc01cd 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -1,81 +1,81 @@ -var/list/GPS_list = list() -/obj/item/device/gps - name = "global positioning system" - desc = "Helping lost spacemen find their way through the planets since 2016." - icon = 'icons/obj/telescience.dmi' - icon_state = "gps-c" - w_class = 2.0 - slot_flags = SLOT_BELT - origin_tech = "programming=2;engineering=2" - var/gpstag = "COM0" - var/emped = 0 - var/turf/locked_location - -/obj/item/device/gps/New() - ..() - GPS_list.Add(src) - name = "global positioning system ([gpstag])" - overlays += "working" - -/obj/item/device/gps/Del() - GPS_list.Remove(src) - ..() - -/obj/item/device/gps/emp_act(severity) - emped = 1 - overlays -= "working" - overlays += "emp" - spawn(300) - emped = 0 - overlays -= "emp" - overlays += "working" - -/obj/item/device/gps/attack_self(mob/user as mob) - - var/obj/item/device/gps/t = "" - var/gps_window_height = 110 + GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show - if(emped) - t += "ERROR" - else - t += "
    Set Tag " - t += "
    Tag: [gpstag]" - if(locked_location && locked_location.loc) - t += "
    Bluespace coordinates saved: [locked_location.loc]" - gps_window_height += 20 - - for(var/obj/item/device/gps/G in GPS_list) - var/turf/pos = get_turf(G) - var/area/gps_area = get_area(G) - var/tracked_gpstag = G.gpstag - if(G.emped == 1) - t += "
    [tracked_gpstag]: ERROR" - else - t += "
    [tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])" - - var/datum/browser/popup = new(user, "GPS", name, 360, min(gps_window_height, 800)) - popup.set_content(t) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - -/obj/item/device/gps/Topic(href, href_list) - ..() - if(href_list["tag"] ) - var/a = input("Please enter desired tag.", name, gpstag) as text - a = uppertext(copytext(sanitize(a), 1, 5)) - if(src.loc == usr) - gpstag = a - name = "global positioning system ([gpstag])" - attack_self(usr) - -/obj/item/device/gps/science - icon_state = "gps-s" - gpstag = "SCI0" - -/obj/item/device/gps/engineering - icon_state = "gps-e" - gpstag = "ENG0" - -/obj/item/device/gps/mining - icon_state = "gps-m" - gpstag = "MINE0" - desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life." +var/list/GPS_list = list() +/obj/item/device/gps + name = "global positioning system" + desc = "Helping lost spacemen find their way through the planets since 2016." + icon = 'icons/obj/telescience.dmi' + icon_state = "gps-c" + w_class = 2.0 + slot_flags = SLOT_BELT + origin_tech = "programming=2;engineering=2" + var/gpstag = "COM0" + var/emped = 0 + var/turf/locked_location + +/obj/item/device/gps/New() + ..() + GPS_list.Add(src) + name = "global positioning system ([gpstag])" + overlays += "working" + +/obj/item/device/gps/Destroy() + GPS_list.Remove(src) + ..() + +/obj/item/device/gps/emp_act(severity) + emped = 1 + overlays -= "working" + overlays += "emp" + spawn(300) + emped = 0 + overlays -= "emp" + overlays += "working" + +/obj/item/device/gps/attack_self(mob/user as mob) + + var/obj/item/device/gps/t = "" + var/gps_window_height = 110 + GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show + if(emped) + t += "ERROR" + else + t += "
    Set Tag " + t += "
    Tag: [gpstag]" + if(locked_location && locked_location.loc) + t += "
    Bluespace coordinates saved: [locked_location.loc]" + gps_window_height += 20 + + for(var/obj/item/device/gps/G in GPS_list) + var/turf/pos = get_turf(G) + var/area/gps_area = get_area(G) + var/tracked_gpstag = G.gpstag + if(G.emped == 1) + t += "
    [tracked_gpstag]: ERROR" + else + t += "
    [tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])" + + var/datum/browser/popup = new(user, "GPS", name, 360, min(gps_window_height, 800)) + popup.set_content(t) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/item/device/gps/Topic(href, href_list) + ..() + if(href_list["tag"] ) + var/a = input("Please enter desired tag.", name, gpstag) as text + a = uppertext(copytext(sanitize(a), 1, 5)) + if(src.loc == usr) + gpstag = a + name = "global positioning system ([gpstag])" + attack_self(usr) + +/obj/item/device/gps/science + icon_state = "gps-s" + gpstag = "SCI0" + +/obj/item/device/gps/engineering + icon_state = "gps-e" + gpstag = "ENG0" + +/obj/item/device/gps/mining + icon_state = "gps-m" + gpstag = "MINE0" + desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life." diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index ba7037a7572..e9873c7c732 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -1,157 +1,157 @@ -///SCI TELEPAD/// -/obj/machinery/telepad - name = "telepad" - desc = "A bluespace telepad used for teleporting objects to and from a location." - icon = 'icons/obj/telescience.dmi' - icon_state = "pad-idle" - anchored = 1 - use_power = 1 - idle_power_usage = 200 - active_power_usage = 5000 - var/efficiency - -/obj/machinery/telepad/New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/telesci_pad(null) - component_parts += new /obj/item/bluespace_crystal/artificial(null) - component_parts += new /obj/item/bluespace_crystal/artificial(null) - component_parts += new /obj/item/weapon/stock_parts/capacitor(null) - component_parts += new /obj/item/weapon/stock_parts/console_screen(null) - component_parts += new /obj/item/stack/cable_coil(null, 1) - RefreshParts() - -/obj/machinery/telepad/RefreshParts() - var/E - for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) - E += C.rating - efficiency = E - -/obj/machinery/telepad/attackby(obj/item/I, mob/user) - if(default_deconstruction_screwdriver(user, "pad-idle-o", "pad-idle", I)) - return - - if(panel_open) - if(istype(I, /obj/item/device/multitool)) - var/obj/item/device/multitool/M = I - M.buffer = src - user << "You save the data in the [I.name]'s buffer." - - if(exchange_parts(user, I)) - return - - default_deconstruction_crowbar(I) - - -//CARGO TELEPAD// -/obj/machinery/telepad_cargo - name = "cargo telepad" - desc = "A telepad used by the Rapid Crate Sender." - icon = 'icons/obj/telescience.dmi' - icon_state = "pad-idle" - anchored = 1 - use_power = 1 - idle_power_usage = 20 - active_power_usage = 500 - var/stage = 0 -/obj/machinery/telepad_cargo/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/wrench)) - anchored = 0 - playsound(src, 'sound/items/Ratchet.ogg', 50, 1) - if(anchored) - anchored = 0 - user << " The [src] can now be moved." - else if(!anchored) - anchored = 1 - user << " The [src] is now secured." - if(istype(W, /obj/item/weapon/screwdriver)) - if(stage == 0) - playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) - user << " You unscrew the telepad's tracking beacon." - stage = 1 - else if(stage == 1) - playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) - user << " You screw in the telepad's tracking beacon." - stage = 0 - if(istype(W, /obj/item/weapon/weldingtool) && stage == 1) - playsound(src, 'sound/items/Welder.ogg', 50, 1) - user << " You disassemble the telepad." - new /obj/item/stack/sheet/metal(get_turf(src)) - new /obj/item/stack/sheet/glass(get_turf(src)) - del(src) - -///TELEPAD CALLER/// -/obj/item/device/telepad_beacon - name = "telepad beacon" - desc = "Use to warp in a cargo telepad." - icon = 'icons/obj/radio.dmi' - icon_state = "beacon" - item_state = "signaler" - origin_tech = "bluespace=3" - -/obj/item/device/telepad_beacon/attack_self(mob/user as mob) - if(user) - user << " Locked In" - new /obj/machinery/telepad_cargo(user.loc) - playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) - del(src) - return - -///HANDHELD TELEPAD USER/// -/obj/item/weapon/rcs - name = "rapid-crate-sender (RCS)" - desc = "Use this to send crates and closets to cargo telepads." - icon = 'icons/obj/telescience.dmi' - icon_state = "rcs" - flags = CONDUCT - force = 10.0 - throwforce = 10.0 - throw_speed = 2 - throw_range = 5 - var/rcharges = 10 - var/obj/machinery/pad = null - var/last_charge = 30 - var/mode = 0 - var/rand_x = 0 - var/rand_y = 0 - var/emagged = 0 - var/teleporting = 0 - -/obj/item/weapon/rcs/New() - ..() - processing_objects.Add(src) -/obj/item/weapon/rcs/examine() - desc = "Use this to send crates and closets to cargo telepads. There are [rcharges] charges left." - ..() - -/obj/item/weapon/rcs/Del() - processing_objects.Remove(src) - ..() -/obj/item/weapon/rcs/process() - if(rcharges > 10) - rcharges = 10 - if(last_charge == 0) - rcharges++ - last_charge = 30 - else - last_charge-- - -/obj/item/weapon/rcs/attack_self(mob/user) - if(emagged) - if(mode == 0) - mode = 1 - playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) - user << " The telepad locator has become uncalibrated." - else - mode = 0 - playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) - user << " You calibrate the telepad locator." - -/obj/item/weapon/rcs/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/weapon/card/emag) && emagged == 0) - emagged = 1 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - user << " You emag the RCS. Click on it to toggle between modes." +///SCI TELEPAD/// +/obj/machinery/telepad + name = "telepad" + desc = "A bluespace telepad used for teleporting objects to and from a location." + icon = 'icons/obj/telescience.dmi' + icon_state = "pad-idle" + anchored = 1 + use_power = 1 + idle_power_usage = 200 + active_power_usage = 5000 + var/efficiency + +/obj/machinery/telepad/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telesci_pad(null) + component_parts += new /obj/item/bluespace_crystal/artificial(null) + component_parts += new /obj/item/bluespace_crystal/artificial(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + RefreshParts() + +/obj/machinery/telepad/RefreshParts() + var/E + for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) + E += C.rating + efficiency = E + +/obj/machinery/telepad/attackby(obj/item/I, mob/user) + if(default_deconstruction_screwdriver(user, "pad-idle-o", "pad-idle", I)) + return + + if(panel_open) + if(istype(I, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = I + M.buffer = src + user << "You save the data in the [I.name]'s buffer." + + if(exchange_parts(user, I)) + return + + default_deconstruction_crowbar(I) + + +//CARGO TELEPAD// +/obj/machinery/telepad_cargo + name = "cargo telepad" + desc = "A telepad used by the Rapid Crate Sender." + icon = 'icons/obj/telescience.dmi' + icon_state = "pad-idle" + anchored = 1 + use_power = 1 + idle_power_usage = 20 + active_power_usage = 500 + var/stage = 0 +/obj/machinery/telepad_cargo/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/wrench)) + anchored = 0 + playsound(src, 'sound/items/Ratchet.ogg', 50, 1) + if(anchored) + anchored = 0 + user << " The [src] can now be moved." + else if(!anchored) + anchored = 1 + user << " The [src] is now secured." + if(istype(W, /obj/item/weapon/screwdriver)) + if(stage == 0) + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) + user << " You unscrew the telepad's tracking beacon." + stage = 1 + else if(stage == 1) + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) + user << " You screw in the telepad's tracking beacon." + stage = 0 + if(istype(W, /obj/item/weapon/weldingtool) && stage == 1) + playsound(src, 'sound/items/Welder.ogg', 50, 1) + user << " You disassemble the telepad." + new /obj/item/stack/sheet/metal(get_turf(src)) + new /obj/item/stack/sheet/glass(get_turf(src)) + qdel(src) + +///TELEPAD CALLER/// +/obj/item/device/telepad_beacon + name = "telepad beacon" + desc = "Use to warp in a cargo telepad." + icon = 'icons/obj/radio.dmi' + icon_state = "beacon" + item_state = "signaler" + origin_tech = "bluespace=3" + +/obj/item/device/telepad_beacon/attack_self(mob/user as mob) + if(user) + user << " Locked In" + new /obj/machinery/telepad_cargo(user.loc) + playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) + qdel(src) + return + +///HANDHELD TELEPAD USER/// +/obj/item/weapon/rcs + name = "rapid-crate-sender (RCS)" + desc = "Use this to send crates and closets to cargo telepads." + icon = 'icons/obj/telescience.dmi' + icon_state = "rcs" + flags = CONDUCT + force = 10.0 + throwforce = 10.0 + throw_speed = 2 + throw_range = 5 + var/rcharges = 10 + var/obj/machinery/pad = null + var/last_charge = 30 + var/mode = 0 + var/rand_x = 0 + var/rand_y = 0 + var/emagged = 0 + var/teleporting = 0 + +/obj/item/weapon/rcs/New() + ..() + processing_objects.Add(src) +/obj/item/weapon/rcs/examine() + desc = "Use this to send crates and closets to cargo telepads. There are [rcharges] charges left." + ..() + +/obj/item/weapon/rcs/Destroy() + processing_objects.Remove(src) + ..() +/obj/item/weapon/rcs/process() + if(rcharges > 10) + rcharges = 10 + if(last_charge == 0) + rcharges++ + last_charge = 30 + else + last_charge-- + +/obj/item/weapon/rcs/attack_self(mob/user) + if(emagged) + if(mode == 0) + mode = 1 + playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) + user << " The telepad locator has become uncalibrated." + else + mode = 0 + playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) + user << " You calibrate the telepad locator." + +/obj/item/weapon/rcs/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/weapon/card/emag) && emagged == 0) + emagged = 1 + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + user << " You emag the RCS. Click on it to toggle between modes." return \ No newline at end of file diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index e23f1117dd9..edb9916eb06 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -1,381 +1,381 @@ -/obj/machinery/computer/telescience - name = "\improper Telepad Control Console" - desc = "Used to teleport objects to and from the telescience telepad." - icon_state = "teleport" - circuit = /obj/item/weapon/circuitboard/telesci_console - var/sending = 1 - var/obj/machinery/telepad/telepad = null - var/temp_msg = "Telescience control console initialized.
    Welcome." - - // VARIABLES // - var/teles_left // How many teleports left until it becomes uncalibrated - var/datum/projectile_data/last_tele_data = null - var/z_co = 1 - var/power_off - var/rotation_off - //var/angle_off - var/last_target - - var/rotation = 0 - var/angle = 45 - var/power = 5 - - // Based on the power used - var/teleport_cooldown = 0 // every index requires a bluespace crystal - var/list/power_options = list(5, 10, 20, 25, 30, 40, 50, 80, 100) - var/teleporting = 0 - var/starting_crystals = 3 - var/max_crystals = 4 - var/list/crystals = list() - var/obj/item/device/gps/inserted_gps - -/obj/machinery/computer/telescience/New() - ..() - recalibrate() - -/obj/machinery/computer/telescience/Del() - eject() - if(inserted_gps) - inserted_gps.loc = loc - inserted_gps = null - ..() - -/obj/machinery/computer/telescience/examine() - ..() - usr << "There are [crystals.len ? crystals.len : "no"] bluespace crystals in the crystal slots." - -/obj/machinery/computer/telescience/initialize() - ..() - for(var/i = 1; i <= starting_crystals; i++) - crystals += new /obj/item/bluespace_crystal/artificial(null) // starting crystals - -/obj/machinery/computer/telescience/update_icon() - if(stat & BROKEN) - icon_state = "telescib" - else - if(stat & NOPOWER) - src.icon_state = "teleport0" - stat |= NOPOWER - else - icon_state = initial(icon_state) - stat &= ~NOPOWER - -/obj/machinery/computer/telescience/attack_paw(mob/user) - user << "You are too primitive to use this computer." - return - -/obj/machinery/computer/telescience/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/bluespace_crystal)) - if(crystals.len >= max_crystals) - user << "There are not enough crystal slots." - return - user.drop_item() - crystals += W - W.loc = null - user.visible_message("[user] inserts [W] into \the [src]'s crystal slot.") - updateDialog() - else if(istype(W, /obj/item/device/gps)) - if(!inserted_gps) - inserted_gps = W - user.unEquip(W) - W.loc = src - user.visible_message("[user] inserts [W] into \the [src]'s GPS device slot.") - else if(istype(W, /obj/item/device/multitool)) - var/obj/item/device/multitool/M = W - if(M.buffer && istype(M.buffer, /obj/machinery/telepad)) - telepad = M.buffer - M.buffer = null - user << "You upload the data from the [W.name]'s buffer." - else - ..() - -/obj/machinery/computer/telescience/attack_ai(mob/user) - src.attack_hand(user) - -/obj/machinery/computer/telescience/attack_hand(mob/user) - if(..()) - return - interact(user) - -/obj/machinery/computer/telescience/interact(mob/user) - var/t - if(!telepad) - in_use = 0 //Yeah so if you deconstruct teleporter while its in the process of shooting it wont disable the console - t += "
    No telepad located.
    Please add telepad data.

    " - else - if(inserted_gps) - t += "Eject GPS" - t += "Set GPS memory" - else - t += "Eject GPS" - t += "Set GPS memory" - t += "
    [temp_msg]

    " - t += "Set Bearing" - t += "
    [rotation]°
    " - t += "Set Elevation" - t += "
    [angle]°
    " - t += "Set Power" - t += "
    " - - for(var/i = 1; i <= power_options.len; i++) - if(crystals.len + telepad.efficiency < i) - t += "[power_options[i]]" - continue - if(power == power_options[i]) - t += "[power_options[i]]" - continue - t += "[power_options[i]]" - t += "
    " - - t += "Set Sector" - t += "
    [z_co ? z_co : "NULL"]
    " - - t += "
    Send" - t += " Receive" - t += "
    Recalibrate Crystals Eject Crystals" - - // Information about the last teleport - t += "
    " - if(!last_tele_data) - t += "No teleport data found." - else - t += "Source Location: ([last_tele_data.src_x], [last_tele_data.src_y])
    " - //t += "Distance: [round(last_tele_data.distance, 0.1)]m
    " - t += "Time: [round(last_tele_data.time, 0.1)] secs
    " - t += "
    " - - var/datum/browser/popup = new(user, "telesci", name, 300, 500) - popup.set_content(t) - popup.open() - return - -/obj/machinery/computer/telescience/proc/sparks() - if(telepad) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, get_turf(telepad)) - s.start() - else - return - -/obj/machinery/computer/telescience/proc/telefail() - sparks() - visible_message("The telepad weakly fizzles.") - return - -/obj/machinery/computer/telescience/proc/doteleport(mob/user) - - if(teleport_cooldown > world.time) - temp_msg = "Telepad is recharging power.
    Please wait [round((teleport_cooldown - world.time) / 10)] seconds." - return - - if(teleporting) - temp_msg = "Telepad is in use.
    Please wait." - return - - if(telepad) - - var/truePower = Clamp(power + power_off, 1, 1000) - var/trueRotation = rotation + rotation_off - var/trueAngle = Clamp(angle, 1, 90) - - var/datum/projectile_data/proj_data = projectile_trajectory(telepad.x, telepad.y, trueRotation, trueAngle, truePower) - last_tele_data = proj_data - - var/trueX = Clamp(round(proj_data.dest_x, 1), 1, world.maxx) - var/trueY = Clamp(round(proj_data.dest_y, 1), 1, world.maxy) - var/spawn_time = round(proj_data.time) * 10 - - var/turf/target = locate(trueX, trueY, z_co) - last_target = target - var/area/A = get_area(target) - flick("pad-beam", telepad) - - if(spawn_time > 15) // 1.5 seconds - playsound(telepad.loc, 'sound/weapons/flash.ogg', 25, 1) - // Wait depending on the time the projectile took to get there - teleporting = 1 - temp_msg = "Powering up bluespace crystals.
    Please wait." - - - spawn(round(proj_data.time) * 10) // in seconds - if(!telepad) - return - if(telepad.stat & NOPOWER) - return - teleporting = 0 - teleport_cooldown = world.time + (power * 2) - teles_left -= 1 - - // use a lot of power - use_power(power * 10) - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, get_turf(telepad)) - s.start() - - temp_msg = "Teleport successful.
    " - if(teles_left < 10) - temp_msg += "
    Calibration required soon." - else - temp_msg += "Data printed below." - - var/sparks = get_turf(target) - var/datum/effect/effect/system/spark_spread/y = new /datum/effect/effect/system/spark_spread - y.set_up(5, 1, sparks) - y.start() - - var/turf/source = target - var/turf/dest = get_turf(telepad) - var/log_msg = "" - log_msg += ": [key_name(user)] has teleported " - - if(sending) - source = dest - dest = target - - flick("pad-beam", telepad) - playsound(telepad.loc, 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) - for(var/atom/movable/ROI in source) - // if is anchored, don't let through - if(ROI.anchored) - if(isliving(ROI)) - var/mob/living/L = ROI - if(L.buckled) - // TP people on office chairs - if(L.buckled.anchored) - continue - - log_msg += "[key_name(L)] (on a chair), " - else - continue - else if(!isobserver(ROI)) - continue - if(ismob(ROI)) - var/mob/T = ROI - log_msg += "[key_name(T)], " - else - log_msg += "[ROI.name]" - if (istype(ROI, /obj/structure/closet)) - var/obj/structure/closet/C = ROI - log_msg += " (" - for(var/atom/movable/Q as mob|obj in C) - if(ismob(Q)) - log_msg += "[key_name(Q)], " - else - log_msg += "[Q.name], " - if (dd_hassuffix(log_msg, "(")) - log_msg += "empty)" - else - log_msg = dd_limittext(log_msg, length(log_msg) - 2) - log_msg += ")" - log_msg += ", " - do_teleport(ROI, dest) - - if (dd_hassuffix(log_msg, ", ")) - log_msg = dd_limittext(log_msg, length(log_msg) - 2) - else - log_msg += "nothing" - log_msg += " [sending ? "to" : "from"] [trueX], [trueY], [z_co] ([A ? A.name : "null area"])" - investigate_log(log_msg, "telesci") - updateDialog() - -/obj/machinery/computer/telescience/proc/teleport(mob/user) - if(rotation == null || angle == null || z_co == null) - temp_msg = "ERROR!
    Set a angle, rotation and sector." - return - if(power <= 0) - telefail() - temp_msg = "ERROR!
    No power selected!" - return - if(angle < 1 || angle > 90) - telefail() - temp_msg = "ERROR!
    Elevation is less than 1 or greater than 90." - return - if(z_co == 2 || z_co < 1 || z_co > 6) - telefail() - temp_msg = "ERROR! Sector is less than 1,
    greater than 6, or equal to 2." - return - if(teles_left > 0) - doteleport(user) - else - telefail() - temp_msg = "ERROR!
    Calibration required." - return - return - -/obj/machinery/computer/telescience/proc/eject() - for(var/obj/item/I in crystals) - I.loc = src.loc - crystals -= I - power = 0 - -/obj/machinery/computer/telescience/Topic(href, href_list) - if(..()) - return - if(!telepad) - updateDialog() - return - if(telepad.panel_open) - temp_msg = "Telepad undergoing physical maintenance operations." - - if(href_list["setrotation"]) - var/new_rot = input("Please input desired bearing in degrees.", name, rotation) as num - if(..()) // Check after we input a value, as they could've moved after they entered something - return - rotation = Clamp(new_rot, -900, 900) - rotation = round(rotation, 0.01) - - if(href_list["setangle"]) - var/new_angle = input("Please input desired elevation in degrees.", name, angle) as num - if(..()) - return - angle = Clamp(round(new_angle, 0.1), 1, 9999) - - if(href_list["setpower"]) - var/index = href_list["setpower"] - index = text2num(index) - if(index != null && power_options[index]) - if(crystals.len + telepad.efficiency >= index) - power = power_options[index] - - if(href_list["setz"]) - var/new_z = input("Please input desired sector.", name, z_co) as num - if(..()) - return - z_co = Clamp(round(new_z), 1, 10) - - if(href_list["ejectGPS"]) - inserted_gps.loc = loc - inserted_gps = null - - if(href_list["setMemory"]) - if(last_target) - inserted_gps.locked_location = last_target - temp_msg = "Location saved." - else - temp_msg = "ERROR!
    No data stored." - - if(href_list["send"]) - sending = 1 - teleport(usr) - - if(href_list["receive"]) - sending = 0 - teleport(usr) - - if(href_list["recal"]) - recalibrate() - sparks() - temp_msg = "NOTICE:
    Calibration successful." - - if(href_list["eject"]) - eject() - temp_msg = "NOTICE:
    Bluespace crystals ejected." - - updateDialog() - -/obj/machinery/computer/telescience/proc/recalibrate() - teles_left = rand(30, 40) - //angle_off = rand(-25, 25) - power_off = rand(-4, 0) +/obj/machinery/computer/telescience + name = "\improper Telepad Control Console" + desc = "Used to teleport objects to and from the telescience telepad." + icon_state = "teleport" + circuit = /obj/item/weapon/circuitboard/telesci_console + var/sending = 1 + var/obj/machinery/telepad/telepad = null + var/temp_msg = "Telescience control console initialized.
    Welcome." + + // VARIABLES // + var/teles_left // How many teleports left until it becomes uncalibrated + var/datum/projectile_data/last_tele_data = null + var/z_co = 1 + var/power_off + var/rotation_off + //var/angle_off + var/last_target + + var/rotation = 0 + var/angle = 45 + var/power = 5 + + // Based on the power used + var/teleport_cooldown = 0 // every index requires a bluespace crystal + var/list/power_options = list(5, 10, 20, 25, 30, 40, 50, 80, 100) + var/teleporting = 0 + var/starting_crystals = 3 + var/max_crystals = 4 + var/list/crystals = list() + var/obj/item/device/gps/inserted_gps + +/obj/machinery/computer/telescience/New() + ..() + recalibrate() + +/obj/machinery/computer/telescience/Destroy() + eject() + if(inserted_gps) + inserted_gps.loc = loc + inserted_gps = null + ..() + +/obj/machinery/computer/telescience/examine() + ..() + usr << "There are [crystals.len ? crystals.len : "no"] bluespace crystals in the crystal slots." + +/obj/machinery/computer/telescience/initialize() + ..() + for(var/i = 1; i <= starting_crystals; i++) + crystals += new /obj/item/bluespace_crystal/artificial(null) // starting crystals + +/obj/machinery/computer/telescience/update_icon() + if(stat & BROKEN) + icon_state = "telescib" + else + if(stat & NOPOWER) + src.icon_state = "teleport0" + stat |= NOPOWER + else + icon_state = initial(icon_state) + stat &= ~NOPOWER + +/obj/machinery/computer/telescience/attack_paw(mob/user) + user << "You are too primitive to use this computer." + return + +/obj/machinery/computer/telescience/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/bluespace_crystal)) + if(crystals.len >= max_crystals) + user << "There are not enough crystal slots." + return + user.drop_item() + crystals += W + W.loc = null + user.visible_message("[user] inserts [W] into \the [src]'s crystal slot.") + updateDialog() + else if(istype(W, /obj/item/device/gps)) + if(!inserted_gps) + inserted_gps = W + user.unEquip(W) + W.loc = src + user.visible_message("[user] inserts [W] into \the [src]'s GPS device slot.") + else if(istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = W + if(M.buffer && istype(M.buffer, /obj/machinery/telepad)) + telepad = M.buffer + M.buffer = null + user << "You upload the data from the [W.name]'s buffer." + else + ..() + +/obj/machinery/computer/telescience/attack_ai(mob/user) + src.attack_hand(user) + +/obj/machinery/computer/telescience/attack_hand(mob/user) + if(..()) + return + interact(user) + +/obj/machinery/computer/telescience/interact(mob/user) + var/t + if(!telepad) + in_use = 0 //Yeah so if you deconstruct teleporter while its in the process of shooting it wont disable the console + t += "
    No telepad located.
    Please add telepad data.

    " + else + if(inserted_gps) + t += "Eject GPS" + t += "Set GPS memory" + else + t += "Eject GPS" + t += "Set GPS memory" + t += "
    [temp_msg]

    " + t += "Set Bearing" + t += "
    [rotation]°
    " + t += "Set Elevation" + t += "
    [angle]°
    " + t += "Set Power" + t += "
    " + + for(var/i = 1; i <= power_options.len; i++) + if(crystals.len + telepad.efficiency < i) + t += "[power_options[i]]" + continue + if(power == power_options[i]) + t += "[power_options[i]]" + continue + t += "[power_options[i]]" + t += "
    " + + t += "Set Sector" + t += "
    [z_co ? z_co : "NULL"]
    " + + t += "
    Send" + t += " Receive" + t += "
    Recalibrate Crystals Eject Crystals" + + // Information about the last teleport + t += "
    " + if(!last_tele_data) + t += "No teleport data found." + else + t += "Source Location: ([last_tele_data.src_x], [last_tele_data.src_y])
    " + //t += "Distance: [round(last_tele_data.distance, 0.1)]m
    " + t += "Time: [round(last_tele_data.time, 0.1)] secs
    " + t += "
    " + + var/datum/browser/popup = new(user, "telesci", name, 300, 500) + popup.set_content(t) + popup.open() + return + +/obj/machinery/computer/telescience/proc/sparks() + if(telepad) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, get_turf(telepad)) + s.start() + else + return + +/obj/machinery/computer/telescience/proc/telefail() + sparks() + visible_message("The telepad weakly fizzles.") + return + +/obj/machinery/computer/telescience/proc/doteleport(mob/user) + + if(teleport_cooldown > world.time) + temp_msg = "Telepad is recharging power.
    Please wait [round((teleport_cooldown - world.time) / 10)] seconds." + return + + if(teleporting) + temp_msg = "Telepad is in use.
    Please wait." + return + + if(telepad) + + var/truePower = Clamp(power + power_off, 1, 1000) + var/trueRotation = rotation + rotation_off + var/trueAngle = Clamp(angle, 1, 90) + + var/datum/projectile_data/proj_data = projectile_trajectory(telepad.x, telepad.y, trueRotation, trueAngle, truePower) + last_tele_data = proj_data + + var/trueX = Clamp(round(proj_data.dest_x, 1), 1, world.maxx) + var/trueY = Clamp(round(proj_data.dest_y, 1), 1, world.maxy) + var/spawn_time = round(proj_data.time) * 10 + + var/turf/target = locate(trueX, trueY, z_co) + last_target = target + var/area/A = get_area(target) + flick("pad-beam", telepad) + + if(spawn_time > 15) // 1.5 seconds + playsound(telepad.loc, 'sound/weapons/flash.ogg', 25, 1) + // Wait depending on the time the projectile took to get there + teleporting = 1 + temp_msg = "Powering up bluespace crystals.
    Please wait." + + + spawn(round(proj_data.time) * 10) // in seconds + if(!telepad) + return + if(telepad.stat & NOPOWER) + return + teleporting = 0 + teleport_cooldown = world.time + (power * 2) + teles_left -= 1 + + // use a lot of power + use_power(power * 10) + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, get_turf(telepad)) + s.start() + + temp_msg = "Teleport successful.
    " + if(teles_left < 10) + temp_msg += "
    Calibration required soon." + else + temp_msg += "Data printed below." + + var/sparks = get_turf(target) + var/datum/effect/effect/system/spark_spread/y = new /datum/effect/effect/system/spark_spread + y.set_up(5, 1, sparks) + y.start() + + var/turf/source = target + var/turf/dest = get_turf(telepad) + var/log_msg = "" + log_msg += ": [key_name(user)] has teleported " + + if(sending) + source = dest + dest = target + + flick("pad-beam", telepad) + playsound(telepad.loc, 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) + for(var/atom/movable/ROI in source) + // if is anchored, don't let through + if(ROI.anchored) + if(isliving(ROI)) + var/mob/living/L = ROI + if(L.buckled) + // TP people on office chairs + if(L.buckled.anchored) + continue + + log_msg += "[key_name(L)] (on a chair), " + else + continue + else if(!isobserver(ROI)) + continue + if(ismob(ROI)) + var/mob/T = ROI + log_msg += "[key_name(T)], " + else + log_msg += "[ROI.name]" + if (istype(ROI, /obj/structure/closet)) + var/obj/structure/closet/C = ROI + log_msg += " (" + for(var/atom/movable/Q as mob|obj in C) + if(ismob(Q)) + log_msg += "[key_name(Q)], " + else + log_msg += "[Q.name], " + if (dd_hassuffix(log_msg, "(")) + log_msg += "empty)" + else + log_msg = dd_limittext(log_msg, length(log_msg) - 2) + log_msg += ")" + log_msg += ", " + do_teleport(ROI, dest) + + if (dd_hassuffix(log_msg, ", ")) + log_msg = dd_limittext(log_msg, length(log_msg) - 2) + else + log_msg += "nothing" + log_msg += " [sending ? "to" : "from"] [trueX], [trueY], [z_co] ([A ? A.name : "null area"])" + investigate_log(log_msg, "telesci") + updateDialog() + +/obj/machinery/computer/telescience/proc/teleport(mob/user) + if(rotation == null || angle == null || z_co == null) + temp_msg = "ERROR!
    Set a angle, rotation and sector." + return + if(power <= 0) + telefail() + temp_msg = "ERROR!
    No power selected!" + return + if(angle < 1 || angle > 90) + telefail() + temp_msg = "ERROR!
    Elevation is less than 1 or greater than 90." + return + if(z_co == 2 || z_co < 1 || z_co > 6) + telefail() + temp_msg = "ERROR! Sector is less than 1,
    greater than 6, or equal to 2." + return + if(teles_left > 0) + doteleport(user) + else + telefail() + temp_msg = "ERROR!
    Calibration required." + return + return + +/obj/machinery/computer/telescience/proc/eject() + for(var/obj/item/I in crystals) + I.loc = src.loc + crystals -= I + power = 0 + +/obj/machinery/computer/telescience/Topic(href, href_list) + if(..()) + return + if(!telepad) + updateDialog() + return + if(telepad.panel_open) + temp_msg = "Telepad undergoing physical maintenance operations." + + if(href_list["setrotation"]) + var/new_rot = input("Please input desired bearing in degrees.", name, rotation) as num + if(..()) // Check after we input a value, as they could've moved after they entered something + return + rotation = Clamp(new_rot, -900, 900) + rotation = round(rotation, 0.01) + + if(href_list["setangle"]) + var/new_angle = input("Please input desired elevation in degrees.", name, angle) as num + if(..()) + return + angle = Clamp(round(new_angle, 0.1), 1, 9999) + + if(href_list["setpower"]) + var/index = href_list["setpower"] + index = text2num(index) + if(index != null && power_options[index]) + if(crystals.len + telepad.efficiency >= index) + power = power_options[index] + + if(href_list["setz"]) + var/new_z = input("Please input desired sector.", name, z_co) as num + if(..()) + return + z_co = Clamp(round(new_z), 1, 10) + + if(href_list["ejectGPS"]) + inserted_gps.loc = loc + inserted_gps = null + + if(href_list["setMemory"]) + if(last_target) + inserted_gps.locked_location = last_target + temp_msg = "Location saved." + else + temp_msg = "ERROR!
    No data stored." + + if(href_list["send"]) + sending = 1 + teleport(usr) + + if(href_list["receive"]) + sending = 0 + teleport(usr) + + if(href_list["recal"]) + recalibrate() + sparks() + temp_msg = "NOTICE:
    Calibration successful." + + if(href_list["eject"]) + eject() + temp_msg = "NOTICE:
    Bluespace crystals ejected." + + updateDialog() + +/obj/machinery/computer/telescience/proc/recalibrate() + teles_left = rand(30, 40) + //angle_off = rand(-25, 25) + power_off = rand(-4, 0) rotation_off = rand(-10, 10) \ No newline at end of file diff --git a/code/unused/Agouri_stuff.dm b/code/unused/Agouri_stuff.dm index 4fbfc7adc1a..e8820b410fe 100644 --- a/code/unused/Agouri_stuff.dm +++ b/code/unused/Agouri_stuff.dm @@ -1,1949 +1,1949 @@ -/* -/obj/vehicle/airtight - //inner atmos - var/use_internal_tank = 0 - var/internal_tank_valve = ONE_ATMOSPHERE - var/obj/machinery/portable_atmospherics/canister/internal_tank - var/datum/gas_mixture/cabin_air - var/obj/machinery/atmospherics/portables_connector/connected_port = null - - var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature - var/datum/global_iterator/pr_give_air //moves air from tank to cabin - - -/obj/vehicle/airtight/New() - ..() - src.add_airtank() - src.add_cabin() - src.add_airtight_iterators() - - - - -//######################################### Helpers for airtight vehicles ######################################### - -/obj/vehicle/airtight/proc/add_cabin() - cabin_air = new - cabin_air.temperature = T20C - cabin_air.volume = 200 - cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - return cabin_air - -/obj/vehicle/airtight/proc/add_airtank() - internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) - return internal_tank - -/obj/vehicle/airtight/proc/add_airtight_iterators() - pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) - pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src)) - - -//######################################### Specific datums for airtight vehicles ################################# - - -/datum/global_iterator/vehicle_preserve_temp //normalizing cabin air temperature to 20 degrees celsium - delay = 20 - - process(var/obj/vehicle/airtight/V) - if(V.cabin_air && V.cabin_air.return_volume() > 0) - var/delta = V.cabin_air.temperature - T20C - V.cabin_air.temperature -= max(-10, min(10, round(delta/4,0.1))) - return - - -/datum/global_iterator/vehicle_tank_give_air - delay = 15 - - process(var/obj/vehicle/airtight/V) - if(V.internal_tank) - var/datum/gas_mixture/tank_air = V.internal_tank.return_air() - var/datum/gas_mixture/cabin_air = V.cabin_air - - var/release_pressure = V.internal_tank_valve - var/cabin_pressure = cabin_air.return_pressure() - var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) - var/transfer_moles = 0 - if(pressure_delta > 0) //cabin pressure lower than release pressure - if(tank_air.return_temperature() > 0) - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) - cabin_air.merge(removed) - else if(pressure_delta < 0) //cabin pressure higher than release pressure - var/datum/gas_mixture/t_air = V.get_turf_air() - pressure_delta = cabin_pressure - release_pressure - if(t_air) - pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) - if(pressure_delta > 0) //if location pressure is lower than cabin pressure - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) - if(t_air) - t_air.merge(removed) - else //just delete the cabin gas, we're in space or some shit - del(removed) - else - return stop() - return - - -//######################################### Atmospherics for vehicles ############################################# - - -/obj/vehicle/proc/get_turf_air() - var/turf/T = get_turf(src) - if(T) - . = T.return_air() - return - -/obj/vehicle/airtight/remove_air(amount) - if(use_internal_tank) - return cabin_air.remove(amount) - else - var/turf/T = get_turf(src) - if(T) - return T.remove_air(amount) - return - -/obj/vehicle/airtight/return_air() - if(use_internal_tank) - return cabin_air - return get_turf_air() - -/obj/vehicle/airtight/proc/return_pressure() - . = 0 - if(use_internal_tank) - . = cabin_air.return_pressure() - else - var/datum/gas_mixture/t_air = get_turf_air() - if(t_air) - . = t_air.return_pressure() - return - - -/obj/vehicle/airtight/proc/return_temperature() - . = 0 - if(use_internal_tank) - . = cabin_air.return_temperature() - else - var/datum/gas_mixture/t_air = get_turf_air() - if(t_air) - . = t_air.return_temperature() - return - -/obj/vehicle/airtight/proc/connect(obj/machinery/atmospherics/portables_connector/new_port) - //Make sure not already connected to something else - if(connected_port || !new_port || new_port.connected_device) - return 0 - - //Make sure are close enough for a valid connection - if(new_port.loc != src.loc) - return 0 - - //Perform the connection - connected_port = new_port - connected_port.connected_device = src - - //Actually enforce the air sharing - var/datum/pipe_network/network = connected_port.return_network(src) - if(network && !(internal_tank.return_air() in network.gases)) - network.gases += internal_tank.return_air() - network.update = 1 - log_message("Vehicle airtank connected to external port.") - return 1 - -/obj/vehicle/airtight/proc/disconnect() - if(!connected_port) - return 0 - - var/datum/pipe_network/network = connected_port.return_network(src) - if(network) - network.gases -= internal_tank.return_air() - - connected_port.connected_device = null - connected_port = null - src.log_message("Vehicle airtank disconnected from external port.") - return 1 - - - - -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// - - - -/obj/vehicle - name = "Vehicle" - icon = 'icons/vehicles/vehicles.dmi' - density = 1 - anchored = 1 - unacidable = 1 //To avoid the pilot-deleting shit that came with mechas - layer = MOB_LAYER - //var/can_move = 1 - var/mob/living/carbon/occupant = null - //var/step_in = 10 //make a step in step_in/10 sec. - //var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. - //var/step_energy_drain = 10 - var/health = 300 //health is health - //var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. - //the values in this list show how much damage will pass through, not how much will be absorbed. - var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1) - var/obj/item/weapon/stock_parts/cell/cell //Our power source - var/state = 0 - var/list/log = new - var/last_message = 0 - var/add_req_access = 1 - var/maint_access = 1 - //var/dna //dna-locking the mech - var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference - var/datum/effect/effect/system/spark_spread/spark_system = new - var/lights = 0 - var/lights_power = 6 - - //inner atmos //These go in airtight.dm, not all vehicles are space-faring -Agouri - //var/use_internal_tank = 0 - //var/internal_tank_valve = ONE_ATMOSPHERE - //var/obj/machinery/portable_atmospherics/canister/internal_tank - //var/datum/gas_mixture/cabin_air - //var/obj/machinery/atmospherics/portables_connector/connected_port = null - - var/obj/item/device/radio/radio = null - - var/max_temperature = 2500 - //var/internal_damage_threshold = 50 //health percentage below which internal damage is possible - var/internal_damage = 0 //contains bitflags - - var/list/operation_req_access = list()//required access level for mecha operation - var/list/internals_req_access = list(access_engine,access_robotics)//required access level to open cell compartment - - //var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature //In airtight.dm you go -Agouri - var/datum/global_iterator/pr_inertial_movement //controls intertial movement in spesss - - //var/datum/global_iterator/pr_give_air //moves air from tank to cabin //Y-you too -Agouri - - var/datum/global_iterator/pr_internal_damage //processes internal damage - - - var/wreckage - - var/list/equipment = new - var/obj/selected - //var/max_equip = 3 - - var/datum/events/events - - - -/obj/vehicle/New() - ..() - events = new - icon_state += "-unmanned" - add_radio() - //add_cabin() //No cabin for non-airtights - - spark_system.set_up(2, 0, src) - spark_system.attach(src) - add_cell() - add_iterators() - removeVerb(/obj/mecha/verb/disconnect_from_port) - removeVerb(/atom/movable/verb/pull) - log_message("[src.name]'s functions initialised. Work protocols active - Entering IDLE mode.") - loc.Entered(src) - return - - -//################ Helpers ########################################################### - - -/obj/vehicle/proc/removeVerb(verb_path) - verbs -= verb_path - -/obj/vehicle/proc/addVerb(verb_path) - verbs += verb_path - -/*/obj/vehicle/proc/add_airtank() //In airtight.dm -Agouri - internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) - return internal_tank*/ - -/obj/vehicle/proc/add_cell(var/obj/item/weapon/stock_parts/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new(src) - cell.charge = 15000 - cell.maxcharge = 15000 - -/*/obj/vehicle/proc/add_cabin() //In airtight.dm -Agouri - cabin_air = new - cabin_air.temperature = T20C - cabin_air.volume = 200 - cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - return cabin_air*/ - -/obj/vehicle/proc/add_radio() - radio = new(src) - radio.name = "[src] radio" - radio.icon = icon - radio.icon_state = icon_state - radio.subspace_transmission = 1 - -/obj/vehicle/proc/add_iterators() - pr_inertial_movement = new /datum/global_iterator/vehicle_intertial_movement(null,0) - //pr_internal_damage = new /datum/global_iterator/vehicle_internal_damage(list(src),0) - //pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) //In airtight.dm's add_airtight_iterators -Agouri - //pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src) //Same here -Agouri - -/obj/vehicle/proc/check_for_support() - if(locate(/obj/structure/grille, orange(1, src)) || locate(/obj/structure/lattice, orange(1, src)) || locate(/turf/simulated, orange(1, src)) || locate(/turf/unsimulated, orange(1, src))) - return 1 - else - return 0 - -//################ Logs and messages ############################################ - - -/obj/vehicle/proc/log_message(message as text,red=null) - log.len++ - log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]") - return log.len - - - -//################ Global Iterator Datums ###################################### - - -/datum/global_iterator/vehicle_intertial_movement //inertial movement in space - delay = 7 - - process(var/obj/vehicle/V as obj, direction) - if(direction) - if(!step(V, direction)||V.check_for_support()) - src.stop() - else - src.stop() - return - - -/datum/global_iterator/mecha_internal_damage // processing internal damage - - process(var/obj/mecha/mecha) - if(!mecha.hasInternalDamage()) - return stop() - if(mecha.hasInternalDamage(MECHA_INT_FIRE)) - if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5)) - mecha.clearInternalDamage(MECHA_INT_FIRE) - if(mecha.internal_tank) - if(mecha.internal_tank.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH))) - mecha.setInternalDamage(MECHA_INT_TANK_BREACH) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - if(int_tank_air && int_tank_air.return_volume()>0) //heat the air_contents - int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15)) - if(mecha.cabin_air && mecha.cabin_air.return_volume()>0) - mecha.cabin_air.temperature = min(6000+T0C, mecha.cabin_air.return_temperature()+rand(10,15)) - if(mecha.cabin_air.return_temperature()>mecha.max_temperature/2) - mecha.take_damage(4/round(mecha.max_temperature/mecha.cabin_air.return_temperature(),0.1),"fire") - if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum - mecha.pr_int_temp_processor.stop() - if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank - if(mecha.internal_tank) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) - if(mecha.loc && hascall(mecha.loc,"assume_air")) - mecha.loc.assume_air(leaked_gas) - else - del(leaked_gas) - if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) - if(mecha.get_charge()) - mecha.spark_system.start() - mecha.cell.charge -= min(20,mecha.cell.charge) - mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge) - return - - -*/ - - - - - -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// -///////////////////////////////////////////////////////// - - - - -/*/turf/DblClick() - if(istype(usr, /mob/living/silicon/ai)) - return move_camera_by_click() - if(usr.stat || usr.restrained() || usr.lying) - return ..() - - if(usr.hand && istype(usr.l_hand, /obj/item/weapon/flamethrower)) - var/turflist = getline(usr,src) - var/obj/item/weapon/flamethrower/F = usr.l_hand - F.flame_turf(turflist) - else if(!usr.hand && istype(usr.r_hand, /obj/item/weapon/flamethrower)) - var/turflist = getline(usr,src) - var/obj/item/weapon/flamethrower/F = usr.r_hand - F.flame_turf(turflist) - - return ..() - -/turf/New() - ..() - for(var/atom/movable/AM as mob|obj in src) - spawn( 0 ) - src.Entered(AM) - return - return - -/turf/ex_act(severity) - return 0 - - -/turf/bullet_act(var/obj/item/projectile/Proj) - if(istype(Proj ,/obj/item/projectile/beam/pulse)) - src.ex_act(2) - ..() - return 0 - -/turf/bullet_act(var/obj/item/projectile/Proj) - if(istype(Proj ,/obj/item/projectile/bullet/gyro)) - explosion(src, -1, 0, 2) - ..() - return 0 - -/turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area) - if (!mover || !isturf(mover.loc)) - return 1 - - - //First, check objects to block exit that are not on the border - for(var/obj/obstacle in mover.loc) - if((obstacle.flags & ~ON_BORDER) && (mover != obstacle) && (forget != obstacle)) - if(!obstacle.CheckExit(mover, src)) - mover.Bump(obstacle, 1) - return 0 - - //Now, check objects to block exit that are on the border - for(var/obj/border_obstacle in mover.loc) - if((border_obstacle.flags & ON_BORDER) && (mover != border_obstacle) && (forget != border_obstacle)) - if(!border_obstacle.CheckExit(mover, src)) - mover.Bump(border_obstacle, 1) - return 0 - - //Next, check objects to block entry that are on the border - for(var/obj/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 - - //Then, check the turf itself - if (!src.CanPass(mover, src)) - mover.Bump(src, 1) - return 0 - - //Finally, check objects/mobs to block entry that are not on the border - for(var/atom/movable/obstacle in src) - if(obstacle.flags & ~ON_BORDER) - 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! - - -/turf/Entered(atom/movable/M as mob|obj) - var/loopsanity = 100 - if(ismob(M)) - if(!M:lastarea) - M:lastarea = get_area(M.loc) - if(M:lastarea.has_gravity == 0) - inertial_drift(M) - - /* - if(M.flags & NOGRAV) - inertial_drift(M) - */ - - - - else if(!istype(src, /turf/space)) - M:inertia_dir = 0 - ..() - var/objects = 0 - for(var/atom/A as mob|obj|turf|area in src) - if(objects > loopsanity) break - objects++ - spawn( 0 ) - if ((A && M)) - A.HasEntered(M, 1) - return - objects = 0 - for(var/atom/A as mob|obj|turf|area in range(1)) - if(objects > loopsanity) break - objects++ - spawn( 0 ) - if ((A && M)) - A.HasProximity(M, 1) - return - return - -/turf/proc/inertial_drift(atom/movable/A as mob|obj) - if(!(A.last_move)) return - if((istype(A, /mob/) && src.x > 2 && src.x < (world.maxx - 1) && src.y > 2 && src.y < (world.maxy-1))) - var/mob/M = A - if(M.Process_Spacemove(1)) - M.inertia_dir = 0 - return - spawn(5) - if((M && !(M.anchored) && (M.loc == src))) - if(M.inertia_dir) - step(M, M.inertia_dir) - return - M.inertia_dir = M.last_move - step(M, M.inertia_dir) - return - -/turf/proc/levelupdate() - for(var/obj/O in src) - if(O.level == 1) - O.hide(src.intact) - -// override for space turfs, since they should never hide anything -/turf/space/levelupdate() - for(var/obj/O in src) - if(O.level == 1) - O.hide(0) - -// Removes all signs of lattice on the pos of the turf -Donkieyo -/turf/proc/RemoveLattice() - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - del L - -/turf/proc/ReplaceWithFloor(explode=0) - var/prior_icon = icon_old - var/old_dir = dir - - var/turf/simulated/floor/W = new /turf/simulated/floor( locate(src.x, src.y, src.z) ) - - W.RemoveLattice() - W.dir = old_dir - if(prior_icon) W.icon_state = prior_icon - else W.icon_state = "floor" - - if (!explode) - W.opacity = 1 - W.sd_SetOpacity(0) - //This is probably gonna make lighting go a bit wonky in bombed areas, but sd_SetOpacity was the primary reason bombs have been so laggy. --NEO - W.levelupdate() - return W - -/turf/proc/ReplaceWithPlating() - var/prior_icon = icon_old - var/old_dir = dir - - var/turf/simulated/floor/plating/W = new /turf/simulated/floor/plating( locate(src.x, src.y, src.z) ) - - W.RemoveLattice() - W.dir = old_dir - if(prior_icon) W.icon_state = prior_icon - else W.icon_state = "plating" - W.opacity = 1 - W.sd_SetOpacity(0) - W.levelupdate() - return W - -/turf/proc/ReplaceWithEngineFloor() - var/old_dir = dir - - var/turf/simulated/floor/engine/E = new /turf/simulated/floor/engine( locate(src.x, src.y, src.z) ) - - E.dir = old_dir - E.icon_state = "engine" - -/turf/simulated/Entered(atom/A, atom/OL) - if (istype(A,/mob/living/carbon)) - var/mob/living/carbon/M = A - if(M.lying) return - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(istype(H.shoes, /obj/item/clothing/shoes/clown_shoes)) - if(H.m_intent == "run") - if(H.footstep >= 2) - H.footstep = 0 - else - H.footstep++ - if(H.footstep == 0) - playsound(src, "clownstep", 50, 1) // this will get annoying very fast. - else - playsound(src, "clownstep", 20, 1) - - switch (src.wet) - if(1) - if(istype(M, /mob/living/carbon/human)) // Added check since monkeys don't have shoes - if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP)) - M.stop_pulling() - step(M, M.dir) - M << "\blue You slipped on the wet floor!" - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(8) - M.Weaken(5) - else - M.inertia_dir = 0 - return - else if(!istype(M, /mob/living/carbon/slime)) - if (M.m_intent == "run") - M.stop_pulling() - step(M, M.dir) - M << "\blue You slipped on the wet floor!" - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(8) - M.Weaken(5) - else - M.inertia_dir = 0 - return - - if(2) //lube - if(!istype(M, /mob/living/carbon/slime)) - M.stop_pulling() - step(M, M.dir) - spawn(1) step(M, M.dir) - spawn(2) step(M, M.dir) - spawn(3) step(M, M.dir) - spawn(4) step(M, M.dir) - M.take_organ_damage(2) - M << "\blue You slipped on the floor!" - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Weaken(10) - - ..() - -/turf/proc/ReplaceWithSpace() - var/old_dir = dir - var/turf/space/S = new /turf/space( locate(src.x, src.y, src.z) ) - S.dir = old_dir - return S - -/turf/proc/ReplaceWithLattice() - var/old_dir = dir - var/turf/space/S = new /turf/space( locate(src.x, src.y, src.z) ) - S.dir = old_dir - new /obj/structure/lattice( locate(src.x, src.y, src.z) ) - return S - -/turf/proc/ReplaceWithWall() - var/old_icon = icon_state - var/turf/simulated/wall/S = new /turf/simulated/wall( locate(src.x, src.y, src.z) ) - S.icon_old = old_icon - S.opacity = 0 - S.sd_NewOpacity(1) - return S - -/turf/proc/ReplaceWithRWall() - var/old_icon = icon_state - var/turf/simulated/wall/r_wall/S = new /turf/simulated/wall/r_wall( locate(src.x, src.y, src.z) ) - S.icon_old = old_icon - S.opacity = 0 - S.sd_NewOpacity(1) - return S - -/turf/simulated/wall/New() - ..() - -/turf/simulated/wall/proc/dismantle_wall(devastated=0, explode=0) - if(istype(src,/turf/simulated/wall/r_wall)) - if(!devastated) - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - new /obj/structure/girder/reinforced(src) - new /obj/item/stack/sheet/plasteel( src ) - else - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/plasteel( src ) - else if(istype(src,/turf/simulated/wall/cult)) - if(!devastated) - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - new /obj/effect/decal/remains/human(src) - else - new /obj/effect/decal/remains/human(src) - - else - if(!devastated) - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - new /obj/structure/girder(src) - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/metal( src ) - else - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/metal( src ) - new /obj/item/stack/sheet/metal( src ) - - ReplaceWithPlating(explode) - -/turf/simulated/wall/examine() - set src in oview(1) - - usr << "It looks like a regular wall." - return - -/turf/simulated/wall/ex_act(severity) - switch(severity) - if(1.0) - //SN src = null - src.ReplaceWithSpace() - del(src) - return - if(2.0) - if (prob(50)) - dismantle_wall(0,1) - else - dismantle_wall(1,1) - if(3.0) - var/proba - if (istype(src, /turf/simulated/wall/r_wall)) - proba = 15 - else - proba = 40 - if (prob(proba)) - dismantle_wall(0,1) - else - return - -/turf/simulated/wall/blob_act() - if(prob(50)) - dismantle_wall() - -/turf/simulated/wall/attack_paw(mob/user as mob) - if ((user.mutations & HULK)) - if (prob(40)) - usr << text("\blue You smash through the wall.") - dismantle_wall(1) - return - else - usr << text("\blue You punch the wall.") - return - - return src.attack_hand(user) - - -/turf/simulated/wall/attack_animal(mob/living/simple_animal/M as mob) - if(M.wall_smash) - if (istype(src, /turf/simulated/wall/r_wall)) - M << text("\blue This wall is far too strong for you to destroy.") - return - else - if (prob(40)) - M << text("\blue You smash through the wall.") - dismantle_wall(1) - return - else - M << text("\blue You smash against the wall.") - return - - M << "\blue You push the wall but nothing happens!" - return - -/turf/simulated/wall/attack_hand(mob/user as mob) - if ((user.mutations & HULK)) - if (prob(40)) - usr << text("\blue You smash through the wall.") - dismantle_wall(1) - return - else - usr << text("\blue You punch the wall.") - return - - user << "\blue You push the wall but nothing happens!" - playsound(src.loc, 'sound/weapons/Genhit.ogg', 25, 1) - src.add_fingerprint(user) - return - -/turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob) - - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" - return - - if (istype(W, /obj/item/weapon/weldingtool) && W:welding) - var/turf/T = get_turf(user) - if (!( istype(T, /turf) )) - return - - if (thermite) - var/obj/effect/overlay/O = new/obj/effect/overlay( src ) - O.name = "Thermite" - O.desc = "Looks hot." - O.icon = 'icons/effects/fire.dmi' - O.icon_state = "2" - O.anchored = 1 - O.density = 1 - O.layer = 5 - var/turf/simulated/floor/F = ReplaceWithPlating() - F.burn_tile() - F.icon_state = "wall_thermite" - user << "\red The thermite melts the wall." - spawn(100) del(O) - F.sd_LumReset() - return - - if (W:remove_fuel(0,user)) - W:welding = 2 - user << "\blue Now disassembling the outer wall plating." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - sleep(100) - if (W && istype(src, /turf/simulated/wall)) - if ((get_turf(user) == T && user.equipped() == W)) - user << "\blue You disassembled the outer wall plating." - dismantle_wall() - W:welding = 1 - else - user << "\blue You need more welding fuel to complete this task." - return - - else if (istype(W, /obj/item/weapon/pickaxe/plasmacutter)) - var/turf/T = user.loc - if (!( istype(T, /turf) )) - return - - if (thermite) - var/obj/effect/overlay/O = new/obj/effect/overlay( src ) - O.name = "Thermite" - O.desc = "Looks hot." - O.icon = 'icons/effects/fire.dmi' - O.icon_state = "2" - O.anchored = 1 - O.density = 1 - O.layer = 5 - var/turf/simulated/floor/F = ReplaceWithPlating() - F.burn_tile() - F.icon_state = "wall_thermite" - user << "\red The thermite melts the wall." - spawn(100) del(O) - F.sd_LumReset() - return - - else - user << "\blue Now disassembling the outer wall plating." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - sleep(60) - if (W && istype(src, /turf/simulated/wall)) - if ((get_turf(user) == T && user.equipped() == W)) - user << "\blue You disassembled the outer wall plating." - dismantle_wall() - for(var/mob/O in viewers(user, 5)) - O.show_message(text("\blue The wall was sliced apart by []!", user), 1, text("\red You hear metal being sliced apart."), 2) - return - - else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) - var/turf/T = user.loc - user << "\blue Now drilling through wall." - sleep(60) - if (W && istype(src, /turf/simulated/wall)) - if ((user.loc == T && user.equipped() == W)) - dismantle_wall(1) - for(var/mob/O in viewers(user, 5)) - O.show_message(text("\blue The wall was drilled apart by []!", user), 1, text("\red You hear metal being drilled appart."), 2) - return - - else if(istype(W, /obj/item/weapon/melee/energy/blade)) - var/turf/T = user.loc - user << "\blue Now slicing through wall." - W:spark_system.start() - playsound(src.loc, "sparks", 50, 1) - sleep(70) - if (W && istype(src, /turf/simulated/wall)) - if ((user.loc == T && user.equipped() == W)) - W:spark_system.start() - playsound(src.loc, "sparks", 50, 1) - playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) - dismantle_wall(1) - for(var/mob/O in viewers(user, 5)) - O.show_message(text("\blue The wall was sliced apart by []!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) - return - - else if(istype(W,/obj/item/apc_frame)) - var/obj/item/apc_frame/AH = W - AH.try_build(src) - else if(istype(W,/obj/item/weapon/contraband/poster)) - var/obj/item/weapon/contraband/poster/P = W - if(P.resulting_poster) - var/check = 0 - var/stuff_on_wall = 0 - for( var/obj/O in src.contents) //Let's see if it already has a poster on it or too much stuff - if(istype(O,/obj/effect/decal/poster)) - check = 1 - break - stuff_on_wall++ - if(stuff_on_wall==3) - check = 1 - break - - if(check) - user << "The wall is far too cluttered to place a poster!" - return - - user << "You start placing the poster on the wall..." //Looks like it's uncluttered enough. Place the poster. - - P.resulting_poster.loc = src - var/temp = P.resulting_poster.icon_state - var/temp_loc = user.loc - P.resulting_poster.icon_state = "poster_being_set" - playsound(P.resulting_poster.loc, 'sound/items/poster_being_created.ogg', 100, 1) - sleep(24) - - if(user.loc == temp_loc)//Let's check if he still is there - user << "You place the poster!" - P.resulting_poster.icon_state = temp - src.contents += P.resulting_poster - del(P) - else - user << "You stop placing the poster." - P.resulting_poster.loc = P - P.resulting_poster.icon_state = temp - else - return attack_hand(user) - return - - -/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob) - - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" - return - - if(!istype(src, /turf/simulated/wall/r_wall)) - return // this may seem stupid and redundant but apparently floors can call this attackby() proc, it was spamming shit up. -- Doohl - - - if (istype(W, /obj/item/weapon/weldingtool) && W:welding) - W:eyecheck(user) - var/turf/T = user.loc - if (!( istype(T, /turf) )) - return - - if (thermite) - var/obj/effect/overlay/O = new/obj/effect/overlay( src ) - O.name = "Thermite" - O.desc = "Looks hot." - O.icon = 'icons/effects/fire.dmi' - O.icon_state = "2" - O.anchored = 1 - O.density = 1 - O.layer = 5 - var/turf/simulated/floor/F = ReplaceWithPlating() - F.burn_tile() - F.icon_state = "wall_thermite" - user << "\red The thermite melts the wall." - spawn(100) del(O) - F.sd_LumReset() - return - - if (src.d_state == 2) - W:welding = 2 - user << "\blue Slicing metal cover." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - sleep(60) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 3 - user << "\blue You removed the metal cover." - W:welding = 1 - - else if (src.d_state == 5) - W:welding = 2 - user << "\blue Removing support rods." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - sleep(100) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 6 - new /obj/item/stack/rods( src ) - user << "\blue You removed the support rods." - W:welding = 1 - - else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) - var/turf/T = user.loc - if (!( istype(T, /turf) )) - return - - if (thermite) - var/obj/effect/overlay/O = new/obj/effect/overlay( src ) - O.name = "Thermite" - O.desc = "Looks hot." - O.icon = 'icons/effects/fire.dmi' - O.icon_state = "2" - O.anchored = 1 - O.density = 1 - O.layer = 5 - var/turf/simulated/floor/F = ReplaceWithPlating() - F.burn_tile() - F.icon_state = "wall_thermite" - user << "\red The thermite melts the wall." - spawn(100) del(O) - F.sd_LumReset() - return - - if (src.d_state == 2) - user << "\blue Slicing metal cover." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - sleep(40) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 3 - user << "\blue You removed the metal cover." - - else if (src.d_state == 5) - user << "\blue Removing support rods." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - sleep(70) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 6 - new /obj/item/stack/rods( src ) - user << "\blue You removed the support rods." - - else if(istype(W, /obj/item/weapon/melee/energy/blade)) - user << "\blue This wall is too thick to slice through. You will need to find a different path." - return - - else if (istype(W, /obj/item/weapon/wrench)) - if (src.d_state == 4) - var/turf/T = user.loc - user << "\blue Detaching support rods." - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - sleep(40) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 5 - user << "\blue You detach the support rods." - - else if (istype(W, /obj/item/weapon/wirecutters)) - if (src.d_state == 0) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - src.d_state = 1 - new /obj/item/stack/rods( src ) - - else if (istype(W, /obj/item/weapon/screwdriver)) - if (src.d_state == 1) - var/turf/T = user.loc - playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << "\blue Removing support lines." - sleep(40) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 2 - user << "\blue You removed the support lines." - - else if (istype(W, /obj/item/weapon/crowbar)) - - if (src.d_state == 3) - var/turf/T = user.loc - user << "\blue Prying cover off." - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - sleep(100) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 4 - user << "\blue You removed the cover." - - else if (src.d_state == 6) - var/turf/T = user.loc - user << "\blue Prying outer sheath off." - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - sleep(100) - if(src) - if ((user.loc == T && user.equipped() == W)) - user << "\blue You removed the outer sheath." - dismantle_wall() - return - - else if (istype(W, /obj/item/weapon/pickaxe/diamonddrill)) - var/turf/T = user.loc - user << "\blue You begin to drill though, this will take some time." - sleep(200) - if(src) - if ((user.loc == T && user.equipped() == W)) - user << "\blue Your drill tears though the reinforced plating." - dismantle_wall() - return - - else if ((istype(W, /obj/item/stack/sheet/metal)) && (src.d_state)) - var/turf/T = user.loc - user << "\blue Repairing wall." - sleep(100) - if ((user.loc == T && user.equipped() == W)) - src.d_state = 0 - src.icon_state = initial(src.icon_state) - user << "\blue You repaired the wall." - if (W:amount > 1) - W:amount-- - else - del(W) - - else if(istype(W,/obj/item/weapon/contraband/poster)) - var/obj/item/weapon/contraband/poster/P = W - if(P.resulting_poster) - var/check = 0 - var/stuff_on_wall = 0 - for( var/obj/O in src.contents) //Let's see if it already has a poster on it or too much stuff - if(istype(O,/obj/effect/decal/poster)) - check = 1 - break - stuff_on_wall++ - if(stuff_on_wall==3) - check = 1 - break - - if(check) - user << "The wall is far too cluttered to place a poster!" - return - - user << "You start placing the poster on the wall..." //Looks like it's uncluttered enough. Place the poster. - - P.resulting_poster.loc = src - var/temp = P.resulting_poster.icon_state - var/temp_loc = user.loc - P.resulting_poster.icon_state = "poster_being_set" - playsound(P.resulting_poster.loc, 'sound/items/poster_being_created.ogg', 100, 1) - sleep(24) - - if(user.loc == temp_loc)//Let's check if he still is there - user << "You place the poster!" - P.resulting_poster.icon_state = temp - src.contents += P.resulting_poster - del(P) - else - user << "You stop placing the poster." - P.resulting_poster.loc = P - P.resulting_poster.icon_state = temp - return - - if(istype(W,/obj/item/apc_frame)) - var/obj/item/apc_frame/AH = W - AH.try_build(src) - return - - if(src.d_state > 0) - src.icon_state = "r_wall-[d_state]" - - else - return attack_hand(user) - return - -/turf/simulated/wall/meteorhit(obj/M as obj) - if (prob(15)) - dismantle_wall() - else if(prob(70)) - ReplaceWithPlating() - else - ReplaceWithLattice() - return 0 - - -//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", - "damaged5","panelscorched","floorscorched1","floorscorched2","platingdmg1","platingdmg2", - "platingdmg3","plating","light_on","light_on_flicker1","light_on_flicker2", - "light_on_clicker3","light_on_clicker4","light_on_clicker5","light_broken", - "light_on_broken","light_off","wall_thermite","grass1","grass2","grass3","grass4", - "asteroid","asteroid_dug", - "asteroid0","asteroid1","asteroid2","asteroid3","asteroid4", - "asteroid5","asteroid6","asteroid7","asteroid8", - "burning","oldburning","light-on-r","light-on-y","light-on-g","light-on-b") - -var/list/plating_icons = list("plating","platingdmg1","platingdmg2","platingdmg3","asteroid","asteroid_dug") - -/turf/simulated/floor - - //Note to coders, the 'intact' var can no longer be used to determine if the floor is a plating or not. - //Use the is_plating(), is_plasteel_floor() and is_light_floor() procs instead. --Errorage - name = "floor" - icon = 'icons/turf/floors.dmi' - icon_state = "floor" - var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default - var/icon_plating = "plating" - thermal_conductivity = 0.040 - heat_capacity = 10000 - var/broken = 0 - var/burnt = 0 - var/obj/item/stack/tile/floor_tile = new/obj/item/stack/tile/plasteel - - airless - icon_state = "floor" - name = "airless floor" - oxygen = 0.01 - nitrogen = 0.01 - temperature = TCMB - - New() - ..() - name = "floor" - - light - name = "Light floor" - luminosity = 5 - icon_state = "light_on" - floor_tile = new/obj/item/stack/tile/light - - New() - floor_tile.New() //I guess New() isn't run on objects spawned without the definition of a turf to house them, ah well. - var/n = name //just in case commands rename it in the ..() call - ..() - spawn(4) - update_icon() - name = n - - grass - name = "Grass patch" - icon_state = "grass1" - floor_tile = new/obj/item/stack/tile/grass - - New() - floor_tile.New() //I guess New() isn't run on objects spawned without the definition of a turf to house them, ah well. - icon_state = "grass[pick("1","2","3","4")]" - ..() - spawn(4) - update_icon() - for(var/direction in cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding get updated properly - -/turf/simulated/floor/vault - icon_state = "rockvault" - - New(location,type) - ..() - icon_state = "[type]vault" - -/turf/simulated/wall/vault - icon_state = "rockvault" - - New(location,type) - ..() - icon_state = "[type]vault" - -/turf/simulated/floor/engine - name = "reinforced floor" - icon_state = "engine" - thermal_conductivity = 0.025 - heat_capacity = 325000 - -/turf/simulated/floor/engine/cult - name = "engraved floor" - icon_state = "cult" - - -/turf/simulated/floor/engine/n20 - New() - ..() - var/datum/gas_mixture/adding = new - var/datum/gas/sleeping_agent/trace_gas = new - - trace_gas.moles = 2000 - adding.trace_gases += trace_gas - adding.temperature = T20C - - assume_air(adding) - -/turf/simulated/floor/engine/vacuum - name = "vacuum floor" - icon_state = "engine" - oxygen = 0 - nitrogen = 0.001 - temperature = TCMB - -/turf/simulated/floor/plating - name = "plating" - icon_state = "plating" - floor_tile = null - intact = 0 - -/turf/simulated/floor/plating/airless - icon_state = "plating" - name = "airless plating" - oxygen = 0.01 - nitrogen = 0.01 - temperature = TCMB - - New() - ..() - name = "plating" - -/turf/simulated/floor/grid - icon = 'icons/turf/floors.dmi' - icon_state = "circuit" - -/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 - icon_regular_floor = "floor" - else - icon_regular_floor = icon_state - -//turf/simulated/floor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) -// if ((istype(mover, /obj/machinery/vehicle) && !(src.burnt))) -// if (!( locate(/obj/machinery/mass_driver, src) )) -// return 0 -// return ..() - -/turf/simulated/floor/ex_act(severity) - //set src in oview(1) - switch(severity) - if(1.0) - src.ReplaceWithSpace() - if(2.0) - switch(pick(1,2;75,3)) - if (1) - src.ReplaceWithLattice() - if(prob(33)) new /obj/item/stack/sheet/metal(src) - if(2) - src.ReplaceWithSpace() - if(3) - if(prob(80)) - src.break_tile_to_plating() - else - src.break_tile() - src.hotspot_expose(1000,CELL_VOLUME) - if(prob(33)) new /obj/item/stack/sheet/metal(src) - if(3.0) - if (prob(50)) - src.break_tile() - src.hotspot_expose(1000,CELL_VOLUME) - return - -/turf/simulated/floor/blob_act() - return - -turf/simulated/floor/proc/update_icon() - if(is_plasteel_floor()) - if(!broken && !burnt) - icon_state = icon_regular_floor - if(is_plating()) - if(!broken && !burnt) - icon_state = icon_plating //Because asteroids are 'platings' too. - if(is_light_floor()) - var/obj/item/stack/tile/light/T = floor_tile - if(T.on) - switch(T.state) - if(0) - icon_state = "light_on" - sd_SetLuminosity(5) - if(1) - var/num = pick("1","2","3","4") - icon_state = "light_on_flicker[num]" - sd_SetLuminosity(5) - if(2) - icon_state = "light_on_broken" - sd_SetLuminosity(5) - if(3) - icon_state = "light_off" - sd_SetLuminosity(0) - else - sd_SetLuminosity(0) - icon_state = "light_off" - if(is_grass_floor()) - if(!broken && !burnt) - if(!(icon_state in list("grass1","grass2","grass3","grass4"))) - icon_state = "grass[pick("1","2","3","4")]" - spawn(1) - if(istype(src,/turf/simulated/floor)) //Was throwing runtime errors due to a chance of it changing to space halfway through. - if(air) - update_visuals(air) - -turf/simulated/floor/return_siding_icon_state() - ..() - if(is_grass_floor()) - var/dir_sum = 0 - for(var/direction in cardinal) - var/turf/T = get_step(src,direction) - if(!(T.is_grass_floor())) - dir_sum += direction - if(dir_sum) - return "wood_siding[dir_sum]" - else - return 0 - - -/turf/simulated/floor/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/turf/simulated/floor/attack_hand(mob/user as mob) - if (is_light_floor()) - var/obj/item/stack/tile/light/T = floor_tile - T.on = !T.on - update_icon() - if ((!( user.canmove ) || user.restrained() || !( user.pulling ))) - return - if (user.pulling.anchored) - return - if ((user.pulling.loc != user.loc && get_dist(user, user.pulling) > 1)) - return - if (ismob(user.pulling)) - var/mob/M = user.pulling - var/mob/t = M.pulling - M.stop_pulling() - step(user.pulling, get_dir(user.pulling.loc, src)) - M.start_pulling(t) - else - step(user.pulling, get_dir(user.pulling.loc, src)) - return - -/turf/simulated/floor/engine/attackby(obj/item/weapon/C as obj, mob/user as mob) - if(!C) - return - if(!user) - return - if(istype(C, /obj/item/weapon/wrench)) - user << "\blue Removing rods..." - playsound(src.loc, 'sound/items/Ratchet.ogg', 80, 1) - if(do_after(user, 30)) - new /obj/item/stack/rods(src, 2) - ReplaceWithFloor() - var/turf/simulated/floor/F = src - F.make_plating() - return - -/turf/simulated/floor/proc/gets_drilled() - return - -/turf/simulated/floor/proc/break_tile_to_plating() - if(!is_plating()) - make_plating() - break_tile() - -/turf/simulated/floor/is_plasteel_floor() - if(istype(floor_tile,/obj/item/stack/tile/plasteel)) - return 1 - else - return 0 - -/turf/simulated/floor/is_light_floor() - if(istype(floor_tile,/obj/item/stack/tile/light)) - return 1 - else - return 0 - -/turf/simulated/floor/is_grass_floor() - if(istype(floor_tile,/obj/item/stack/tile/grass)) - return 1 - else - return 0 - -/turf/simulated/floor/is_plating() - if(!floor_tile) - return 1 - return 0 - -/turf/simulated/floor/proc/break_tile() - if(istype(src,/turf/simulated/floor/engine)) return - if(istype(src,/turf/simulated/floor/mech_bay_recharge_floor)) - src.ReplaceWithPlating() - if(broken) return - if(is_plasteel_floor()) - src.icon_state = "damaged[pick(1,2,3,4,5)]" - broken = 1 - else if(is_plasteel_floor()) - src.icon_state = "light_broken" - broken = 1 - else if(is_plating()) - src.icon_state = "platingdmg[pick(1,2,3)]" - broken = 1 - else if(is_grass_floor()) - src.icon_state = "sand[pick("1","2","3")]" - broken = 1 - -/turf/simulated/floor/proc/burn_tile() - if(istype(src,/turf/simulated/floor/engine)) return - if(broken || burnt) return - if(is_plasteel_floor()) - src.icon_state = "damaged[pick(1,2,3,4,5)]" - burnt = 1 - else if(is_plasteel_floor()) - src.icon_state = "floorscorched[pick(1,2)]" - burnt = 1 - else if(is_plating()) - src.icon_state = "panelscorched" - burnt = 1 - else if(is_grass_floor()) - src.icon_state = "sand[pick("1","2","3")]" - burnt = 1 - -//This proc will delete the floor_tile and the update_iocn() proc will then change the icon_state of the turf -//This proc auto corrects the grass tiles' siding. -/turf/simulated/floor/proc/make_plating() - if(istype(src,/turf/simulated/floor/engine)) return - - if(is_grass_floor()) - for(var/direction in cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding get updated properly - - if(!floor_tile) return - del(floor_tile) - icon_plating = "plating" - sd_SetLuminosity(0) - floor_tile = null - intact = 0 - broken = 0 - burnt = 0 - - update_icon() - levelupdate() - -//This proc will make the turf a plasteel floor tile. The expected argument is the tile to make the turf with -//If none is given it will make a new object. dropping or unequipping must be handled before or after calling -//this proc. -/turf/simulated/floor/proc/make_plasteel_floor(var/obj/item/stack/tile/plasteel/T = null) - broken = 0 - burnt = 0 - intact = 1 - sd_SetLuminosity(0) - if(T) - if(istype(T,/obj/item/stack/tile/plasteel)) - floor_tile = T - if (icon_regular_floor) - icon_state = icon_regular_floor - else - icon_state = "floor" - icon_regular_floor = icon_state - update_icon() - levelupdate() - return - //if you gave a valid parameter, it won't get thisf ar. - floor_tile = new/obj/item/stack/tile/plasteel - icon_state = "floor" - icon_regular_floor = icon_state - - update_icon() - levelupdate() - -//This proc will make the turf a light floor tile. The expected argument is the tile to make the turf with -//If none is given it will make a new object. dropping or unequipping must be handled before or after calling -//this proc. -/turf/simulated/floor/proc/make_light_floor(var/obj/item/stack/tile/light/T = null) - broken = 0 - burnt = 0 - intact = 1 - if(T) - if(istype(T,/obj/item/stack/tile/light)) - floor_tile = T - update_icon() - levelupdate() - return - //if you gave a valid parameter, it won't get thisf ar. - floor_tile = new/obj/item/stack/tile/light - - update_icon() - levelupdate() - -//This proc will make a turf into a grass patch. Fun eh? Insert the grass tile to be used as the argument -//If no argument is given a new one will be made. -/turf/simulated/floor/proc/make_grass_floor(var/obj/item/stack/tile/grass/T = null) - broken = 0 - burnt = 0 - intact = 1 - if(T) - if(istype(T,/obj/item/stack/tile/grass)) - floor_tile = T - update_icon() - levelupdate() - return - //if you gave a valid parameter, it won't get thisf ar. - floor_tile = new/obj/item/stack/tile/grass - - update_icon() - levelupdate() - -/turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob) - - if(!C || !user) - return 0 - - if(istype(C,/obj/item/weapon/light/bulb)) //only for light tiles - if(is_light_floor()) - var/obj/item/stack/tile/light/T = floor_tile - if(T.state) - user.unEquip(C) - del(C) - T.state = C //fixing it by bashing it with a light bulb, fun eh? - update_icon() - user << "\blue You replace the light bulb." - else - user << "\blue The lightbulb seems fine, no need to replace it." - - if(istype(C, /obj/item/weapon/crowbar) && (!(is_plating()))) - if(broken || burnt) - user << "\red You remove the broken plating." - else - user << "\red You remove the [floor_tile.name]." - new floor_tile.type(src) - - make_plating() - playsound(src.loc, 'sound/items/Crowbar.ogg', 80, 1) - - return - - if(istype(C, /obj/item/stack/rods)) - var/obj/item/stack/rods/R = C - if (is_plating()) - if (R.amount >= 2) - user << "\blue Reinforcing the floor..." - if(do_after(user, 30) && R && R.amount >= 2 && is_plating()) - ReplaceWithEngineFloor() - playsound(src.loc, 'sound/items/Deconstruct.ogg', 80, 1) - R.use(2) - return - else - user << "\red You need more rods." - else - user << "\red You must remove the plating first." - return - - if(istype(C, /obj/item/stack/tile)) - if(is_plating()) - if(!broken && !burnt) - var/obj/item/stack/tile/T = C - floor_tile = new T.type - intact = 1 - if(istype(T,/obj/item/stack/tile/light)) - var/obj/item/stack/tile/light/L = T - var/obj/item/stack/tile/light/F = floor_tile - F.state = L.state - F.on = L.on - if(istype(T,/obj/item/stack/tile/grass)) - for(var/direction in cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding gets updated properly - T.use(1) - update_icon() - levelupdate() - playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) - else - user << "\blue This section is too damaged to support a tile. Use a welder to fix the damage." - - - if(istype(C, /obj/item/stack/cable_coil)) - if(is_plating()) - var/obj/item/stack/cable_coil/coil = C - coil.turf_place(src, user) - else - user << "\red You must remove the plating first." - - if(istype(C, /obj/item/weapon/shovel)) - if(is_grass_floor()) - new /obj/item/weapon/ore/glass(src) - new /obj/item/weapon/ore/glass(src) //Make some sand if you shovel grass - user << "\blue You shovel the grass." - make_plating() - else - user << "\red You cannot shovel this." - - if(istype(C, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/welder = C - if(welder.welding && (is_plating())) - if(broken || burnt) - if(welder.remove_fuel(0,user)) - user << "\red You fix some dents on the broken plating." - playsound(src.loc, 'sound/items/Welder.ogg', 80, 1) - icon_state = "plating" - burnt = 0 - broken = 0 - else - user << "\blue You need more welding fuel to complete this task." - -/turf/unsimulated/floor/attack_paw(user as mob) - return src.attack_hand(user) - -/turf/unsimulated/floor/attack_hand(var/mob/user as mob) - if ((!( user.canmove ) || user.restrained() || !( user.pulling ))) - return - if (user.pulling.anchored) - return - if ((user.pulling.loc != user.loc && get_dist(user, user.pulling) > 1)) - return - if (ismob(user.pulling)) - var/mob/M = user.pulling - var/mob/t = M.pulling - M.stop_pulling() - step(user.pulling, get_dir(user.pulling.loc, src)) - M.start_pulling(t) - else - step(user.pulling, get_dir(user.pulling.loc, src)) - return - -// imported from space.dm - -/turf/space/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/turf/space/attack_hand(mob/user as mob) - if ((user.restrained() || !( user.pulling ))) - return - if (user.pulling.anchored) - return - if ((user.pulling.loc != user.loc && get_dist(user, user.pulling) > 1)) - return - if (ismob(user.pulling)) - var/mob/M = user.pulling - var/atom/movable/t = M.pulling - M.stop_pulling() - step(user.pulling, get_dir(user.pulling.loc, src)) - M.start_pulling(t) - else - step(user.pulling, get_dir(user.pulling.loc, src)) - return - -/turf/space/attackby(obj/item/C as obj, mob/user as mob) - - if (istype(C, /obj/item/stack/rods)) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - return - var/obj/item/stack/rods/R = C - user << "\blue Constructing support lattice ..." - playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) - ReplaceWithLattice() - R.use(1) - return - - if (istype(C, /obj/item/stack/tile/plasteel)) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - var/obj/item/stack/tile/plasteel/S = C - del(L) - playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) - S.build(src) - S.use(1) - return - else - user << "\red The plating is going to need some support." - return - - -// Ported from unstable r355 - -/turf/space/Entered(atom/movable/A as mob|obj) - ..() - if ((!(A) || src != A.loc || istype(null, /obj/effect/beam))) return - - inertial_drift(A) - - if(ticker && ticker.mode) - - // Okay, so let's make it so that people can travel z levels but not nuke disks! - // if(ticker.mode.name == "nuclear emergency") return - - if(ticker.mode.name == "extended"||ticker.mode.name == "sandbox") - Sandbox_Spacemove(A) - - else - if (src.x <= 2 || A.x >= (world.maxx - 1) || src.y <= 2 || A.y >= (world.maxy - 1)) - if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) - return - - if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels ... And moving this shit down here so it only fires when they're actually trying to change z-level. - return - - if(!isemptylist(A.search_contents_for(/obj/item/weapon/disk/nuclear))) - if(istype(A, /mob/living)) - var/mob/living/MM = A - if(MM.client) - MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is." - return - - - - var/move_to_z_str = pickweight(accessable_z_levels) - - var/move_to_z = text2num(move_to_z_str) - - if(!move_to_z) - return - - - - A.z = move_to_z - - - if(src.x <= 2) - A.x = world.maxx - 2 - - else if (A.x >= (world.maxx - 1)) - A.x = 3 - - else if (src.y <= 2) - A.y = world.maxy - 2 - - else if (A.y >= (world.maxy - 1)) - A.y = 3 - - spawn (0) - if ((A && A.loc)) - A.loc.Entered(A) - -// if(istype(A, /obj/structure/closet/coffin)) -// coffinhandler.Add(A) - -/turf/space/proc/Sandbox_Spacemove(atom/movable/A as mob|obj) - var/cur_x - var/cur_y - var/next_x - var/next_y - var/target_z - var/list/y_arr - - if(src.x <= 1) - if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) - return - - var/list/cur_pos = src.get_global_map_pos() - 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] - target_z = y_arr[cur_y] -/* - //debug - world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" - world << "Target Z = [target_z]" - world << "Next X = [next_x]" - //debug -*/ - if(target_z) - A.z = target_z - A.x = world.maxx - 2 - spawn (0) - if ((A && A.loc)) - A.loc.Entered(A) - else if (src.x >= world.maxx) - if(istype(A, /obj/effect/meteor)) - del(A) - return - - var/list/cur_pos = src.get_global_map_pos() - 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] - target_z = y_arr[cur_y] -/* - //debug - world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" - world << "Target Z = [target_z]" - world << "Next X = [next_x]" - //debug -*/ - if(target_z) - A.z = target_z - A.x = 3 - spawn (0) - if ((A && A.loc)) - A.loc.Entered(A) - else if (src.y <= 1) - if(istype(A, /obj/effect/meteor)) - del(A) - return - var/list/cur_pos = src.get_global_map_pos() - if(!cur_pos) return - cur_x = cur_pos["x"] - cur_y = cur_pos["y"] - y_arr = global_map[cur_x] - next_y = (--cur_y||y_arr.len) - target_z = y_arr[next_y] -/* - //debug - world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" - world << "Next Y = [next_y]" - world << "Target Z = [target_z]" - //debug -*/ - if(target_z) - A.z = target_z - A.y = world.maxy - 2 - spawn (0) - if ((A && A.loc)) - A.loc.Entered(A) - - else if (src.y >= world.maxy) - if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) - return - var/list/cur_pos = src.get_global_map_pos() - if(!cur_pos) return - cur_x = cur_pos["x"] - cur_y = cur_pos["y"] - y_arr = global_map[cur_x] - next_y = (++cur_y > y_arr.len ? 1 : cur_y) - target_z = y_arr[next_y] -/* - //debug - world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" - world << "Next Y = [next_y]" - world << "Target Z = [target_z]" - //debug -*/ - if(target_z) - A.z = target_z - A.y = 3 - spawn (0) - if ((A && A.loc)) - A.loc.Entered(A) - return - -/obj/effect/vaultspawner - var/maxX = 6 - var/maxY = 6 - var/minX = 2 - var/minY = 2 - -/obj/effect/vaultspawner/New(turf/location as turf,lX = minX,uX = maxX,lY = minY,uY = maxY,var/type = null) - if(!type) - type = pick("sandstone","rock","alien") - - var/lowBoundX = location.x - var/lowBoundY = location.y - - var/hiBoundX = location.x + rand(lX,uX) - var/hiBoundY = location.y + rand(lY,uY) - - var/z = location.z - - for(var/i = lowBoundX,i<=hiBoundX,i++) - for(var/j = lowBoundY,j<=hiBoundY,j++) - if(i == lowBoundX || i == hiBoundX || j == lowBoundY || j == hiBoundY) - new /turf/simulated/wall/vault(locate(i,j,z),type) - else - new /turf/simulated/floor/vault(locate(i,j,z),type) - - del(src) - -/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() - for(var/obj/mecha/M in src)//Mecha are not gibbed but are damaged. - spawn(0) - M.take_damage(100, "brute") - for(var/obj/effect/critter/M in src) - spawn(0) - M.Die() - -/turf/proc/Bless() - if(flags & NOJAUNT) - return - flags |= NOJAUNT +/* +/obj/vehicle/airtight + //inner atmos + var/use_internal_tank = 0 + var/internal_tank_valve = ONE_ATMOSPHERE + var/obj/machinery/portable_atmospherics/canister/internal_tank + var/datum/gas_mixture/cabin_air + var/obj/machinery/atmospherics/portables_connector/connected_port = null + + var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature + var/datum/global_iterator/pr_give_air //moves air from tank to cabin + + +/obj/vehicle/airtight/New() + ..() + src.add_airtank() + src.add_cabin() + src.add_airtight_iterators() + + + + +//######################################### Helpers for airtight vehicles ######################################### + +/obj/vehicle/airtight/proc/add_cabin() + cabin_air = new + cabin_air.temperature = T20C + cabin_air.volume = 200 + cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) + cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) + return cabin_air + +/obj/vehicle/airtight/proc/add_airtank() + internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) + return internal_tank + +/obj/vehicle/airtight/proc/add_airtight_iterators() + pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) + pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src)) + + +//######################################### Specific datums for airtight vehicles ################################# + + +/datum/global_iterator/vehicle_preserve_temp //normalizing cabin air temperature to 20 degrees celsium + delay = 20 + + process(var/obj/vehicle/airtight/V) + if(V.cabin_air && V.cabin_air.return_volume() > 0) + var/delta = V.cabin_air.temperature - T20C + V.cabin_air.temperature -= max(-10, min(10, round(delta/4,0.1))) + return + + +/datum/global_iterator/vehicle_tank_give_air + delay = 15 + + process(var/obj/vehicle/airtight/V) + if(V.internal_tank) + var/datum/gas_mixture/tank_air = V.internal_tank.return_air() + var/datum/gas_mixture/cabin_air = V.cabin_air + + var/release_pressure = V.internal_tank_valve + var/cabin_pressure = cabin_air.return_pressure() + var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) + var/transfer_moles = 0 + if(pressure_delta > 0) //cabin pressure lower than release pressure + if(tank_air.return_temperature() > 0) + transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) + var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) + cabin_air.merge(removed) + else if(pressure_delta < 0) //cabin pressure higher than release pressure + var/datum/gas_mixture/t_air = V.get_turf_air() + pressure_delta = cabin_pressure - release_pressure + if(t_air) + pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) + if(pressure_delta > 0) //if location pressure is lower than cabin pressure + transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) + var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) + if(t_air) + t_air.merge(removed) + else //just delete the cabin gas, we're in space or some shit + del(removed) + else + return stop() + return + + +//######################################### Atmospherics for vehicles ############################################# + + +/obj/vehicle/proc/get_turf_air() + var/turf/T = get_turf(src) + if(T) + . = T.return_air() + return + +/obj/vehicle/airtight/remove_air(amount) + if(use_internal_tank) + return cabin_air.remove(amount) + else + var/turf/T = get_turf(src) + if(T) + return T.remove_air(amount) + return + +/obj/vehicle/airtight/return_air() + if(use_internal_tank) + return cabin_air + return get_turf_air() + +/obj/vehicle/airtight/proc/return_pressure() + . = 0 + if(use_internal_tank) + . = cabin_air.return_pressure() + else + var/datum/gas_mixture/t_air = get_turf_air() + if(t_air) + . = t_air.return_pressure() + return + + +/obj/vehicle/airtight/proc/return_temperature() + . = 0 + if(use_internal_tank) + . = cabin_air.return_temperature() + else + var/datum/gas_mixture/t_air = get_turf_air() + if(t_air) + . = t_air.return_temperature() + return + +/obj/vehicle/airtight/proc/connect(obj/machinery/atmospherics/portables_connector/new_port) + //Make sure not already connected to something else + if(connected_port || !new_port || new_port.connected_device) + return 0 + + //Make sure are close enough for a valid connection + if(new_port.loc != src.loc) + return 0 + + //Perform the connection + connected_port = new_port + connected_port.connected_device = src + + //Actually enforce the air sharing + var/datum/pipe_network/network = connected_port.return_network(src) + if(network && !(internal_tank.return_air() in network.gases)) + network.gases += internal_tank.return_air() + network.update = 1 + log_message("Vehicle airtank connected to external port.") + return 1 + +/obj/vehicle/airtight/proc/disconnect() + if(!connected_port) + return 0 + + var/datum/pipe_network/network = connected_port.return_network(src) + if(network) + network.gases -= internal_tank.return_air() + + connected_port.connected_device = null + connected_port = null + src.log_message("Vehicle airtank disconnected from external port.") + return 1 + + + + +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// + + + +/obj/vehicle + name = "Vehicle" + icon = 'icons/vehicles/vehicles.dmi' + density = 1 + anchored = 1 + unacidable = 1 //To avoid the pilot-deleting shit that came with mechas + layer = MOB_LAYER + //var/can_move = 1 + var/mob/living/carbon/occupant = null + //var/step_in = 10 //make a step in step_in/10 sec. + //var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. + //var/step_energy_drain = 10 + var/health = 300 //health is health + //var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. + //the values in this list show how much damage will pass through, not how much will be absorbed. + var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1) + var/obj/item/weapon/stock_parts/cell/cell //Our power source + var/state = 0 + var/list/log = new + var/last_message = 0 + var/add_req_access = 1 + var/maint_access = 1 + //var/dna //dna-locking the mech + var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference + var/datum/effect/effect/system/spark_spread/spark_system = new + var/lights = 0 + var/lights_power = 6 + + //inner atmos //These go in airtight.dm, not all vehicles are space-faring -Agouri + //var/use_internal_tank = 0 + //var/internal_tank_valve = ONE_ATMOSPHERE + //var/obj/machinery/portable_atmospherics/canister/internal_tank + //var/datum/gas_mixture/cabin_air + //var/obj/machinery/atmospherics/portables_connector/connected_port = null + + var/obj/item/device/radio/radio = null + + var/max_temperature = 2500 + //var/internal_damage_threshold = 50 //health percentage below which internal damage is possible + var/internal_damage = 0 //contains bitflags + + var/list/operation_req_access = list()//required access level for mecha operation + var/list/internals_req_access = list(access_engine,access_robotics)//required access level to open cell compartment + + //var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature //In airtight.dm you go -Agouri + var/datum/global_iterator/pr_inertial_movement //controls intertial movement in spesss + + //var/datum/global_iterator/pr_give_air //moves air from tank to cabin //Y-you too -Agouri + + var/datum/global_iterator/pr_internal_damage //processes internal damage + + + var/wreckage + + var/list/equipment = new + var/obj/selected + //var/max_equip = 3 + + var/datum/events/events + + + +/obj/vehicle/New() + ..() + events = new + icon_state += "-unmanned" + add_radio() + //add_cabin() //No cabin for non-airtights + + spark_system.set_up(2, 0, src) + spark_system.attach(src) + add_cell() + add_iterators() + removeVerb(/obj/mecha/verb/disconnect_from_port) + removeVerb(/atom/movable/verb/pull) + log_message("[src.name]'s functions initialised. Work protocols active - Entering IDLE mode.") + loc.Entered(src) + return + + +//################ Helpers ########################################################### + + +/obj/vehicle/proc/removeVerb(verb_path) + verbs -= verb_path + +/obj/vehicle/proc/addVerb(verb_path) + verbs += verb_path + +/*/obj/vehicle/proc/add_airtank() //In airtight.dm -Agouri + internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) + return internal_tank*/ + +/obj/vehicle/proc/add_cell(var/obj/item/weapon/stock_parts/cell/C=null) + if(C) + C.forceMove(src) + cell = C + return + cell = new(src) + cell.charge = 15000 + cell.maxcharge = 15000 + +/*/obj/vehicle/proc/add_cabin() //In airtight.dm -Agouri + cabin_air = new + cabin_air.temperature = T20C + cabin_air.volume = 200 + cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) + cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) + return cabin_air*/ + +/obj/vehicle/proc/add_radio() + radio = new(src) + radio.name = "[src] radio" + radio.icon = icon + radio.icon_state = icon_state + radio.subspace_transmission = 1 + +/obj/vehicle/proc/add_iterators() + pr_inertial_movement = new /datum/global_iterator/vehicle_intertial_movement(null,0) + //pr_internal_damage = new /datum/global_iterator/vehicle_internal_damage(list(src),0) + //pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) //In airtight.dm's add_airtight_iterators -Agouri + //pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src) //Same here -Agouri + +/obj/vehicle/proc/check_for_support() + if(locate(/obj/structure/grille, orange(1, src)) || locate(/obj/structure/lattice, orange(1, src)) || locate(/turf/simulated, orange(1, src)) || locate(/turf/unsimulated, orange(1, src))) + return 1 + else + return 0 + +//################ Logs and messages ############################################ + + +/obj/vehicle/proc/log_message(message as text,red=null) + log.len++ + log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]") + return log.len + + + +//################ Global Iterator Datums ###################################### + + +/datum/global_iterator/vehicle_intertial_movement //inertial movement in space + delay = 7 + + process(var/obj/vehicle/V as obj, direction) + if(direction) + if(!step(V, direction)||V.check_for_support()) + src.stop() + else + src.stop() + return + + +/datum/global_iterator/mecha_internal_damage // processing internal damage + + process(var/obj/mecha/mecha) + if(!mecha.hasInternalDamage()) + return stop() + if(mecha.hasInternalDamage(MECHA_INT_FIRE)) + if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5)) + mecha.clearInternalDamage(MECHA_INT_FIRE) + if(mecha.internal_tank) + if(mecha.internal_tank.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH))) + mecha.setInternalDamage(MECHA_INT_TANK_BREACH) + var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() + if(int_tank_air && int_tank_air.return_volume()>0) //heat the air_contents + int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15)) + if(mecha.cabin_air && mecha.cabin_air.return_volume()>0) + mecha.cabin_air.temperature = min(6000+T0C, mecha.cabin_air.return_temperature()+rand(10,15)) + if(mecha.cabin_air.return_temperature()>mecha.max_temperature/2) + mecha.take_damage(4/round(mecha.max_temperature/mecha.cabin_air.return_temperature(),0.1),"fire") + if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum + mecha.pr_int_temp_processor.stop() + if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank + if(mecha.internal_tank) + var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() + var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) + if(mecha.loc && hascall(mecha.loc,"assume_air")) + mecha.loc.assume_air(leaked_gas) + else + del(leaked_gas) + if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) + if(mecha.get_charge()) + mecha.spark_system.start() + mecha.cell.charge -= min(20,mecha.cell.charge) + mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge) + return + + +*/ + + + + + +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// + + + + +/*/turf/DblClick() + if(istype(usr, /mob/living/silicon/ai)) + return move_camera_by_click() + if(usr.stat || usr.restrained() || usr.lying) + return ..() + + if(usr.hand && istype(usr.l_hand, /obj/item/weapon/flamethrower)) + var/turflist = getline(usr,src) + var/obj/item/weapon/flamethrower/F = usr.l_hand + F.flame_turf(turflist) + else if(!usr.hand && istype(usr.r_hand, /obj/item/weapon/flamethrower)) + var/turflist = getline(usr,src) + var/obj/item/weapon/flamethrower/F = usr.r_hand + F.flame_turf(turflist) + + return ..() + +/turf/New() + ..() + for(var/atom/movable/AM as mob|obj in src) + spawn( 0 ) + src.Entered(AM) + return + return + +/turf/ex_act(severity) + return 0 + + +/turf/bullet_act(var/obj/item/projectile/Proj) + if(istype(Proj ,/obj/item/projectile/beam/pulse)) + src.ex_act(2) + ..() + return 0 + +/turf/bullet_act(var/obj/item/projectile/Proj) + if(istype(Proj ,/obj/item/projectile/bullet/gyro)) + explosion(src, -1, 0, 2) + ..() + return 0 + +/turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area) + if (!mover || !isturf(mover.loc)) + return 1 + + + //First, check objects to block exit that are not on the border + for(var/obj/obstacle in mover.loc) + if((obstacle.flags & ~ON_BORDER) && (mover != obstacle) && (forget != obstacle)) + if(!obstacle.CheckExit(mover, src)) + mover.Bump(obstacle, 1) + return 0 + + //Now, check objects to block exit that are on the border + for(var/obj/border_obstacle in mover.loc) + if((border_obstacle.flags & ON_BORDER) && (mover != border_obstacle) && (forget != border_obstacle)) + if(!border_obstacle.CheckExit(mover, src)) + mover.Bump(border_obstacle, 1) + return 0 + + //Next, check objects to block entry that are on the border + for(var/obj/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 + + //Then, check the turf itself + if (!src.CanPass(mover, src)) + mover.Bump(src, 1) + return 0 + + //Finally, check objects/mobs to block entry that are not on the border + for(var/atom/movable/obstacle in src) + if(obstacle.flags & ~ON_BORDER) + 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! + + +/turf/Entered(atom/movable/M as mob|obj) + var/loopsanity = 100 + if(ismob(M)) + if(!M:lastarea) + M:lastarea = get_area(M.loc) + if(M:lastarea.has_gravity == 0) + inertial_drift(M) + + /* + if(M.flags & NOGRAV) + inertial_drift(M) + */ + + + + else if(!istype(src, /turf/space)) + M:inertia_dir = 0 + ..() + var/objects = 0 + for(var/atom/A as mob|obj|turf|area in src) + if(objects > loopsanity) break + objects++ + spawn( 0 ) + if ((A && M)) + A.HasEntered(M, 1) + return + objects = 0 + for(var/atom/A as mob|obj|turf|area in range(1)) + if(objects > loopsanity) break + objects++ + spawn( 0 ) + if ((A && M)) + A.HasProximity(M, 1) + return + return + +/turf/proc/inertial_drift(atom/movable/A as mob|obj) + if(!(A.last_move)) return + if((istype(A, /mob/) && src.x > 2 && src.x < (world.maxx - 1) && src.y > 2 && src.y < (world.maxy-1))) + var/mob/M = A + if(M.Process_Spacemove(1)) + M.inertia_dir = 0 + return + spawn(5) + if((M && !(M.anchored) && (M.loc == src))) + if(M.inertia_dir) + step(M, M.inertia_dir) + return + M.inertia_dir = M.last_move + step(M, M.inertia_dir) + return + +/turf/proc/levelupdate() + for(var/obj/O in src) + if(O.level == 1) + O.hide(src.intact) + +// override for space turfs, since they should never hide anything +/turf/space/levelupdate() + for(var/obj/O in src) + if(O.level == 1) + O.hide(0) + +// Removes all signs of lattice on the pos of the turf -Donkieyo +/turf/proc/RemoveLattice() + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + del L + +/turf/proc/ReplaceWithFloor(explode=0) + var/prior_icon = icon_old + var/old_dir = dir + + var/turf/simulated/floor/W = new /turf/simulated/floor( locate(src.x, src.y, src.z) ) + + W.RemoveLattice() + W.dir = old_dir + if(prior_icon) W.icon_state = prior_icon + else W.icon_state = "floor" + + if (!explode) + W.opacity = 1 + W.sd_SetOpacity(0) + //This is probably gonna make lighting go a bit wonky in bombed areas, but sd_SetOpacity was the primary reason bombs have been so laggy. --NEO + W.levelupdate() + return W + +/turf/proc/ReplaceWithPlating() + var/prior_icon = icon_old + var/old_dir = dir + + var/turf/simulated/floor/plating/W = new /turf/simulated/floor/plating( locate(src.x, src.y, src.z) ) + + W.RemoveLattice() + W.dir = old_dir + if(prior_icon) W.icon_state = prior_icon + else W.icon_state = "plating" + W.opacity = 1 + W.sd_SetOpacity(0) + W.levelupdate() + return W + +/turf/proc/ReplaceWithEngineFloor() + var/old_dir = dir + + var/turf/simulated/floor/engine/E = new /turf/simulated/floor/engine( locate(src.x, src.y, src.z) ) + + E.dir = old_dir + E.icon_state = "engine" + +/turf/simulated/Entered(atom/A, atom/OL) + if (istype(A,/mob/living/carbon)) + var/mob/living/carbon/M = A + if(M.lying) return + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(istype(H.shoes, /obj/item/clothing/shoes/clown_shoes)) + if(H.m_intent == "run") + if(H.footstep >= 2) + H.footstep = 0 + else + H.footstep++ + if(H.footstep == 0) + playsound(src, "clownstep", 50, 1) // this will get annoying very fast. + else + playsound(src, "clownstep", 20, 1) + + switch (src.wet) + if(1) + if(istype(M, /mob/living/carbon/human)) // Added check since monkeys don't have shoes + if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP)) + M.stop_pulling() + step(M, M.dir) + M << "\blue You slipped on the wet floor!" + playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) + M.Stun(8) + M.Weaken(5) + else + M.inertia_dir = 0 + return + else if(!istype(M, /mob/living/carbon/slime)) + if (M.m_intent == "run") + M.stop_pulling() + step(M, M.dir) + M << "\blue You slipped on the wet floor!" + playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) + M.Stun(8) + M.Weaken(5) + else + M.inertia_dir = 0 + return + + if(2) //lube + if(!istype(M, /mob/living/carbon/slime)) + M.stop_pulling() + step(M, M.dir) + spawn(1) step(M, M.dir) + spawn(2) step(M, M.dir) + spawn(3) step(M, M.dir) + spawn(4) step(M, M.dir) + M.take_organ_damage(2) + M << "\blue You slipped on the floor!" + playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) + M.Weaken(10) + + ..() + +/turf/proc/ReplaceWithSpace() + var/old_dir = dir + var/turf/space/S = new /turf/space( locate(src.x, src.y, src.z) ) + S.dir = old_dir + return S + +/turf/proc/ReplaceWithLattice() + var/old_dir = dir + var/turf/space/S = new /turf/space( locate(src.x, src.y, src.z) ) + S.dir = old_dir + new /obj/structure/lattice( locate(src.x, src.y, src.z) ) + return S + +/turf/proc/ReplaceWithWall() + var/old_icon = icon_state + var/turf/simulated/wall/S = new /turf/simulated/wall( locate(src.x, src.y, src.z) ) + S.icon_old = old_icon + S.opacity = 0 + S.sd_NewOpacity(1) + return S + +/turf/proc/ReplaceWithRWall() + var/old_icon = icon_state + var/turf/simulated/wall/r_wall/S = new /turf/simulated/wall/r_wall( locate(src.x, src.y, src.z) ) + S.icon_old = old_icon + S.opacity = 0 + S.sd_NewOpacity(1) + return S + +/turf/simulated/wall/New() + ..() + +/turf/simulated/wall/proc/dismantle_wall(devastated=0, explode=0) + if(istype(src,/turf/simulated/wall/r_wall)) + if(!devastated) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + new /obj/structure/girder/reinforced(src) + new /obj/item/stack/sheet/plasteel( src ) + else + new /obj/item/stack/sheet/metal( src ) + new /obj/item/stack/sheet/metal( src ) + new /obj/item/stack/sheet/plasteel( src ) + else if(istype(src,/turf/simulated/wall/cult)) + if(!devastated) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + new /obj/effect/decal/remains/human(src) + else + new /obj/effect/decal/remains/human(src) + + else + if(!devastated) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + new /obj/structure/girder(src) + new /obj/item/stack/sheet/metal( src ) + new /obj/item/stack/sheet/metal( src ) + else + new /obj/item/stack/sheet/metal( src ) + new /obj/item/stack/sheet/metal( src ) + new /obj/item/stack/sheet/metal( src ) + + ReplaceWithPlating(explode) + +/turf/simulated/wall/examine() + set src in oview(1) + + usr << "It looks like a regular wall." + return + +/turf/simulated/wall/ex_act(severity) + switch(severity) + if(1.0) + //SN src = null + src.ReplaceWithSpace() + del(src) + return + if(2.0) + if (prob(50)) + dismantle_wall(0,1) + else + dismantle_wall(1,1) + if(3.0) + var/proba + if (istype(src, /turf/simulated/wall/r_wall)) + proba = 15 + else + proba = 40 + if (prob(proba)) + dismantle_wall(0,1) + else + return + +/turf/simulated/wall/blob_act() + if(prob(50)) + dismantle_wall() + +/turf/simulated/wall/attack_paw(mob/user as mob) + if ((user.mutations & HULK)) + if (prob(40)) + usr << text("\blue You smash through the wall.") + dismantle_wall(1) + return + else + usr << text("\blue You punch the wall.") + return + + return src.attack_hand(user) + + +/turf/simulated/wall/attack_animal(mob/living/simple_animal/M as mob) + if(M.wall_smash) + if (istype(src, /turf/simulated/wall/r_wall)) + M << text("\blue This wall is far too strong for you to destroy.") + return + else + if (prob(40)) + M << text("\blue You smash through the wall.") + dismantle_wall(1) + return + else + M << text("\blue You smash against the wall.") + return + + M << "\blue You push the wall but nothing happens!" + return + +/turf/simulated/wall/attack_hand(mob/user as mob) + if ((user.mutations & HULK)) + if (prob(40)) + usr << text("\blue You smash through the wall.") + dismantle_wall(1) + return + else + usr << text("\blue You punch the wall.") + return + + user << "\blue You push the wall but nothing happens!" + playsound(src.loc, 'sound/weapons/Genhit.ogg', 25, 1) + src.add_fingerprint(user) + return + +/turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob) + + if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") + usr << "\red You don't have the dexterity to do this!" + return + + if (istype(W, /obj/item/weapon/weldingtool) && W:welding) + var/turf/T = get_turf(user) + if (!( istype(T, /turf) )) + return + + if (thermite) + var/obj/effect/overlay/O = new/obj/effect/overlay( src ) + O.name = "Thermite" + O.desc = "Looks hot." + O.icon = 'icons/effects/fire.dmi' + O.icon_state = "2" + O.anchored = 1 + O.density = 1 + O.layer = 5 + var/turf/simulated/floor/F = ReplaceWithPlating() + F.burn_tile() + F.icon_state = "wall_thermite" + user << "\red The thermite melts the wall." + spawn(100) del(O) + F.sd_LumReset() + return + + if (W:remove_fuel(0,user)) + W:welding = 2 + user << "\blue Now disassembling the outer wall plating." + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + sleep(100) + if (W && istype(src, /turf/simulated/wall)) + if ((get_turf(user) == T && user.equipped() == W)) + user << "\blue You disassembled the outer wall plating." + dismantle_wall() + W:welding = 1 + else + user << "\blue You need more welding fuel to complete this task." + return + + else if (istype(W, /obj/item/weapon/pickaxe/plasmacutter)) + var/turf/T = user.loc + if (!( istype(T, /turf) )) + return + + if (thermite) + var/obj/effect/overlay/O = new/obj/effect/overlay( src ) + O.name = "Thermite" + O.desc = "Looks hot." + O.icon = 'icons/effects/fire.dmi' + O.icon_state = "2" + O.anchored = 1 + O.density = 1 + O.layer = 5 + var/turf/simulated/floor/F = ReplaceWithPlating() + F.burn_tile() + F.icon_state = "wall_thermite" + user << "\red The thermite melts the wall." + spawn(100) del(O) + F.sd_LumReset() + return + + else + user << "\blue Now disassembling the outer wall plating." + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + sleep(60) + if (W && istype(src, /turf/simulated/wall)) + if ((get_turf(user) == T && user.equipped() == W)) + user << "\blue You disassembled the outer wall plating." + dismantle_wall() + for(var/mob/O in viewers(user, 5)) + O.show_message(text("\blue The wall was sliced apart by []!", user), 1, text("\red You hear metal being sliced apart."), 2) + return + + else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) + var/turf/T = user.loc + user << "\blue Now drilling through wall." + sleep(60) + if (W && istype(src, /turf/simulated/wall)) + if ((user.loc == T && user.equipped() == W)) + dismantle_wall(1) + for(var/mob/O in viewers(user, 5)) + O.show_message(text("\blue The wall was drilled apart by []!", user), 1, text("\red You hear metal being drilled appart."), 2) + return + + else if(istype(W, /obj/item/weapon/melee/energy/blade)) + var/turf/T = user.loc + user << "\blue Now slicing through wall." + W:spark_system.start() + playsound(src.loc, "sparks", 50, 1) + sleep(70) + if (W && istype(src, /turf/simulated/wall)) + if ((user.loc == T && user.equipped() == W)) + W:spark_system.start() + playsound(src.loc, "sparks", 50, 1) + playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) + dismantle_wall(1) + for(var/mob/O in viewers(user, 5)) + O.show_message(text("\blue The wall was sliced apart by []!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) + return + + else if(istype(W,/obj/item/apc_frame)) + var/obj/item/apc_frame/AH = W + AH.try_build(src) + else if(istype(W,/obj/item/weapon/contraband/poster)) + var/obj/item/weapon/contraband/poster/P = W + if(P.resulting_poster) + var/check = 0 + var/stuff_on_wall = 0 + for( var/obj/O in src.contents) //Let's see if it already has a poster on it or too much stuff + if(istype(O,/obj/effect/decal/poster)) + check = 1 + break + stuff_on_wall++ + if(stuff_on_wall==3) + check = 1 + break + + if(check) + user << "The wall is far too cluttered to place a poster!" + return + + user << "You start placing the poster on the wall..." //Looks like it's uncluttered enough. Place the poster. + + P.resulting_poster.loc = src + var/temp = P.resulting_poster.icon_state + var/temp_loc = user.loc + P.resulting_poster.icon_state = "poster_being_set" + playsound(P.resulting_poster.loc, 'sound/items/poster_being_created.ogg', 100, 1) + sleep(24) + + if(user.loc == temp_loc)//Let's check if he still is there + user << "You place the poster!" + P.resulting_poster.icon_state = temp + src.contents += P.resulting_poster + del(P) + else + user << "You stop placing the poster." + P.resulting_poster.loc = P + P.resulting_poster.icon_state = temp + else + return attack_hand(user) + return + + +/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob) + + if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") + usr << "\red You don't have the dexterity to do this!" + return + + if(!istype(src, /turf/simulated/wall/r_wall)) + return // this may seem stupid and redundant but apparently floors can call this attackby() proc, it was spamming shit up. -- Doohl + + + if (istype(W, /obj/item/weapon/weldingtool) && W:welding) + W:eyecheck(user) + var/turf/T = user.loc + if (!( istype(T, /turf) )) + return + + if (thermite) + var/obj/effect/overlay/O = new/obj/effect/overlay( src ) + O.name = "Thermite" + O.desc = "Looks hot." + O.icon = 'icons/effects/fire.dmi' + O.icon_state = "2" + O.anchored = 1 + O.density = 1 + O.layer = 5 + var/turf/simulated/floor/F = ReplaceWithPlating() + F.burn_tile() + F.icon_state = "wall_thermite" + user << "\red The thermite melts the wall." + spawn(100) del(O) + F.sd_LumReset() + return + + if (src.d_state == 2) + W:welding = 2 + user << "\blue Slicing metal cover." + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + sleep(60) + if ((user.loc == T && user.equipped() == W)) + src.d_state = 3 + user << "\blue You removed the metal cover." + W:welding = 1 + + else if (src.d_state == 5) + W:welding = 2 + user << "\blue Removing support rods." + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + sleep(100) + if ((user.loc == T && user.equipped() == W)) + src.d_state = 6 + new /obj/item/stack/rods( src ) + user << "\blue You removed the support rods." + W:welding = 1 + + else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) + var/turf/T = user.loc + if (!( istype(T, /turf) )) + return + + if (thermite) + var/obj/effect/overlay/O = new/obj/effect/overlay( src ) + O.name = "Thermite" + O.desc = "Looks hot." + O.icon = 'icons/effects/fire.dmi' + O.icon_state = "2" + O.anchored = 1 + O.density = 1 + O.layer = 5 + var/turf/simulated/floor/F = ReplaceWithPlating() + F.burn_tile() + F.icon_state = "wall_thermite" + user << "\red The thermite melts the wall." + spawn(100) del(O) + F.sd_LumReset() + return + + if (src.d_state == 2) + user << "\blue Slicing metal cover." + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + sleep(40) + if ((user.loc == T && user.equipped() == W)) + src.d_state = 3 + user << "\blue You removed the metal cover." + + else if (src.d_state == 5) + user << "\blue Removing support rods." + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + sleep(70) + if ((user.loc == T && user.equipped() == W)) + src.d_state = 6 + new /obj/item/stack/rods( src ) + user << "\blue You removed the support rods." + + else if(istype(W, /obj/item/weapon/melee/energy/blade)) + user << "\blue This wall is too thick to slice through. You will need to find a different path." + return + + else if (istype(W, /obj/item/weapon/wrench)) + if (src.d_state == 4) + var/turf/T = user.loc + user << "\blue Detaching support rods." + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + sleep(40) + if ((user.loc == T && user.equipped() == W)) + src.d_state = 5 + user << "\blue You detach the support rods." + + else if (istype(W, /obj/item/weapon/wirecutters)) + if (src.d_state == 0) + playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) + src.d_state = 1 + new /obj/item/stack/rods( src ) + + else if (istype(W, /obj/item/weapon/screwdriver)) + if (src.d_state == 1) + var/turf/T = user.loc + playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) + user << "\blue Removing support lines." + sleep(40) + if ((user.loc == T && user.equipped() == W)) + src.d_state = 2 + user << "\blue You removed the support lines." + + else if (istype(W, /obj/item/weapon/crowbar)) + + if (src.d_state == 3) + var/turf/T = user.loc + user << "\blue Prying cover off." + playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) + sleep(100) + if ((user.loc == T && user.equipped() == W)) + src.d_state = 4 + user << "\blue You removed the cover." + + else if (src.d_state == 6) + var/turf/T = user.loc + user << "\blue Prying outer sheath off." + playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) + sleep(100) + if(src) + if ((user.loc == T && user.equipped() == W)) + user << "\blue You removed the outer sheath." + dismantle_wall() + return + + else if (istype(W, /obj/item/weapon/pickaxe/diamonddrill)) + var/turf/T = user.loc + user << "\blue You begin to drill though, this will take some time." + sleep(200) + if(src) + if ((user.loc == T && user.equipped() == W)) + user << "\blue Your drill tears though the reinforced plating." + dismantle_wall() + return + + else if ((istype(W, /obj/item/stack/sheet/metal)) && (src.d_state)) + var/turf/T = user.loc + user << "\blue Repairing wall." + sleep(100) + if ((user.loc == T && user.equipped() == W)) + src.d_state = 0 + src.icon_state = initial(src.icon_state) + user << "\blue You repaired the wall." + if (W:amount > 1) + W:amount-- + else + del(W) + + else if(istype(W,/obj/item/weapon/contraband/poster)) + var/obj/item/weapon/contraband/poster/P = W + if(P.resulting_poster) + var/check = 0 + var/stuff_on_wall = 0 + for( var/obj/O in src.contents) //Let's see if it already has a poster on it or too much stuff + if(istype(O,/obj/effect/decal/poster)) + check = 1 + break + stuff_on_wall++ + if(stuff_on_wall==3) + check = 1 + break + + if(check) + user << "The wall is far too cluttered to place a poster!" + return + + user << "You start placing the poster on the wall..." //Looks like it's uncluttered enough. Place the poster. + + P.resulting_poster.loc = src + var/temp = P.resulting_poster.icon_state + var/temp_loc = user.loc + P.resulting_poster.icon_state = "poster_being_set" + playsound(P.resulting_poster.loc, 'sound/items/poster_being_created.ogg', 100, 1) + sleep(24) + + if(user.loc == temp_loc)//Let's check if he still is there + user << "You place the poster!" + P.resulting_poster.icon_state = temp + src.contents += P.resulting_poster + del(P) + else + user << "You stop placing the poster." + P.resulting_poster.loc = P + P.resulting_poster.icon_state = temp + return + + if(istype(W,/obj/item/apc_frame)) + var/obj/item/apc_frame/AH = W + AH.try_build(src) + return + + if(src.d_state > 0) + src.icon_state = "r_wall-[d_state]" + + else + return attack_hand(user) + return + +/turf/simulated/wall/meteorhit(obj/M as obj) + if (prob(15)) + dismantle_wall() + else if(prob(70)) + ReplaceWithPlating() + else + ReplaceWithLattice() + return 0 + + +//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", + "damaged5","panelscorched","floorscorched1","floorscorched2","platingdmg1","platingdmg2", + "platingdmg3","plating","light_on","light_on_flicker1","light_on_flicker2", + "light_on_clicker3","light_on_clicker4","light_on_clicker5","light_broken", + "light_on_broken","light_off","wall_thermite","grass1","grass2","grass3","grass4", + "asteroid","asteroid_dug", + "asteroid0","asteroid1","asteroid2","asteroid3","asteroid4", + "asteroid5","asteroid6","asteroid7","asteroid8", + "burning","oldburning","light-on-r","light-on-y","light-on-g","light-on-b") + +var/list/plating_icons = list("plating","platingdmg1","platingdmg2","platingdmg3","asteroid","asteroid_dug") + +/turf/simulated/floor + + //Note to coders, the 'intact' var can no longer be used to determine if the floor is a plating or not. + //Use the is_plating(), is_plasteel_floor() and is_light_floor() procs instead. --Errorage + name = "floor" + icon = 'icons/turf/floors.dmi' + icon_state = "floor" + var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default + var/icon_plating = "plating" + thermal_conductivity = 0.040 + heat_capacity = 10000 + var/broken = 0 + var/burnt = 0 + var/obj/item/stack/tile/floor_tile = new/obj/item/stack/tile/plasteel + + airless + icon_state = "floor" + name = "airless floor" + oxygen = 0.01 + nitrogen = 0.01 + temperature = TCMB + + New() + ..() + name = "floor" + + light + name = "Light floor" + luminosity = 5 + icon_state = "light_on" + floor_tile = new/obj/item/stack/tile/light + + New() + floor_tile.New() //I guess New() isn't run on objects spawned without the definition of a turf to house them, ah well. + var/n = name //just in case commands rename it in the ..() call + ..() + spawn(4) + update_icon() + name = n + + grass + name = "Grass patch" + icon_state = "grass1" + floor_tile = new/obj/item/stack/tile/grass + + New() + floor_tile.New() //I guess New() isn't run on objects spawned without the definition of a turf to house them, ah well. + icon_state = "grass[pick("1","2","3","4")]" + ..() + spawn(4) + update_icon() + for(var/direction in cardinal) + if(istype(get_step(src,direction),/turf/simulated/floor)) + var/turf/simulated/floor/FF = get_step(src,direction) + FF.update_icon() //so siding get updated properly + +/turf/simulated/floor/vault + icon_state = "rockvault" + + New(location,type) + ..() + icon_state = "[type]vault" + +/turf/simulated/wall/vault + icon_state = "rockvault" + + New(location,type) + ..() + icon_state = "[type]vault" + +/turf/simulated/floor/engine + name = "reinforced floor" + icon_state = "engine" + thermal_conductivity = 0.025 + heat_capacity = 325000 + +/turf/simulated/floor/engine/cult + name = "engraved floor" + icon_state = "cult" + + +/turf/simulated/floor/engine/n20 + New() + ..() + var/datum/gas_mixture/adding = new + var/datum/gas/sleeping_agent/trace_gas = new + + trace_gas.moles = 2000 + adding.trace_gases += trace_gas + adding.temperature = T20C + + assume_air(adding) + +/turf/simulated/floor/engine/vacuum + name = "vacuum floor" + icon_state = "engine" + oxygen = 0 + nitrogen = 0.001 + temperature = TCMB + +/turf/simulated/floor/plating + name = "plating" + icon_state = "plating" + floor_tile = null + intact = 0 + +/turf/simulated/floor/plating/airless + icon_state = "plating" + name = "airless plating" + oxygen = 0.01 + nitrogen = 0.01 + temperature = TCMB + + New() + ..() + name = "plating" + +/turf/simulated/floor/grid + icon = 'icons/turf/floors.dmi' + icon_state = "circuit" + +/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 + icon_regular_floor = "floor" + else + icon_regular_floor = icon_state + +//turf/simulated/floor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) +// if ((istype(mover, /obj/machinery/vehicle) && !(src.burnt))) +// if (!( locate(/obj/machinery/mass_driver, src) )) +// return 0 +// return ..() + +/turf/simulated/floor/ex_act(severity) + //set src in oview(1) + switch(severity) + if(1.0) + src.ReplaceWithSpace() + if(2.0) + switch(pick(1,2;75,3)) + if (1) + src.ReplaceWithLattice() + if(prob(33)) new /obj/item/stack/sheet/metal(src) + if(2) + src.ReplaceWithSpace() + if(3) + if(prob(80)) + src.break_tile_to_plating() + else + src.break_tile() + src.hotspot_expose(1000,CELL_VOLUME) + if(prob(33)) new /obj/item/stack/sheet/metal(src) + if(3.0) + if (prob(50)) + src.break_tile() + src.hotspot_expose(1000,CELL_VOLUME) + return + +/turf/simulated/floor/blob_act() + return + +turf/simulated/floor/proc/update_icon() + if(is_plasteel_floor()) + if(!broken && !burnt) + icon_state = icon_regular_floor + if(is_plating()) + if(!broken && !burnt) + icon_state = icon_plating //Because asteroids are 'platings' too. + if(is_light_floor()) + var/obj/item/stack/tile/light/T = floor_tile + if(T.on) + switch(T.state) + if(0) + icon_state = "light_on" + sd_SetLuminosity(5) + if(1) + var/num = pick("1","2","3","4") + icon_state = "light_on_flicker[num]" + sd_SetLuminosity(5) + if(2) + icon_state = "light_on_broken" + sd_SetLuminosity(5) + if(3) + icon_state = "light_off" + sd_SetLuminosity(0) + else + sd_SetLuminosity(0) + icon_state = "light_off" + if(is_grass_floor()) + if(!broken && !burnt) + if(!(icon_state in list("grass1","grass2","grass3","grass4"))) + icon_state = "grass[pick("1","2","3","4")]" + spawn(1) + if(istype(src,/turf/simulated/floor)) //Was throwing runtime errors due to a chance of it changing to space halfway through. + if(air) + update_visuals(air) + +turf/simulated/floor/return_siding_icon_state() + ..() + if(is_grass_floor()) + var/dir_sum = 0 + for(var/direction in cardinal) + var/turf/T = get_step(src,direction) + if(!(T.is_grass_floor())) + dir_sum += direction + if(dir_sum) + return "wood_siding[dir_sum]" + else + return 0 + + +/turf/simulated/floor/attack_paw(mob/user as mob) + return src.attack_hand(user) + +/turf/simulated/floor/attack_hand(mob/user as mob) + if (is_light_floor()) + var/obj/item/stack/tile/light/T = floor_tile + T.on = !T.on + update_icon() + if ((!( user.canmove ) || user.restrained() || !( user.pulling ))) + return + if (user.pulling.anchored) + return + if ((user.pulling.loc != user.loc && get_dist(user, user.pulling) > 1)) + return + if (ismob(user.pulling)) + var/mob/M = user.pulling + var/mob/t = M.pulling + M.stop_pulling() + step(user.pulling, get_dir(user.pulling.loc, src)) + M.start_pulling(t) + else + step(user.pulling, get_dir(user.pulling.loc, src)) + return + +/turf/simulated/floor/engine/attackby(obj/item/weapon/C as obj, mob/user as mob) + if(!C) + return + if(!user) + return + if(istype(C, /obj/item/weapon/wrench)) + user << "\blue Removing rods..." + playsound(src.loc, 'sound/items/Ratchet.ogg', 80, 1) + if(do_after(user, 30)) + new /obj/item/stack/rods(src, 2) + ReplaceWithFloor() + var/turf/simulated/floor/F = src + F.make_plating() + return + +/turf/simulated/floor/proc/gets_drilled() + return + +/turf/simulated/floor/proc/break_tile_to_plating() + if(!is_plating()) + make_plating() + break_tile() + +/turf/simulated/floor/is_plasteel_floor() + if(istype(floor_tile,/obj/item/stack/tile/plasteel)) + return 1 + else + return 0 + +/turf/simulated/floor/is_light_floor() + if(istype(floor_tile,/obj/item/stack/tile/light)) + return 1 + else + return 0 + +/turf/simulated/floor/is_grass_floor() + if(istype(floor_tile,/obj/item/stack/tile/grass)) + return 1 + else + return 0 + +/turf/simulated/floor/is_plating() + if(!floor_tile) + return 1 + return 0 + +/turf/simulated/floor/proc/break_tile() + if(istype(src,/turf/simulated/floor/engine)) return + if(istype(src,/turf/simulated/floor/mech_bay_recharge_floor)) + src.ReplaceWithPlating() + if(broken) return + if(is_plasteel_floor()) + src.icon_state = "damaged[pick(1,2,3,4,5)]" + broken = 1 + else if(is_plasteel_floor()) + src.icon_state = "light_broken" + broken = 1 + else if(is_plating()) + src.icon_state = "platingdmg[pick(1,2,3)]" + broken = 1 + else if(is_grass_floor()) + src.icon_state = "sand[pick("1","2","3")]" + broken = 1 + +/turf/simulated/floor/proc/burn_tile() + if(istype(src,/turf/simulated/floor/engine)) return + if(broken || burnt) return + if(is_plasteel_floor()) + src.icon_state = "damaged[pick(1,2,3,4,5)]" + burnt = 1 + else if(is_plasteel_floor()) + src.icon_state = "floorscorched[pick(1,2)]" + burnt = 1 + else if(is_plating()) + src.icon_state = "panelscorched" + burnt = 1 + else if(is_grass_floor()) + src.icon_state = "sand[pick("1","2","3")]" + burnt = 1 + +//This proc will delete the floor_tile and the update_iocn() proc will then change the icon_state of the turf +//This proc auto corrects the grass tiles' siding. +/turf/simulated/floor/proc/make_plating() + if(istype(src,/turf/simulated/floor/engine)) return + + if(is_grass_floor()) + for(var/direction in cardinal) + if(istype(get_step(src,direction),/turf/simulated/floor)) + var/turf/simulated/floor/FF = get_step(src,direction) + FF.update_icon() //so siding get updated properly + + if(!floor_tile) return + del(floor_tile) + icon_plating = "plating" + sd_SetLuminosity(0) + floor_tile = null + intact = 0 + broken = 0 + burnt = 0 + + update_icon() + levelupdate() + +//This proc will make the turf a plasteel floor tile. The expected argument is the tile to make the turf with +//If none is given it will make a new object. dropping or unequipping must be handled before or after calling +//this proc. +/turf/simulated/floor/proc/make_plasteel_floor(var/obj/item/stack/tile/plasteel/T = null) + broken = 0 + burnt = 0 + intact = 1 + sd_SetLuminosity(0) + if(T) + if(istype(T,/obj/item/stack/tile/plasteel)) + floor_tile = T + if (icon_regular_floor) + icon_state = icon_regular_floor + else + icon_state = "floor" + icon_regular_floor = icon_state + update_icon() + levelupdate() + return + //if you gave a valid parameter, it won't get thisf ar. + floor_tile = new/obj/item/stack/tile/plasteel + icon_state = "floor" + icon_regular_floor = icon_state + + update_icon() + levelupdate() + +//This proc will make the turf a light floor tile. The expected argument is the tile to make the turf with +//If none is given it will make a new object. dropping or unequipping must be handled before or after calling +//this proc. +/turf/simulated/floor/proc/make_light_floor(var/obj/item/stack/tile/light/T = null) + broken = 0 + burnt = 0 + intact = 1 + if(T) + if(istype(T,/obj/item/stack/tile/light)) + floor_tile = T + update_icon() + levelupdate() + return + //if you gave a valid parameter, it won't get thisf ar. + floor_tile = new/obj/item/stack/tile/light + + update_icon() + levelupdate() + +//This proc will make a turf into a grass patch. Fun eh? Insert the grass tile to be used as the argument +//If no argument is given a new one will be made. +/turf/simulated/floor/proc/make_grass_floor(var/obj/item/stack/tile/grass/T = null) + broken = 0 + burnt = 0 + intact = 1 + if(T) + if(istype(T,/obj/item/stack/tile/grass)) + floor_tile = T + update_icon() + levelupdate() + return + //if you gave a valid parameter, it won't get thisf ar. + floor_tile = new/obj/item/stack/tile/grass + + update_icon() + levelupdate() + +/turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob) + + if(!C || !user) + return 0 + + if(istype(C,/obj/item/weapon/light/bulb)) //only for light tiles + if(is_light_floor()) + var/obj/item/stack/tile/light/T = floor_tile + if(T.state) + user.unEquip(C) + del(C) + T.state = C //fixing it by bashing it with a light bulb, fun eh? + update_icon() + user << "\blue You replace the light bulb." + else + user << "\blue The lightbulb seems fine, no need to replace it." + + if(istype(C, /obj/item/weapon/crowbar) && (!(is_plating()))) + if(broken || burnt) + user << "\red You remove the broken plating." + else + user << "\red You remove the [floor_tile.name]." + new floor_tile.type(src) + + make_plating() + playsound(src.loc, 'sound/items/Crowbar.ogg', 80, 1) + + return + + if(istype(C, /obj/item/stack/rods)) + var/obj/item/stack/rods/R = C + if (is_plating()) + if (R.amount >= 2) + user << "\blue Reinforcing the floor..." + if(do_after(user, 30) && R && R.amount >= 2 && is_plating()) + ReplaceWithEngineFloor() + playsound(src.loc, 'sound/items/Deconstruct.ogg', 80, 1) + R.use(2) + return + else + user << "\red You need more rods." + else + user << "\red You must remove the plating first." + return + + if(istype(C, /obj/item/stack/tile)) + if(is_plating()) + if(!broken && !burnt) + var/obj/item/stack/tile/T = C + floor_tile = new T.type + intact = 1 + if(istype(T,/obj/item/stack/tile/light)) + var/obj/item/stack/tile/light/L = T + var/obj/item/stack/tile/light/F = floor_tile + F.state = L.state + F.on = L.on + if(istype(T,/obj/item/stack/tile/grass)) + for(var/direction in cardinal) + if(istype(get_step(src,direction),/turf/simulated/floor)) + var/turf/simulated/floor/FF = get_step(src,direction) + FF.update_icon() //so siding gets updated properly + T.use(1) + update_icon() + levelupdate() + playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) + else + user << "\blue This section is too damaged to support a tile. Use a welder to fix the damage." + + + if(istype(C, /obj/item/stack/cable_coil)) + if(is_plating()) + var/obj/item/stack/cable_coil/coil = C + coil.turf_place(src, user) + else + user << "\red You must remove the plating first." + + if(istype(C, /obj/item/weapon/shovel)) + if(is_grass_floor()) + new /obj/item/weapon/ore/glass(src) + new /obj/item/weapon/ore/glass(src) //Make some sand if you shovel grass + user << "\blue You shovel the grass." + make_plating() + else + user << "\red You cannot shovel this." + + if(istype(C, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/welder = C + if(welder.welding && (is_plating())) + if(broken || burnt) + if(welder.remove_fuel(0,user)) + user << "\red You fix some dents on the broken plating." + playsound(src.loc, 'sound/items/Welder.ogg', 80, 1) + icon_state = "plating" + burnt = 0 + broken = 0 + else + user << "\blue You need more welding fuel to complete this task." + +/turf/unsimulated/floor/attack_paw(user as mob) + return src.attack_hand(user) + +/turf/unsimulated/floor/attack_hand(var/mob/user as mob) + if ((!( user.canmove ) || user.restrained() || !( user.pulling ))) + return + if (user.pulling.anchored) + return + if ((user.pulling.loc != user.loc && get_dist(user, user.pulling) > 1)) + return + if (ismob(user.pulling)) + var/mob/M = user.pulling + var/mob/t = M.pulling + M.stop_pulling() + step(user.pulling, get_dir(user.pulling.loc, src)) + M.start_pulling(t) + else + step(user.pulling, get_dir(user.pulling.loc, src)) + return + +// imported from space.dm + +/turf/space/attack_paw(mob/user as mob) + return src.attack_hand(user) + +/turf/space/attack_hand(mob/user as mob) + if ((user.restrained() || !( user.pulling ))) + return + if (user.pulling.anchored) + return + if ((user.pulling.loc != user.loc && get_dist(user, user.pulling) > 1)) + return + if (ismob(user.pulling)) + var/mob/M = user.pulling + var/atom/movable/t = M.pulling + M.stop_pulling() + step(user.pulling, get_dir(user.pulling.loc, src)) + M.start_pulling(t) + else + step(user.pulling, get_dir(user.pulling.loc, src)) + return + +/turf/space/attackby(obj/item/C as obj, mob/user as mob) + + if (istype(C, /obj/item/stack/rods)) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + return + var/obj/item/stack/rods/R = C + user << "\blue Constructing support lattice ..." + playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) + ReplaceWithLattice() + R.use(1) + return + + if (istype(C, /obj/item/stack/tile/plasteel)) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + var/obj/item/stack/tile/plasteel/S = C + del(L) + playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) + S.build(src) + S.use(1) + return + else + user << "\red The plating is going to need some support." + return + + +// Ported from unstable r355 + +/turf/space/Entered(atom/movable/A as mob|obj) + ..() + if ((!(A) || src != A.loc || istype(null, /obj/effect/beam))) return + + inertial_drift(A) + + if(ticker && ticker.mode) + + // Okay, so let's make it so that people can travel z levels but not nuke disks! + // if(ticker.mode.name == "nuclear emergency") return + + if(ticker.mode.name == "extended"||ticker.mode.name == "sandbox") + Sandbox_Spacemove(A) + + else + if (src.x <= 2 || A.x >= (world.maxx - 1) || src.y <= 2 || A.y >= (world.maxy - 1)) + if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) + del(A) + return + + if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels ... And moving this shit down here so it only fires when they're actually trying to change z-level. + return + + if(!isemptylist(A.search_contents_for(/obj/item/weapon/disk/nuclear))) + if(istype(A, /mob/living)) + var/mob/living/MM = A + if(MM.client) + MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is." + return + + + + var/move_to_z_str = pickweight(accessable_z_levels) + + var/move_to_z = text2num(move_to_z_str) + + if(!move_to_z) + return + + + + A.z = move_to_z + + + if(src.x <= 2) + A.x = world.maxx - 2 + + else if (A.x >= (world.maxx - 1)) + A.x = 3 + + else if (src.y <= 2) + A.y = world.maxy - 2 + + else if (A.y >= (world.maxy - 1)) + A.y = 3 + + spawn (0) + if ((A && A.loc)) + A.loc.Entered(A) + +// if(istype(A, /obj/structure/closet/coffin)) +// coffinhandler.Add(A) + +/turf/space/proc/Sandbox_Spacemove(atom/movable/A as mob|obj) + var/cur_x + var/cur_y + var/next_x + var/next_y + var/target_z + var/list/y_arr + + if(src.x <= 1) + if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) + del(A) + return + + var/list/cur_pos = src.get_global_map_pos() + 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] + target_z = y_arr[cur_y] +/* + //debug + world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" + world << "Target Z = [target_z]" + world << "Next X = [next_x]" + //debug +*/ + if(target_z) + A.z = target_z + A.x = world.maxx - 2 + spawn (0) + if ((A && A.loc)) + A.loc.Entered(A) + else if (src.x >= world.maxx) + if(istype(A, /obj/effect/meteor)) + del(A) + return + + var/list/cur_pos = src.get_global_map_pos() + 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] + target_z = y_arr[cur_y] +/* + //debug + world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" + world << "Target Z = [target_z]" + world << "Next X = [next_x]" + //debug +*/ + if(target_z) + A.z = target_z + A.x = 3 + spawn (0) + if ((A && A.loc)) + A.loc.Entered(A) + else if (src.y <= 1) + if(istype(A, /obj/effect/meteor)) + del(A) + return + var/list/cur_pos = src.get_global_map_pos() + if(!cur_pos) return + cur_x = cur_pos["x"] + cur_y = cur_pos["y"] + y_arr = global_map[cur_x] + next_y = (--cur_y||y_arr.len) + target_z = y_arr[next_y] +/* + //debug + world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" + world << "Next Y = [next_y]" + world << "Target Z = [target_z]" + //debug +*/ + if(target_z) + A.z = target_z + A.y = world.maxy - 2 + spawn (0) + if ((A && A.loc)) + A.loc.Entered(A) + + else if (src.y >= world.maxy) + if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) + del(A) + return + var/list/cur_pos = src.get_global_map_pos() + if(!cur_pos) return + cur_x = cur_pos["x"] + cur_y = cur_pos["y"] + y_arr = global_map[cur_x] + next_y = (++cur_y > y_arr.len ? 1 : cur_y) + target_z = y_arr[next_y] +/* + //debug + world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" + world << "Next Y = [next_y]" + world << "Target Z = [target_z]" + //debug +*/ + if(target_z) + A.z = target_z + A.y = 3 + spawn (0) + if ((A && A.loc)) + A.loc.Entered(A) + return + +/obj/effect/vaultspawner + var/maxX = 6 + var/maxY = 6 + var/minX = 2 + var/minY = 2 + +/obj/effect/vaultspawner/New(turf/location as turf,lX = minX,uX = maxX,lY = minY,uY = maxY,var/type = null) + if(!type) + type = pick("sandstone","rock","alien") + + var/lowBoundX = location.x + var/lowBoundY = location.y + + var/hiBoundX = location.x + rand(lX,uX) + var/hiBoundY = location.y + rand(lY,uY) + + var/z = location.z + + for(var/i = lowBoundX,i<=hiBoundX,i++) + for(var/j = lowBoundY,j<=hiBoundY,j++) + if(i == lowBoundX || i == hiBoundX || j == lowBoundY || j == hiBoundY) + new /turf/simulated/wall/vault(locate(i,j,z),type) + else + new /turf/simulated/floor/vault(locate(i,j,z),type) + + del(src) + +/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() + for(var/obj/mecha/M in src)//Mecha are not gibbed but are damaged. + spawn(0) + M.take_damage(100, "brute") + for(var/obj/effect/critter/M in src) + spawn(0) + M.Die() + +/turf/proc/Bless() + if(flags & NOJAUNT) + return + flags |= NOJAUNT overlays += image('icons/effects/water.dmi',src,"holywater")*/ \ No newline at end of file diff --git a/code/unused/Ultralight.dm b/code/unused/Ultralight.dm index d7597ee6fcc..63c679b68be 100644 --- a/code/unused/Ultralight.dm +++ b/code/unused/Ultralight.dm @@ -223,7 +223,7 @@ atom ul_Illuminate() return - Del() + Delete() if(ul_IsLuminous()) ul_Extinguish() diff --git a/code/unused/assemblies.dm b/code/unused/assemblies.dm index 8450da294cc..52e48f700c4 100644 --- a/code/unused/assemblies.dm +++ b/code/unused/assemblies.dm @@ -121,7 +121,7 @@ part2.master = src //part2.status = 0 -/obj/item/assembly/time_ignite/Del() +/obj/item/assembly/time_ignite/Delete() del(part1) del(part2) ..() @@ -301,7 +301,7 @@ user.show_message("\blue The armor is now unsecured!", 1) src.add_fingerprint(user) -/obj/item/assembly/a_i_a/Del() +/obj/item/assembly/a_i_a/Delete() //src.part1 = null del(src.part1) //src.part2 = null @@ -311,7 +311,7 @@ return //***** -/obj/item/assembly/rad_time/Del() +/obj/item/assembly/rad_time/Delete() //src.part1 = null del(src.part1) //src.part2 = null @@ -361,7 +361,7 @@ src.icon_state = "prox-radio[n]" return -/obj/item/assembly/rad_prox/Del() +/obj/item/assembly/rad_prox/Delete() //src.part1 = null del(src.part1) //src.part2 = null @@ -431,7 +431,7 @@ src.icon_state = text("infrared-radio[]", n) return -/obj/item/assembly/rad_infra/Del() +/obj/item/assembly/rad_infra/Delete() del(src.part1) del(src.part2) ..() @@ -516,7 +516,7 @@ return return -/obj/item/assembly/prox_ignite/Del() +/obj/item/assembly/prox_ignite/Delete() del(src.part1) del(src.part2) ..() @@ -565,7 +565,7 @@ src.part2.Activate() return -/obj/item/assembly/rad_ignite/Del() +/obj/item/assembly/rad_ignite/Delete() del(src.part1) del(src.part2) ..() @@ -664,7 +664,7 @@ ..() part3.examine() -/obj/item/assembly/m_i_ptank/Del() +/obj/item/assembly/m_i_ptank/Delete() //src.part1 = null del(src.part1) @@ -752,7 +752,7 @@ ..() src.part3.examine() -/obj/item/assembly/t_i_ptank/Del() +/obj/item/assembly/t_i_ptank/Delete() //src.part1 = null del(src.part1) @@ -831,7 +831,7 @@ ..() src.part3.examine() -/obj/item/assembly/r_i_ptank/Del() +/obj/item/assembly/r_i_ptank/Delete() //src.part1 = null del(src.part1) diff --git a/code/unused/biomass_rift.dm b/code/unused/biomass_rift.dm index 247f485b570..e021d333971 100644 --- a/code/unused/biomass_rift.dm +++ b/code/unused/biomass_rift.dm @@ -36,7 +36,7 @@ spawn(1) //DEBUG starting.icon_state = "[newicon]" -/obj/effect/rift/Del() +/obj/effect/rift/Delete() for(var/obj/effect/biomass/biomass in linkedBiomass) del(biomass) ..() diff --git a/code/unused/cable_heavyduty.dm b/code/unused/cable_heavyduty.dm index 36bd4f93eb7..911fe50b43c 100644 --- a/code/unused/cable_heavyduty.dm +++ b/code/unused/cable_heavyduty.dm @@ -1,28 +1,28 @@ -/obj/item/stack/cable_coil/heavyduty - name = "heavy cable coil" - icon = 'icons/obj/power.dmi' - icon_state = "wire" - -/obj/structure/cable/heavyduty - icon = 'icons/obj/power_cond_heavy.dmi' - name = "large power cable" - desc = "This cable is tough. It cannot be cut with simple hand tools." - layer = 2.39 //Just below pipes, which are at 2.4 - -/obj/structure/cable/heavyduty/attackby(obj/item/W, mob/user) - - var/turf/T = src.loc - if(T.intact) - return - - if(istype(W, /obj/item/weapon/wirecutters)) - usr << "\blue These cables are too tough to be cut with those [W.name]." - return - else if(istype(W, /obj/item/stack/cable_coil)) - usr << "\blue You will need heavier cables to connect to these." - return - else - ..() - -/obj/structure/cable/heavyduty/cableColor(var/colorC) +/obj/item/stack/cable_coil/heavyduty + name = "heavy cable coil" + icon = 'icons/obj/power.dmi' + icon_state = "wire" + +/obj/structure/cable/heavyduty + icon = 'icons/obj/power_cond_heavy.dmi' + name = "large power cable" + desc = "This cable is tough. It cannot be cut with simple hand tools." + layer = 2.39 //Just below pipes, which are at 2.4 + +/obj/structure/cable/heavyduty/attackby(obj/item/W, mob/user) + + var/turf/T = src.loc + if(T.intact) + return + + if(istype(W, /obj/item/weapon/wirecutters)) + usr << "\blue These cables are too tough to be cut with those [W.name]." + return + else if(istype(W, /obj/item/stack/cable_coil)) + usr << "\blue You will need heavier cables to connect to these." + return + else + ..() + +/obj/structure/cable/heavyduty/cableColor(var/colorC) return \ No newline at end of file diff --git a/code/unused/carpetsplosion.dm b/code/unused/carpetsplosion.dm index 01e0e757573..fda6b41f254 100644 --- a/code/unused/carpetsplosion.dm +++ b/code/unused/carpetsplosion.dm @@ -21,7 +21,7 @@ /obj/effect/spreader var/list/obj/effect/spreader/spreadList = list() -/obj/effect/spreader/Del() +/obj/effect/spreader/Delete() for(var/obj/effect/spreader/spread in spreadList) if(spread != src) del(spread) diff --git a/code/unused/computer2/buildandrepair.dm b/code/unused/computer2/buildandrepair.dm index 2fde1740b77..69e7b5fb822 100644 --- a/code/unused/computer2/buildandrepair.dm +++ b/code/unused/computer2/buildandrepair.dm @@ -1,150 +1,150 @@ -//Motherboard is just used in assembly/disassembly, doesn't exist in the actual computer object. -/obj/item/weapon/motherboard - name = "Computer mainboard" - desc = "A computer motherboard." - icon = 'icons/obj/module.dmi' - icon_state = "mainboard" - item_state = "electronic" - w_class = 3 - var/created_name = null //If defined, result computer will have this name. - -/obj/computer2frame - density = 1 - anchored = 0 - name = "Computer-frame" - icon = 'icons/obj/stock_parts.dmi' - icon_state = "0" - var/state = 0 - var/obj/item/weapon/motherboard/mainboard = null - var/obj/item/weapon/disk/data/fixed_disk/hd = null - var/list/peripherals = list() - var/created_icon_state = "aiupload" - -/obj/computer2frame/attackby(obj/item/P as obj, mob/user as mob) - switch(state) - if(0) - if(istype(P, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 20)) - user << "\blue You wrench the frame into place." - src.anchored = 1 - src.state = 1 - if(istype(P, /obj/item/weapon/weldingtool)) - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - if(do_after(user, 20)) - user << "\blue You deconstruct the frame." - new /obj/item/stack/sheet/metal( src.loc, 5 ) - del(src) - if(1) - if(istype(P, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 20)) - user << "\blue You unfasten the frame." - src.anchored = 0 - src.state = 0 - if(istype(P, /obj/item/weapon/motherboard) && !mainboard) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "\blue You place the mainboard inside the frame." - src.icon_state = "1" - src.mainboard = P - user.drop_item() - P.loc = src - if(istype(P, /obj/item/weapon/screwdriver) && mainboard) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You screw the mainboard into place." - src.state = 2 - src.icon_state = "2" - if(istype(P, /obj/item/weapon/crowbar) && mainboard) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the mainboard." - src.state = 1 - src.icon_state = "0" - mainboard.loc = src.loc - src.mainboard = null - if(2) - if(istype(P, /obj/item/weapon/screwdriver) && mainboard && (!peripherals.len)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You unfasten the mainboard." - src.state = 1 - src.icon_state = "1" - - if(istype(P, /obj/item/weapon/peripheral)) - if(src.peripherals.len < 3) - user.drop_item() - src.peripherals.Add(P) - P.loc = src - user << "\blue You add [P] to the frame." - else - user << "\red There is no more room for peripheral cards." - - if(istype(P, /obj/item/weapon/crowbar) && src.peripherals.len) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the peripheral boards." - for(var/obj/item/weapon/peripheral/W in src.peripherals) - W.loc = src.loc - src.peripherals.Remove(W) - - if(istype(P, /obj/item/stack/cable_coil)) - if(P:amount >= 5) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 20)) - P:amount -= 5 - if(!P:amount) del(P) - user << "\blue You add cables to the frame." - src.state = 3 - src.icon_state = "3" - if(3) - if(istype(P, /obj/item/weapon/wirecutters)) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "\blue You remove the cables." - src.state = 2 - src.icon_state = "2" - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) - A.amount = 5 - if(src.hd) - src.hd.loc = src.loc - src.hd = null - - if(istype(P, /obj/item/weapon/disk/data/fixed_disk) && !src.hd) - user.drop_item() - src.hd = P - P.loc = src - user << "\blue You connect the drive to the cabling." - - if(istype(P, /obj/item/weapon/crowbar) && src.hd) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the hard drive." - src.hd.loc = src.loc - src.hd = null - - if(istype(P, /obj/item/stack/sheet/glass)) - if(P:amount >= 2) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 20)) - P:use(2) - user << "\blue You put in the glass panel." - src.state = 4 - src.icon_state = "4" - if(4) - if(istype(P, /obj/item/weapon/crowbar)) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the glass panel." - src.state = 3 - src.icon_state = "3" - new /obj/item/stack/sheet/glass( src.loc, 2 ) - if(istype(P, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You connect the monitor." - var/obj/machinery/computer2/C= new /obj/machinery/computer2( src.loc ) - C.setup_drive_size = 0 - C.icon_state = src.created_icon_state - if(mainboard.created_name) C.name = mainboard.created_name - del(mainboard) - if(hd) - C.hd = hd - hd.loc = C - for(var/obj/item/weapon/peripheral/W in src.peripherals) - W.loc = C - W.host = C - C.peripherals.Add(W) +//Motherboard is just used in assembly/disassembly, doesn't exist in the actual computer object. +/obj/item/weapon/motherboard + name = "Computer mainboard" + desc = "A computer motherboard." + icon = 'icons/obj/module.dmi' + icon_state = "mainboard" + item_state = "electronic" + w_class = 3 + var/created_name = null //If defined, result computer will have this name. + +/obj/computer2frame + density = 1 + anchored = 0 + name = "Computer-frame" + icon = 'icons/obj/stock_parts.dmi' + icon_state = "0" + var/state = 0 + var/obj/item/weapon/motherboard/mainboard = null + var/obj/item/weapon/disk/data/fixed_disk/hd = null + var/list/peripherals = list() + var/created_icon_state = "aiupload" + +/obj/computer2frame/attackby(obj/item/P as obj, mob/user as mob) + switch(state) + if(0) + if(istype(P, /obj/item/weapon/wrench)) + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + if(do_after(user, 20)) + user << "\blue You wrench the frame into place." + src.anchored = 1 + src.state = 1 + if(istype(P, /obj/item/weapon/weldingtool)) + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) + if(do_after(user, 20)) + user << "\blue You deconstruct the frame." + new /obj/item/stack/sheet/metal( src.loc, 5 ) + del(src) + if(1) + if(istype(P, /obj/item/weapon/wrench)) + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + if(do_after(user, 20)) + user << "\blue You unfasten the frame." + src.anchored = 0 + src.state = 0 + if(istype(P, /obj/item/weapon/motherboard) && !mainboard) + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + user << "\blue You place the mainboard inside the frame." + src.icon_state = "1" + src.mainboard = P + user.drop_item() + P.loc = src + if(istype(P, /obj/item/weapon/screwdriver) && mainboard) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "\blue You screw the mainboard into place." + src.state = 2 + src.icon_state = "2" + if(istype(P, /obj/item/weapon/crowbar) && mainboard) + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + user << "\blue You remove the mainboard." + src.state = 1 + src.icon_state = "0" + mainboard.loc = src.loc + src.mainboard = null + if(2) + if(istype(P, /obj/item/weapon/screwdriver) && mainboard && (!peripherals.len)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "\blue You unfasten the mainboard." + src.state = 1 + src.icon_state = "1" + + if(istype(P, /obj/item/weapon/peripheral)) + if(src.peripherals.len < 3) + user.drop_item() + src.peripherals.Add(P) + P.loc = src + user << "\blue You add [P] to the frame." + else + user << "\red There is no more room for peripheral cards." + + if(istype(P, /obj/item/weapon/crowbar) && src.peripherals.len) + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + user << "\blue You remove the peripheral boards." + for(var/obj/item/weapon/peripheral/W in src.peripherals) + W.loc = src.loc + src.peripherals.Remove(W) + + if(istype(P, /obj/item/stack/cable_coil)) + if(P:amount >= 5) + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + if(do_after(user, 20)) + P:amount -= 5 + if(!P:amount) del(P) + user << "\blue You add cables to the frame." + src.state = 3 + src.icon_state = "3" + if(3) + if(istype(P, /obj/item/weapon/wirecutters)) + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) + user << "\blue You remove the cables." + src.state = 2 + src.icon_state = "2" + var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) + A.amount = 5 + if(src.hd) + src.hd.loc = src.loc + src.hd = null + + if(istype(P, /obj/item/weapon/disk/data/fixed_disk) && !src.hd) + user.drop_item() + src.hd = P + P.loc = src + user << "\blue You connect the drive to the cabling." + + if(istype(P, /obj/item/weapon/crowbar) && src.hd) + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + user << "\blue You remove the hard drive." + src.hd.loc = src.loc + src.hd = null + + if(istype(P, /obj/item/stack/sheet/glass)) + if(P:amount >= 2) + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + if(do_after(user, 20)) + P:use(2) + user << "\blue You put in the glass panel." + src.state = 4 + src.icon_state = "4" + if(4) + if(istype(P, /obj/item/weapon/crowbar)) + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + user << "\blue You remove the glass panel." + src.state = 3 + src.icon_state = "3" + new /obj/item/stack/sheet/glass( src.loc, 2 ) + if(istype(P, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "\blue You connect the monitor." + var/obj/machinery/computer2/C= new /obj/machinery/computer2( src.loc ) + C.setup_drive_size = 0 + C.icon_state = src.created_icon_state + if(mainboard.created_name) C.name = mainboard.created_name + del(mainboard) + if(hd) + C.hd = hd + hd.loc = C + for(var/obj/item/weapon/peripheral/W in src.peripherals) + W.loc = C + W.host = C + C.peripherals.Add(W) del(src) \ No newline at end of file diff --git a/code/unused/computer2/peripherals.dm b/code/unused/computer2/peripherals.dm index b581e0c448b..cc3b50190fb 100644 --- a/code/unused/computer2/peripherals.dm +++ b/code/unused/computer2/peripherals.dm @@ -17,7 +17,7 @@ // var/setup_id = "\ref[src]" // src.id = copytext(setup_id,4,(length(setup_id)-1) ) - Del() + Delete() if(host) host.peripherals.Remove(src) ..() diff --git a/code/unused/conveyor.dm b/code/unused/conveyor.dm index 0756be124f6..ad4337b696c 100644 --- a/code/unused/conveyor.dm +++ b/code/unused/conveyor.dm @@ -1,384 +1,384 @@ -// converyor belt - -// moves items/mobs/movables in set direction every ptick - - -/obj/machinery/conveyor - icon = 'icons/obj/recycling.dmi' - icon_state = "conveyor0" - name = "conveyor belt" - desc = "A conveyor belt." - anchored = 1 - var/operating = 0 // 1 if running forward, -1 if backwards, 0 if off - var/operable = 1 // true if can operate (no broken segments in this belt run) - var/basedir // this is the default (forward) direction, set by the map dir - // note dir var can vary when the direction changes - - var/list/affecting // the list of all items that will be moved this ptick - var/id = "" // the control ID - must match controller ID - // following two only used if a diverter is present - var/divert = 0 // if non-zero, direction to divert items - var/divdir = 0 // if diverting, will be conveyer dir needed to divert (otherwise dense) - - - - // create a conveyor - -/obj/machinery/conveyor/New() - ..() - basedir = dir - setdir() - - // set the dir and target turf depending on the operating direction - -/obj/machinery/conveyor/proc/setdir() - if(operating == -1) - dir = turn(basedir,180) - else - dir = basedir - update() - - - // update the icon depending on the operating condition - -/obj/machinery/conveyor/proc/update() - if(stat & BROKEN) - icon_state = "conveyor-b" - operating = 0 - return - if(!operable) - operating = 0 - icon_state = "conveyor[(operating != 0) && !(stat & NOPOWER)]" - - - // machine process - // move items to the target location -/obj/machinery/conveyor/process() - if(stat & (BROKEN | NOPOWER)) - return - if(!operating) - return - use_power(100) - - var/movedir = dir // base movement dir - if(divert && dir==divdir) // update if diverter present - movedir = divert - - - affecting = loc.contents - src // moved items will be all in loc - spawn(1) // slight delay to prevent infinite propagation due to map order - var/items_moved = 0 - for(var/atom/movable/A in affecting) - if(!A.anchored) - if(isturf(A.loc)) // this is to prevent an ugly bug that forces a player to drop what they're holding if they recently pick it up from the conveyer belt - if(ismob(A)) - var/mob/M = A - if(M.buckled == src) - var/obj/machinery/conveyor/C = locate() in get_step(src, dir) - M.buckled = null - step(M,dir) - if(C) - M.buckled = C - else - new/obj/item/stack/cable_coil/cut(M.loc) - else - step(M,movedir) - else - step(A,movedir) - items_moved++ - if(items_moved >= 10) - break - -// attack with item, place item on conveyor - -/obj/machinery/conveyor/attackby(var/obj/item/I, mob/user) - if(istype(I, /obj/item/weapon/grab)) // special handling if grabbing a mob - var/obj/item/weapon/grab/G = I - G.affecting.Move(src.loc) - del(G) - return - else if(istype(I, /obj/item/stack/cable_coil)) // if cable, see if a mob is present - var/mob/M = locate() in src.loc - if(M) - if (M == user) - src.visible_message("\blue [M] ties \himself to the conveyor.") - // note don't check for lying if self-tying - else - if(M.lying) - user.visible_message("\blue [M] has been tied to the conveyor by [user].", "\blue You tie [M] to the converyor!") - else - user << "\blue [M] must be lying down to be tied to the converyor!" - return - M.buckled = src - src.add_fingerprint(user) - I:use(1) - M.lying = 1 - return - - // else if no mob in loc, then allow coil to be placed - - else if(istype(I, /obj/item/weapon/wirecutters)) - var/mob/M = locate() in src.loc - if(M && M.buckled == src) - M.buckled = null - src.add_fingerprint(user) - if (M == user) - src.visible_message("\blue [M] cuts \himself free from the conveyor.") - else - src.visible_message("\blue [M] had been cut free from the conveyor by [user].") - return - - if(isrobot(user)) - return - - // otherwise drop and place on conveyor - user.drop_item() - if(I && I.loc) I.loc = src.loc - return - -// attack with hand, move pulled object onto conveyor - -/obj/machinery/conveyor/attack_hand(mob/user as mob) - user.Move_Pulled(src) - - -// make the conveyor broken -// also propagate inoperability to any connected conveyor with the same ID -/obj/machinery/conveyor/proc/broken() - stat |= BROKEN - update() - - var/obj/machinery/conveyor/C = locate() in get_step(src, basedir) - if(C) - C.set_operable(basedir, id, 0) - - C = locate() in get_step(src, turn(basedir,180)) - if(C) - C.set_operable(turn(basedir,180), id, 0) - - -//set the operable var if ID matches, propagating in the given direction - -/obj/machinery/conveyor/proc/set_operable(stepdir, match_id, op) - - if(id != match_id) - return - operable = op - - update() - var/obj/machinery/conveyor/C = locate() in get_step(src, stepdir) - if(C) - C.set_operable(stepdir, id, op) - -/* -/obj/machinery/conveyor/verb/destroy() - set src in view() - src.broken() -*/ - -/obj/machinery/conveyor/power_change() - ..() - update() - - -// converyor diverter -// extendable arm that can be switched so items on the conveyer are diverted sideways -// situate in same turf as conveyor -// only works if belts is running proper direction -// -// -/obj/machinery/diverter - icon = 'icons/obj/recycling.dmi' - icon_state = "diverter0" - name = "diverter" - desc = "A diverter arm for a conveyor belt." - anchored = 1 - layer = FLY_LAYER - var/obj/machinery/conveyor/conv // the conveyor this diverter works on - var/deployed = 0 // true if diverter arm is extended - var/operating = 0 // true if arm is extending/contracting - var/divert_to // the dir that diverted items will be moved - var/divert_from // the dir items must be moving to divert - - -// create a diverter -// set up divert_to and divert_from directions depending on dir state -/obj/machinery/diverter/New() - - ..() - - switch(dir) - if(NORTH) - divert_to = WEST // stuff will be moved to the west - divert_from = NORTH // if entering from the north - if(SOUTH) - divert_to = EAST - divert_from = NORTH - if(EAST) - divert_to = EAST - divert_from = SOUTH - if(WEST) - divert_to = WEST - divert_from = SOUTH - if(NORTHEAST) - divert_to = NORTH - divert_from = EAST - if(NORTHWEST) - divert_to = NORTH - divert_from = WEST - if(SOUTHEAST) - divert_to = SOUTH - divert_from = EAST - if(SOUTHWEST) - divert_to = SOUTH - divert_from = WEST - spawn(2) - // wait for map load then find the conveyor in this turf - conv = locate() in src.loc - if(conv) // divert_from dir must match possible conveyor movement - if(conv.basedir != divert_from && conv.basedir != turn(divert_from,180) ) - del(src) // if no dir match, then delete self - set_divert() - update() - -// update the icon state depending on whether the diverter is extended -/obj/machinery/diverter/proc/update() - icon_state = "diverter[deployed]" - -// call to set the diversion vars of underlying conveyor -/obj/machinery/diverter/proc/set_divert() - if(conv) - if(deployed) - conv.divert = divert_to - conv.divdir = divert_from - else - conv.divert= 0 - - -// *** TESTING click to toggle -/obj/machinery/diverter/Click() - toggle() - - -// toggle between arm deployed and not deployed, showing animation -// -/obj/machinery/diverter/proc/toggle() - if( stat & (NOPOWER|BROKEN)) - return - - if(operating) - return - - use_power(50) - operating = 1 - if(deployed) - flick("diverter10",src) - icon_state = "diverter0" - sleep(10) - deployed = 0 - else - flick("diverter01",src) - icon_state = "diverter1" - sleep(10) - deployed = 1 - operating = 0 - update() - set_divert() - -// don't allow movement into the 'backwards' direction if deployed -/obj/machinery/diverter/CanPass(atom/movable/O, var/turf/target) - var/direct = get_dir(O, target) - if(direct == divert_to) // prevent movement through body of diverter - return 0 - if(!deployed) - return 1 - return(direct != turn(divert_from,180)) - -// don't allow movement through the arm if deployed -/obj/machinery/diverter/CheckExit(atom/movable/O, var/turf/target) - var/direct = get_dir(O, target) - if(direct == turn(divert_to,180)) // prevent movement through body of diverter - return 0 - if(!deployed) - return 1 - return(direct != divert_from) - - - - - -// the conveyor control switch -// -// - -/obj/machinery/conveyor_switch - - name = "conveyor switch" - desc = "A conveyor control switch." - icon = 'icons/obj/recycling.dmi' - icon_state = "switch-off" - var/position = 0 // 0 off, -1 reverse, 1 forward - var/last_pos = -1 // last direction setting - var/operated = 1 // true if just operated - - var/id = "" // must match conveyor IDs to control them - - var/list/conveyors // the list of converyors that are controlled by this switch - anchored = 1 - - - -/obj/machinery/conveyor_switch/New() - ..() - update() - - spawn(5) // allow map load - conveyors = list() - for(var/obj/machinery/conveyor/C in world) - if(C.id == id) - conveyors += C - -// update the icon depending on the position - -/obj/machinery/conveyor_switch/proc/update() - if(position<0) - icon_state = "switch-rev" - else if(position>0) - icon_state = "switch-fwd" - else - icon_state = "switch-off" - - -// timed process -// if the switch changed, update the linked conveyors - -/obj/machinery/conveyor_switch/process() - if(!operated) - return - operated = 0 - - for(var/obj/machinery/conveyor/C in conveyors) - C.operating = position - C.setdir() - -// attack with hand, switch position -/obj/machinery/conveyor_switch/attack_hand(mob/user) - if(position == 0) - if(last_pos < 0) - position = 1 - last_pos = 0 - else - position = -1 - last_pos = 0 - else - last_pos = position - position = 0 - - operated = 1 - update() - - // find any switches with same id as this one, and set their positions to match us - for(var/obj/machinery/conveyor_switch/S in world) - if(S.id == src.id) - S.position = position - S.update() +// converyor belt + +// moves items/mobs/movables in set direction every ptick + + +/obj/machinery/conveyor + icon = 'icons/obj/recycling.dmi' + icon_state = "conveyor0" + name = "conveyor belt" + desc = "A conveyor belt." + anchored = 1 + var/operating = 0 // 1 if running forward, -1 if backwards, 0 if off + var/operable = 1 // true if can operate (no broken segments in this belt run) + var/basedir // this is the default (forward) direction, set by the map dir + // note dir var can vary when the direction changes + + var/list/affecting // the list of all items that will be moved this ptick + var/id = "" // the control ID - must match controller ID + // following two only used if a diverter is present + var/divert = 0 // if non-zero, direction to divert items + var/divdir = 0 // if diverting, will be conveyer dir needed to divert (otherwise dense) + + + + // create a conveyor + +/obj/machinery/conveyor/New() + ..() + basedir = dir + setdir() + + // set the dir and target turf depending on the operating direction + +/obj/machinery/conveyor/proc/setdir() + if(operating == -1) + dir = turn(basedir,180) + else + dir = basedir + update() + + + // update the icon depending on the operating condition + +/obj/machinery/conveyor/proc/update() + if(stat & BROKEN) + icon_state = "conveyor-b" + operating = 0 + return + if(!operable) + operating = 0 + icon_state = "conveyor[(operating != 0) && !(stat & NOPOWER)]" + + + // machine process + // move items to the target location +/obj/machinery/conveyor/process() + if(stat & (BROKEN | NOPOWER)) + return + if(!operating) + return + use_power(100) + + var/movedir = dir // base movement dir + if(divert && dir==divdir) // update if diverter present + movedir = divert + + + affecting = loc.contents - src // moved items will be all in loc + spawn(1) // slight delay to prevent infinite propagation due to map order + var/items_moved = 0 + for(var/atom/movable/A in affecting) + if(!A.anchored) + if(isturf(A.loc)) // this is to prevent an ugly bug that forces a player to drop what they're holding if they recently pick it up from the conveyer belt + if(ismob(A)) + var/mob/M = A + if(M.buckled == src) + var/obj/machinery/conveyor/C = locate() in get_step(src, dir) + M.buckled = null + step(M,dir) + if(C) + M.buckled = C + else + new/obj/item/stack/cable_coil/cut(M.loc) + else + step(M,movedir) + else + step(A,movedir) + items_moved++ + if(items_moved >= 10) + break + +// attack with item, place item on conveyor + +/obj/machinery/conveyor/attackby(var/obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/grab)) // special handling if grabbing a mob + var/obj/item/weapon/grab/G = I + G.affecting.Move(src.loc) + del(G) + return + else if(istype(I, /obj/item/stack/cable_coil)) // if cable, see if a mob is present + var/mob/M = locate() in src.loc + if(M) + if (M == user) + src.visible_message("\blue [M] ties \himself to the conveyor.") + // note don't check for lying if self-tying + else + if(M.lying) + user.visible_message("\blue [M] has been tied to the conveyor by [user].", "\blue You tie [M] to the converyor!") + else + user << "\blue [M] must be lying down to be tied to the converyor!" + return + M.buckled = src + src.add_fingerprint(user) + I:use(1) + M.lying = 1 + return + + // else if no mob in loc, then allow coil to be placed + + else if(istype(I, /obj/item/weapon/wirecutters)) + var/mob/M = locate() in src.loc + if(M && M.buckled == src) + M.buckled = null + src.add_fingerprint(user) + if (M == user) + src.visible_message("\blue [M] cuts \himself free from the conveyor.") + else + src.visible_message("\blue [M] had been cut free from the conveyor by [user].") + return + + if(isrobot(user)) + return + + // otherwise drop and place on conveyor + user.drop_item() + if(I && I.loc) I.loc = src.loc + return + +// attack with hand, move pulled object onto conveyor + +/obj/machinery/conveyor/attack_hand(mob/user as mob) + user.Move_Pulled(src) + + +// make the conveyor broken +// also propagate inoperability to any connected conveyor with the same ID +/obj/machinery/conveyor/proc/broken() + stat |= BROKEN + update() + + var/obj/machinery/conveyor/C = locate() in get_step(src, basedir) + if(C) + C.set_operable(basedir, id, 0) + + C = locate() in get_step(src, turn(basedir,180)) + if(C) + C.set_operable(turn(basedir,180), id, 0) + + +//set the operable var if ID matches, propagating in the given direction + +/obj/machinery/conveyor/proc/set_operable(stepdir, match_id, op) + + if(id != match_id) + return + operable = op + + update() + var/obj/machinery/conveyor/C = locate() in get_step(src, stepdir) + if(C) + C.set_operable(stepdir, id, op) + +/* +/obj/machinery/conveyor/verb/destroy() + set src in view() + src.broken() +*/ + +/obj/machinery/conveyor/power_change() + ..() + update() + + +// converyor diverter +// extendable arm that can be switched so items on the conveyer are diverted sideways +// situate in same turf as conveyor +// only works if belts is running proper direction +// +// +/obj/machinery/diverter + icon = 'icons/obj/recycling.dmi' + icon_state = "diverter0" + name = "diverter" + desc = "A diverter arm for a conveyor belt." + anchored = 1 + layer = FLY_LAYER + var/obj/machinery/conveyor/conv // the conveyor this diverter works on + var/deployed = 0 // true if diverter arm is extended + var/operating = 0 // true if arm is extending/contracting + var/divert_to // the dir that diverted items will be moved + var/divert_from // the dir items must be moving to divert + + +// create a diverter +// set up divert_to and divert_from directions depending on dir state +/obj/machinery/diverter/New() + + ..() + + switch(dir) + if(NORTH) + divert_to = WEST // stuff will be moved to the west + divert_from = NORTH // if entering from the north + if(SOUTH) + divert_to = EAST + divert_from = NORTH + if(EAST) + divert_to = EAST + divert_from = SOUTH + if(WEST) + divert_to = WEST + divert_from = SOUTH + if(NORTHEAST) + divert_to = NORTH + divert_from = EAST + if(NORTHWEST) + divert_to = NORTH + divert_from = WEST + if(SOUTHEAST) + divert_to = SOUTH + divert_from = EAST + if(SOUTHWEST) + divert_to = SOUTH + divert_from = WEST + spawn(2) + // wait for map load then find the conveyor in this turf + conv = locate() in src.loc + if(conv) // divert_from dir must match possible conveyor movement + if(conv.basedir != divert_from && conv.basedir != turn(divert_from,180) ) + del(src) // if no dir match, then delete self + set_divert() + update() + +// update the icon state depending on whether the diverter is extended +/obj/machinery/diverter/proc/update() + icon_state = "diverter[deployed]" + +// call to set the diversion vars of underlying conveyor +/obj/machinery/diverter/proc/set_divert() + if(conv) + if(deployed) + conv.divert = divert_to + conv.divdir = divert_from + else + conv.divert= 0 + + +// *** TESTING click to toggle +/obj/machinery/diverter/Click() + toggle() + + +// toggle between arm deployed and not deployed, showing animation +// +/obj/machinery/diverter/proc/toggle() + if( stat & (NOPOWER|BROKEN)) + return + + if(operating) + return + + use_power(50) + operating = 1 + if(deployed) + flick("diverter10",src) + icon_state = "diverter0" + sleep(10) + deployed = 0 + else + flick("diverter01",src) + icon_state = "diverter1" + sleep(10) + deployed = 1 + operating = 0 + update() + set_divert() + +// don't allow movement into the 'backwards' direction if deployed +/obj/machinery/diverter/CanPass(atom/movable/O, var/turf/target) + var/direct = get_dir(O, target) + if(direct == divert_to) // prevent movement through body of diverter + return 0 + if(!deployed) + return 1 + return(direct != turn(divert_from,180)) + +// don't allow movement through the arm if deployed +/obj/machinery/diverter/CheckExit(atom/movable/O, var/turf/target) + var/direct = get_dir(O, target) + if(direct == turn(divert_to,180)) // prevent movement through body of diverter + return 0 + if(!deployed) + return 1 + return(direct != divert_from) + + + + + +// the conveyor control switch +// +// + +/obj/machinery/conveyor_switch + + name = "conveyor switch" + desc = "A conveyor control switch." + icon = 'icons/obj/recycling.dmi' + icon_state = "switch-off" + var/position = 0 // 0 off, -1 reverse, 1 forward + var/last_pos = -1 // last direction setting + var/operated = 1 // true if just operated + + var/id = "" // must match conveyor IDs to control them + + var/list/conveyors // the list of converyors that are controlled by this switch + anchored = 1 + + + +/obj/machinery/conveyor_switch/New() + ..() + update() + + spawn(5) // allow map load + conveyors = list() + for(var/obj/machinery/conveyor/C in world) + if(C.id == id) + conveyors += C + +// update the icon depending on the position + +/obj/machinery/conveyor_switch/proc/update() + if(position<0) + icon_state = "switch-rev" + else if(position>0) + icon_state = "switch-fwd" + else + icon_state = "switch-off" + + +// timed process +// if the switch changed, update the linked conveyors + +/obj/machinery/conveyor_switch/process() + if(!operated) + return + operated = 0 + + for(var/obj/machinery/conveyor/C in conveyors) + C.operating = position + C.setdir() + +// attack with hand, switch position +/obj/machinery/conveyor_switch/attack_hand(mob/user) + if(position == 0) + if(last_pos < 0) + position = 1 + last_pos = 0 + else + position = -1 + last_pos = 0 + else + last_pos = position + position = 0 + + operated = 1 + update() + + // find any switches with same id as this one, and set their positions to match us + for(var/obj/machinery/conveyor_switch/S in world) + if(S.id == src.id) + S.position = position + S.update() diff --git a/code/unused/hivebot/hive_modules.dm b/code/unused/hivebot/hive_modules.dm index abac6236910..c0ae3196ca9 100644 --- a/code/unused/hivebot/hive_modules.dm +++ b/code/unused/hivebot/hive_modules.dm @@ -1,57 +1,57 @@ -/obj/item/weapon/hive_module - name = "hive robot module" - icon = 'icons/obj/module.dmi' - icon_state = "std_module" - w_class = 2.0 - item_state = "electronic" - flags = FPRINT|TABLEPASS | CONDUCT - var/list/modules = list() - -/obj/item/weapon/hive_module/standard - name = "give standard robot module" - -/obj/item/weapon/hive_module/engineering - name = "HiveBot engineering robot module" - -/obj/item/weapon/hive_module/New()//Shit all the mods have - src.modules += new /obj/item/device/flash(src) - - -/obj/item/weapon/hive_module/standard/New() - ..() - src.modules += new /obj/item/weapon/melee/baton(src) - src.modules += new /obj/item/weapon/extinguisher(src) - //var/obj/item/weapon/gun/mp5/M = new /obj/item/weapon/gun/mp5(src) - //M.weapon_lock = 0 - //src.modules += M - - -/obj/item/weapon/hive_module/engineering/New() - - src.modules += new /obj/item/weapon/extinguisher(src) - src.modules += new /obj/item/weapon/screwdriver(src) - src.modules += new /obj/item/weapon/weldingtool(src) - src.modules += new /obj/item/weapon/wrench(src) - src.modules += new /obj/item/device/analyzer(src) - src.modules += new /obj/item/device/flashlight(src) - - var/obj/item/weapon/rcd/R = new /obj/item/weapon/rcd(src) - R.matter = 30 - src.modules += R - - src.modules += new /obj/item/device/t_scanner(src) - src.modules += new /obj/item/weapon/crowbar(src) - src.modules += new /obj/item/weapon/wirecutters(src) - src.modules += new /obj/item/device/multitool(src) - - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(src) - M.amount = 50 - src.modules += M - - var/obj/item/stack/sheet/rglass/G = new /obj/item/stack/sheet/rglass(src) - G.amount = 50 - src.modules += G - - var/obj/item/stack/cable_coil/W = new /obj/item/stack/cable_coil(src) - W.amount = 50 - src.modules += W +/obj/item/weapon/hive_module + name = "hive robot module" + icon = 'icons/obj/module.dmi' + icon_state = "std_module" + w_class = 2.0 + item_state = "electronic" + flags = FPRINT|TABLEPASS | CONDUCT + var/list/modules = list() + +/obj/item/weapon/hive_module/standard + name = "give standard robot module" + +/obj/item/weapon/hive_module/engineering + name = "HiveBot engineering robot module" + +/obj/item/weapon/hive_module/New()//Shit all the mods have + src.modules += new /obj/item/device/flash(src) + + +/obj/item/weapon/hive_module/standard/New() + ..() + src.modules += new /obj/item/weapon/melee/baton(src) + src.modules += new /obj/item/weapon/extinguisher(src) + //var/obj/item/weapon/gun/mp5/M = new /obj/item/weapon/gun/mp5(src) + //M.weapon_lock = 0 + //src.modules += M + + +/obj/item/weapon/hive_module/engineering/New() + + src.modules += new /obj/item/weapon/extinguisher(src) + src.modules += new /obj/item/weapon/screwdriver(src) + src.modules += new /obj/item/weapon/weldingtool(src) + src.modules += new /obj/item/weapon/wrench(src) + src.modules += new /obj/item/device/analyzer(src) + src.modules += new /obj/item/device/flashlight(src) + + var/obj/item/weapon/rcd/R = new /obj/item/weapon/rcd(src) + R.matter = 30 + src.modules += R + + src.modules += new /obj/item/device/t_scanner(src) + src.modules += new /obj/item/weapon/crowbar(src) + src.modules += new /obj/item/weapon/wirecutters(src) + src.modules += new /obj/item/device/multitool(src) + + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(src) + M.amount = 50 + src.modules += M + + var/obj/item/stack/sheet/rglass/G = new /obj/item/stack/sheet/rglass(src) + G.amount = 50 + src.modules += G + + var/obj/item/stack/cable_coil/W = new /obj/item/stack/cable_coil(src) + W.amount = 50 + src.modules += W diff --git a/code/unused/hologram.dm b/code/unused/hologram.dm index 8622a923644..7254b0b6380 100644 --- a/code/unused/hologram.dm +++ b/code/unused/hologram.dm @@ -1,112 +1,112 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/obj/machinery/computer/hologram_comp - name = "Hologram Console" - desc = "Rumoured to control holograms." - icon = 'icons/obj/stationobjs.dmi' - icon_state = "holo_console0" - var/obj/machinery/hologram/projector/projector = null - var/temp = null - var/lumens = 0.0 - var/h_r = 245.0 - var/h_g = 245.0 - var/h_b = 245.0 - - -/obj/machinery/computer/hologram_comp/New() - ..() - spawn( 10 ) - src.projector = locate(/obj/machinery/hologram/projector, get_step(src.loc, NORTH)) - return - return - -/obj/machinery/computer/hologram_comp/DblClick() - if (!in_range(src, usr)) - return 0 - src.show_console(usr) - return - -/obj/machinery/computer/hologram_comp/proc/render() - var/icon/I = new /icon('icons/mob/human.dmi', "[skin_tones[1]]_m_s") - - if (src.lumens >= 0) - I.Blend(rgb(src.lumens, src.lumens, src.lumens), ICON_ADD) - else - I.Blend(rgb(- src.lumens, -src.lumens, -src.lumens), ICON_SUBTRACT) - - I.Blend(new /icon('icons/mob/underwear.dmi', "Mens White"), ICON_OVERLAY) - - var/icon/U = new /icon('icons/mob/human_face.dmi', "hair_a_s") - U.Blend(rgb(src.h_r, src.h_g, src.h_b), ICON_ADD) - - I.Blend(U, ICON_OVERLAY) - - src.projector.hologram.icon = I - -/obj/machinery/computer/hologram_comp/proc/show_console(var/mob/user as mob) - var/dat - user.set_machine(src) - if (src.temp) - dat = text("[]

    Clear", src.temp, src) - else - dat = text("Hologram Status:
    \nPower: []
    \nHologram Control:
    \nColor Luminosity: []/220 \[Reset\]
    \nLighten: 1 10
    \nDarken: 1 10
    \n
    \nHair Color: ([],[],[]) \[Reset\]
    \nRed (0-255): \[0\] -10 -1 [] 1 10 \[255\]
    \nGreen (0-255): \[0\] -10 -1 [] 1 10 \[255\]
    \nBlue (0-255): \[0\] -10 -1 [] 1 10 \[255\]
    ", src, (src.projector.hologram ? "On" : "Off"), -src.lumens + 35, src, src, src, src, src, src.h_r, src.h_g, src.h_b, src, src, src, src, src.h_r, src, src, src, src, src, src, src.h_g, src, src, src, src, src, src, src.h_b, src, src, src) - //user << browse(dat, "window=hologram_console") - //onclose(user, "hologram_console") - var/datum/browser/popup = new(user, "hologram_console", name) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer/hologram_comp/Topic(href, href_list) - if(..()) - return - if (in_range(src, usr)) - flick("holo_console1", src) - if (href_list["power"]) - if (src.projector.hologram) - src.projector.icon_state = "hologram0" - //src.projector.hologram = null - del(src.projector.hologram) - else - src.projector.hologram = new(src.projector.loc) - src.projector.hologram.icon = 'icons/mob/human.dmi' - src.projector.hologram.icon_state = "body_m_s" - src.projector.icon_state = "hologram1" - src.render() - else - if (href_list["h_r"]) - if (src.projector.hologram) - src.h_r += text2num(href_list["h_r"]) - src.h_r = min(max(src.h_r, 0), 255) - render() - else - if (href_list["h_g"]) - if (src.projector.hologram) - src.h_g += text2num(href_list["h_g"]) - src.h_g = min(max(src.h_g, 0), 255) - render() - else - if (href_list["h_b"]) - if (src.projector.hologram) - src.h_b += text2num(href_list["h_b"]) - src.h_b = min(max(src.h_b, 0), 255) - render() - else - if (href_list["light"]) - if (src.projector.hologram) - src.lumens += text2num(href_list["light"]) - src.lumens = min(max(src.lumens, -185.0), 35) - render() - else - if (href_list["reset"]) - if (src.projector.hologram) - src.lumens = 0 - render() - else - if (href_list["temp"]) - src.temp = null - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - src.show_console(M) - return +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 + +/obj/machinery/computer/hologram_comp + name = "Hologram Console" + desc = "Rumoured to control holograms." + icon = 'icons/obj/stationobjs.dmi' + icon_state = "holo_console0" + var/obj/machinery/hologram/projector/projector = null + var/temp = null + var/lumens = 0.0 + var/h_r = 245.0 + var/h_g = 245.0 + var/h_b = 245.0 + + +/obj/machinery/computer/hologram_comp/New() + ..() + spawn( 10 ) + src.projector = locate(/obj/machinery/hologram/projector, get_step(src.loc, NORTH)) + return + return + +/obj/machinery/computer/hologram_comp/DblClick() + if (!in_range(src, usr)) + return 0 + src.show_console(usr) + return + +/obj/machinery/computer/hologram_comp/proc/render() + var/icon/I = new /icon('icons/mob/human.dmi', "[skin_tones[1]]_m_s") + + if (src.lumens >= 0) + I.Blend(rgb(src.lumens, src.lumens, src.lumens), ICON_ADD) + else + I.Blend(rgb(- src.lumens, -src.lumens, -src.lumens), ICON_SUBTRACT) + + I.Blend(new /icon('icons/mob/underwear.dmi', "Mens White"), ICON_OVERLAY) + + var/icon/U = new /icon('icons/mob/human_face.dmi', "hair_a_s") + U.Blend(rgb(src.h_r, src.h_g, src.h_b), ICON_ADD) + + I.Blend(U, ICON_OVERLAY) + + src.projector.hologram.icon = I + +/obj/machinery/computer/hologram_comp/proc/show_console(var/mob/user as mob) + var/dat + user.set_machine(src) + if (src.temp) + dat = text("[]

    Clear", src.temp, src) + else + dat = text("Hologram Status:
    \nPower: []
    \nHologram Control:
    \nColor Luminosity: []/220 \[Reset\]
    \nLighten: 1 10
    \nDarken: 1 10
    \n
    \nHair Color: ([],[],[]) \[Reset\]
    \nRed (0-255): \[0\] -10 -1 [] 1 10 \[255\]
    \nGreen (0-255): \[0\] -10 -1 [] 1 10 \[255\]
    \nBlue (0-255): \[0\] -10 -1 [] 1 10 \[255\]
    ", src, (src.projector.hologram ? "On" : "Off"), -src.lumens + 35, src, src, src, src, src, src.h_r, src.h_g, src.h_b, src, src, src, src, src.h_r, src, src, src, src, src, src, src.h_g, src, src, src, src, src, src, src.h_b, src, src, src) + //user << browse(dat, "window=hologram_console") + //onclose(user, "hologram_console") + var/datum/browser/popup = new(user, "hologram_console", name) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/computer/hologram_comp/Topic(href, href_list) + if(..()) + return + if (in_range(src, usr)) + flick("holo_console1", src) + if (href_list["power"]) + if (src.projector.hologram) + src.projector.icon_state = "hologram0" + //src.projector.hologram = null + del(src.projector.hologram) + else + src.projector.hologram = new(src.projector.loc) + src.projector.hologram.icon = 'icons/mob/human.dmi' + src.projector.hologram.icon_state = "body_m_s" + src.projector.icon_state = "hologram1" + src.render() + else + if (href_list["h_r"]) + if (src.projector.hologram) + src.h_r += text2num(href_list["h_r"]) + src.h_r = min(max(src.h_r, 0), 255) + render() + else + if (href_list["h_g"]) + if (src.projector.hologram) + src.h_g += text2num(href_list["h_g"]) + src.h_g = min(max(src.h_g, 0), 255) + render() + else + if (href_list["h_b"]) + if (src.projector.hologram) + src.h_b += text2num(href_list["h_b"]) + src.h_b = min(max(src.h_b, 0), 255) + render() + else + if (href_list["light"]) + if (src.projector.hologram) + src.lumens += text2num(href_list["light"]) + src.lumens = min(max(src.lumens, -185.0), 35) + render() + else + if (href_list["reset"]) + if (src.projector.hologram) + src.lumens = 0 + render() + else + if (href_list["temp"]) + src.temp = null + for(var/mob/M in viewers(1, src)) + if ((M.client && M.machine == src)) + src.show_console(M) + return diff --git a/code/unused/limbs.dm b/code/unused/limbs.dm index b9a95ba889e..ef73eec5ece 100644 --- a/code/unused/limbs.dm +++ b/code/unused/limbs.dm @@ -1,140 +1,140 @@ -/datum/limb - var/name = "limb" - var/mob/owner = null - var/icon_name = null - var/body_part = null - var/brutestate = 0 - var/burnstate = 0 - var/brute_dam = 0 - var/burn_dam = 0 - var/max_damage = 0 - -/datum/limb/chest - name = "chest" - icon_name = "chest" - max_damage = 200 - body_part = CHEST - -/datum/limb/head - name = "head" - icon_name = "head" - max_damage = 200 - body_part = HEAD - -/datum/limb/l_arm - name = "l_arm" - icon_name = "l_arm" - max_damage = 75 - body_part = ARM_LEFT - -/datum/limb/l_leg - name = "l_leg" - icon_name = "l_leg" - max_damage = 75 - body_part = LEG_LEFT - -/datum/limb/r_arm - name = "r_arm" - icon_name = "r_arm" - max_damage = 75 - body_part = ARM_RIGHT - -/datum/limb/r_leg - name = "r_leg" - icon_name = "r_leg" - max_damage = 75 - body_part = LEG_RIGHT - -/*Leaving these here in case we want to use them later -/datum/limb/l_foot - name = "l foot" - icon_name = "l_foot" - body_part = FOOT_LEFT - -/datum/limb/r_foot - name = "r foot" - icon_name = "r_foot" - body_part = FOOT_RIGHT - -/datum/limb/r_hand - name = "r hand" - icon_name = "r_hand" - body_part = HAND_RIGHT - -/datum/limb/l_hand - name = "l hand" - icon_name = "l_hand" - body_part = HAND_LEFT - -/datum/limb/groin - name = "groin" - icon_name = "groin" - body_part = GROIN -*/ - -//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all. -//Damage will not exceed max_damage using this proc -//Cannot apply negative damage -/datum/limb/proc/take_damage(brute, burn) - if(owner && (owner.status_flags & GODMODE)) return 0 //godmode - brute = max(brute,0) - burn = max(burn,0) - - var/can_inflict = max_damage - (brute_dam + burn_dam) - if(!can_inflict) return 0 - - if((brute + burn) < can_inflict) - brute_dam += brute - burn_dam += burn - else - if(brute > 0) - if(burn > 0) - brute = round( (brute/(brute+burn)) * can_inflict, 1 ) - burn = can_inflict - brute //gets whatever damage is left over - brute_dam += brute - burn_dam += burn - else - brute_dam += can_inflict - else - if(burn > 0) - burn_dam += can_inflict - else - return 0 - return update_icon() - - -//Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all. -//Damage cannot go below zero. -//Cannot remove negative damage (i.e. apply damage) -/datum/limb/proc/heal_damage(brute, burn) - brute = max(brute, 0) - burn = max(burn, 0) - brute_dam = max(brute_dam - brute, 0) - burn_dam = max(burn_dam - burn, 0) - return update_icon() - - -//Returns total damage...kinda pointless really -/datum/limb/proc/get_damage() - return brute_dam + burn_dam - - -//Updates an organ's brute/burn states for use by update_damage_overlays() -//Returns 1 if we need to update overlays. 0 otherwise. -/datum/limb/proc/update_icon() - var/tbrute = round( (brute_dam/max_damage)*3, 1 ) - var/tburn = round( (burn_dam/max_damage)*3, 1 ) - if((tbrute != brutestate) || (tburn != burnstate)) - brutestate = tbrute - burnstate = tburn - return 1 - return 0 - -//Returns a display name for the organ -/datum/limb/proc/getDisplayName() - switch(name) - if("l_leg") return "left leg" - if("r_leg") return "right leg" - if("l_arm") return "left arm" - if("r_arm") return "right arm" - else return name +/datum/limb + var/name = "limb" + var/mob/owner = null + var/icon_name = null + var/body_part = null + var/brutestate = 0 + var/burnstate = 0 + var/brute_dam = 0 + var/burn_dam = 0 + var/max_damage = 0 + +/datum/limb/chest + name = "chest" + icon_name = "chest" + max_damage = 200 + body_part = CHEST + +/datum/limb/head + name = "head" + icon_name = "head" + max_damage = 200 + body_part = HEAD + +/datum/limb/l_arm + name = "l_arm" + icon_name = "l_arm" + max_damage = 75 + body_part = ARM_LEFT + +/datum/limb/l_leg + name = "l_leg" + icon_name = "l_leg" + max_damage = 75 + body_part = LEG_LEFT + +/datum/limb/r_arm + name = "r_arm" + icon_name = "r_arm" + max_damage = 75 + body_part = ARM_RIGHT + +/datum/limb/r_leg + name = "r_leg" + icon_name = "r_leg" + max_damage = 75 + body_part = LEG_RIGHT + +/*Leaving these here in case we want to use them later +/datum/limb/l_foot + name = "l foot" + icon_name = "l_foot" + body_part = FOOT_LEFT + +/datum/limb/r_foot + name = "r foot" + icon_name = "r_foot" + body_part = FOOT_RIGHT + +/datum/limb/r_hand + name = "r hand" + icon_name = "r_hand" + body_part = HAND_RIGHT + +/datum/limb/l_hand + name = "l hand" + icon_name = "l_hand" + body_part = HAND_LEFT + +/datum/limb/groin + name = "groin" + icon_name = "groin" + body_part = GROIN +*/ + +//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all. +//Damage will not exceed max_damage using this proc +//Cannot apply negative damage +/datum/limb/proc/take_damage(brute, burn) + if(owner && (owner.status_flags & GODMODE)) return 0 //godmode + brute = max(brute,0) + burn = max(burn,0) + + var/can_inflict = max_damage - (brute_dam + burn_dam) + if(!can_inflict) return 0 + + if((brute + burn) < can_inflict) + brute_dam += brute + burn_dam += burn + else + if(brute > 0) + if(burn > 0) + brute = round( (brute/(brute+burn)) * can_inflict, 1 ) + burn = can_inflict - brute //gets whatever damage is left over + brute_dam += brute + burn_dam += burn + else + brute_dam += can_inflict + else + if(burn > 0) + burn_dam += can_inflict + else + return 0 + return update_icon() + + +//Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all. +//Damage cannot go below zero. +//Cannot remove negative damage (i.e. apply damage) +/datum/limb/proc/heal_damage(brute, burn) + brute = max(brute, 0) + burn = max(burn, 0) + brute_dam = max(brute_dam - brute, 0) + burn_dam = max(burn_dam - burn, 0) + return update_icon() + + +//Returns total damage...kinda pointless really +/datum/limb/proc/get_damage() + return brute_dam + burn_dam + + +//Updates an organ's brute/burn states for use by update_damage_overlays() +//Returns 1 if we need to update overlays. 0 otherwise. +/datum/limb/proc/update_icon() + var/tbrute = round( (brute_dam/max_damage)*3, 1 ) + var/tburn = round( (burn_dam/max_damage)*3, 1 ) + if((tbrute != brutestate) || (tburn != burnstate)) + brutestate = tbrute + burnstate = tburn + return 1 + return 0 + +//Returns a display name for the organ +/datum/limb/proc/getDisplayName() + switch(name) + if("l_leg") return "left leg" + if("r_leg") return "right leg" + if("l_arm") return "left arm" + if("r_arm") return "right arm" + else return name diff --git a/code/unused/pipe.dm b/code/unused/pipe.dm index 60e552e3406..d8ee5fd7826 100644 --- a/code/unused/pipe.dm +++ b/code/unused/pipe.dm @@ -379,7 +379,7 @@ var/linenums = 0 stat |= BROKEN update() -/obj/machinery/pipes/Del() +/obj/machinery/pipes/Delete() stat |= BROKEN update() ..() diff --git a/code/unused/pipe_filter.dm b/code/unused/pipe_filter.dm index f12b36be467..10f0673728a 100644 --- a/code/unused/pipe_filter.dm +++ b/code/unused/pipe_filter.dm @@ -1,243 +1,243 @@ -// *** pipefilter - -/obj/machinery/pipefilter/New() - ..() - p_dir = (NORTH|SOUTH|EAST|WEST) ^ turn(dir, 180) - - src.gas = new /datum/gas_mixture/() - src.ngas = new /datum/gas_mixture/() - - src.f_gas = new /datum/gas_mixture/() - src.f_ngas = new /datum/gas_mixture/() - - gasflowlist += src - -/obj/machinery/pipefilter/buildnodes() - var/turf/T = src.loc - - n1dir = turn(dir, 90) - n2dir = turn(dir,-90) - - node1 = get_machine( level, T , n1dir ) // the main flow dir - node2 = get_machine( level, T , n2dir ) - node3 = get_machine( level, T, dir ) // the ejector port - - if(node1) vnode1 = node1.getline() - if(node2) vnode2 = node2.getline() - if(node3) vnode3 = node3.getline() - -/obj/machinery/pipefilter/gas_flow() - gas.copy_from(ngas) - f_gas.copy_from(f_ngas) - -/obj/machinery/pipefilter/process() -/* var/delta_gt - - if(vnode1) - delta_gt = FLOWFRAC * ( vnode1.get_gas_val(src) - gas.total_moles() / capmult) - calc_delta( src, gas, ngas, vnode1, delta_gt) - else - leak_to_turf(1) - if(vnode2) - delta_gt = FLOWFRAC * ( vnode2.get_gas_val(src) - gas.total_moles() / capmult) - calc_delta( src, gas, ngas, vnode2, delta_gt) - else - leak_to_turf(2) - if(vnode3) - delta_gt = FLOWFRAC * ( vnode3.get_gas_val(src) - f_gas.total_moles() / capmult) - calc_delta( src, f_gas, f_ngas, vnode3, delta_gt) - else - leak_to_turf(3) - - // transfer gas from ngas->f_ngas according to extraction rate, but only if we have power - if(! (stat & NOPOWER) ) - use_power(min(src.f_per, 100),ENVIRON) - var/datum/gas_mixture/ndelta = src.get_extract() - ngas.sub_delta(ndelta) - f_ngas.add_delta(ndelta) - AutoUpdateAI(src) - src.updateUsrDialog()*/ //TODO: FIX - -/obj/machinery/pipefilter/get_gas_val(from) - return ((from == vnode3) ? f_gas.total_moles() : gas.total_moles())/capmult - -/obj/machinery/pipefilter/get_gas(from) - return (from == vnode3) ? f_gas : gas - -/obj/machinery/pipefilter/proc/leak_to_turf(var/port) - var/turf/T - - switch(port) - if(1) - T = get_step(src, n1dir) - if(2) - T = get_step(src, n2dir) - if(3) - T = get_step(src, dir) - if(T.density) - T = src.loc - if(T.density) - return - flow_to_turf(f_gas, f_ngas, T) - return - - if(T.density) - T = src.loc - if(T.density) - return - - flow_to_turf(gas, ngas, T) - -/obj/machinery/pipefilter/proc/get_extract() - /* - var/datum/gas_mixture/ndelta = new() - if (src.f_mask & GAS_O2) - ndelta.oxygen = min(src.f_per, src.ngas.oxygen) - if (src.f_mask & GAS_N2) - ndelta.n2 = min(src.f_per, src.ngas.n2) - if (src.f_mask & GAS_PL) - ndelta.plasma = min(src.f_per, src.ngas.plasma) - if (src.f_mask & GAS_CO2) - ndelta.co2 = min(src.f_per, src.ngas.co2) - if (src.f_mask & GAS_N2O) - ndelta.sl_gas = min(src.f_per, src.ngas.sl_gas) - return ndelta - */ //TODO: FIX - -/obj/machinery/pipefilter/attackby(obj/item/weapon/W, mob/user as mob) - if(istype(W, /obj/item/weapon/detective_scanner)) - return ..() - if(istype(W, /obj/item/weapon/screwdriver)) - if(bypassed) - user.show_message(text("\red Remove the foreign wires first!"), 1) - return - src.add_fingerprint(user) - user.show_message(text("\red Now []securing the access system panel...", (src.locked) ? "un" : "re"), 1) - sleep(30) - locked =! locked - user.show_message(text("\red Done!"),1) - src.updateicon() - return - if(istype(W, /obj/item/stack/cable_coil) && !bypassed) - if(src.locked) - user.show_message(text("\red You must remove the panel first!"),1) - return - var/obj/item/stack/cable_coil/C = W - if(C.use(4)) - user.show_message(text("\red You unravel some cable.."),1) - else - user.show_message(text("\red Not enough cable! (Requires four pieces)"),1) - src.add_fingerprint(user) - user.show_message(text("\red Now bypassing the access system... (This may take a while)"), 1) - sleep(100) - bypassed = 1 - src.updateicon() - return - if(istype(W, /obj/item/weapon/wirecutters) && bypassed) - src.add_fingerprint(user) - user.show_message(text("\red Now removing the bypass wires... (This may take a while)"), 1) - sleep(50) - bypassed = 0 - src.updateicon() - return - if(istype(W, /obj/item/weapon/card/emag) && (!emagged)) - emagged++ - src.add_fingerprint(user) - for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [] has shorted out the [] with an electromagnetic card!", user, src), 1) - src.overlays += image('icons/obj/pipes2.dmi', "filter-spark") - sleep(6) - src.updateicon() - return src.attack_hand(user) - return src.attack_hand(user) - -// pipefilter interact/topic -/obj/machinery/pipefilter/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/pipefilter/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/pipefilter/attack_hand(mob/user as mob) -/* if(stat & NOPOWER) - user << browse(null, "window=pipefilter") - user.machine = null - return - - var/list/gases = list("O2", "N2", "Plasma", "CO2", "N2O") - user.machine = src - var/dat = "Filter Release Rate:
    \nM - - - - - [src.f_per] + + + + + M
    \n" - for (var/i = 1; i <= gases.len; i++) - dat += "[gases[i]]: [(src.f_mask & 1 << (i - 1)) ? "Releasing" : "Passing"]
    \n" - if(gas.total_moles()) - var/totalgas = gas.total_moles() - var/pressure = round(totalgas / gas.maximum * 100) - var/nitrogen = gas.n2 / totalgas * 100 - var/oxygen = gas.oxygen / totalgas * 100 - var/plasma = gas.plasma / totalgas * 100 - var/co2 = gas.co2 / totalgas * 100 - var/no2 = gas.sl_gas / totalgas * 100 - - dat += "
    Gas Levels:
    \nPressure: [pressure]%
    \nNitrogen: [nitrogen]%
    \nOxygen: [oxygen]%
    \nPlasma: [plasma]%
    \nCO2: [co2]%
    \nN2O: [no2]%
    \n" - else - dat += "
    Gas Levels:
    \nPressure: 0%
    \nNitrogen: 0%
    \nOxygen: 0%
    \nPlasma: 0%
    \nCO2: 0%
    \nN2O: 0%
    \n" - dat += "
    \nClose
    \n" - - user << browse(dat, "window=pipefilter;size=300x365")*/ //TODO: FIX - //onclose(user, "pipefilter") - -/obj/machinery/pipefilter/Topic(href, href_list) - ..() - if(usr.restrained() || usr.lying) - return - if ((((get_dist(src, usr) <= 1 || usr.telekinesis == 1) || istype(usr, /mob/living/silicon/ai)) && istype(src.loc, /turf))) - usr.machine = src - if (href_list["close"]) - usr << browse(null, "window=pipefilter;") - usr.machine = null - return - if (src.allowed(usr) || src.emagged || src.bypassed) - if (href_list["fp"]) - src.f_per = min(max(round(src.f_per + text2num(href_list["fp"])), 0), src.maxrate) - else if (href_list["tg"]) - // toggle gas - src.f_mask ^= text2num(href_list["tg"]) - src.updateicon() - else - usr.see("\red Access Denied ([src.name] operation restricted to authorized atmospheric technicians.)") - AutoUpdateAI(src) - src.updateUsrDialog() - src.add_fingerprint(usr) - else - usr << browse(null, "window=pipefilter") - usr.machine = null - return - -/obj/machinery/pipefilter/power_change() - if(powered(ENVIRON)) - stat &= ~NOPOWER - else - stat |= NOPOWER - spawn(rand(1,15)) //so all the filters don't come on at once - updateicon() - -/obj/machinery/pipefilter/proc/updateicon() - src.overlays.Cut() - if(stat & NOPOWER) - icon_state = "filter-off" - else - icon_state = "filter" - if(emagged) //only show if powered because presumeably its the interface that has been fried - src.overlays += image('icons/obj/pipes2.dmi', "filter-emag") - if (src.f_mask & (GAS_N2O|GAS_PL)) - src.overlays += image('icons/obj/pipes2.dmi', "filter-tox") - if (src.f_mask & GAS_O2) - src.overlays += image('icons/obj/pipes2.dmi', "filter-o2") - if (src.f_mask & GAS_N2) - src.overlays += image('icons/obj/pipes2.dmi', "filter-n2") - if (src.f_mask & GAS_CO2) - src.overlays += image('icons/obj/pipes2.dmi', "filter-co2") - if(!locked) - src.overlays += image('icons/obj/pipes2.dmi', "filter-open") - if(bypassed) //should only be bypassed if unlocked +// *** pipefilter + +/obj/machinery/pipefilter/New() + ..() + p_dir = (NORTH|SOUTH|EAST|WEST) ^ turn(dir, 180) + + src.gas = new /datum/gas_mixture/() + src.ngas = new /datum/gas_mixture/() + + src.f_gas = new /datum/gas_mixture/() + src.f_ngas = new /datum/gas_mixture/() + + gasflowlist += src + +/obj/machinery/pipefilter/buildnodes() + var/turf/T = src.loc + + n1dir = turn(dir, 90) + n2dir = turn(dir,-90) + + node1 = get_machine( level, T , n1dir ) // the main flow dir + node2 = get_machine( level, T , n2dir ) + node3 = get_machine( level, T, dir ) // the ejector port + + if(node1) vnode1 = node1.getline() + if(node2) vnode2 = node2.getline() + if(node3) vnode3 = node3.getline() + +/obj/machinery/pipefilter/gas_flow() + gas.copy_from(ngas) + f_gas.copy_from(f_ngas) + +/obj/machinery/pipefilter/process() +/* var/delta_gt + + if(vnode1) + delta_gt = FLOWFRAC * ( vnode1.get_gas_val(src) - gas.total_moles() / capmult) + calc_delta( src, gas, ngas, vnode1, delta_gt) + else + leak_to_turf(1) + if(vnode2) + delta_gt = FLOWFRAC * ( vnode2.get_gas_val(src) - gas.total_moles() / capmult) + calc_delta( src, gas, ngas, vnode2, delta_gt) + else + leak_to_turf(2) + if(vnode3) + delta_gt = FLOWFRAC * ( vnode3.get_gas_val(src) - f_gas.total_moles() / capmult) + calc_delta( src, f_gas, f_ngas, vnode3, delta_gt) + else + leak_to_turf(3) + + // transfer gas from ngas->f_ngas according to extraction rate, but only if we have power + if(! (stat & NOPOWER) ) + use_power(min(src.f_per, 100),ENVIRON) + var/datum/gas_mixture/ndelta = src.get_extract() + ngas.sub_delta(ndelta) + f_ngas.add_delta(ndelta) + AutoUpdateAI(src) + src.updateUsrDialog()*/ //TODO: FIX + +/obj/machinery/pipefilter/get_gas_val(from) + return ((from == vnode3) ? f_gas.total_moles() : gas.total_moles())/capmult + +/obj/machinery/pipefilter/get_gas(from) + return (from == vnode3) ? f_gas : gas + +/obj/machinery/pipefilter/proc/leak_to_turf(var/port) + var/turf/T + + switch(port) + if(1) + T = get_step(src, n1dir) + if(2) + T = get_step(src, n2dir) + if(3) + T = get_step(src, dir) + if(T.density) + T = src.loc + if(T.density) + return + flow_to_turf(f_gas, f_ngas, T) + return + + if(T.density) + T = src.loc + if(T.density) + return + + flow_to_turf(gas, ngas, T) + +/obj/machinery/pipefilter/proc/get_extract() + /* + var/datum/gas_mixture/ndelta = new() + if (src.f_mask & GAS_O2) + ndelta.oxygen = min(src.f_per, src.ngas.oxygen) + if (src.f_mask & GAS_N2) + ndelta.n2 = min(src.f_per, src.ngas.n2) + if (src.f_mask & GAS_PL) + ndelta.plasma = min(src.f_per, src.ngas.plasma) + if (src.f_mask & GAS_CO2) + ndelta.co2 = min(src.f_per, src.ngas.co2) + if (src.f_mask & GAS_N2O) + ndelta.sl_gas = min(src.f_per, src.ngas.sl_gas) + return ndelta + */ //TODO: FIX + +/obj/machinery/pipefilter/attackby(obj/item/weapon/W, mob/user as mob) + if(istype(W, /obj/item/weapon/detective_scanner)) + return ..() + if(istype(W, /obj/item/weapon/screwdriver)) + if(bypassed) + user.show_message(text("\red Remove the foreign wires first!"), 1) + return + src.add_fingerprint(user) + user.show_message(text("\red Now []securing the access system panel...", (src.locked) ? "un" : "re"), 1) + sleep(30) + locked =! locked + user.show_message(text("\red Done!"),1) + src.updateicon() + return + if(istype(W, /obj/item/stack/cable_coil) && !bypassed) + if(src.locked) + user.show_message(text("\red You must remove the panel first!"),1) + return + var/obj/item/stack/cable_coil/C = W + if(C.use(4)) + user.show_message(text("\red You unravel some cable.."),1) + else + user.show_message(text("\red Not enough cable! (Requires four pieces)"),1) + src.add_fingerprint(user) + user.show_message(text("\red Now bypassing the access system... (This may take a while)"), 1) + sleep(100) + bypassed = 1 + src.updateicon() + return + if(istype(W, /obj/item/weapon/wirecutters) && bypassed) + src.add_fingerprint(user) + user.show_message(text("\red Now removing the bypass wires... (This may take a while)"), 1) + sleep(50) + bypassed = 0 + src.updateicon() + return + if(istype(W, /obj/item/weapon/card/emag) && (!emagged)) + emagged++ + src.add_fingerprint(user) + for(var/mob/O in viewers(user, null)) + O.show_message(text("\red [] has shorted out the [] with an electromagnetic card!", user, src), 1) + src.overlays += image('icons/obj/pipes2.dmi', "filter-spark") + sleep(6) + src.updateicon() + return src.attack_hand(user) + return src.attack_hand(user) + +// pipefilter interact/topic +/obj/machinery/pipefilter/attack_paw(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/pipefilter/attack_ai(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/pipefilter/attack_hand(mob/user as mob) +/* if(stat & NOPOWER) + user << browse(null, "window=pipefilter") + user.machine = null + return + + var/list/gases = list("O2", "N2", "Plasma", "CO2", "N2O") + user.machine = src + var/dat = "Filter Release Rate:
    \nM - - - - - [src.f_per] + + + + + M
    \n" + for (var/i = 1; i <= gases.len; i++) + dat += "[gases[i]]: [(src.f_mask & 1 << (i - 1)) ? "Releasing" : "Passing"]
    \n" + if(gas.total_moles()) + var/totalgas = gas.total_moles() + var/pressure = round(totalgas / gas.maximum * 100) + var/nitrogen = gas.n2 / totalgas * 100 + var/oxygen = gas.oxygen / totalgas * 100 + var/plasma = gas.plasma / totalgas * 100 + var/co2 = gas.co2 / totalgas * 100 + var/no2 = gas.sl_gas / totalgas * 100 + + dat += "
    Gas Levels:
    \nPressure: [pressure]%
    \nNitrogen: [nitrogen]%
    \nOxygen: [oxygen]%
    \nPlasma: [plasma]%
    \nCO2: [co2]%
    \nN2O: [no2]%
    \n" + else + dat += "
    Gas Levels:
    \nPressure: 0%
    \nNitrogen: 0%
    \nOxygen: 0%
    \nPlasma: 0%
    \nCO2: 0%
    \nN2O: 0%
    \n" + dat += "
    \nClose
    \n" + + user << browse(dat, "window=pipefilter;size=300x365")*/ //TODO: FIX + //onclose(user, "pipefilter") + +/obj/machinery/pipefilter/Topic(href, href_list) + ..() + if(usr.restrained() || usr.lying) + return + if ((((get_dist(src, usr) <= 1 || usr.telekinesis == 1) || istype(usr, /mob/living/silicon/ai)) && istype(src.loc, /turf))) + usr.machine = src + if (href_list["close"]) + usr << browse(null, "window=pipefilter;") + usr.machine = null + return + if (src.allowed(usr) || src.emagged || src.bypassed) + if (href_list["fp"]) + src.f_per = min(max(round(src.f_per + text2num(href_list["fp"])), 0), src.maxrate) + else if (href_list["tg"]) + // toggle gas + src.f_mask ^= text2num(href_list["tg"]) + src.updateicon() + else + usr.see("\red Access Denied ([src.name] operation restricted to authorized atmospheric technicians.)") + AutoUpdateAI(src) + src.updateUsrDialog() + src.add_fingerprint(usr) + else + usr << browse(null, "window=pipefilter") + usr.machine = null + return + +/obj/machinery/pipefilter/power_change() + if(powered(ENVIRON)) + stat &= ~NOPOWER + else + stat |= NOPOWER + spawn(rand(1,15)) //so all the filters don't come on at once + updateicon() + +/obj/machinery/pipefilter/proc/updateicon() + src.overlays.Cut() + if(stat & NOPOWER) + icon_state = "filter-off" + else + icon_state = "filter" + if(emagged) //only show if powered because presumeably its the interface that has been fried + src.overlays += image('icons/obj/pipes2.dmi', "filter-emag") + if (src.f_mask & (GAS_N2O|GAS_PL)) + src.overlays += image('icons/obj/pipes2.dmi', "filter-tox") + if (src.f_mask & GAS_O2) + src.overlays += image('icons/obj/pipes2.dmi', "filter-o2") + if (src.f_mask & GAS_N2) + src.overlays += image('icons/obj/pipes2.dmi', "filter-n2") + if (src.f_mask & GAS_CO2) + src.overlays += image('icons/obj/pipes2.dmi', "filter-co2") + if(!locked) + src.overlays += image('icons/obj/pipes2.dmi', "filter-open") + if(bypassed) //should only be bypassed if unlocked src.overlays += image('icons/obj/pipes2.dmi', "filter-bypass") \ No newline at end of file diff --git a/code/unused/splash_simulation.dm b/code/unused/splash_simulation.dm index d7352ff7128..b2d185d260c 100644 --- a/code/unused/splash_simulation.dm +++ b/code/unused/splash_simulation.dm @@ -131,7 +131,7 @@ obj/effect/liquid/proc/apply_calculated_effect() obj/effect/liquid/Move() return 0 -obj/effect/liquid/Del() +obj/effect/liquid/Delete() src.controller.liquid_objects.Remove(src) ..() diff --git a/config/game_options.txt b/config/game_options.txt index a01b8ef2450..0c059ce64d0 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -18,6 +18,10 @@ REVIVAL_CLONING 1 # amount of time (in hundredths of seconds) for which a brain retains the "spark of life" after the person's death (set to -1 for infinite) REVIVAL_BRAIN_LIFE -1 +### RENAMING ### + +# Whether cyborgs can rename themselves at roundstart or when built. Has no effect on roboticists renaming cyborgs the normal way. Set to 0 to disable self-renaming. +#RENAME_CYBORG ### MOB MOVEMENT ### diff --git a/html/changelog.html b/html/changelog.html index a8d4a7ced17..474612e7494 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,32 @@ should be listed in the changelog upon commit tho. Thanks. --> +
    +

    25 March 2014

    +

    Ikarrus updated:

    +
      +
    • A security review committee has approved an update to all Nanotrasen airlocks to better resist cryptographic attacks by the enemy. +

      *New internal wiring will be able to withstand attacks, and panel wires will no longer be left unusable after an attack. +
      *Welding tools will now be able to cut through welded doors that have been damaged. +
      *Damaged electronics are now removable and replaceable following standard procedure. +
      *Airlocks will not be able to operate autonomously until the electronics are replaced.
    • +
    • Hair sprites have been given a visual lift. For best results, set your hair color to be slightly lighter than how you want it to look. For dark hair, do not use a color darker than 80% black.
    • +
    +
    + +
    +

    22 March 2014

    +

    MrPerson updated:

    +
      +
    • Added a new, somewhat experimental system to delete things. This is basically a port from /vg/, so big thanks to N3X15.
    • +
    • As a result, bombs and the singularity should be much less laggy.
    • +
    • There may be issues with "phantom objects" or other problems with stuff that's suppoed to be deleted or objects interacting with deleted objects. Please report any issues right away!
    • +
    +

    Giacom updated:

    +
      +
    • Gravity is no longer beamed from CentCom! Instead, there is a new gravity generator stored near Engineering that will provide all the gravity for the station and the z level. Please remember that it gives off a lot of radiation when charging or discharging, so wear protection.
    • +
    +

    18 March 2014

    diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index afe6dad66b1..a639ab31162 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index e55fb7cec98..8634b61f79d 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index bf443312009..2628bc48b9d 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 8b4ddeed26a..515a69547df 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index 6f8ea7af516..6e4b095e8c1 100644 Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index 454630e4935..0bc19db3c47 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index f89176d1d22..823c3c3db0f 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/screen_cyborg.dmi b/icons/mob/screen_cyborg.dmi index 8fad55192be..3492672b32e 100644 Binary files a/icons/mob/screen_cyborg.dmi and b/icons/mob/screen_cyborg.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 98fc2ab41f8..90a6095b3ee 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index c0d073039bb..c2f21ea8cc7 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 77312526ac2..4f0f2b071ea 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/aibots.dmi b/icons/obj/aibots.dmi index f0393979b54..7b559aad634 100644 Binary files a/icons/obj/aibots.dmi and b/icons/obj/aibots.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 347bad28ac0..dbd74d4f445 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index a064ea3d649..30878cd97e3 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index 6208ccc3b02..38e89b591ed 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 3beb3b2f2b1..89e94d21bb1 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 1612bfde40e..201f6e42e7d 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index a424ea49f5e..80722813075 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 63a21591aa3..23efbe3ecb3 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/cryogenics.dmi b/icons/obj/cryogenics.dmi index b4f68b30bad..1159725b91a 100644 Binary files a/icons/obj/cryogenics.dmi and b/icons/obj/cryogenics.dmi differ diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi index a38a213dec5..12791090e09 100644 Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ diff --git a/icons/obj/doors/doormed.dmi b/icons/obj/doors/doormed.dmi index 3e131b5788b..da561d3f619 100644 Binary files a/icons/obj/doors/doormed.dmi and b/icons/obj/doors/doormed.dmi differ diff --git a/icons/obj/doors/doormedglass.dmi b/icons/obj/doors/doormedglass.dmi index 397f0ced0db..42292469311 100644 Binary files a/icons/obj/doors/doormedglass.dmi and b/icons/obj/doors/doormedglass.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 669c3461697..d4cbb96c20d 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 68dab1900b8..3619504282e 100644 Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index b6cabec2b38..95f63945904 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index ee76458d822..7cb334987a1 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 2e59c8155b4..5379d6e70e0 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/machines/gravity_generator.dmi b/icons/obj/machines/gravity_generator.dmi new file mode 100644 index 00000000000..69395034dc8 Binary files /dev/null and b/icons/obj/machines/gravity_generator.dmi differ diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index 41d14c7f1a6..cf23e987632 100644 Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index bff28d7f30b..f38c5a5085d 100644 Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index a759f4fc3d8..49455882710 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index de6de2b2fa2..7ae9dadfd3b 100644 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 922408e0335..a56f4e00b2c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -104,6 +104,7 @@ #include "code\controllers\_DynamicAreaLighting_TG.dm" #include "code\controllers\configuration.dm" #include "code\controllers\failsafe.dm" +#include "code\controllers\garbage.dm" #include "code\controllers\lighting_controller.dm" #include "code\controllers\master_controller.dm" #include "code\controllers\shuttle_controller.dm" @@ -727,6 +728,8 @@ #include "code\modules\admin\verbs\randomverbs.dm" #include "code\modules\admin\verbs\ticklag.dm" #include "code\modules\admin\verbs\tripAI.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" #include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\bomb.dm" #include "code\modules\assembly\helpers.dm" @@ -753,6 +756,7 @@ #include "code\modules\awaymissions\maploader\writer.dm" #include "code\modules\awaymissions\mission_code\Academy.dm" #include "code\modules\awaymissions\mission_code\blackmarketpackers.dm" +#include "code\modules\awaymissions\mission_code\box2550Away.dm" #include "code\modules\awaymissions\mission_code\centcomAway.dm" #include "code\modules\awaymissions\mission_code\challenge.dm" #include "code\modules\awaymissions\mission_code\spacebattle.dm" @@ -1225,7 +1229,6 @@ #include "code\modules\telesci\telesci_computer.dm" #include "code\WorkInProgress\buildmode.dm" #include "code\WorkInProgress\explosion_particles.dm" -#include "code\WorkInProgress\Sigyn\Department Sec\jobs.dm" #include "interface\interface.dm" #include "interface\stylesheet.dm" #include "interface\skin.dmf"