From 146ded3521438897e75481e26ec9e4f62c80863c Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 24 Aug 2015 02:45:38 -0400 Subject: [PATCH 01/39] Gutter Language Update --- code/modules/mob/language.dm | 4 +++- code/stylesheet.dm | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index e1cae9e3c66..43c84502453 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -246,7 +246,7 @@ key = "5" flags = RESTRICTED | WHITELISTED syllables = list("02011","01222","10100","10210","21012","02011","21200","1002","2001","0002","0012","0012","000","120","121","201","220","10","11","0") - + /datum/language/machine/get_random_name() if(prob(70)) name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" @@ -333,6 +333,8 @@ name = "Gutter" desc = "Much like Standard, this crude pidgin tongue descended from numerous languages and serves as Tradeband for criminal elements." speech_verb = "growls" + ask_verb = "gnarls" + exclaim_verb = "snarls" colour = "rough" key = "3" syllables = list ("gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra") diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 9ba50242b59..a8ad6cf6580 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -85,7 +85,7 @@ h1.alert, h2.alert {color: #000000;} .clown {color: #ff0000;} .shadowling {color: #3b2769;} .vulpkanin {color: #B97A57;} -.rough {font-family: "Trebuchet MS", cursive, sans-serif;} +.rough {color: #7092BE; font-family: "Trebuchet MS", cursive, sans-serif;} .say_quote {font-family: Georgia, Verdana, sans-serif;} .sans {font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} From 6a6f09ed36df2c4c50f7cd0f57a38ea0d2d0e026 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 24 Aug 2015 19:20:20 +0200 Subject: [PATCH 02/39] Cargo interface overhaul --- code/datums/supplypacks.dm | 88 +-- code/game/supplyshuttle.dm | 556 ++++++++---------- code/modules/mob/inventory.dm | 8 + code/modules/mob/language.dm | 7 +- code/modules/mob/living/carbon/carbon.dm | 10 +- .../mob/living/carbon/human/inventory.dm | 30 + .../mob/living/silicon/robot/inventory.dm | 3 +- nano/templates/order_console.tmpl | 111 ++++ nano/templates/supply_console.tmpl | 125 ++++ 9 files changed, 593 insertions(+), 345 deletions(-) create mode 100644 nano/templates/order_console.tmpl create mode 100644 nano/templates/supply_console.tmpl diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 85a1c2b0215..d29e6769dd2 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -31,7 +31,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine if(5) return "Science" if(6) - return "Food & Livestock" + return "Food and Livestock" if(7) return "Raw Materials" if(8) @@ -75,7 +75,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/emergency/evac - name = "Emergency equipment" + name = "Emergency Equipment Crate" contains = list(/obj/machinery/bot/floorbot, /obj/machinery/bot/floorbot, /obj/machinery/bot/medbot, @@ -125,7 +125,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "firefighting crate" /datum/supply_packs/emergency/atmostank - name = "Firefighting Watertank" + name = "Firefighting Watertank Crate" contains = list(/obj/item/weapon/watertank/atmos) cost = 10 containertype = /obj/structure/closet/crate/secure @@ -144,7 +144,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine access = access_hydroponics /datum/supply_packs/emergency/specialops - name = "Special Ops supplies" + name = "Special Ops Supplies" contains = list(/obj/item/weapon/storage/box/emps, /obj/item/weapon/grenade/smokebomb, /obj/item/weapon/grenade/smokebomb, @@ -413,7 +413,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "insulated gloves crate" /datum/supply_packs/engineering/power - name = "Powercell Crate" + name = "Power Cell Crate" contains = list(/obj/item/weapon/stock_parts/cell/high, //Changed to an extra high powercell because normal cells are useless /obj/item/weapon/stock_parts/cell/high, /obj/item/weapon/stock_parts/cell/high) @@ -524,7 +524,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/storage/briefcase/inflatable) cost = 20 - containername = "Inflatable Barrier Crate" + containername = "inflatable barrier crate" /datum/supply_packs/engineering/engine/supermatter_shard name = "Supermatter Shard Crate" @@ -543,7 +543,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine ) cost = 25 containertype = /obj/structure/closet/crate/secure - containername = "Thermo-Electric Generator Components" + containername = "thermo-electric generator crate" access = access_ce ////////////////////////////////////////////////////////////////////////////// @@ -586,21 +586,21 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "first aid kits crate" /datum/supply_packs/medical/firstaidadv - name = "Advaced First Aid Kits Crate" + name = "Advanced First Aid Kits Crate" contains = list(/obj/item/weapon/storage/firstaid/adv, /obj/item/weapon/storage/firstaid/adv, /obj/item/weapon/storage/firstaid/adv, /obj/item/weapon/storage/firstaid/adv) cost = 10 - containername = "advaced first aid kits crate" + containername = "advanced first aid kits crate" /datum/supply_packs/medical/firstaibrute - name = "Brute Trauma Treatment Kits Crate" + name = "Brute Treatment Kits Crate" contains = list(/obj/item/weapon/storage/firstaid/brute, /obj/item/weapon/storage/firstaid/brute, /obj/item/weapon/storage/firstaid/brute) cost = 10 - containername = "brute trauma treatment kit" + containername = "brute first aid kits crate" /datum/supply_packs/medical/firstaidburns name = "Burns Treatment Kits Crate" @@ -619,12 +619,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "toxin first aid kits crate" /datum/supply_packs/medical/firstaidoxygen - name = "Oxygen Deprivation Kits Crate" + name = "Oxygen Treatment Kits Crate" contains = list(/obj/item/weapon/storage/firstaid/o2, /obj/item/weapon/storage/firstaid/o2, /obj/item/weapon/storage/firstaid/o2) cost = 10 - containername = "oxygen deprivation kits crate" + containername = "oxygen first aid kits crate" /datum/supply_packs/medical/virus name = "Virus Crate" @@ -657,11 +657,11 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine contains = list(/obj/machinery/iv_drip) cost = 30 containertype = /obj/structure/closet/crate/secure - containername = "iv drip crate" + containername = "IV drip crate" access = access_cmo /datum/supply_packs/medical/surgery - name = "Surgery crate" + name = "Surgery Crate" contains = list(/obj/item/weapon/cautery, /obj/item/weapon/surgicaldrill, /obj/item/clothing/mask/breath/medical, @@ -675,7 +675,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/circular_saw) cost = 25 containertype = /obj/structure/closet/crate/secure - containername = "Surgery crate" + containername = "surgery crate" access = access_medical @@ -703,7 +703,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine access = access_robotics /datum/supply_packs/science/robotics/mecha_ripley - name = "Circuit Crate (\"Ripley\" APLU)" + name = "Circuit Crate (Ripley APLU)" contains = list(/obj/item/weapon/book/manual/ripley_build_and_repair, /obj/item/weapon/circuitboard/mecha/ripley/main, //TEMPORARY due to lack of circuitboard printer /obj/item/weapon/circuitboard/mecha/ripley/peripherals) //TEMPORARY due to lack of circuitboard printer @@ -712,7 +712,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "\improper APLU \"Ripley\" circuit crate" /datum/supply_packs/science/robotics/mecha_odysseus - name = "Circuit Crate (\"Odysseus\")" + name = "Circuit Crate (Odysseus)" contains = list(/obj/item/weapon/circuitboard/mecha/odysseus/peripherals, //TEMPORARY due to lack of circuitboard printer /obj/item/weapon/circuitboard/mecha/odysseus/main) //TEMPORARY due to lack of circuitboard printer cost = 25 @@ -740,7 +740,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine group = supply_science /datum/supply_packs/science/shieldwalls - name = "Shield Generators" + name = "Shield Generators Crate" contains = list(/obj/machinery/shieldwallgen, /obj/machinery/shieldwallgen, /obj/machinery/shieldwallgen, @@ -752,12 +752,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/science/transfer_valves - name = "Tank Transfer Valves" + name = "Tank Transfer Valves Crate" contains = list(/obj/item/device/transfer_valve, /obj/item/device/transfer_valve) cost = 60 containertype = /obj/structure/closet/crate/secure - containername = "transfer valves crate" + containername = "tank transfer valves crate" access = access_rd @@ -805,33 +805,33 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "monkey crate" /datum/supply_packs/organic/farwa - name = "Farwa crate" + name = "Farwa Crate" contains = list (/obj/item/weapon/storage/box/farwacubes) cost = 30 containername = "farwa crate" /datum/supply_packs/organic/wolpin - name = "Wolpin crate" + name = "Wolpin Crate" contains = list (/obj/item/weapon/storage/box/wolpincubes) cost = 30 containername = "wolpin crate" /datum/supply_packs/organic/skrell - name = "Neaera crate" + name = "Neaera Crate" contains = list (/obj/item/weapon/storage/box/neaeracubes) cost = 30 containername = "neaera crate" /datum/supply_packs/organic/stok - name = "Stok crate" + name = "Stok Crate" contains = list (/obj/item/weapon/storage/box/stokcubes) cost = 30 containername = "stok crate" /datum/supply_packs/organic/party - name = "Party equipment" + name = "Party Equipment Crate" contains = list(/obj/item/weapon/storage/box/drinkingglasses, /obj/item/weapon/reagent_containers/food/drinks/shaker, /obj/item/weapon/reagent_containers/food/drinks/bottle/patron, @@ -923,7 +923,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "hydroponics crate" /datum/supply_packs/misc/hydroponics/hydrotank - name = "Hydroponics Watertank Backpack Crate" + name = "Hydroponics Watertank Crate" contains = list(/obj/item/weapon/watertank) cost = 10 containertype = /obj/structure/closet/crate/secure @@ -995,42 +995,42 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/materials/metal50 - name = "50 Metal Sheets" + name = "50 Metal Sheets Crate" contains = list(/obj/item/stack/sheet/metal) amount = 50 cost = 10 containername = "metal sheets crate" /datum/supply_packs/materials/plasteel20 - name = "20 Plasteel Sheets" + name = "20 Plasteel Sheets Crate" contains = list(/obj/item/stack/sheet/plasteel) amount = 20 cost = 30 containername = "plasteel sheets crate" /datum/supply_packs/materials/plasteel50 - name = "50 Plasteel Sheets" + name = "50 Plasteel Sheets Crate" contains = list(/obj/item/stack/sheet/plasteel) amount = 50 cost = 50 containername = "plasteel sheets crate" /datum/supply_packs/materials/glass50 - name = "50 Glass Sheets" + name = "50 Glass Sheets Crate" contains = list(/obj/item/stack/sheet/glass) amount = 50 cost = 10 containername = "glass sheets crate" /datum/supply_packs/materials/cardboard50 - name = "50 Cardboard Sheets" + name = "50 Cardboard Sheets Crate" contains = list(/obj/item/stack/sheet/cardboard) amount = 50 cost = 10 containername = "cardboard sheets crate" /datum/supply_packs/materials/sandstone30 - name = "30 Sandstone Blocks" + name = "30 Sandstone Blocks Crate" contains = list(/obj/item/stack/sheet/mineral/sandstone) amount = 30 cost = 20 @@ -1038,7 +1038,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/materials/plastic30 - name = "30 Plastic Sheets" + name = "30 Plastic Sheets Crate" contains = list(/obj/item/stack/sheet/mineral/plastic) amount = 30 cost = 25 @@ -1057,7 +1057,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine contains = list(/obj/machinery/bot/mulebot) cost = 20 containertype = /obj/structure/largecrate/mule - containername = "\improper MULEbot Crate" + containername = "\improper MULEbot crate" /datum/supply_packs/misc/watertank name = "Water Tank Crate" @@ -1120,7 +1120,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "bureaucracy crate" /datum/supply_packs/misc/toner - name = "Toner Cartridges crate" + name = "Toner Cartridges Crate" contains = list(/obj/item/device/toner, /obj/item/device/toner, /obj/item/device/toner, @@ -1131,7 +1131,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "toner cartridges crate" /datum/supply_packs/misc/artscrafts - name = "Arts and Crafts supplies" + name = "Arts and Crafts Supplies Crate" contains = list(/obj/item/weapon/storage/fancy/crayons, /obj/item/device/camera, /obj/item/device/camera_film, @@ -1151,7 +1151,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/stack/wrapping_paper, /obj/item/stack/wrapping_paper) cost = 10 - containername = "Arts and Crafts crate" + containername = "arts and crafts crate" /datum/supply_packs/misc/posters name = "Corporate Posters Crate" @@ -1161,7 +1161,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/contraband/poster/legit, /obj/item/weapon/contraband/poster/legit) cost = 8 - containername = "Corporate Posters Crate" + containername = "corporate posters crate" ///////////// Janitor Supplies @@ -1200,12 +1200,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine access = access_janitor /datum/supply_packs/misc/janitor/lightbulbs - name = "Replacement Lights" + name = "Replacement Lights Crate" contains = list(/obj/item/weapon/storage/box/lights/mixed, /obj/item/weapon/storage/box/lights/mixed, /obj/item/weapon/storage/box/lights/mixed) cost = 10 - containername = "replacement lights" + containername = "replacement lights crate" ///////////// Costumes @@ -1239,7 +1239,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "wizard costume crate" /datum/supply_packs/misc/mafia - name = "Mafia Supply crate" + name = "Mafia Supply Crate" contains = list(/obj/item/clothing/suit/browntrenchcoat =1,/obj/item/clothing/suit/blacktrenchcoat =1,/obj/item/clothing/head/fedora/whitefedora =1, /obj/item/clothing/head/fedora/brownfedora =1,/obj/item/clothing/head/fedora =1,/obj/item/clothing/under/flappers =1,/obj/item/clothing/under/mafia =1,/obj/item/clothing/under/mafia/vest =1,/obj/item/clothing/under/mafia/white =1, /obj/item/clothing/under/mafia/sue =1,/obj/item/clothing/under/mafia/tan =1, /obj/item/toy/crossbow/tommygun =2) @@ -1268,7 +1268,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/clothing/head/collectable/slime, /obj/item/clothing/head/collectable/xenom, /obj/item/clothing/head/collectable/petehat) - name = "Collectable hat crate!" + name = "Collectible Hats Crate" cost = 200 containername = "collectable hats crate! Brought to you by Bass.inc!" @@ -1289,7 +1289,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine contraband = 1 /datum/supply_packs/misc/formalwear //This is a very classy crate. - name = "Formal-wear Crate" + name = "Formal Wear Crate" contains = list(/obj/item/clothing/under/blacktango, /obj/item/clothing/under/assistantformal, /obj/item/clothing/under/assistantformal, diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 847c4179d8f..b66a5f7aecb 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -3,6 +3,8 @@ #define SUPPLY_STATIONZ 1 //Z-level of the Station. #define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station #define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock +#define COMP_SCREEN_WIDTH 580 //width of supply.order computer interaction window +#define COMP_SCREEN_HEIGHT 555 //height of supply order computer interaction window var/datum/controller/supply/supply_controller = new() @@ -104,22 +106,23 @@ var/list/mechtoys = list( icon = 'icons/obj/computer.dmi' icon_screen = "supply" req_access = list(access_cargo) - circuit = "/obj/item/weapon/circuitboard/supplycomp" + circuit = /obj/item/weapon/circuitboard/supplycomp var/temp = null var/reqtime = 0 //Cooldown for requisitions - Quarxink var/hacked = 0 var/can_order_contraband = 0 var/last_viewed_group = "categories" + var/datum/supply_packs/content_pack /obj/machinery/computer/ordercomp name = "Supply Ordering Console" desc = "Used to order supplies from cargo staff." icon = 'icons/obj/computer.dmi' icon_screen = "request" - circuit = "/obj/item/weapon/circuitboard/ordercomp" - var/temp = null + circuit = /obj/item/weapon/circuitboard/ordercomp var/reqtime = 0 //Cooldown for requisitions - Quarxink var/last_viewed_group = "categories" + var/datum/supply_packs/content_pack /* /obj/effect/marker/supplymarker @@ -261,7 +264,7 @@ var/list/mechtoys = list( var/datum/supply_packs/SP = SO.object var/atom/A = new SP.containertype(pickedloc) - A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]" + A.name = "[SP.containername]"// [SO.comment ? "([SO.comment])":"" ]" //supply manifest generation begin @@ -312,96 +315,102 @@ var/list/mechtoys = list( /obj/item/weapon/paper/manifest name = "Supply Manifest" - /obj/machinery/computer/ordercomp/attack_ai(var/mob/user as mob) return attack_hand(user) - -/obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob) - return attack_hand(user) - - /obj/machinery/computer/ordercomp/attack_hand(var/mob/user as mob) - if(..()) - return - user.set_machine(src) - var/dat - if(temp) - dat = temp - else - var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle - if (shuttle) - dat += {"
Supply shuttle
- Location: [shuttle.has_arrive_time() ? "Moving to station ([shuttle.eta_minutes()] Mins.)":shuttle.at_station() ? "Docked":"Away"]
-
Supply points: [supply_controller.points]
-
\nRequest items

- View approved orders

- View requests

- Close"} - - user << browse(dat, "window=computer;size=575x450") - onclose(user, "computer") + ui_interact(usr) return +/obj/machinery/computer/ordercomp/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) + // data to send to ui + var/data[0] + data["last_viewed_group"] = last_viewed_group + + var/category_list[0] + for(var/category in all_supply_groups) + category_list.Add(list(list("name" = get_supply_group_name(category), "category" = category))) + data["categories"] = category_list + + var/cat = text2num(last_viewed_group) + var/packs_list[0] + for(var/set_name in supply_controller.supply_packs) + var/datum/supply_packs/pack = supply_controller.supply_packs[set_name] + if(!pack.contraband && !pack.hidden && pack.group == cat) + // 0/1 after the pack name (set_name) is a boolean for ordering multiple crates + packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name)))) + + data["supply_packs"] = packs_list + if(content_pack) + var/pack_name = sanitize(content_pack.name) + data["contents_name"] = pack_name + data["contents"] = content_pack.manifest + data["contents_access"] = get_access_desc(content_pack.access) + + var/requests_list[0] + for(var/set_name in supply_controller.requestlist) + var/datum/supply_order/SO = set_name + if(SO) + // Check if the usr owns the request, so they can cancel requests + var/obj/item/weapon/card/id/I = usr.get_id_card() + var/owned = 0 + if(I && SO.orderedby == I.registered_name) + owned = 1 + requests_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "owned" = owned, "command1" = list("rreq" = SO.ordernum)))) + data["requests"] = requests_list + + var/orders_list[0] + for(var/set_name in supply_controller.shoppinglist) + var/datum/supply_order/SO = set_name + if(SO) + orders_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby))) + data["orders"] = orders_list + + data["points"] = supply_controller.points + data["send"] = list("send" = 1) + + var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle + data["moving"] = shuttle.has_arrive_time() + data["at_station"] = shuttle.at_station() + data["timeleft"] = shuttle.eta_minutes() + if(shuttle.docking_controller) + data["docked"] = capitalize(shuttle.docking_controller.get_docking_status()) + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) + if(!ui) + ui = new(user, src, ui_key, "order_console.tmpl", name, COMP_SCREEN_WIDTH, COMP_SCREEN_HEIGHT) + ui.set_initial_data(data) + ui.open() + /obj/machinery/computer/ordercomp/Topic(href, href_list) if(..()) - return + return 1 - if( isturf(loc) && (in_range(src, usr) || istype(usr, /mob/living/silicon)) ) - usr.set_machine(src) - - if(href_list["order"]) - if(href_list["order"] == "categories") - //all_supply_groups - //Request what? - last_viewed_group = "categories" - temp = "Supply points: [supply_controller.points]
" - temp += "Main Menu


" - temp += "Select a category

" - for(var/cat in all_supply_groups ) - temp += "[get_supply_group_name(cat)]
" - else - last_viewed_group = href_list["order"] - var/cat = text2num(last_viewed_group) - temp = "Supply points: [supply_controller.points]
" - temp += "Back to all categories


" - temp += "Request from: [get_supply_group_name(cat)]

" - for(var/supply_type in supply_controller.supply_packs ) - var/datum/supply_packs/N = supply_controller.supply_packs[supply_type] - if(N.hidden || N.contraband || N.group != cat) continue - temp += "[N.name]" //Have to send the type instead of a reference to the obj because it would get caught by the garbage - temp += " (contents)" - temp += " Cost: [N.cost]
" - - else if (href_list["see_contents"]) - //Find the correct supply_pack datum - var/datum/supply_packs/P = supply_controller.supply_packs[href_list["see_contents"]] - if(!istype(P)) return - - var/cat = P.group - var/tempaccess = get_access_desc(P.access) - - temp = "Supply points: [supply_controller.points]
" - temp += "Back to [get_supply_group_name(cat)]


" - temp += "Access restriction: [tempaccess ? tempaccess : "None"]

" - temp += "Contents of [P.name]:
" - temp += P.manifest - - else if (href_list["doorder"]) + if (href_list["doorder"]) if(world.time < reqtime) - for(var/mob/V in hearers(src)) - V.show_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"") + visible_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"") + nanomanager.update_uis(src) return - - //Find the correct supply_pack datum - var/datum/supply_packs/P = supply_controller.supply_packs[href_list["doorder"]] - if(!istype(P)) return + + var/index = copytext(href_list["doorder"], 1, lentext(href_list["doorder"])) //text2num(copytext(href_list["doorder"], 1)) + var/multi = text2num(copytext(href_list["doorder"], -1)) + if(!isnum(multi)) + return + var/datum/supply_packs/P = supply_controller.supply_packs[index] + if(!istype(P)) + return + var/crates = 1 + if(multi) + var/num_input = input(usr, "Amount:", "How many crates?", "") as num + crates = Clamp(round(text2num(num_input)), 1, 20) + if(..()) + return var/timeout = world.time + 600 var/reason = sanitize(copytext(input(usr,"Reason:","Why do you require this item?","") as null|text,1,MAX_MESSAGE_LEN)) - if(world.time > timeout) return - if(!reason) return - + if(world.time > timeout || !reason || ..()) + return + var/idname = "*None Provided*" var/idrank = "*None Provided*" if(ishuman(usr)) @@ -413,13 +422,14 @@ var/list/mechtoys = list( supply_controller.ordernum++ var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(loc) - reqform.name = "Requisition Form - [P.name]" + reqform.name = "Requisition Form - [crates] '[P.name]' for [idname]" reqform.info += "

[station_name] Supply Requisition Form


" reqform.info += "INDEX: #[supply_controller.ordernum]
" reqform.info += "REQUESTED BY: [idname]
" reqform.info += "RANK: [idrank]
" reqform.info += "REASON: [reason]
" reqform.info += "SUPPLY CRATE TYPE: [P.name]
" + reqform.info += "NUMBER OF CRATES: [crates]
" reqform.info += "ACCESS RESTRICTION: [replacetext(get_access_desc(P.access))]
" reqform.info += "CONTENTS:
" reqform.info += P.manifest @@ -429,130 +439,154 @@ var/list/mechtoys = list( reqform.update_icon() //Fix for appearing blank when printed. reqtime = (world.time + 5) % 1e5 - //make our supply_order datum - var/datum/supply_order/O = new /datum/supply_order() - O.ordernum = supply_controller.ordernum - O.object = P - O.orderedby = idname - supply_controller.requestlist += O + //make our supply_order datums + for(var/i = 1; i <= crates; i++) + supply_controller.ordernum++ + var/datum/supply_order/O = new /datum/supply_order() + O.ordernum = supply_controller.ordernum + O.object = P + O.orderedby = idname + O.comment = reason + supply_controller.requestlist += O - temp = "Thanks for your request. The cargo team will process it as soon as possible.
" - temp += "
Back Main Menu" + else if (href_list["rreq"]) + var/ordernum = text2num(href_list["rreq"]) + var/obj/item/weapon/card/id/I = usr.get_id_card() + for(var/i=1, i<=supply_controller.requestlist.len, i++) + var/datum/supply_order/SO = supply_controller.requestlist[i] + if(SO.ordernum == ordernum && (I && SO.orderedby == I.registered_name)) + supply_controller.requestlist.Cut(i,i+1) + break - else if (href_list["vieworders"]) - temp = "Current approved orders:

" - for(var/S in supply_controller.shoppinglist) - var/datum/supply_order/SO = S - temp += "[SO.object.name] approved by [SO.orderedby] [SO.comment ? "([SO.comment])":""]
" - temp += "
OK" - - else if (href_list["viewrequests"]) - temp = "Current requests:

" - for(var/S in supply_controller.requestlist) - var/datum/supply_order/SO = S - temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby]
" - temp += "
OK" - - else if (href_list["mainmenu"]) - temp = null + else if (href_list["last_viewed_group"]) + content_pack = null + last_viewed_group = text2num(href_list["last_viewed_group"]) + + else if (href_list["contents"]) + var/topic = href_list["contents"] + if(topic == 1) + content_pack = null + else + var/datum/supply_packs/P = supply_controller.supply_packs[topic] + content_pack = P add_fingerprint(usr) - updateUsrDialog() + nanomanager.update_uis(src) return +/obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob) + return attack_hand(user) + /obj/machinery/computer/supplycomp/attack_hand(var/mob/user as mob) - if(!allowed(user)) - user << "\red Access Denied." + if(!allowed(user) && !isobserver(user)) + user << "Access denied." return - if(..()) - return - user.set_machine(src) post_signal("supply") - var/dat - if (temp) - dat = temp - else - var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle - if (shuttle) - dat += "
Supply shuttle
" - dat += "\nLocation: " - if (shuttle.has_arrive_time()) - dat += "In transit ([shuttle.eta_minutes()] Mins.)
" - else - if (shuttle.at_station()) - if (shuttle.docking_controller) - switch(shuttle.docking_controller.get_docking_status()) - if ("docked") dat += "Docked at station
" - if ("undocked") dat += "Undocked from station
" - if ("docking") dat += "Docking with station [shuttle.can_force()? "Force Launch" : ""]
" - if ("undocking") dat += "Undocking from station [shuttle.can_force()? "Force Launch" : ""]
" - else - dat += "Station
" - - if (shuttle.can_launch()) - dat += "Send away" - else if (shuttle.can_cancel()) - dat += "Cancel launch" - else - dat += "*Shuttle is busy*" - dat += "
\n
" - else - dat += "Away
" - if (shuttle.can_launch()) - dat += "Request supply shuttle" - else if (shuttle.can_cancel()) - dat += "Cancel request" - else - dat += "*Shuttle is busy*" - dat += "
\n
" - - - dat += {"
\nSupply points: [supply_controller.points]
\n
- \nOrder items
\n
- \nView requests
\n
- \nView orders
\n
- \nClose"} - - - user << browse(dat, "window=computer;size=575x450") - onclose(user, "computer") + ui_interact(user) return -/obj/machinery/computer/supplycomp/attackby(I as obj, user as mob, params) - if(istype(I,/obj/item/weapon/card/emag) && !hacked) - user << "\blue Special supplies unlocked." +/obj/machinery/computer/supplycomp/emag_act(user as mob) + if(!hacked) + user << "Special supplies unlocked." hacked = 1 return - else - ..() - return + +/obj/machinery/computer/supplycomp/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) + // data to send to ui + var/data[0] + data["last_viewed_group"] = last_viewed_group + + var/category_list[0] + for(var/category in all_supply_groups) + category_list.Add(list(list("name" = get_supply_group_name(category), "category" = category))) + data["categories"] = category_list + + var/cat = text2num(last_viewed_group) + var/packs_list[0] + for(var/set_name in supply_controller.supply_packs) + var/datum/supply_packs/pack = supply_controller.supply_packs[set_name] + if((pack.hidden && src.hacked) || (pack.contraband && src.can_order_contraband) || (!pack.contraband && !pack.hidden)) + if(pack.group == cat) + // 0/1 after the pack name (set_name) is a boolean for ordering multiple crates + packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name)))) + + data["supply_packs"] = packs_list + if(content_pack) + var/pack_name = sanitize(content_pack.name) + data["contents_name"] = pack_name + data["contents"] = content_pack.manifest + data["contents_access"] = get_access_desc(content_pack.access) + + var/requests_list[0] + for(var/set_name in supply_controller.requestlist) + var/datum/supply_order/SO = set_name + if(SO) + if(!SO.comment) + SO.comment = "No comment." + requests_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "comment" = SO.comment, "command1" = list("confirmorder" = SO.ordernum), "command2" = list("rreq" = SO.ordernum)))) + data["requests"] = requests_list + + var/orders_list[0] + for(var/set_name in supply_controller.shoppinglist) + var/datum/supply_order/SO = set_name + if(SO) + orders_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "comment" = SO.comment))) + data["orders"] = orders_list + + data["points"] = supply_controller.points + data["send"] = list("send" = 1) + + var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle + data["moving"] = shuttle.has_arrive_time() + data["at_station"] = shuttle.at_station() + data["timeleft"] = shuttle.eta_minutes() + data["can_launch"] = shuttle.can_launch() + data["can_force"] = shuttle.can_force() + data["can_cancel"] = shuttle.can_cancel() + if(shuttle.docking_controller) + data["docked"] = capitalize(shuttle.docking_controller.get_docking_status()) + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) + if(!ui) + ui = new(user, src, ui_key, "supply_console.tmpl", name, COMP_SCREEN_WIDTH, COMP_SCREEN_HEIGHT) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/computer/supplycomp/proc/is_authorized(user) + if(allowed(user)) + return 1 + + if(isobserver(user) && check_rights(R_ADMIN, 0)) + return 1 + + return 0 /obj/machinery/computer/supplycomp/Topic(href, href_list) - if(!supply_controller) - log_to_dd("## ERROR: Eek. The supply_controller controller datum is missing somehow.") - return - var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle - if (!shuttle) - log_to_dd("## ERROR: Eek. The supply/shuttle datum is missing somehow.") - return if(..()) - return - - if(isturf(loc) && ( in_range(src, usr) || istype(usr, /mob/living/silicon) ) ) - usr.set_machine(src) - - //Calling the shuttle + return 1 + + if(!is_authorized(usr)) + return 1 + + if(!supply_controller) + log_to_dd("## ERROR: The supply_controller controller datum is missing somehow.") + return 1 + + var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle + if(!shuttle) + log_to_dd("## ERROR: The supply or shuttle datum is missing somehow.") + return 1 + if(href_list["send"]) if(shuttle.at_station()) if (shuttle.forbidden_atoms_check()) - temp = "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.

OK" + usr = "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons." else shuttle.launch(src) - temp = "Initiating launch sequence. \[Force Launch\]

OK" else shuttle.launch(src) - temp = "The supply shuttle has been called and will arrive in approximately [round(supply_controller.movetime/600,1)] minutes.

OK" post_signal("supply") if (href_list["force_send"]) @@ -561,70 +595,34 @@ var/list/mechtoys = list( if (href_list["cancel_send"]) shuttle.cancel_launch(src) - else if (href_list["order"]) - //if(!shuttle.idle()) return //this shouldn't be necessary it seems - if(href_list["order"] == "categories") - //all_supply_groups - //Request what? - last_viewed_group = "categories" - temp = "Supply points: [supply_controller.points]
" - temp += "Main Menu


" - temp += "Select a category

" - for(var/cat in all_supply_groups ) - temp += "[get_supply_group_name(cat)]
" - else - last_viewed_group = href_list["order"] - var/cat = text2num(last_viewed_group) - temp = "Supply points: [supply_controller.points]
" - temp += "Back to all categories


" - temp += "Request from: [get_supply_group_name(cat)]

" - for(var/supply_type in supply_controller.supply_packs ) - var/datum/supply_packs/N = supply_controller.supply_packs[supply_type] - if((N.hidden && !hacked) || (N.contraband && !can_order_contraband) || N.group != cat) continue - temp += "[N.name]" //Have to send the type instead of a reference to the obj because it would get caught by the garbage - temp += " (contents)" - temp += " Cost: [N.cost]
" - - /*temp = "Supply points: [supply_controller.points]


Request what?

" - - for(var/supply_name in supply_controller.supply_packs ) - var/datum/supply_packs/N = supply_controller.supply_packs[supply_name] - if(N.hidden && !hacked) continue - if(N.contraband && !can_order_contraband) continue - temp += "[supply_name] Cost: [N.cost]
" //the obj because it would get caught by the garbage - temp += "
OK"*/ - - else if (href_list["see_contents"]) - //Find the correct supply_pack datum - var/datum/supply_packs/P = supply_controller.supply_packs[href_list["see_contents"]] - if(!istype(P)) return - - var/cat = P.group - var/tempaccess = get_access_desc(P.access) - - temp = "Supply points: [supply_controller.points]
" - temp += "Back to [get_supply_group_name(cat)]


" - temp += "Access restriction: [tempaccess ? tempaccess : "None"]

" - temp += "Contents of [P.name]:
" - temp += P.manifest - else if (href_list["doorder"]) if(world.time < reqtime) - for(var/mob/V in hearers(src)) - V.show_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"") + visible_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"") + nanomanager.update_uis(src) return - //Find the correct supply_pack datum - var/datum/supply_packs/P = supply_controller.supply_packs[href_list["doorder"]] - if(!istype(P)) return - + var/index = copytext(href_list["doorder"], 1, lentext(href_list["doorder"])) //text2num(copytext(href_list["doorder"], 1)) + var/multi = text2num(copytext(href_list["doorder"], -1)) + if(!isnum(multi)) + return + var/datum/supply_packs/P = supply_controller.supply_packs[index] + if(!istype(P)) + return + var/crates = 1 + if(multi) + var/num_input = input(usr, "Amount:", "How many crates?", "") as num + crates = Clamp(round(text2num(num_input)), 1, 20) + if(..()) + return + var/timeout = world.time + 600 var/reason = sanitize(copytext(input(usr,"Reason:","Why do you require this item?","") as null|text,1,MAX_MESSAGE_LEN)) - if(world.time > timeout) return - if(!reason) return - + if(world.time > timeout || !reason || ..()) + return + var/idname = "*None Provided*" var/idrank = "*None Provided*" + if(ishuman(usr)) var/mob/living/carbon/human/H = usr idname = H.get_authentification_name() @@ -634,13 +632,14 @@ var/list/mechtoys = list( supply_controller.ordernum++ var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(loc) - reqform.name = "Requisition Form - [P.name]" + reqform.name = "Requisition Form - [crates] '[P.name]' for [idname]" reqform.info += "

[station_name] Supply Requisition Form


" reqform.info += "INDEX: #[supply_controller.ordernum]
" reqform.info += "REQUESTED BY: [idname]
" reqform.info += "RANK: [idrank]
" reqform.info += "REASON: [reason]
" reqform.info += "SUPPLY CRATE TYPE: [P.name]
" + reqform.info += "NUMBER OF CRATES: [crates]
" reqform.info += "ACCESS RESTRICTION: [replacetext(get_access_desc(P.access))]
" reqform.info += "CONTENTS:
" reqform.info += P.manifest @@ -651,21 +650,20 @@ var/list/mechtoys = list( reqtime = (world.time + 5) % 1e5 //make our supply_order datum - var/datum/supply_order/O = new /datum/supply_order() - O.ordernum = supply_controller.ordernum - O.object = P - O.orderedby = idname - supply_controller.requestlist += O - - temp = "Order request placed.
" - temp += "
Back | Main Menu | Authorize Order" - + for(var/i = 1; i <= crates; i++) + supply_controller.ordernum++ + var/datum/supply_order/O = new /datum/supply_order() + O.ordernum = supply_controller.ordernum + O.object = P + O.orderedby = idname + O.comment = reason + supply_controller.requestlist += O + else if(href_list["confirmorder"]) //Find the correct supply_order datum var/ordernum = text2num(href_list["confirmorder"]) var/datum/supply_order/O var/datum/supply_packs/P - temp = "Invalid Request" for(var/i=1, i<=supply_controller.requestlist.len, i++) var/datum/supply_order/SO = supply_controller.requestlist[i] if(SO.ordernum == ordernum) @@ -675,64 +673,34 @@ var/list/mechtoys = list( supply_controller.requestlist.Cut(i,i+1) supply_controller.points -= P.cost supply_controller.shoppinglist += O - temp = "Thanks for your order.
" else - temp = "Not enough supply points.
" + usr << "There are insufficient supply points for this request." break - temp += "
Back Main Menu" - - else if (href_list["vieworders"]) - temp = "Current approved orders:

" - for(var/S in supply_controller.shoppinglist) - var/datum/supply_order/SO = S - temp += "#[SO.ordernum] - [SO.object.name] approved by [SO.orderedby][SO.comment ? " ([SO.comment])":""]
"// (Cancel)
" - temp += "
OK" -/* - else if (href_list["cancelorder"]) - var/datum/supply_order/remove_supply = href_list["cancelorder"] - supply_shuttle_shoppinglist -= remove_supply - supply_shuttle_points += remove_supply.object.cost - temp += "Canceled: [remove_supply.object.name]


" - - for(var/S in supply_shuttle_shoppinglist) - var/datum/supply_order/SO = S - temp += "[SO.object.name] approved by [SO.orderedby][SO.comment ? " ([SO.comment])":""] (Cancel)
" - temp += "
OK" -*/ - else if (href_list["viewrequests"]) - temp = "Current requests:

" - for(var/S in supply_controller.requestlist) - var/datum/supply_order/SO = S - temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby] Approve Remove
" - - temp += "
Clear list" - temp += "
OK" - + else if (href_list["rreq"]) var/ordernum = text2num(href_list["rreq"]) - temp = "Invalid Request.
" for(var/i=1, i<=supply_controller.requestlist.len, i++) var/datum/supply_order/SO = supply_controller.requestlist[i] if(SO.ordernum == ordernum) supply_controller.requestlist.Cut(i,i+1) - temp = "Request removed.
" break - temp += "
Back Main Menu" - else if (href_list["clearreq"]) - supply_controller.requestlist.Cut() - temp = "List cleared.
" - temp += "
OK" - - else if (href_list["mainmenu"]) - temp = null + else if (href_list["last_viewed_group"]) + content_pack = null + last_viewed_group = text2num(href_list["last_viewed_group"]) + + else if (href_list["contents"]) + var/topic = href_list["contents"] + if(topic == 1) + content_pack = null + else + var/datum/supply_packs/P = supply_controller.supply_packs[topic] + content_pack = P add_fingerprint(usr) - updateUsrDialog() - return + nanomanager.update_uis(src) /obj/machinery/computer/supplycomp/proc/post_signal(var/command) - var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435) if(!frequency) return @@ -743,7 +711,3 @@ var/list/mechtoys = list( status_signal.data["command"] = command frequency.post_signal(src, status_signal) - - - - diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 90c1574c7eb..04b8745c4ac 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -261,3 +261,11 @@ qdel(W) return equipped +/mob/proc/get_all_slots() + return list(wear_mask, back, l_hand, r_hand) + +/mob/proc/get_id_card() + for(var/obj/item/I in src.get_all_slots()) + . = I.GetID() + if(.) + break \ No newline at end of file diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index e1cae9e3c66..ca265cdcfe3 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -248,11 +248,12 @@ syllables = list("02011","01222","10100","10210","21012","02011","21200","1002","2001","0002","0012","0012","000","120","121","201","220","10","11","0") /datum/language/machine/get_random_name() + var/new_name if(prob(70)) - name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" + new_name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" else - name = pick(ai_names) - return name + new_name = pick(ai_names) + return new_name /datum/language/kidan name = "Chittin" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b0b7d85e97e..b23874b399f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -683,4 +683,12 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(buckled) return initial(pixel_y) return -6 else - return initial(pixel_y) \ No newline at end of file + return initial(pixel_y) + +/mob/living/carbon/get_all_slots() + return list(l_hand, + r_hand, + handcuffed, + legcuffed, + back, + wear_mask) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 507c8dab0ca..4bea67b9ab3 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -884,3 +884,33 @@ It can still be worn/put on as normal. if(slot_s_store) return s_store return null + +/mob/living/carbon/human/get_all_slots() + . = get_head_slots() | get_body_slots() + +/mob/living/carbon/human/proc/get_body_slots() + return list( + l_hand, + r_hand, + back, + s_store, + handcuffed, + legcuffed, + wear_suit, + gloves, + shoes, + belt, + wear_id, + l_store, + r_store, + w_uniform + ) + +/mob/living/carbon/human/proc/get_head_slots() + return list( + head, + wear_mask, + glasses, + r_ear, + l_ear, + ) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index da2157f44bc..9c1d8b79f92 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -5,7 +5,8 @@ /mob/living/silicon/robot/get_active_hand() return module_active - +/mob/living/silicon/robot/get_all_slots() + return list(module_state_1, module_state_2, module_state_3) /*-------TODOOOOOOOOOO--------*/ /mob/living/silicon/robot/proc/uneq_module(obj/item/O) diff --git a/nano/templates/order_console.tmpl b/nano/templates/order_console.tmpl new file mode 100644 index 00000000000..70fe24f881e --- /dev/null +++ b/nano/templates/order_console.tmpl @@ -0,0 +1,111 @@ + + + +
+
+ Supply Points: +
+
+ {{:data.points}} +
+
+
+
+ Shuttle Status: +
+
+ {{if !data.moving && !data.at_station}} + {{:data.docked}} off-station. + {{else !data.moving && data.at_station}} + {{:data.docked}} at the station. + {{else data.moving}} + Shuttle is en route (ETA: {{:data.timeleft}} minutes). + {{/if}} +
+
+
+
+ Supply Crates +
+
+
+
+ {{if !data.contents}} + {{for data.supply_packs}} +
+
+
{{:helper.link(value.name, null, value.command1)}}
+ {{:helper.link('#', null, value.command2, null)}}{{:helper.link('C', null, value.command3, null)}}
{{:value.cost}} points
+
+
+ {{/for}} + {{else}} +
+ Contents of {{:data.contents_name}} +
+ {{:data.contents}} + {{:helper.link('Return', 'arrow-1-w', {'contents' : 1})}} + {{/if}} +
+
+
+
+
+
+ Categories +
+ {{for data.categories}} +
+ {{:helper.link(value.name, 'gear', {'last_viewed_group':value.category}, (data.last_viewed_group==value.category) ? 'linkOn' : '', null, 'category')}} +
+ {{/for}} +
+
+
+ Supply Orders +
+
+
+
+ Requests +
+ {{for data.requests}} +
+ #{{:value.ordernum}} - {{:value.supply_type}} for {{:value.orderedby}} + {{if value.owned == 1}} + {{:helper.link('CANCEL', null, value.command1, null)}} + {{/if}} +
+ {{empty}} + No active requests. + {{/for}} +
+ Orders +
+ {{for data.orders}} +
+ #{{:value.ordernum}} - {{:value.supply_type}} for {{:value.orderedby}} +
+ {{empty}} + No confirmed orders. + {{/for}} +
+
+
+
\ No newline at end of file diff --git a/nano/templates/supply_console.tmpl b/nano/templates/supply_console.tmpl new file mode 100644 index 00000000000..0591cf18698 --- /dev/null +++ b/nano/templates/supply_console.tmpl @@ -0,0 +1,125 @@ + + + +
+
+ Supply Points: +
+
+ {{:data.points}} +
+
+
+
+ Shuttle Status: +
+
+ {{if !data.moving && !data.at_station}} + {{:data.docked}} off-station. + {{else !data.moving && data.at_station}} + {{:data.docked}} at the station. + {{else data.moving}} +
Shuttle is en route (ETA: {{:data.timeleft}} minutes).
+ {{/if}} +
+
+
+
+ Shuttle Control: +
+
+ {{:helper.link('Call Shuttle', 'circle-triangle-e', data.send, data.moving || data.at_station || !data.can_launch ? 'disabled' : '')}} + {{:helper.link('Return Shuttle', 'circle-triangle-w', data.send, data.moving || !data.at_station || !data.can_launch ? 'disabled' : '')}} +
+ {{:helper.link('Force Shuttle', 'alert', {'force_send' : 1}, !data.can_force ? 'disabled' : '')}} + {{:helper.link('Cancel Shuttle', 'cancel', {'cancel_send' : 1}, !data.can_force ? 'disabled' : '')}} +
+
+
+
+ Supply Crates +
+
+
+
+ {{if !data.contents}} + {{for data.supply_packs}} +
+
+
{{:helper.link(value.name, null, value.command1)}}
+ {{:helper.link('#', null, value.command2, null)}} + {{:helper.link('C', null, value.command3, null)}}
{{:value.cost}} points
+
+
+ {{/for}} + {{else}} + {{:helper.link('Return', 'arrow-1-w', {'contents' : 1})}} +
+ Contents of {{:data.contents_name}} +
+ {{:data.contents}} + {{/if}} +
+
+
+
+
+
+ Categories +
+ {{for data.categories}} +
+ {{:helper.link(value.name, 'gear', {'last_viewed_group':value.category}, (data.last_viewed_group==value.category) ? 'linkOn' : '', null, 'category')}} +
+ {{/for}} +
+
+
+ Supply Orders +
+
+
+
+ Requests +
+ {{for data.requests}} +
+ #{{:value.ordernum}} - {{:value.supply_type}} for {{:value.orderedby}} +
+ {{:value.comment}} +
+ {{:helper.link('APPROVE', null, value.command1, null)}} {{:helper.link('REJECT', null, value.command2, null)}} +
+ {{empty}} + No active requests. + {{/for}} +
+ Orders +
+ {{for data.orders}} +
+ #{{:value.ordernum}} - {{:value.supply_type}} for {{:value.orderedby}} +
+ {{empty}} + No confirmed orders. + {{/for}} +
+
+
+
\ No newline at end of file From d76db2c5be52de039b9ec6954a7788c1297f6d2d Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 24 Aug 2015 19:32:38 +0200 Subject: [PATCH 03/39] Minute(s) --- nano/templates/order_console.tmpl | 2 +- nano/templates/supply_console.tmpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nano/templates/order_console.tmpl b/nano/templates/order_console.tmpl index 70fe24f881e..43ae8f37a0d 100644 --- a/nano/templates/order_console.tmpl +++ b/nano/templates/order_console.tmpl @@ -35,7 +35,7 @@ Used In File(s): \code\game\supplyshuttle.dm {{else !data.moving && data.at_station}} {{:data.docked}} at the station. {{else data.moving}} - Shuttle is en route (ETA: {{:data.timeleft}} minutes). + Shuttle is en route (ETA: {{:data.timeleft}} minute{{if data.timeleft > 1}}s{{/if}}). {{/if}} diff --git a/nano/templates/supply_console.tmpl b/nano/templates/supply_console.tmpl index 0591cf18698..05002413e83 100644 --- a/nano/templates/supply_console.tmpl +++ b/nano/templates/supply_console.tmpl @@ -35,7 +35,7 @@ Used In File(s): \code\game\supplyshuttle.dm {{else !data.moving && data.at_station}} {{:data.docked}} at the station. {{else data.moving}} -
Shuttle is en route (ETA: {{:data.timeleft}} minutes).
+
Shuttle is en route (ETA: {{:data.timeleft}} minute{{if data.timeleft > 1}}s{{/if}}).
{{/if}} From 7a3696a11491b9a444e6e2ea169d49c3d56791f5 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 24 Aug 2015 19:43:06 +0200 Subject: [PATCH 04/39] Fix camera monitor not updating networks --- code/game/machinery/computer/camera.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 31e53150081..44b3a16f27f 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -159,7 +159,7 @@ else src.network += net break - invalidateCameraCache() + invalidateCameraCache() nanomanager.update_uis(src) else . = ..() From 1cd47ee4a385ae55d4f64ea88acb6e02dec92f3f Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 24 Aug 2015 19:53:42 +0200 Subject: [PATCH 05/39] Life reaction log update --- code/modules/reagents/newchem/medicine.dm | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index 3790abca26b..ea2675034e7 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -702,14 +702,12 @@ proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reac var/atom/A = holder.my_atom var/turf/T = get_turf(A) var/area/my_area = get_area(T) - var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)" - message += " (VV)" - + var/message = "A [reaction_name] reaction has occured in ([my_area.name])" var/mob/M = get(A, /mob) if(M) - message += " - Carried By: [M.real_name] ([M.key]) (PP) (?)" + message += " - carried by: [key_name_admin(M)]" else - message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" + message += " - last fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" message_admins(message, 0, 1) From 51ea729d992378254222eecf366734fc60971f37 Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Mon, 24 Aug 2015 12:57:33 -0500 Subject: [PATCH 06/39] Allows xenos to use *flip. Why wasn't this a thing before. --- code/modules/mob/living/carbon/alien/humanoid/emote.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index d0f4cf86aad..c4ac448293e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -114,8 +114,12 @@ Paralyse(2) message = text("[] collapses!", src) m_type = 2 + if ("flip") + m_type = 1 + message = "[src] does a flip!" + src.SpinAnimation(5,1) if("help") - src << "burp, deathgasp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper" + src << "burp, flip, deathgasp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper" else src << text("Invalid Emote: []", act) if ((message && src.stat == 0)) @@ -132,4 +136,4 @@ for(var/mob/O in hearers(src, null)) O.show_message(message, m_type) //Foreach goto(746) - return \ No newline at end of file + return From 466c05d4e08db9804747e1315cdf350e8cc94ff7 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 24 Aug 2015 20:15:34 +0200 Subject: [PATCH 07/39] Let ghosts access autolathes/mech fabricators --- code/game/machinery/autolathe.dm | 4 ++++ code/game/mecha/mech_fabricator.dm | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 5df74641bcc..6228fe05ddd 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -168,6 +168,9 @@ busy = 0 src.updateUsrDialog() +/obj/machinery/autolathe/attack_ghost(mob/user) + interact(user) + /obj/machinery/autolathe/attack_hand(mob/user) if(..(user, 0)) return @@ -176,6 +179,7 @@ /obj/machinery/autolathe/Topic(href, href_list) if(..()) return 1 + if(href_list["menu"]) screen = text2num(href_list["menu"]) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 70653c05826..1d581405393 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -309,6 +309,9 @@ /obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(datum/design/D, roundto = 1) //aran return round(initial(D.construction_time)*time_coeff*time_coeff_tech, roundto) +/obj/machinery/mecha_part_fabricator/attack_ghost(mob/user) + interact(user) + /obj/machinery/mecha_part_fabricator/attack_hand(mob/user) if(!(..())) return interact(user) @@ -374,7 +377,7 @@ /obj/machinery/mecha_part_fabricator/Topic(href, href_list) if(..()) - return + return 1 var/datum/topic_input/filter = new /datum/topic_input(href,href_list) if(href_list["part_set"]) var/tpart_set = filter.getStr("part_set") From e0fff795f667b6f23d8dce94a4965328e9a6cc2e Mon Sep 17 00:00:00 2001 From: Markolie Date: Tue, 25 Aug 2015 01:00:43 +0200 Subject: [PATCH 08/39] Fix disappearing cargo shuttle --- code/game/supplyshuttle.dm | 250 ++++++++++++++++++------------------- 1 file changed, 125 insertions(+), 125 deletions(-) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index b66a5f7aecb..8ce551d58be 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -158,159 +158,159 @@ var/list/mechtoys = list( var/movetime = 1200 var/datum/shuttle/ferry/supply/shuttle - New() - ordernum = rand(1,9000) +/datum/controller/supply/New() + ordernum = rand(1,9000) - //Supply shuttle ticker - handles supply point regeneration and shuttle travelling between centcomm and the station - proc/process() - for(var/typepath in subtypesof(/datum/supply_packs)) - var/datum/supply_packs/P = new typepath() - if(P.name == "HEADER") - qdel(P) - continue - supply_packs[P.name] = P +//Supply shuttle ticker - handles supply point regeneration and shuttle travelling between centcomm and the station +/datum/controller/supply/proc/process() + for(var/typepath in subtypesof(/datum/supply_packs)) + var/datum/supply_packs/P = new typepath() + if(P.name == "HEADER") + qdel(P) + continue + supply_packs[P.name] = P - spawn(0) - if(processing) - iteration++ - points += points_per_process + spawn(0) + if(processing) + iteration++ + points += points_per_process - //sleep(processing_interval) + //sleep(processing_interval) - //To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types. - proc/forbidden_atoms_check(atom/A) - if(istype(A,/mob/living)) - return 1 - if(istype(A,/obj/item/weapon/disk/nuclear)) - return 1 - if(istype(A,/obj/item/flag/nation)) - return 1 - if(istype(A,/obj/machinery/nuclearbomb)) - return 1 - if(istype(A,/obj/item/device/radio/beacon)) - return 1 +//To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types. +/datum/controller/supply/proc/forbidden_atoms_check(atom/A) + if(istype(A,/mob/living)) + return 1 + if(istype(A,/obj/item/weapon/disk/nuclear)) + return 1 + if(istype(A,/obj/item/flag/nation)) + return 1 + if(istype(A,/obj/machinery/nuclearbomb)) + return 1 + if(istype(A,/obj/item/device/radio/beacon)) + return 1 - for(var/i=1, i<=A.contents.len, i++) - var/atom/B = A.contents[i] - if(.(B)) - return 1 + for(var/i=1, i<=A.contents.len, i++) + var/atom/B = A.contents[i] + if(.(B)) + return 1 //Sellin - proc/sell() - var/area/area_shuttle = shuttle.get_location_area() - if(!area_shuttle) return +/datum/controller/supply/proc/sell() + var/area/area_shuttle = shuttle.get_location_area() + if(!area_shuttle) return - var/plasma_count = 0 + var/plasma_count = 0 - for(var/atom/movable/MA in area_shuttle) - if(MA.anchored) continue + for(var/atom/movable/MA in area_shuttle) + if(MA.anchored) continue - // Must be in a crate! - if(istype(MA,/obj/structure/closet/crate)) - callHook("sell_crate", list(MA, area_shuttle)) // check this + // Must be in a crate! + if(istype(MA,/obj/structure/closet/crate)) + callHook("sell_crate", list(MA, area_shuttle)) // check this - points += points_per_crate - var/find_slip = 1 + points += points_per_crate + var/find_slip = 1 - for(var/atom in MA) - // Sell manifests - var/atom/A = atom - if(find_slip && istype(A,/obj/item/weapon/paper/manifest)) - var/obj/item/weapon/paper/slip = A - if(slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense - points += points_per_slip - find_slip = 0 + for(var/atom in MA) + // Sell manifests + var/atom/A = atom + if(find_slip && istype(A,/obj/item/weapon/paper/manifest)) + var/obj/item/weapon/paper/slip = A + if(slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense + points += points_per_slip + find_slip = 0 - // Sell plasma - else if(istype(A, /obj/item/stack/sheet/mineral/plasma)) - var/obj/item/stack/sheet/mineral/plasma/P = A - plasma_count += P.amount + // Sell plasma + else if(istype(A, /obj/item/stack/sheet/mineral/plasma)) + var/obj/item/stack/sheet/mineral/plasma/P = A + plasma_count += P.amount - // If you send something in a crate, centcom's keeping it! - fixes secure crates being sent to centom to open them - qdel(A) - qdel(MA) + // If you send something in a crate, centcom's keeping it! - fixes secure crates being sent to centom to open them + qdel(A) + qdel(MA) - if(plasma_count) - points += plasma_count * points_per_plasma + if(plasma_count) + points += plasma_count * points_per_plasma - //Buyin - proc/buy() - if(!shoppinglist.len) return +//Buyin +/datum/controller/supply/proc/buy() + if(!shoppinglist.len) return - var/area/area_shuttle = shuttle.get_location_area() - if(!area_shuttle) return + var/area/area_shuttle = shuttle.get_location_area() + if(!area_shuttle) return - var/list/clear_turfs = list() + var/list/clear_turfs = list() - for(var/turf/T in area_shuttle) - if(T.density) continue - var/contcount - for(var/atom/A in T.contents) - if(istype(A,/atom/movable/lighting_overlay)) - continue - if(istype(A,/obj/machinery/light)) - continue - contcount++ - if(contcount) continue - clear_turfs += T + for(var/turf/T in area_shuttle) + if(T.density) continue + var/contcount + for(var/atom/A in T.contents) + if(istype(A,/atom/movable/lighting_overlay)) + continue + if(A.simulated) + continue + contcount++ + if(contcount) continue + clear_turfs += T - for(var/S in shoppinglist) - if(!clear_turfs.len) break - var/i = rand(1,clear_turfs.len) - var/turf/pickedloc = clear_turfs[i] - clear_turfs.Cut(i,i+1) + for(var/S in shoppinglist) + if(!clear_turfs.len) break + var/i = rand(1,clear_turfs.len) + var/turf/pickedloc = clear_turfs[i] + clear_turfs.Cut(i,i+1) - var/datum/supply_order/SO = S - var/datum/supply_packs/SP = SO.object + var/datum/supply_order/SO = S + var/datum/supply_packs/SP = SO.object - var/atom/A = new SP.containertype(pickedloc) - A.name = "[SP.containername]"// [SO.comment ? "([SO.comment])":"" ]" + var/atom/A = new SP.containertype(pickedloc) + A.name = "[SP.containername]"// [SO.comment ? "([SO.comment])":"" ]" - //supply manifest generation begin + //supply manifest generation begin - var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest(A) - slip.info = "

[command_name()] Shipping Manifest



" - slip.info +="Order #[SO.ordernum]
" - slip.info +="Destination: [station_name]
" - slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
" - slip.info +="CONTENTS:
    " + var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest(A) + slip.info = "

    [command_name()] Shipping Manifest



    " + slip.info +="Order #[SO.ordernum]
    " + slip.info +="Destination: [station_name]
    " + slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
    " + slip.info +="CONTENTS:
      " - //spawn the stuff, finish generating the manifest while you're at it - if(SP.access) - A:req_access = list() - A:req_access += text2num(SP.access) + //spawn the stuff, finish generating the manifest while you're at it + if(SP.access) + A:req_access = list() + A:req_access += text2num(SP.access) - var/list/contains - if(istype(SP,/datum/supply_packs/misc/randomised)) - var/datum/supply_packs/misc/randomised/SPR = SP - contains = list() - if(SPR.contains.len) - for(var/j=1,j<=SPR.num_contained,j++) - contains += pick(SPR.contains) - else - contains = SP.contains + var/list/contains + if(istype(SP,/datum/supply_packs/misc/randomised)) + var/datum/supply_packs/misc/randomised/SPR = SP + contains = list() + if(SPR.contains.len) + for(var/j=1,j<=SPR.num_contained,j++) + contains += pick(SPR.contains) + else + contains = SP.contains - for(var/typepath in contains) - if(!typepath) continue - var/atom/B2 = new typepath(A) - if(SP.amount && B2:amount) B2:amount = SP.amount - slip.info += "
    • [B2.name]
    • " //add the item to the manifest + for(var/typepath in contains) + if(!typepath) continue + var/atom/B2 = new typepath(A) + if(SP.amount && B2:amount) B2:amount = SP.amount + slip.info += "
    • [B2.name]
    • " //add the item to the manifest - //manifest finalisation - slip.info += "

    " - slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
    " - if(!SP.contraband) - if(istype(A, /obj/structure/closet/crate)) - var/obj/structure/closet/crate/CR = A - CR.manifest = slip - CR.update_icon() - if(istype(A, /obj/structure/largecrate)) - var/obj/structure/largecrate/LC = A - LC.manifest = slip - LC.update_icon() - else slip.loc = null //we are out of blanks for Form #44-D Ordering Illicit Drugs. - shoppinglist.Cut() - return + //manifest finalisation + slip.info += "

" + slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
" + if(!SP.contraband) + if(istype(A, /obj/structure/closet/crate)) + var/obj/structure/closet/crate/CR = A + CR.manifest = slip + CR.update_icon() + if(istype(A, /obj/structure/largecrate)) + var/obj/structure/largecrate/LC = A + LC.manifest = slip + LC.update_icon() + else slip.loc = null //we are out of blanks for Form #44-D Ordering Illicit Drugs. + shoppinglist.Cut() + return /obj/item/weapon/paper/manifest name = "Supply Manifest" From d4c9f877cdef53a9e1bf856dbd8dcf4cffd7b509 Mon Sep 17 00:00:00 2001 From: DZD Date: Mon, 24 Aug 2015 20:35:25 -0400 Subject: [PATCH 09/39] Disables Challenge Map See title. --- _maps/map_files/RandomZLevels/fileList.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/RandomZLevels/fileList.txt b/_maps/map_files/RandomZLevels/fileList.txt index 4b12cdc0fe4..104b4dac7e4 100644 --- a/_maps/map_files/RandomZLevels/fileList.txt +++ b/_maps/map_files/RandomZLevels/fileList.txt @@ -10,7 +10,7 @@ #_maps/map_files/RandomZLevels/academy.dmm _maps/map_files/RandomZLevels/beach.dmm #_maps/map_files/RandomZLevels/blackmarketpackers.dmm -_maps/map_files/RandomZLevels/challenge.dmm +#_maps/map_files/RandomZLevels/challenge.dmm #_maps/map_files/RandomZLevels/centcomAway.dmm #_maps/map_files/RandomZLevels/clownplanet.dmm #_maps/map_files/RandomZLevels/example.dmm From 47aa5764a9be53838985e4221e75090c9733188d Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Tue, 25 Aug 2015 04:06:31 -0400 Subject: [PATCH 10/39] Fixes #1776, Vox Welding Helmet now Visible Title explains the whole PR, for whatever reason it was looking for the sprite in the eyes section instead of the head section. However, this turned up another issue. The mask's UP state is the exact same sprite as humans'-- which is just odd on Vox. I'll look further into that --- code/modules/clothing/head/misc_special.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index a351badfdb3..6224f0d5f9e 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -29,7 +29,7 @@ loose = 4 species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/head.dmi' ) /obj/item/clothing/head/welding/attack_self() @@ -191,4 +191,4 @@ mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD) var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mouseyinner") - mob.Blend(earbit, ICON_OVERLAY) \ No newline at end of file + mob.Blend(earbit, ICON_OVERLAY) From 960436945cf34248f3b579d97318e864698656ff Mon Sep 17 00:00:00 2001 From: Markolie Date: Tue, 25 Aug 2015 19:18:02 +0200 Subject: [PATCH 11/39] NanoUI apostrophe fix --- code/modules/nano/nanoui.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 7d5ebc18868..150f45e9518 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -347,7 +347,7 @@ nanoui is used to open and update nano browser uis template_data_json = list2json(templates) var/list/send_data = get_send_data(initial_data) - var/initial_data_json = replacetext(list2json_usecache(send_data), "'", "'") + var/initial_data_json = replacetext(replacetext(list2json_usecache(send_data), """, "&#34;"), "'", "'") var/url_parameters_json = list2json(list("src" = "\ref[src]")) From 77ed7b6d68767a025d50fbf1ecdf9414e80e65ed Mon Sep 17 00:00:00 2001 From: Markolie Date: Tue, 25 Aug 2015 19:18:19 +0200 Subject: [PATCH 12/39] Brainloss fix --- .../mob/living/carbon/human/human_damage.dm | 1 - code/modules/organs/organ.dm | 16 +++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index d0969503796..63f9461e06b 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -38,7 +38,6 @@ var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"] if(sponge) sponge.take_damage(amount) - sponge.damage = min(max(sponge.damage, 0),(maxHealth*2)) brainloss = sponge.damage else brainloss = 200 diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 01b95c09ddf..7dff264aa53 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -178,16 +178,18 @@ var/list/organ_cache = list() W.damage += damage W.time_inflicted = world.time +//Note: external organs have their own version of this proc /obj/item/organ/proc/take_damage(amount, var/silent=0) - if(src.robotic == 2) - src.damage += (amount * 0.8) + if(src.status & ORGAN_ROBOT) + src.damage = between(0, src.damage + (amount * 0.8), max_damage) else - src.damage += amount + src.damage = between(0, src.damage + amount, max_damage) - if(owner && parent_organ) - var/obj/item/organ/external/parent = owner.get_organ(parent_organ) - if(parent && !silent) - owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1) + //only show this if the organ is not robotic + if(owner && parent_organ && amount > 0) + var/obj/item/organ/external/parent = owner.get_organ(parent_organ) + if(parent && !silent) + owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1) /obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc robotic = 2 From 4cc619278341164e1e327475c633e485cb4fd858 Mon Sep 17 00:00:00 2001 From: Markolie Date: Tue, 25 Aug 2015 19:31:38 +0200 Subject: [PATCH 13/39] Fix robotics console admin message --- code/modules/research/rdconsole.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 25914feb81d..7c67f22cf7b 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -771,7 +771,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Disconnect from Research Network
" dat += "Device Linkage Menu
" dat += "Lock Console
" - if(check_rights(R_ADMIN)) + if(check_rights(R_ADMIN,0)) dat += "\[ADMIN\] Maximize Research Levels
" dat += "Reset R&D Database" From 16c17d3e8e70627e9274bce927e62b4621f7513b Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 25 Aug 2015 17:46:20 -0400 Subject: [PATCH 14/39] Reduces Powernet Lag --- .../garbage collection/garbage_collector.dm | 9 +++++++++ code/modules/power/cable.dm | 15 +++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/code/modules/garbage collection/garbage_collector.dm b/code/modules/garbage collection/garbage_collector.dm index 5b3a070f570..4ae68bf9952 100644 --- a/code/modules/garbage collection/garbage_collector.dm +++ b/code/modules/garbage collection/garbage_collector.dm @@ -140,6 +140,15 @@ var/global/datum/controller/process/garbage_collector/garbageCollector // world << "WARNING GC DID NOT GET A RETURN VALUE FOR [D], [D.type]!" garbageCollector.addTrash(D) + +// Returns 1 if the object has been queued for deletion. +/proc/qdeleted(var/datum/D) + if (!istype(D)) + return 0 + if (!isnull(D.gcDestroyed)) + return 1 + return 0 + /* * Like Del(), but for qdel. * Called BEFORE qdel moves shit. diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index de6fb00c621..ea9a92f3230 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -432,12 +432,15 @@ obj/structure/cable/proc/cableColor(var/colorC) P.disconnect_from_network() //remove from current network (and delete powernet) return + var/obj/O = P_list[1] // remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist loc = null powernet.remove_cable(src) //remove the cut cable from its powernet - var/datum/powernet/newPN = new()// creates a new powernet... - propagate_network(P_list[1], newPN)//... and propagates it to the other side of the cable + spawn(0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables + if(O && !qdeleted(O)) + var/datum/powernet/newPN = new()// creates a new powernet... + propagate_network(O, newPN)//... and propagates it to the other side of the cable // Disconnect machines connected to nodes if(d1 == 0) // if we cut a node (O-X) cable @@ -501,9 +504,9 @@ obj/structure/cable/proc/cableColor(var/colorC) if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting] - - if(!S) - return + + if(!S) + return if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help" || S.open == 2) return ..() @@ -892,4 +895,4 @@ obj/structure/cable/proc/cableColor(var/colorC) /obj/item/stack/cable_coil/cyborg/attack_self(mob/user) var/cablecolor = input(user,"Pick a cable color.","Cable Color") in list("red","yellow","green","blue","pink","orange","cyan","white") color = cablecolor - update_icon() \ No newline at end of file + update_icon() \ No newline at end of file From bc7b4400bddd8c43be961b3bf19d56ed7e22264f Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Tue, 25 Aug 2015 17:54:05 -0400 Subject: [PATCH 15/39] Vox Welding Helmet up-State Fix Moved the sprite (all directions) to better fit Vox instead of just floating on their quills as mentioned in #1851. Used an old old old Zuhayr sprite image preview thing as a reference. Before PR: http://i.imgur.com/lZtPrx8.png AFTER PR: http://i.imgur.com/uEedkGC.png --- icons/mob/species/vox/head.dmi | Bin 10943 -> 10959 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi index 67a90c9c4c56f48f5a60c76bfb1c89a5289c9e5a..d1cf1ef7b724988b3b130ea15ec34e48f36b118d 100644 GIT binary patch literal 10959 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≫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 Date: Tue, 25 Aug 2015 21:24:09 -0400 Subject: [PATCH 16/39] R&D Lockbox Origintech --- code/game/objects/items/weapons/storage/lockbox.dm | 4 +++- code/modules/research/rdconsole.dm | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index f9bbd9f0c69..0dd85c270ab 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -31,6 +31,7 @@ else src.icon_state = src.icon_closed user << "\red You unlock the [src.name]!" + origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D. return else user << "\red Access Denied" @@ -58,6 +59,7 @@ desc = "It appears to be broken." icon_state = src.icon_broken user << "You unlock \the [src]." + origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D. return /obj/item/weapon/storage/lockbox/loyalty @@ -89,7 +91,7 @@ item_state = "syringe_kit" w_class = 3 max_w_class = 2 - max_combined_w_class = 20 + max_combined_w_class = 20 storage_slots = 12 req_access = list(access_captain) icon_locked = "medalbox+l" diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 7c67f22cf7b..dca34a6b9b6 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -442,6 +442,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc) new_item.loc = L L.name += " ([new_item.name])" + L.origin_tech = new_item.origin_tech else new_item.loc = linked_lathe.loc linked_lathe.busy = 0 From 5d8df1e0025296eeca538cc840132cc5b8547cb0 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Tue, 25 Aug 2015 21:48:47 -0400 Subject: [PATCH 17/39] Fixes Vox Grey Jumpsuit Previously the only way you'd ever see the correct Vox grey jumpsuit sprite was if you were holding it in-game or looking at the sprite in vox/uniform.dmi. No longer! Now if a Vox player wears this jumpsuit it will look in the correct location for the sprite instead of giving them an ill-fitting human one. Fixes part of #1130. To fix the rest of that issue report, unfortunately-- as I'd not figured out then-- sprites for all the other colours of uniforms will need to be made and lines 51-54 copypasted to each jumpsuit code block that's added in. I'll rewrite #1130 accordingly and see if I can work out those sprites some other time. Before PR: AFTER PR: http://i.imgur.com/phSVZpK.png --- code/modules/clothing/under/color.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 28045dfc1ab..925d9f1f036 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -49,6 +49,9 @@ _color = "grey" flags = ONESIZEFITSALL species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/uniform.dmi' + ) /obj/item/clothing/under/color/grey/greytide flags = ONESIZEFITSALL | NODROP From c1f7808d9e6dccd5f9e50742f98d5f5672b4e68c Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 25 Aug 2015 21:52:44 -0400 Subject: [PATCH 18/39] So Salty --- code/modules/reagents/reagent_containers/food/snacks.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 89f14c26358..0556eee6d18 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -366,6 +366,7 @@ New() ..() reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sodiumchloride", 1) bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/cornchips @@ -1228,6 +1229,7 @@ New() ..() reagents.add_reagent("plantmatter", 6) + reagents.add_reagent("sodiumchloride", 1) /obj/item/weapon/reagent_containers/food/snacks/no_raisin name = "4no Raisins" From 52df4c6a33c9be8aa3caf6cf5e4458513cbd5f67 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 25 Aug 2015 21:59:51 -0400 Subject: [PATCH 19/39] Fixes Max Research Levels --- code/modules/research/research.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 274f02f27fc..5d33c5982f2 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -223,7 +223,7 @@ datum/tech/magnets name = "Electromagnetic Spectrum Research" desc = "Research into the electromagnetic spectrum. No clue how they actually work, though." id = "magnets" - max_level = 5 + max_level = 6 datum/tech/programming name = "Data Theory Research" From 27f75d7b383cc3d62784dc6c305f0e09ee52f7c1 Mon Sep 17 00:00:00 2001 From: Markolie Date: Thu, 27 Aug 2015 03:25:32 +0200 Subject: [PATCH 20/39] Fix ghosts triggering glass --- code/game/objects/items/weapons/shards.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index d73281a46ed..dab7a54de78 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -55,8 +55,8 @@ ..() /obj/item/weapon/shard/Crossed(AM as mob|obj) - if(ismob(AM)) - var/mob/M = AM + if(isliving(AM)) + var/mob/living/M = AM M << "\red You step on \the [src]!" playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds if(ishuman(M)) From 1589f54537901481d7555eb8866b61d6b8bca724 Mon Sep 17 00:00:00 2001 From: Markolie Date: Thu, 27 Aug 2015 03:31:02 +0200 Subject: [PATCH 21/39] Fix cargo scrolling issue --- code/game/supplyshuttle.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 8ce551d58be..7486ae70bf1 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -552,7 +552,6 @@ var/list/mechtoys = list( ui = new(user, src, ui_key, "supply_console.tmpl", name, COMP_SCREEN_WIDTH, COMP_SCREEN_HEIGHT) ui.set_initial_data(data) ui.open() - ui.set_auto_update(1) /obj/machinery/computer/supplycomp/proc/is_authorized(user) if(allowed(user)) From 01c919b5b07e6da8bd5b983878084bbf73a4a5c5 Mon Sep 17 00:00:00 2001 From: Markolie Date: Thu, 27 Aug 2015 04:05:18 +0200 Subject: [PATCH 22/39] Fix admins not seeing LOOC --- code/game/verbs/ooc.dm | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index afbb84847f5..2d62be62449 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -40,7 +40,7 @@ var/global/normal_ooc_colour = "#002eb8" var/display_colour = normal_ooc_colour if(holder && !holder.fakekey) display_colour = "#0099cc" //light blue - if(holder.rights & R_MOD && !(holder.rights & R_ADMIN)) + if(check_rights(R_MOD,0) && !check_rights(R_ADMIN,0)) display_colour = "#184880" //dark blue else if(holder.rights & R_ADMIN) if(config.allow_admin_ooccolor) @@ -59,22 +59,6 @@ var/global/normal_ooc_colour = "#002eb8" display_name = holder.fakekey C << "OOC: [display_name]: [msg]" - /* - if(holder) - if(!holder.fakekey || C.holder) - if(holder.rights & R_ADMIN) - C << "OOC: [key][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]" - else if(holder.rights & R_MOD) - C << "OOC: [src.key][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]" - else - C << "OOC: [src.key]: [msg]" - - else - C << "OOC: [holder.fakekey ? holder.fakekey : src.key]: [msg]" - else - C << "OOC: [src.key]: [msg]" - */ - /proc/toggle_ooc() ooc_allowed = !( ooc_allowed ) if (ooc_allowed) @@ -92,7 +76,6 @@ var/global/normal_ooc_colour = "#002eb8" set category = "Server" normal_ooc_colour = newColor - /client/verb/looc(msg as text) set name = "LOOC" //Gave this shit a shorter name so you only have to time out "ooc" rather than "ooc message" to use it --NeoFite set desc = "Local OOC, seen only by those in view." @@ -110,7 +93,7 @@ var/global/normal_ooc_colour = "#002eb8" src << "\red You have LOOC muted." return - if(!(holder && holder.rights && (holder.rights & R_MOD))) + if(!check_rights(R_MOD,0)) if(!ooc_allowed) src << "\red LOOC is globally muted" return @@ -141,7 +124,7 @@ var/global/normal_ooc_colour = "#002eb8" if(!M.client) continue var/client/C = M.client - if(check_rights(R_MENTOR,0)) + if(check_rights(R_MOD,0)) continue //they are handled after that if(C.prefs.toggles & CHAT_LOOC) @@ -159,7 +142,7 @@ var/global/normal_ooc_colour = "#002eb8" display_name = "[S.name]/([S.key])" for(var/client/C in admins) - if(check_rights(R_MENTOR,0)) + if(check_rights(R_MOD,0)) if(C.prefs.toggles & CHAT_LOOC) var/prefix = "(R)LOOC" if (C.mob in heard) From 0e0cc0af50face859b8da7d77a970fc6390063cb Mon Sep 17 00:00:00 2001 From: Markolie Date: Thu, 27 Aug 2015 15:33:33 +0200 Subject: [PATCH 23/39] Ghost interaction update, voice changer fix, man up global confirmation --- code/game/machinery/atmoalter/canister.dm | 14 +- code/game/machinery/atmoalter/pump.dm | 2 +- code/game/machinery/atmoalter/scrubber.dm | 2 +- code/game/machinery/firealarm.dm | 52 +- code/game/machinery/newscaster.dm | 490 +++++++++--------- .../objects/items/devices/radio/intercom.dm | 8 +- .../game/objects/items/devices/radio/radio.dm | 9 +- code/modules/admin/admin_verbs.dm | 13 +- code/modules/mob/living/carbon/human/say.dm | 10 +- code/modules/nano/interaction/base.dm | 5 + 10 files changed, 293 insertions(+), 312 deletions(-) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 702f7512535..644420fc3c1 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -74,6 +74,7 @@ var/datum/canister_icons/canister_icon_container = new() var/temperature_resistance = 1000 + T0C volume = 1000 use_power = 0 + interact_offline = 1 var/release_log = "" var/busy = 0 var/update_flag = 0 @@ -424,16 +425,9 @@ update_flag possibledecals = new /list(3) /obj/machinery/portable_atmospherics/canister/Topic(href, href_list) - - //Do not use "if(..()) return" here, canisters will stop working in unpowered areas like space or on the derelict. // yeah but without SOME sort of Topic check any dick can mess with them via exploits as he pleases -walter0o - if (!istype(src.loc, /turf)) - return 0 - - if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) // exploit protection -walter0o - usr << browse(null, "window=canister") - onclose(usr, "canister") - return - + if(..()) + return 1 + if (href_list["choice"] == "menu") menu = text2num(href_list["mode_target"]) diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index e9fb01b034c..23dca91dd51 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -99,7 +99,7 @@ src.add_hiddenprint(user) return src.attack_hand(user) -/obj/machinery/portable_atmospherics/pump/attack_ghost(var/mob/user) +/obj/machinery/portable_atmospherics/pump/attack_ghost(var/mob/user as mob) return src.attack_hand(user) /obj/machinery/portable_atmospherics/pump/attack_hand(var/mob/user as mob) diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index b6dabbdec32..5ab92bd3088 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -109,7 +109,7 @@ src.add_hiddenprint(user) return src.attack_hand(user) -/obj/machinery/portable_atmospherics/scrubber/attack_ghost(var/mob/user) +/obj/machinery/portable_atmospherics/scrubber/attack_ghost(var/mob/user as mob) return src.attack_hand(user) /obj/machinery/portable_atmospherics/scrubber/attack_hand(var/mob/user as mob) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 2c03a7a92e8..75acd99fb58 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -53,12 +53,15 @@ FIRE ALARM if(src.detecting) if(temperature > T0C+200) src.alarm() // added check of detector status here - return - + return + /obj/machinery/firealarm/attack_ai(mob/user as mob) src.add_hiddenprint(user) return src.attack_hand(user) +/obj/machinery/firealarm/attack_ghost(mob/user as mob) + return src.attack_hand(user) + /obj/machinery/firealarm/bullet_act(BLAH) return src.alarm() @@ -174,7 +177,7 @@ FIRE ALARM var/area/A = src.loc var/d1 var/d2 - if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)) + if (ishuman(user) || issilicon(user) || isobserver(user)) A = A.loc if (A.fire) @@ -208,34 +211,27 @@ FIRE ALARM return /obj/machinery/firealarm/Topic(href, href_list) - ..() - if (usr.stat || stat & (BROKEN|NOPOWER)) - return - + if(..()) + return 1 + if (buildstage != 2) - return + return 1 - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) - if (href_list["reset"]) - src.reset() - else if (href_list["alarm"]) - src.alarm() - else if (href_list["time"]) - src.timing = text2num(href_list["time"]) - last_process = world.timeofday - processing_objects.Add(src) - else if (href_list["tp"]) - var/tp = text2num(href_list["tp"]) - src.time += tp - src.time = min(max(round(src.time), 0), 120) + if (href_list["reset"]) + src.reset() + else if (href_list["alarm"]) + src.alarm() + else if (href_list["time"]) + src.timing = text2num(href_list["time"]) + last_process = world.timeofday + processing_objects.Add(src) + else if (href_list["tp"]) + var/tp = text2num(href_list["tp"]) + src.time += tp + src.time = min(max(round(src.time), 0), 120) - src.updateUsrDialog() - - src.add_fingerprint(usr) - else - usr << browse(null, "window=firealarm") - return + src.updateUsrDialog() + src.add_fingerprint(usr) return /obj/machinery/firealarm/proc/reset() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index eef7223d15b..43d4363a997 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -183,9 +183,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(!src.ispowered || src.isbroken) return - if(!user.IsAdvancedToolUser()) - return 0 - if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon) ) var/mob/living/human_or_robot_user = user var/dat @@ -444,273 +441,272 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/Topic(href, href_list) if(..()) return 1 - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) - if(href_list["set_channel_name"]) - src.channel_name = sanitizeSQL(strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""))) - while (findtext(src.channel_name," ") == 1) - src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1) - src.updateUsrDialog() - //src.update_icon() + + usr.set_machine(src) + if(href_list["set_channel_name"]) + src.channel_name = sanitizeSQL(strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""))) + while (findtext(src.channel_name," ") == 1) + src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1) + src.updateUsrDialog() + //src.update_icon() - else if(href_list["set_channel_lock"]) - src.c_locked = !src.c_locked - src.updateUsrDialog() - //src.update_icon() + else if(href_list["set_channel_lock"]) + src.c_locked = !src.c_locked + src.updateUsrDialog() + //src.update_icon() - else if(href_list["submit_new_channel"]) - //var/list/existing_channels = list() //OBSOLETE - var/list/existing_authors = list() - for(var/datum/feed_channel/FC in news_network.network_channels) - //existing_channels += FC.channel_name - if(FC.author == "\[REDACTED\]") - existing_authors += FC.backup_author - else - existing_authors +=FC.author - var/check = 0 + else if(href_list["submit_new_channel"]) + //var/list/existing_channels = list() //OBSOLETE + var/list/existing_authors = list() + for(var/datum/feed_channel/FC in news_network.network_channels) + //existing_channels += FC.channel_name + if(FC.author == "\[REDACTED\]") + existing_authors += FC.backup_author + else + existing_authors +=FC.author + var/check = 0 + for(var/datum/feed_channel/FC in news_network.network_channels) + if(FC.channel_name == src.channel_name) + check = 1 + break + if(src.channel_name == "" || src.channel_name == "\[REDACTED\]" || src.scanned_user == "Unknown" || check || (src.scanned_user in existing_authors) ) + src.screen=7 + else + var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel") + if(choice=="Confirm") + var/datum/feed_channel/newChannel = new /datum/feed_channel + newChannel.channel_name = src.channel_name + newChannel.author = src.scanned_user + newChannel.locked = c_locked + feedback_inc("newscaster_channels",1) + /*for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) //Let's add the new channel in all casters. + NEWSCASTER.channel_list += newChannel*/ //Now that it is sane, get it into the list. -OBSOLETE + news_network.network_channels += newChannel //Adding channel to the global network + src.screen=5 + src.updateUsrDialog() + //src.update_icon() + + else if(href_list["set_channel_receiving"]) + //var/list/datum/feed_channel/available_channels = list() + var/list/available_channels = list() + for(var/datum/feed_channel/F in news_network.network_channels) + if( (!F.locked || F.author == scanned_user) && !F.censored) + available_channels += F.channel_name + src.channel_name = strip_html_simple(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels ) + src.updateUsrDialog() + + else if(href_list["set_new_message"]) + src.msg = strip_html(input(usr, "Write your feed story", "Network Channel Handler", "")) + while (findtext(src.msg," ") == 1) + src.msg = copytext(src.msg,2,lentext(src.msg)+1) + src.updateUsrDialog() + + else if(href_list["set_attachment"]) + AttachPhoto(usr) + src.updateUsrDialog() + + else if(href_list["submit_new_message"]) + if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" ) + src.screen=6 + else + var/datum/feed_message/newMsg = new /datum/feed_message + newMsg.author = src.scanned_user + newMsg.body = src.msg + if(photo) + newMsg.img = photo.img + feedback_inc("newscaster_stories",1) + var/announcement = "" for(var/datum/feed_channel/FC in news_network.network_channels) if(FC.channel_name == src.channel_name) - check = 1 + FC.messages += newMsg //Adding message to the network's appropriate feed_channel + announcement = FC.announce_news() break - if(src.channel_name == "" || src.channel_name == "\[REDACTED\]" || src.scanned_user == "Unknown" || check || (src.scanned_user in existing_authors) ) - src.screen=7 - else - var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel") - if(choice=="Confirm") - var/datum/feed_channel/newChannel = new /datum/feed_channel - newChannel.channel_name = src.channel_name - newChannel.author = src.scanned_user - newChannel.locked = c_locked - feedback_inc("newscaster_channels",1) - /*for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) //Let's add the new channel in all casters. - NEWSCASTER.channel_list += newChannel*/ //Now that it is sane, get it into the list. -OBSOLETE - news_network.network_channels += newChannel //Adding channel to the global network - src.screen=5 - src.updateUsrDialog() - //src.update_icon() + src.screen=4 + for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) + NEWSCASTER.newsAlert(announcement) - else if(href_list["set_channel_receiving"]) - //var/list/datum/feed_channel/available_channels = list() - var/list/available_channels = list() - for(var/datum/feed_channel/F in news_network.network_channels) - if( (!F.locked || F.author == scanned_user) && !F.censored) - available_channels += F.channel_name - src.channel_name = strip_html_simple(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels ) - src.updateUsrDialog() + src.updateUsrDialog() - else if(href_list["set_new_message"]) - src.msg = strip_html(input(usr, "Write your feed story", "Network Channel Handler", "")) - while (findtext(src.msg," ") == 1) - src.msg = copytext(src.msg,2,lentext(src.msg)+1) - src.updateUsrDialog() + else if(href_list["create_channel"]) + src.screen=2 + src.updateUsrDialog() - else if(href_list["set_attachment"]) - AttachPhoto(usr) - src.updateUsrDialog() + else if(href_list["create_feed_story"]) + src.screen=3 + src.updateUsrDialog() - else if(href_list["submit_new_message"]) - if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" ) - src.screen=6 - else - var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = src.scanned_user - newMsg.body = src.msg - if(photo) - newMsg.img = photo.img - feedback_inc("newscaster_stories",1) - var/announcement = "" - for(var/datum/feed_channel/FC in news_network.network_channels) - if(FC.channel_name == src.channel_name) - FC.messages += newMsg //Adding message to the network's appropriate feed_channel - announcement = FC.announce_news() - break - src.screen=4 - for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) - NEWSCASTER.newsAlert(announcement) + else if(href_list["menu_paper"]) + src.screen=8 + src.updateUsrDialog() + else if(href_list["print_paper"]) + if(!src.paper_remaining) + src.screen=21 + else + src.print_paper() + src.screen = 20 + src.updateUsrDialog() - src.updateUsrDialog() + else if(href_list["menu_censor_story"]) + src.screen=10 + src.updateUsrDialog() - else if(href_list["create_channel"]) - src.screen=2 - src.updateUsrDialog() + else if(href_list["menu_censor_channel"]) + src.screen=11 + src.updateUsrDialog() - else if(href_list["create_feed_story"]) - src.screen=3 - src.updateUsrDialog() + else if(href_list["menu_wanted"]) + var/already_wanted = 0 + if(news_network.wanted_issue) + already_wanted = 1 - else if(href_list["menu_paper"]) - src.screen=8 - src.updateUsrDialog() - else if(href_list["print_paper"]) - if(!src.paper_remaining) - src.screen=21 - else - src.print_paper() - src.screen = 20 - src.updateUsrDialog() + if(already_wanted) + src.channel_name = news_network.wanted_issue.author + src.msg = news_network.wanted_issue.body + src.screen = 14 + src.updateUsrDialog() - else if(href_list["menu_censor_story"]) - src.screen=10 - src.updateUsrDialog() + else if(href_list["set_wanted_name"]) + src.channel_name = strip_html(input(usr, "Provide the name of the Wanted person", "Network Security Handler", "")) + while (findtext(src.channel_name," ") == 1) + src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1) + src.updateUsrDialog() - else if(href_list["menu_censor_channel"]) - src.screen=11 - src.updateUsrDialog() + else if(href_list["set_wanted_desc"]) + src.msg = strip_html(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", "")) + while (findtext(src.msg," ") == 1) + src.msg = copytext(src.msg,2,lentext(src.msg)+1) + src.updateUsrDialog() - else if(href_list["menu_wanted"]) - var/already_wanted = 0 - if(news_network.wanted_issue) - already_wanted = 1 - - if(already_wanted) - src.channel_name = news_network.wanted_issue.author - src.msg = news_network.wanted_issue.body - src.screen = 14 - src.updateUsrDialog() - - else if(href_list["set_wanted_name"]) - src.channel_name = strip_html(input(usr, "Provide the name of the Wanted person", "Network Security Handler", "")) - while (findtext(src.channel_name," ") == 1) - src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1) - src.updateUsrDialog() - - else if(href_list["set_wanted_desc"]) - src.msg = strip_html(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", "")) - while (findtext(src.msg," ") == 1) - src.msg = copytext(src.msg,2,lentext(src.msg)+1) - src.updateUsrDialog() - - else if(href_list["submit_wanted"]) - var/input_param = text2num(href_list["submit_wanted"]) - if(src.msg == "" || src.channel_name == "" || src.scanned_user == "Unknown") - src.screen = 16 - else - var/choice = alert("Please confirm Wanted Issue [(input_param==1) ? ("creation.") : ("edit.")]","Network Security Handler","Confirm","Cancel") - if(choice=="Confirm") - if(input_param==1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one. See the else below - var/datum/feed_message/WANTED = new /datum/feed_message - WANTED.author = src.channel_name - WANTED.body = src.msg - WANTED.backup_author = src.scanned_user //I know, a bit wacky - if(photo) - WANTED.img = photo.img - news_network.wanted_issue = WANTED - for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) - NEWSCASTER.newsAlert() - NEWSCASTER.update_icon() - src.screen = 15 - else - if(news_network.wanted_issue.is_admin_message) - alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok") - return - news_network.wanted_issue.author = src.channel_name - news_network.wanted_issue.body = src.msg - news_network.wanted_issue.backup_author = src.scanned_user - if(photo) - news_network.wanted_issue.img = photo.img - src.screen = 19 - - src.updateUsrDialog() - - else if(href_list["cancel_wanted"]) - if(news_network.wanted_issue.is_admin_message) - alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.","Ok") - return - var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel") + else if(href_list["submit_wanted"]) + var/input_param = text2num(href_list["submit_wanted"]) + if(src.msg == "" || src.channel_name == "" || src.scanned_user == "Unknown") + src.screen = 16 + else + var/choice = alert("Please confirm Wanted Issue [(input_param==1) ? ("creation.") : ("edit.")]","Network Security Handler","Confirm","Cancel") if(choice=="Confirm") - news_network.wanted_issue = null - for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) - NEWSCASTER.update_icon() - src.screen=17 - src.updateUsrDialog() + if(input_param==1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one. See the else below + var/datum/feed_message/WANTED = new /datum/feed_message + WANTED.author = src.channel_name + WANTED.body = src.msg + WANTED.backup_author = src.scanned_user //I know, a bit wacky + if(photo) + WANTED.img = photo.img + news_network.wanted_issue = WANTED + for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) + NEWSCASTER.newsAlert() + NEWSCASTER.update_icon() + src.screen = 15 + else + if(news_network.wanted_issue.is_admin_message) + alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok") + return + news_network.wanted_issue.author = src.channel_name + news_network.wanted_issue.body = src.msg + news_network.wanted_issue.backup_author = src.scanned_user + if(photo) + news_network.wanted_issue.img = photo.img + src.screen = 19 - else if(href_list["view_wanted"]) - src.screen=18 - src.updateUsrDialog() - else if(href_list["censor_channel_author"]) - var/datum/feed_channel/FC = locate(href_list["censor_channel_author"]) - if(FC.is_admin_channel) - alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") - return - if(FC.author != "\[REDACTED\]") - FC.backup_author = FC.author - FC.author = "\[REDACTED\]" - else - FC.author = FC.backup_author - src.updateUsrDialog() + src.updateUsrDialog() - else if(href_list["censor_channel_story_author"]) - var/datum/feed_message/MSG = locate(href_list["censor_channel_story_author"]) - if(MSG.is_admin_message) - alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok") - return - if(MSG.author != "\[REDACTED\]") - MSG.backup_author = MSG.author - MSG.author = "\[REDACTED\]" - else - MSG.author = MSG.backup_author - src.updateUsrDialog() + else if(href_list["cancel_wanted"]) + if(news_network.wanted_issue.is_admin_message) + alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.","Ok") + return + var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel") + if(choice=="Confirm") + news_network.wanted_issue = null + for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) + NEWSCASTER.update_icon() + src.screen=17 + src.updateUsrDialog() - else if(href_list["censor_channel_story_body"]) - var/datum/feed_message/MSG = locate(href_list["censor_channel_story_body"]) - if(MSG.is_admin_message) - alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") - return - if(MSG.img != null) - MSG.backup_img = MSG.img - MSG.img = null - else - MSG.img = MSG.backup_img - if(MSG.body != "\[REDACTED\]") - MSG.backup_body = MSG.body - MSG.body = "\[REDACTED\]" - else - MSG.body = MSG.backup_body - src.updateUsrDialog() + else if(href_list["view_wanted"]) + src.screen=18 + src.updateUsrDialog() + else if(href_list["censor_channel_author"]) + var/datum/feed_channel/FC = locate(href_list["censor_channel_author"]) + if(FC.is_admin_channel) + alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") + return + if(FC.author != "\[REDACTED\]") + FC.backup_author = FC.author + FC.author = "\[REDACTED\]" + else + FC.author = FC.backup_author + src.updateUsrDialog() - else if(href_list["pick_d_notice"]) - var/datum/feed_channel/FC = locate(href_list["pick_d_notice"]) - src.viewing_channel = FC - src.screen=13 - src.updateUsrDialog() + else if(href_list["censor_channel_story_author"]) + var/datum/feed_message/MSG = locate(href_list["censor_channel_story_author"]) + if(MSG.is_admin_message) + alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok") + return + if(MSG.author != "\[REDACTED\]") + MSG.backup_author = MSG.author + MSG.author = "\[REDACTED\]" + else + MSG.author = MSG.backup_author + src.updateUsrDialog() - else if(href_list["toggle_d_notice"]) - var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"]) - if(FC.is_admin_channel) - alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.","Ok") - return - FC.censored = !FC.censored - src.updateUsrDialog() + else if(href_list["censor_channel_story_body"]) + var/datum/feed_message/MSG = locate(href_list["censor_channel_story_body"]) + if(MSG.is_admin_message) + alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") + return + if(MSG.img != null) + MSG.backup_img = MSG.img + MSG.img = null + else + MSG.img = MSG.backup_img + if(MSG.body != "\[REDACTED\]") + MSG.backup_body = MSG.body + MSG.body = "\[REDACTED\]" + else + MSG.body = MSG.backup_body + src.updateUsrDialog() - else if(href_list["view"]) - src.screen=1 - src.updateUsrDialog() + else if(href_list["pick_d_notice"]) + var/datum/feed_channel/FC = locate(href_list["pick_d_notice"]) + src.viewing_channel = FC + src.screen=13 + src.updateUsrDialog() - else if(href_list["setScreen"]) //Brings us to the main menu and resets all fields~ - src.screen = text2num(href_list["setScreen"]) - if (src.screen == 0) - src.scanned_user = "Unknown"; - msg = ""; - src.c_locked=0; - channel_name=""; - src.viewing_channel = null - src.updateUsrDialog() + else if(href_list["toggle_d_notice"]) + var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"]) + if(FC.is_admin_channel) + alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.","Ok") + return + FC.censored = !FC.censored + src.updateUsrDialog() - else if(href_list["show_channel"]) - var/datum/feed_channel/FC = locate(href_list["show_channel"]) - src.viewing_channel = FC - src.screen = 9 - src.updateUsrDialog() + else if(href_list["view"]) + src.screen=1 + src.updateUsrDialog() - else if(href_list["pick_censor_channel"]) - var/datum/feed_channel/FC = locate(href_list["pick_censor_channel"]) - src.viewing_channel = FC - src.screen = 12 - src.updateUsrDialog() + else if(href_list["setScreen"]) //Brings us to the main menu and resets all fields~ + src.screen = text2num(href_list["setScreen"]) + if (src.screen == 0) + src.scanned_user = "Unknown"; + msg = ""; + src.c_locked=0; + channel_name=""; + src.viewing_channel = null + src.updateUsrDialog() - else if(href_list["refresh"]) - src.updateUsrDialog() + else if(href_list["show_channel"]) + var/datum/feed_channel/FC = locate(href_list["show_channel"]) + src.viewing_channel = FC + src.screen = 9 + src.updateUsrDialog() + else if(href_list["pick_censor_channel"]) + var/datum/feed_channel/FC = locate(href_list["pick_censor_channel"]) + src.viewing_channel = FC + src.screen = 12 + src.updateUsrDialog() + + else if(href_list["refresh"]) + src.updateUsrDialog() /obj/machinery/newscaster/attackby(obj/item/I as obj, mob/living/user as mob, params) if(istype(I, /obj/item/weapon/wrench)) @@ -746,10 +742,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co user << "This does nothing." src.update_icon() -/obj/machinery/newscaster/attack_ai(mob/user as mob) - return src.attack_hand(user) //or maybe it'll have some special functions? No idea. - - /obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob) if(photo) if(!issilicon(user)) @@ -794,11 +786,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/scribble="" var/scribble_page = null -/*obj/item/weapon/newspaper/attack_hand(mob/user as mob) - ..() - world << "derp"*/ - -obj/item/weapon/newspaper/attack_self(mob/user as mob) +/obj/item/weapon/newspaper/attack_self(mob/user as mob) if(ishuman(user)) var/mob/living/carbon/human/human_user = user var/dat diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 3cbcde23f4a..b6bb39bd32b 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -37,12 +37,16 @@ /obj/item/device/radio/intercom/attack_ai(mob/user as mob) add_hiddenprint(user) add_fingerprint(user) - spawn (0) + spawn(0) + attack_self(user) + +/obj/item/device/radio/intercom/attack_ghost(mob/user as mob) + spawn(0) attack_self(user) /obj/item/device/radio/intercom/attack_hand(mob/user as mob) add_fingerprint(user) - spawn (0) + spawn(0) attack_self(user) /obj/item/device/radio/intercom/receive_range(freq, level) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 62498009f0b..cf26aeca7c0 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -122,14 +122,9 @@ listening = !listening && !(wires.IsIndexCut(WIRE_RECEIVE) || wires.IsIndexCut(WIRE_SIGNAL)) /obj/item/device/radio/Topic(href, href_list) - //..() - if (usr.stat || !on) - return + if(..()) + return 1 - if (!(issilicon(usr) || (usr.contents.Find(src) || ( in_range(src, usr) && istype(loc, /turf) )))) - usr << browse(null, "window=radio") - return - usr.set_machine(src) if (href_list["track"]) var/mob/target = locate(href_list["track"]) var/mob/living/silicon/ai/A = locate(href_list["track2"]) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 488eb2c50c5..b41dece52d7 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -846,10 +846,13 @@ var/list/admin_verbs_mentor = list( set category = "Admin" set name = "Man Up Global" set desc = "Tells everyone to man up and deal with it." + + var/confirm = alert("Are you sure you want to send the global message?", "Confirm Man Up Global", "Yes", "No") - for (var/mob/T as mob in mob_list) - T << "
Man up.
Deal with it.

Move on.

" - T << 'sound/voice/ManUp1.ogg' + if(confirm == "Yes") + for (var/mob/T as mob in mob_list) + T << "
Man up.
Deal with it.

Move on.

" + T << 'sound/voice/ManUp1.ogg' - log_admin("[key_name(usr)] told everyone to man up and deal with it.") - message_admins("\blue [key_name_admin(usr)] told everyone to man up and deal with it.", 1) + log_admin("[key_name(usr)] told everyone to man up and deal with it.") + message_admins("\blue [key_name_admin(usr)] told everyone to man up and deal with it.", 1) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 0a38453c5fd..729ce6c8cae 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -27,7 +27,7 @@ return emote(copytext(message,2)) if(name != GetVoice()) - alt_name = "(as [get_id_name("Unknown")])" + alt_name = " (as [get_id_name("Unknown")])" //parse the radio code and consume it if (message_mode) @@ -214,17 +214,13 @@ continue var/obj/item/voice_changer/changer = locate() in gear if(changer && changer.active && changer.voice) - return changer + return changer.voice return 0 /mob/living/carbon/human/GetVoice() - - var/voice_sub var/has_changer = HasVoiceChanger() if(has_changer) - voice_sub = has_changer - if(voice_sub) - return voice_sub + return has_changer if(mind && mind.changeling && mind.changeling.mimicing) return mind.changeling.mimicing if(GetSpecialVoice()) diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm index 85ac56eeedc..e70b4423705 100644 --- a/code/modules/nano/interaction/base.dm +++ b/code/modules/nano/interaction/base.dm @@ -17,6 +17,11 @@ else if (restrained() || lying || stat || stunned || weakened) return STATUS_UPDATE // update only (orange visibility) return STATUS_INTERACTIVE + +/mob/dead/observer/shared_nano_interaction() + if(check_rights(R_ADMIN, 0, src)) + return STATUS_INTERACTIVE // Admins are more equal + return STATUS_UPDATE // Ghosts can view updates /mob/living/silicon/ai/shared_nano_interaction() if(lacks_power()) From 3d970aba1f1e9643f1900cd58f218753c8c5c71c Mon Sep 17 00:00:00 2001 From: Markolie Date: Thu, 27 Aug 2015 15:54:04 +0200 Subject: [PATCH 24/39] Fixes invisible alien leap --- .../carbon/alien/humanoid/caste/hunter.dm | 1 + .../living/carbon/alien/humanoid/humanoid.dm | 21 +++++++++++++++++- .../carbon/alien/humanoid/update_icons.dm | 16 ++++++++----- code/modules/mob/living/living.dm | 3 ++- icons/mob/alienleap.dmi | Bin 3985 -> 4035 bytes 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 018c37e4ad6..52fd9ad29fc 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -110,6 +110,7 @@ if(leaping) leaping = 0 + update_icons() update_canmove() diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 7d8ab9932df..b88004e4a2d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -7,11 +7,14 @@ var/obj/item/weapon/r_store = null var/obj/item/weapon/l_store = null var/caste = "" + var/alt_icon = 'icons/mob/alienleap.dmi' //used to switch between the two alien icon files. var/next_attack = 0 var/pounce_cooldown = 0 var/pounce_cooldown_time = 30 update_icon = 1 var/leap_on_click = 0 + var/custom_pixel_x_offset = 0 //for admin fuckery. + var/custom_pixel_y_offset = 0 //This is fine right now, if we're adding organ specific damage this needs to be updated /mob/living/carbon/alien/humanoid/New() @@ -336,4 +339,20 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/humanoid/canBeHandcuffed() - return 1 \ No newline at end of file + return 1 + +/mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0) + if(leaping) + return -32 + else if(custom_pixel_y_offset) + return custom_pixel_y_offset + else + return initial(pixel_y) + +/mob/living/carbon/alien/humanoid/get_standard_pixel_x_offset(lying = 0) + if(leaping) + return -32 + else if(custom_pixel_x_offset) + return custom_pixel_x_offset + else + return initial(pixel_x) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index 4c24b06bbe0..740c3e5ce25 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -41,14 +41,20 @@ icon_state = "alien[caste]_s" if(leaping) - icon = 'icons/mob/alienleap.dmi' + if(alt_icon == initial(alt_icon)) + var/old_icon = icon + icon = alt_icon + alt_icon = old_icon icon_state = "alien[caste]_leap" pixel_x = -32 pixel_y = -32 - else if(icon == 'icons/mob/alienleap.dmi' && pixel_x == -32 && pixel_y == -32) - icon = initial(icon)// ^ this looks odd, but in theory it will prevent the icon and pixel_xy from being reset unless it needs to be - pixel_x = initial(pixel_x) - pixel_y = initial(pixel_y) + else + if(alt_icon != initial(alt_icon)) + var/old_icon = icon + icon = alt_icon + alt_icon = old_icon + pixel_x = get_standard_pixel_x_offset(lying) + pixel_y = get_standard_pixel_y_offset(lying) /mob/living/carbon/alien/humanoid/regenerate_icons() ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index fa834fa581b..416dc1626cd 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -936,4 +936,5 @@ return initial(pixel_y) /mob/living/proc/spawn_dust() - new /obj/effect/decal/cleanable/ash(loc) \ No newline at end of file + new /obj/effect/decal/cleanable/ash(loc) + \ No newline at end of file diff --git a/icons/mob/alienleap.dmi b/icons/mob/alienleap.dmi index 3adf4ff7597a816d781532c52435ca8324a7fca2..da092d4b9bdf2993bf1295efcd5614abc5da8b3b 100644 GIT binary patch delta 3665 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 Wy&5n$Ry_IYF&P_}->%bhj{6TNt9=Xr From a54be7c47b3b98a9949c9962d8a2acfd41fd4a31 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Thu, 27 Aug 2015 12:27:27 -0700 Subject: [PATCH 25/39] Centcomm Mods Moved the kitchen and dorms to be sticking out less Added escape bathrooms --- _maps/map_files/cyberiad/z2.dmm | 92 +++++++++++++----------- code/game/area/Space Station 13 areas.dm | 15 ++-- code/game/objects/structures/curtains.dm | 3 + 3 files changed, 63 insertions(+), 47 deletions(-) diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 571e5e81d99..bb9eb22cba0 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -982,7 +982,7 @@ "sT" = (/obj/structure/closet/secure_closet/freezer/meat{req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/control) "sU" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/control) "sV" = (/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -5},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/control) -"sW" = (/obj/structure/sign/poster/legit{pixel_x = 32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control) +"sW" = (/obj/effect/spawner/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/living) "sX" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control) "sY" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control) "sZ" = (/obj/machinery/door/airlock/centcom{name = "Freezer"; opacity = 1; req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/control) @@ -1020,7 +1020,7 @@ "tF" = (/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops) "tG" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) "tH" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) -"tI" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) +"tI" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) "tJ" = (/obj/mecha/combat/marauder/loaded,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops) "tK" = (/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/specops) "tL" = (/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/control) @@ -1034,9 +1034,9 @@ "tT" = (/obj/machinery/computer/pod/deathsquad,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "tU" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT1"; name = "Launch Bay #1"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) "tV" = (/obj/machinery/mass_driver{dir = 8; drive_range = 50; id_tag = "ASSAULT1"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) -"tW" = (/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/living) -"tX" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/living) -"tY" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/living) +"tW" = (/turf/unsimulated/wall,/area/centcom/bathroom) +"tX" = (/obj/machinery/door/airlock/centcom{name = "Unit 4"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) +"tY" = (/obj/structure/toilet{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) "tZ" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/control) "ua" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/control) "ub" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT0"; name = "Launch Bay #0"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) @@ -1080,7 +1080,7 @@ "uN" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops) "uO" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) "uP" = (/obj/machinery/door/airlock/centcom{name = "Bridge"; opacity = 1; req_access_txt = "113"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"uQ" = (/turf/unsimulated/wall{desc = "The door appears to be locked tightly."; icon = 'icons/obj/doors/Doorhatchele.dmi'; icon_state = "door_closed"; name = "Administration Wing"},/area/centcom/control) +"uQ" = (/obj/structure/mirror{pixel_y = 32},/obj/structure/sink{pixel_y = 15},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) "uR" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1443; listening = 0; name = "Response Team Intercom"; pixel_y = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "uS" = (/obj/structure/table/reinforced,/obj/effect/landmark{name = "nukecode"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "uT" = (/obj/structure/table/reinforced,/obj/item/weapon/paper,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -1114,7 +1114,7 @@ "vv" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "vw" = (/obj/machinery/computer/robotics,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "vx" = (/obj/machinery/computer/crew,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"vy" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) +"vy" = (/obj/structure/sink{pixel_y = 15},/obj/structure/mirror{pixel_y = 32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) "vz" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "vA" = (/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "specopsoffice"; name = "Privacy Shutters"},/turf/unsimulated/wall/fakeglass,/area/centcom/specops) "vB" = (/obj/structure/table/woodentable{dir = 9},/obj/item/ashtray/glass{icon_state = "ashtray_half_gl"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops) @@ -1797,6 +1797,15 @@ "IC" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomehea"; name = "Ranged Gear"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) "ID" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomegen"; name = "General Equiptment"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) "IE" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomeaxe"; name = "Specialist Supply"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) +"IF" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/structure/curtain/open/shower/centcom,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) +"IG" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; tag = "icon-shower (WEST)"},/obj/structure/curtain/open/shower/centcom,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) +"IH" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) +"II" = (/obj/machinery/door/airlock/centcom{name = "Unit 3"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) +"IJ" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) +"IK" = (/obj/machinery/door/airlock/centcom{name = "Unit 2"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) +"IL" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/evac) +"IM" = (/obj/machinery/door/airlock/centcom{name = "Unit 1"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) +"IN" = (/obj/effect/spawner/window/reinforced,/turf/unsimulated/floor,/area/centcom/bathroom) (1,1,1) = {" aaabacadaeafagahaaaiajakalamanaoagafajacadahakaeamaiaoapaqarasatauavawaxayazaAaBaCaDaEaFaGaHaIaJaKawaxayazaAaBaCaDaEaFaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaOaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaR @@ -1913,47 +1922,47 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspsqsrssspspspspspststststspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspsusrsrsvswsxsyszsAsBsCsDsEspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspspspspspswsCsBsFsGsBsCsCsCspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNstsCsCsCsCsCsCsCsCsCspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNstsCsCsCsCsCsCsCswswspspspspspspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspspspspspsCsCsBsFsAsBsCsHsIspsJsKsLsMspsNsOsPspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspsqsrssspsQsCsBsFsRsBsCswswspsSsSsSsSspsTsUsVspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspsusrsrsvsCsCsCsCsCsCsCsCsWspsSsXsYsYspspsZspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspspspspspspsptaspspspsCsCsCtbsStctcsSsSsSsStdspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsptetftgspthtitititjspsCsCsCsCsSsSsSsStksSsStlspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmaNaNaNaNaNaNsptntotptqtititititrspsCsCsCtbtssSsSsSttsSsStuspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtwtxtytytztmaNaNaNaNaNaNspsptbtbspspsptbtbtbspsCsCsCsptbtbtbtbtbtbtbspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBtCtDtBtBtBtCtEtFtGtytytytmaNaNaNaNaNaNsptHtHtHtHtHtHtHtHtHspsptIspsptHtHtHtHtHtHtHspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtJtKtytytytmaNaNaNaNaNaNspspspspspspspspspspsptLtMtNspspspspspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBtOtDtBtBtBtOtPtFtGtytytytmaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsptQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtJtKtytytTtmaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsptQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBtUtDtBtBtBtUtVtFtGtytytytmaNaNaNaNaNaNaNaNaNaNspspspspspspsptWtXtYspspspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtJtKtytytytmaNaNaNaNaNaNaNaNaNaNsptLtMtMtMtMtMtZtRuatMtMtMtMtMtNspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBubtDtBtBtBubucudtGtytytytmaNaNaNaNaNaNaNaNaNaNsptQtRtRtRtRtRtRtRtRtRtRtRtRtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmueuftmtmtmtmtmtmtmtmtmtmtmaNsptQtRuguhuhuhuhuhuhuhuhuhuitRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmujukukulumunununtmuououououououpuqurtmaNsptQtRtStbtbtbtbtbtbtbtbtbtQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspsqsrssspspspsptbstststspspspspspspspspspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspsusrsrsvswsxsyszsAsBsCsCswswspsJsKsLsMspsNsOsPspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspspspspspswsCsBsFsGsBsCsCsHsIspsSsSsSsSspsTsUsVspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNstsCsCsCsCsCsCsCsCswswspsSsXsYsYspspsZspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmspaNaNaNstsCsCsCsCsCsCsCsCsCsCtbsStctcsSsSsSsStdspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtwtxtytytzspspspspspsCsCsBsFsAsBsCsCsCsCsCsSsSsSsStksSsStlspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBtCtDtBtBtBtCtEtFtGtytytyspsqsrssspsQsCsBsFsRsBsCsCsCsCtbtssSsSsSttsSsStuspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtJtKtytytyspsusrsrsvsCsCsCsCsCsCsCsCsCsCsptbtbtbtbtbtbtbspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBtOtDtBtBtBtOtPtFtGtytytyspspspspspspsptaspspspspsCsCsEsptHtHtHtHtHtHtHspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtJtKtytytTsptetftgspthtititititjspsCsCsDsptHtHtHtHtHtHtHspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBtUtDtBtBtBtUtVtFtGtytytysptntotptqtitititititrsptbsvtbsptbtbsWsWsWtbtbspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtJtKtytytyspsptbtbspspsptbtbtbtbsptQtRuatMtMtMtMtMtMtMtMtMtMtMtNspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBubtDtBtBtBubucudtGtytytysptHtHtHtHtHtHtHtHtHtHsptQtRtRtRtRtRtRtRtRtRtRtRtRtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmueuftmspspspspspspsptmtmtmtmsptQtRuguhuhuhuhuhuhuhuhuhuitRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmujukukulumunununtmuououououououpuqururursptQtRtStbtbtbtbtbtbtbtbtbtQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNusununununununununutuuuuuuuuuuuuuvtmtmtmtmsptQtRtStbuwuxuyuzuAuBuCtbtQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNusununununununununtmuDuEuEuEuEuEuFtmuGuGuGsptZtRuatbuHtRuIuJtRtRtRtbtZtRuaspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmunununuKuKunununuLuMuMuMuMuMuMuMuNuMuMuMuOtRtRtRuPtRtRtRtRtRtRtRuPtRtRtRuQaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmununuRuSuTuUununtmtmuVuWuVtmtmuqtmuXuXuXspuitRugtbtRtRtRtRtRtRtRtbuitRugspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNusununununununununtmuDuEuEuEuEuEuFtmuGuGuGsptZtRuatbuHtRuIuJtRtRtRtbtZtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmunununuKuKunununuLuMuMuMuMuMuMuMuNuMuMuMuOtRtRtRuPtRtRtRtRtRtRtRuPtRtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmununuRuSuTuUununtmtmuVuWuVtmtmuqtmuXuXuXspuitRugtbtRtRtRtRtRtRtRtbuitRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmuYtmtmunuZuUvavbvcvdunvevfvfvfvfvgtmurtmtmtmtmsptQtRtStbvhuxvivivivjvktbtQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmvlvmvntmununvcuUvouUununvpvfvqvrvsvftmtmtmtLtMtNsptQtRtSspspvtvuvvvwvxspsptQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmvmvmvmvyunununvzvzunununvAvfvBvCvDvEtmvFtMtZtRtRvGtRtRtSspsptbtbtbtbtbspsptQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmvmvmvmtIunununvzvzunununvAvfvBvCvDvEtmvFtMtZtRtRvGtRtRtSspsptbtbtbtbtbspsptQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmvHvmtmunvIunvJununununtmvfvKvLvMvNtmvOtRtRtRtStbtQtRuatMtMtMtMtMtMtMtMtMtZtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmvPvPtmtmtmvQvRvSvTvftmvUtRtRtRvVtbtQtRtRtRtRtRtRtRtRtRtRtRtRtRtSspaNaNaNaNaNaNaNaNaNaNvWvXvYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNvZwawbvZwctmwdwewfwgwhtmwiuhuhuhwjtbwkuhuhuhuhuhuitRuguhuhuhuhuhwlspaNaNaNaNaNaNaNaNaNvWwmwnwovYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwpwqwrwpwctmtmtmtmtmtmtmspspspspspspspspspspspspspwsspspspspspspspspaNaNaNaNaNaNaNaNvWwmwtwuwvwovYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwwwxwxwxwxwywywxwxwzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwAwBwCwDwEwFwAaNaNaNaNaNaNaNaNaNaNaNaNaNvXwGwHwIwHwJvXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwLwMwNwOwPwPwQwRwxwzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwAwSwTwUwTwVwAaNaNaNaNaNaNaNaNaNaNaNaNvWwmwWwIwIwIwXwovYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwLwYwPwPwPwPwPwPwZxatmaNaNaNaNaNaNaNaNaNaNaNaNaNaNwAxbxcwDxdwVwAaNaNaNaNaNaNaNaNaNaNaNaNxexfxgwIwIxhxiwIxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwLxjxkxkxkxkxkxkwxxlaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwAxmxnxoxnxnwAwAwAwAwAwAwAwAwAaNaNvWxpxqxpxpxpxrxpxsxpxqxpvYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxtxtxtaNxuxuxuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxvwxwxwxwxwxwxwxwxxlaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwAwAxwxnxxxnwBwFxnxyxyxzxyxyxzwAaNaNxexAxBxCxDxAwIxCxDxAxBxCxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxtxtxtaNxuxuxuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwTwBxExExExEwCwVwTxywAxnxnxnxnwAaNaNxexFwIxCxGxAwIxCxGxAwIxHxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxtxtxtaNxuxuxuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwTxbxIxJwDxIxJwVwTxywAxKxKxKxKwAaNaNvXxAwIxCxGxAwIxCxGxAwIxCvXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxLxMxNxOxPxtxtxtaNxuxuxuxLxMxNxOxPaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwTxbxIxJwDxIxJwVxnxywAwDwDwDxQxnxnxnxexAwIxCxRxAwIxCxRxAwIxCxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxSxTxTxTxUxVxWxVxVxVxXxVxYxTxTxTxSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwwwxwxwxwxwywywxwxwzaNaNaNaNaNaNaNtWtYtXvyuQtWIFIHIGwAwBwCwDwEwFwAaNaNaNaNaNaNaNaNaNaNaNaNaNvXwGwHwIwHwJvXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwLwMwNwOwPwPwQwRwxwzaNaNaNaNaNaNtWtWtWIHIHIHIHIHIHwAwSwTwUwTwVwAaNaNaNaNaNaNaNaNaNaNaNaNvWwmwWwIwIwIwXwovYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwLwYwPwPwPwPwPwPwZxatmaNaNaNaNaNtWtYIIIHIHIHIHIHIHwAxbxcwDxdwVwAaNaNaNaNaNaNaNaNaNaNaNaNxexfxgwIwIxhxiwIxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwLxjxkxkxkxkxkxkwxxlaNaNaNaNaNaNtWtWtWIHIJtWIFIHIGwAxmxnxoxnxnwAwAwAwAwAwAwAwAwAaNaNvWxpxqxpxpxpxrxpxsxpxqxpvYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxtxtxtaNxuxuxuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxvwxwxwxwxwxwxwxwxxlaNaNaNaNaNaNaNtWtYIKIHIJtWtWtWwAwAxwxnxxxnwBwFxnxyxyxzxyxyxzwAaNaNxexAxBxCxDxAwIxCxDxAxBxCxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxtxtxtaNxuxuxuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtWtWtWIHIHIHIHIHILwBxExExExEwCwVwTxywAxnxnxnxnwAaNaNxexFwIxCxGxAwIxCxGxAwIxHxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxtxtxtaNxuxuxuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtWtYIMIHIHIHIHIHILxbxIxJwDxIxJwVwTxywAxKxKxKxKwAaNaNvXxAwIxCxGxAwIxCxGxAwIxCvXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxLxMxNxOxPxtxtxtaNxuxuxuxLxMxNxOxPaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtWtWtWINININININwAxbxIxJwDxIxJwVxnxywAwDwDwDxQxnxnxnxexAwIxCxRxAwIxCxRxAwIxCxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxSxTxTxTxUxVxWxVxVxVxXxVxYxTxTxTxSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwTxbxIxJwDxIxJwVxZwTwAyawDwDybycydycyewIwIwIwIwIwIwIwIwIwIxCxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxSyfyfygyhyiyjykylymynyiyoypyfyfxSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwTxbxIxJwDxIxJwVyqydyqwDwDwDyrxnxnxnxeyswIxCxDxAwIxCxDxAwIytxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxSyfyfyuyvywyxywyyywyxywyzyuyfyfxSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwAxmyAyAyAyBwDwVxZwTwAyawDwDwDwAaNaNxDxAwIxCxGxAwIxCxGxAwIxCxDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyCypyfyDywyxyxyxyxyxyxyxywyDyfygyEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -2055,3 +2064,4 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN "} + diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 098ae32e538..68765df5447 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -54,7 +54,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station var/air_doors_activated = 0 var/tele_proof = 0 - + /*Adding a wizard area teleport list because motherfucking lag -- Urist*/ /*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ var/list/teleportlocs = list() @@ -71,7 +71,7 @@ var/list/teleportlocs = list() teleportlocs = sortAssoc(teleportlocs) return 1 - + var/list/ghostteleportlocs = list() /hook/startup/proc/process_ghost_teleport_locs() for(var/area/AR in world) @@ -119,7 +119,7 @@ var/list/ghostteleportlocs = list() power_equip = 0 power_environ = 0 ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg') - + /area/space/atmosalert() return @@ -131,7 +131,7 @@ var/list/ghostteleportlocs = list() /area/space/readyalert() return - + /area/space/radiation_alert() return @@ -465,6 +465,9 @@ var/list/ghostteleportlocs = list() /area/centcom/holding name = "\improper Holding Facility" +/area/centcom/bathroom + name = "\improper Centcom Emergency Shuttle Bathrooms" + //SYNDICATES /area/syndicate_mothership @@ -1506,7 +1509,7 @@ var/list/ghostteleportlocs = list() /area/security/brig name = "\improper Brig" icon_state = "brig" - + /area/security/brig/prison_break() for(var/obj/structure/closet/secure_closet/brig/temp_closet in src) temp_closet.locked = 0 @@ -1522,7 +1525,7 @@ var/list/ghostteleportlocs = list() /area/security/prison name = "\improper Prison Wing" icon_state = "sec_prison" - + /area/security/prison/prison_break() for(var/obj/structure/closet/secure_closet/brig/temp_closet in src) temp_closet.locked = 0 diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index a7175857ef9..9d7bbc96e1b 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -55,5 +55,8 @@ /obj/structure/curtain/open/shower/security color = "#AA0000" +/obj/structure/curtain/open/shower/centcom + color = "#000066" + #undef SHOWER_OPEN_LAYER #undef SHOWER_CLOSED_LAYER \ No newline at end of file From f8e462b1eec68cddaa747926e3d347a8b4745bfa Mon Sep 17 00:00:00 2001 From: Markolie Date: Thu, 27 Aug 2015 23:59:47 +0200 Subject: [PATCH 26/39] Give engineering borgs magboots --- code/game/objects/items/robot/robot_upgrades.dm | 1 + code/modules/mob/living/silicon/robot/robot.dm | 15 ++++----------- .../mob/living/silicon/robot/robot_modules.dm | 1 - .../mob/living/silicon/robot/robot_movement.dm | 12 +++++++++++- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index b0d483137b7..048d85e5495 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -41,6 +41,7 @@ R.jetpackoverlay = 0 R.update_icons() R.update_headlamp() + R.magpulse = 0 R.add_language("Robot Talk", 1) return 1 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index c55cd5a7bbf..15168dfbfc6 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -81,6 +81,7 @@ var/list/robot_verbs_default = list( var/lamp_recharging = 0 //Flag for if the lamp is on cooldown after being forcibly disabled. var/jetpackoverlay = 0 + var/magpulse = 0 var/obj/item/borg/sight/hud/sec/sechud = null var/obj/item/borg/sight/hud/med/healthhud = null @@ -229,21 +230,12 @@ var/list/robot_verbs_default = list( module_sprites["Bro"] = "Brobot" module_sprites["Rich"] = "maximillion" module_sprites["Default"] = "Service2" -/* - if("Clerical") - module = new /obj/item/weapon/robot_module/clerical(src) - module.channels = list("Service" = 1) - module_sprites["Waitress"] = "Service" - module_sprites["Kent"] = "toiletbot" - module_sprites["Bro"] = "Brobot" - module_sprites["Rich"] = "maximillion" - module_sprites["Default"] = "Service2" -*/ + if("Miner") module = new /obj/item/weapon/robot_module/miner(src) module.channels = list("Supply" = 1) if(camera && "Robots" in camera.network) - camera.network.Add("MINE") + camera.network.Add("Mining Outpost") module_sprites["Basic"] = "Miner_old" module_sprites["Advanced Droid"] = "droid-miner" module_sprites["Treadhead"] = "Miner" @@ -276,6 +268,7 @@ var/list/robot_verbs_default = list( module_sprites["Basic"] = "Engineering" module_sprites["Antique"] = "engineerrobot" module_sprites["Landmate"] = "landmate" + magpulse = 1 if("Janitor") module = new /obj/item/weapon/robot_module/janitor(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4ff0c7f0425..035c199a521 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -226,7 +226,6 @@ fix_modules() - /obj/item/weapon/robot_module/janitor name = "janitorial robot module" diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index 37172cd045d..6f21dec6cb4 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -23,4 +23,14 @@ return tally+config.robot_delay /mob/living/silicon/robot/Move() - ..() \ No newline at end of file + ..() + +/mob/living/silicon/robot/mob_negates_gravity() + return magpulse + +/mob/living/silicon/robot/mob_has_gravity() + return ..() || mob_negates_gravity() + +/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction) + if(!magpulse) + return ..() \ No newline at end of file From 64b33b1115eabfe0b1d8caec13fc780388a87652 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 18:30:45 +0200 Subject: [PATCH 27/39] Fix cargo shuttle misplacing crates --- code/game/supplyshuttle.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 8ce551d58be..71398e26dda 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -3,8 +3,8 @@ #define SUPPLY_STATIONZ 1 //Z-level of the Station. #define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station #define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock -#define COMP_SCREEN_WIDTH 580 //width of supply.order computer interaction window -#define COMP_SCREEN_HEIGHT 555 //height of supply order computer interaction window +#define COMP_SCREEN_WIDTH 590 //width of supply computer interaction window +#define COMP_SCREEN_HEIGHT 555 //height of supply computer interaction window var/datum/controller/supply/supply_controller = new() @@ -248,7 +248,7 @@ var/list/mechtoys = list( for(var/atom/A in T.contents) if(istype(A,/atom/movable/lighting_overlay)) continue - if(A.simulated) + if(!A.simulated) continue contcount++ if(contcount) continue From e05a8e34db4589e0aaee335c87593b632de634e8 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 19:42:46 +0200 Subject: [PATCH 28/39] Fix pAI teleporting --- code/modules/mob/living/silicon/pai/recruit.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 7de12627482..768b46c2283 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -231,7 +231,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates M << browse(dat, "window=paiRecruit;size=580x580;") proc/findPAI(var/obj/item/device/paicard/p, var/mob/user) - requestRecruits() + requestRecruits(p) var/list/available = list() for(var/datum/paiCandidate/c in paiController.pai_candidates) if(c.ready) @@ -346,12 +346,12 @@ var/datum/paiController/paiController // Global handler for pAI candidates user << browse(dat, "window=findPai") - proc/requestRecruits() + proc/requestRecruits(var/obj/item/device/paicard/P) for(var/mob/dead/observer/O in player_list) if(O.client && O.client.prefs.be_special & BE_PAI) if(player_old_enough_antag(O.client,BE_PAI)) if(check_recruit(O)) - O << "\blue A pAI card is looking for personalities. (Teleport | Sign Up)" + O << "\blue A pAI card is looking for personalities. (Teleport | Sign Up)" //question(O.client) proc/check_recruit(var/mob/dead/observer/O) if(jobban_isbanned(O, "pAI") || jobban_isbanned(O,"nonhumandept")) From e94d0934ecfdd9a738d1cb7e6f2439003ee37049 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 19:43:08 +0200 Subject: [PATCH 29/39] Fixes DNA modifier exploit --- code/game/dna/dna_modifier.dm | 54 +++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 7239061a61d..a6bbd866510 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -5,6 +5,8 @@ #define DNA2_BUF_UE 2 #define DNA2_BUF_SE 4 +#define NEGATE_MUTATION_THRESHOLD 30 // Occupants with over ## percent radiation threshold will not gain mutations + //list("data" = null, "owner" = null, "label" = null, "type" = null, "ue" = 0), /datum/dna2/record var/datum/dna/dna = null @@ -306,12 +308,27 @@ else return - /obj/machinery/dna_scannernew/blob_act() if(prob(75)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc qdel(src) + +// Checks if occupants can be irradiated/mutated - prevents exploits where wearing full rad protection would still let you gain mutations +/obj/machinery/dna_scannernew/proc/radiation_check() + if(!occupant) + return 1 + + if(ishuman(occupant)) + var/mob/living/carbon/human/H = occupant + if((H.species.flags & NO_DNA_RAD)) + return 1 + + var/radiation_protection = occupant.run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm.") + if (radiation_protection > NEGATE_MUTATION_THRESHOLD) + return 1 + + return 0 /obj/machinery/computer/scan_consolenew name = "DNA Modifier Access Console" @@ -566,6 +583,10 @@ if (!src.connected.occupant) return 1 // return 1 forces an update to all Nano uis attached to src + if(src.connected.radiation_check()) + src.connected.locked = lock_state + return 1 + if (prob(95)) if(prob(75)) randmutb(src.connected.occupant) @@ -577,7 +598,8 @@ else randmuti(src.connected.occupant) - src.connected.occupant.radiation += (((src.radiation_intensity*3)+src.radiation_duration*3) / connected.damage_coeff) + var/radiation = (((src.radiation_intensity*3)+src.radiation_duration*3) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src @@ -666,12 +688,17 @@ if (!src.connected.occupant) return 1 + + if(src.connected.radiation_check()) + src.connected.locked = lock_state + return 1 if (prob((80 + (src.radiation_duration / 2)))) block = miniscrambletarget(num2text(selected_ui_target), src.radiation_intensity, src.radiation_duration) src.connected.occupant.dna.SetUISubBlock(src.selected_ui_block,src.selected_ui_subblock,block) src.connected.occupant.UpdateAppearance() - src.connected.occupant.radiation += (src.radiation_intensity+src.radiation_duration) + var/radiation = (src.radiation_intensity+src.radiation_duration) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) else if (prob(20+src.radiation_intensity)) randmutb(src.connected.occupant) @@ -679,7 +706,8 @@ else randmuti(src.connected.occupant) src.connected.occupant.UpdateAppearance() - src.connected.occupant.radiation += ((src.radiation_intensity*2)+src.radiation_duration) + var/radiation = ((src.radiation_intensity*2)+src.radiation_duration) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src @@ -724,6 +752,10 @@ irradiating = 0 if(src.connected.occupant) + if(src.connected.radiation_check()) + src.connected.locked = lock_state + return 1 + if (prob((80 + ((src.radiation_duration / 2) + (connected.precision_coeff ** 3))))) // FIXME: Find out what these corresponded to and change them to the WHATEVERBLOCK they need to be. //if ((src.selected_se_block != 2 || src.selected_se_block != 12 || src.selected_se_block != 8 || src.selected_se_block || 10) && prob (20)) @@ -737,10 +769,12 @@ //testing("Irradiated SE block [real_SE_block]:[src.selected_se_subblock] ([original_block] now [block]) [(real_SE_block!=selected_se_block) ? "(SHIFTED)":""]!") connected.occupant.dna.SetSESubBlock(real_SE_block,selected_se_subblock,block) - src.connected.occupant.radiation += ((src.radiation_intensity+src.radiation_duration) / connected.damage_coeff) + var/radiation = ((src.radiation_intensity+src.radiation_duration) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) domutcheck(src.connected.occupant,src.connected) else - src.connected.occupant.radiation += (((src.radiation_intensity*2)+src.radiation_duration) / connected.damage_coeff) + var/radiation = (((src.radiation_intensity*2)+src.radiation_duration) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) if (prob(80-src.radiation_duration)) //testing("Random bad mut!") randmutb(src.connected.occupant) @@ -839,7 +873,7 @@ if (bufferOption == "transfer") if (!src.connected.occupant || (NOCLONE in src.connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna) - return + return 1 irradiating = 2 var/lock_state = src.connected.locked @@ -851,6 +885,9 @@ irradiating = 0 src.connected.locked = lock_state + if(src.connected.radiation_check()) + return 1 + var/datum/dna2/record/buf = src.buffers[bufferId] if ((buf.types & DNA2_BUF_UI)) @@ -862,7 +899,8 @@ src.connected.occupant.dna.SE = buf.dna.SE src.connected.occupant.dna.UpdateSE() domutcheck(src.connected.occupant,src.connected) - src.connected.occupant.radiation += (rand(20,50) / connected.damage_coeff) + var/radiation = (rand(20,50) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) return 1 if (bufferOption == "createInjector") From 0a70d22ad3ff0a1f30cd6278a1f8eda0610bd56f Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 19:43:24 +0200 Subject: [PATCH 30/39] Fixes mechas not gc'ing properly --- code/game/gamemodes/wizard/spellbook.dm | 2 +- code/game/mecha/equipment/mecha_equipment.dm | 7 +++--- .../mecha/equipment/tools/medical_tools.dm | 4 ++-- code/game/mecha/equipment/tools/tools.dm | 7 +++--- code/game/mecha/mecha.dm | 22 +++++++++---------- 5 files changed, 20 insertions(+), 22 deletions(-) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 0444eb9997f..5f981b3fb1a 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -488,7 +488,7 @@ dat += cat_dat[category] dat += "" - user << browse(wrap(dat), "window=spellbook;size=600x300") + user << browse(wrap(dat), "window=spellbook;size=700x300") onclose(user, "spellbook") return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 15f0b7e8aa9..33bbb110766 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -44,7 +44,7 @@ return 1 return -/obj/item/mecha_parts/mecha_equipment/proc/destroy()//missiles detonating, teleporter creating singularity? +/obj/item/mecha_parts/mecha_equipment/Destroy()//missiles detonating, teleporter creating singularity? if(chassis) chassis.equipment -= src listclearnulls(chassis.equipment) @@ -57,9 +57,8 @@ chassis.occupant << sound('sound/mecha/weapdestr.ogg',volume=50) else chassis.occupant << sound('sound/mecha/critdestr.ogg',volume=50) - spawn - qdel(src) - return + chassis = null + return ..() /obj/item/mecha_parts/mecha_equipment/proc/critfail() if(chassis) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 685a65ad15e..bc7100347c5 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -29,7 +29,7 @@ allow_drop() return 0 - destroy() + Destroy() for(var/atom/movable/AM in src) AM.forceMove(get_turf(src)) return ..() @@ -263,7 +263,7 @@ chassis.events.clearEvent("onMove",event) return ..() - destroy() + Destroy() chassis.events.clearEvent("onMove",event) return ..() diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 9882151bb21..d9a7b7a2044 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -665,10 +665,9 @@ M.overlays += droid_overlay return - destroy() + Destroy() chassis.overlays -= droid_overlay - ..() - return + return ..() detach() chassis.overlays -= droid_overlay @@ -941,7 +940,7 @@ GM.toxins += 100 GM.temperature = 1500+T0C //should be enough to start a fire T.visible_message("The [src] suddenly disgorges a cloud of heated plasma.") - destroy() + qdel(src) else GM.toxins += 5 GM.temperature = istype(T) ? T.air.temperature : T20C diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 249e5fa93d8..7a9894ef151 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -363,7 +363,7 @@ if(src.throwing)//high velocity mechas in your face! var/breakthrough = 0 if(istype(obstacle, /obj/structure/window/)) - obstacle.Destroy(brokenup = 1) + qdel(obstacle) breakthrough = 1 else if(istype(obstacle, /obj/structure/grille/)) @@ -377,7 +377,7 @@ else if(istype(obstacle, /obj/structure/table)) var/obj/structure/table/T = obstacle - T.destroy() + qdel(T) breakthrough = 1 else if(istype(obstacle, /obj/structure/rack)) @@ -450,7 +450,7 @@ if(ignore_threshold || src.health*100/initial(src.health) 0) src.spark_system.start() else - src.destroy() + qdel(src) return /obj/mecha/attack_hand(mob/living/user as mob) @@ -609,7 +609,7 @@ Proj.on_hit(src) return -/obj/mecha/proc/destroy() +/obj/mecha/Destroy() go_out() for(var/mob/M in src) //Let's just be ultra sure if(isAI(M)) @@ -624,7 +624,7 @@ var/obj/mecha/working/ripley/R = src if(R.cargo) for(var/obj/O in R.cargo) //Dump contents of stored cargo - O.loc = loc + O.forceMove(loc) R.cargo -= O loc.Entered(O) @@ -638,7 +638,7 @@ E.reliability = round(rand(E.reliability/3,E.reliability)) else E.forceMove(loc) - E.destroy() + qdel(E) if(cell) WR.crowbar_salvage += cell cell.forceMove(WR) @@ -649,7 +649,7 @@ else for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) E.forceMove(loc) - E.destroy() + qdel(E) if(cell) qdel(cell) if(internal_tank) @@ -677,16 +677,16 @@ src.log_append_to_last("Armor saved, changing severity to [severity].") switch(severity) if(1.0) - src.destroy() + qdel(src) if(2.0) if (prob(30)) - src.destroy() + qdel(src) else src.take_damage(initial(src.health)/2) src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1) if(3.0) if (prob(5)) - src.destroy() + qdel(src) else src.take_damage(initial(src.health)/5) src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1) From 2f712c3ce6e5665973882f4de9b3b68753c2d66f Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 19:52:25 +0200 Subject: [PATCH 31/39] Irradiate prior to radiation checks --- code/game/dna/dna_modifier.dm | 63 +++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index a6bbd866510..d74b2672360 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -579,12 +579,14 @@ sleep(10*src.radiation_duration) // sleep for radiation_duration seconds irradiating = 0 + src.connected.locked = lock_state if (!src.connected.occupant) return 1 // return 1 forces an update to all Nano uis attached to src - if(src.connected.radiation_check()) - src.connected.locked = lock_state + var/radiation = (((src.radiation_intensity*3)+src.radiation_duration*3) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + if(src.connected.radiation_check()) return 1 if (prob(95)) @@ -598,9 +600,6 @@ else randmuti(src.connected.occupant) - var/radiation = (((src.radiation_intensity*3)+src.radiation_duration*3) / connected.damage_coeff) - src.connected.occupant.apply_effect(radiation,IRRADIATE,0) - src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src if (href_list["radiationDuration"]) @@ -685,30 +684,33 @@ sleep(10*src.radiation_duration) // sleep for radiation_duration seconds irradiating = 0 + src.connected.locked = lock_state if (!src.connected.occupant) return 1 - if(src.connected.radiation_check()) - src.connected.locked = lock_state - return 1 - if (prob((80 + (src.radiation_duration / 2)))) + var/radiation = (src.radiation_intensity+src.radiation_duration) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + + if(src.connected.radiation_check()) + return 1 + block = miniscrambletarget(num2text(selected_ui_target), src.radiation_intensity, src.radiation_duration) src.connected.occupant.dna.SetUISubBlock(src.selected_ui_block,src.selected_ui_subblock,block) src.connected.occupant.UpdateAppearance() - var/radiation = (src.radiation_intensity+src.radiation_duration) - src.connected.occupant.apply_effect(radiation,IRRADIATE,0) else + var/radiation = ((src.radiation_intensity*2)+src.radiation_duration) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + if(src.connected.radiation_check()) + return 1 + if (prob(20+src.radiation_intensity)) randmutb(src.connected.occupant) domutcheck(src.connected.occupant,src.connected) else randmuti(src.connected.occupant) - src.connected.occupant.UpdateAppearance() - var/radiation = ((src.radiation_intensity*2)+src.radiation_duration) - src.connected.occupant.apply_effect(radiation,IRRADIATE,0) - src.connected.locked = lock_state + src.connected.occupant.UpdateAppearance() return 1 // return 1 forces an update to all Nano uis attached to src //////////////////////////////////////////////////////// @@ -750,15 +752,16 @@ sleep(10*src.radiation_duration) // sleep for radiation_duration seconds irradiating = 0 - - if(src.connected.occupant) - if(src.connected.radiation_check()) - src.connected.locked = lock_state - return 1 - + src.connected.locked = lock_state + + if(src.connected.occupant) if (prob((80 + ((src.radiation_duration / 2) + (connected.precision_coeff ** 3))))) - // FIXME: Find out what these corresponded to and change them to the WHATEVERBLOCK they need to be. - //if ((src.selected_se_block != 2 || src.selected_se_block != 12 || src.selected_se_block != 8 || src.selected_se_block || 10) && prob (20)) + var/radiation = ((src.radiation_intensity+src.radiation_duration) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + + if(src.connected.radiation_check()) + return 1 + var/real_SE_block=selected_se_block block = miniscramble(block, src.radiation_intensity, src.radiation_duration) if(prob(20)) @@ -769,12 +772,14 @@ //testing("Irradiated SE block [real_SE_block]:[src.selected_se_subblock] ([original_block] now [block]) [(real_SE_block!=selected_se_block) ? "(SHIFTED)":""]!") connected.occupant.dna.SetSESubBlock(real_SE_block,selected_se_subblock,block) - var/radiation = ((src.radiation_intensity+src.radiation_duration) / connected.damage_coeff) - src.connected.occupant.apply_effect(radiation,IRRADIATE,0) domutcheck(src.connected.occupant,src.connected) else var/radiation = (((src.radiation_intensity*2)+src.radiation_duration) / connected.damage_coeff) - src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + + if(src.connected.radiation_check()) + return 1 + if (prob(80-src.radiation_duration)) //testing("Random bad mut!") randmutb(src.connected.occupant) @@ -783,7 +788,6 @@ randmuti(src.connected.occupant) //testing("Random identity mut!") src.connected.occupant.UpdateAppearance() - src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src if(href_list["ejectBeaker"]) @@ -885,6 +889,9 @@ irradiating = 0 src.connected.locked = lock_state + var/radiation = (rand(20,50) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + if(src.connected.radiation_check()) return 1 @@ -899,8 +906,6 @@ src.connected.occupant.dna.SE = buf.dna.SE src.connected.occupant.dna.UpdateSE() domutcheck(src.connected.occupant,src.connected) - var/radiation = (rand(20,50) / connected.damage_coeff) - src.connected.occupant.apply_effect(radiation,IRRADIATE,0) return 1 if (bufferOption == "createInjector") From 3379dd6cca6e93db883ef2ba6a816bc158a5cdd0 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 20:08:05 +0200 Subject: [PATCH 32/39] Increase supply shuttle window width further --- code/game/supplyshuttle.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 71398e26dda..35d25e525b1 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -3,7 +3,7 @@ #define SUPPLY_STATIONZ 1 //Z-level of the Station. #define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station #define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock -#define COMP_SCREEN_WIDTH 590 //width of supply computer interaction window +#define COMP_SCREEN_WIDTH 600 //width of supply computer interaction window #define COMP_SCREEN_HEIGHT 555 //height of supply computer interaction window var/datum/controller/supply/supply_controller = new() From 26024318990543f4c421d94379e53b821ebcc37a Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 22:39:17 +0200 Subject: [PATCH 33/39] Fix permissions for polls --- code/controllers/voting.dm | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 30ee4a99e43..1a2ebeffa5c 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -211,7 +211,7 @@ datum/controller/vote question = "End the shift?" choices.Add("Initiate Crew Transfer", "Continue The Round") else - if (get_security_level() == "red" || get_security_level() == "delta") + if (security_level > SEC_LEVEL_BLUE) return 0 if(ticker.current_state <= 2) return 0 @@ -273,11 +273,8 @@ datum/controller/vote proc/interface(var/client/C) if(!C) return var/admin = 0 - var/trialmin = 0 - if(C.holder) + if(check_rights(R_ADMIN,0)) admin = 1 - if(C.holder.rights & R_ADMIN) - trialmin = 1 voting |= C . = "Voting Panel" @@ -299,29 +296,29 @@ datum/controller/vote else . += "

Start a vote:


  • " //restart - if(trialmin || config.allow_vote_restart) + if(admin || config.allow_vote_restart) . += "Restart" else . += "Restart (Disallowed)" . += "
  • " - if(trialmin || config.allow_vote_restart) + if(admin || config.allow_vote_restart) . += "Crew Transfer" else . += "Crew Transfer (Disallowed)" - if(trialmin) + if(admin) . += "\t([config.allow_vote_restart?"Allowed":"Disallowed"])" . += "
  • " //gamemode - if(trialmin || config.allow_vote_mode) + if(admin || config.allow_vote_mode) . += "GameMode" else . += "GameMode (Disallowed)" - if(trialmin) + if(admin) . += "\t([config.allow_vote_mode?"Allowed":"Disallowed"])" . += "
  • " //custom - if(trialmin) + if(admin) . += "
  • Custom
  • " . += "

" . += "Close" From ec5f88f9ec1d633ceb5ee41cdaeab12b334fe7cf Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 22:45:51 +0200 Subject: [PATCH 34/39] Check for permissions in Topic() --- code/controllers/voting.dm | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 1a2ebeffa5c..6a05464cf73 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -272,9 +272,7 @@ datum/controller/vote proc/interface(var/client/C) if(!C) return - var/admin = 0 - if(check_rights(R_ADMIN,0)) - admin = 1 + var/admin = check_rights(R_ADMIN,0) voting |= C . = "Voting Panel" @@ -327,31 +325,32 @@ datum/controller/vote Topic(href,href_list[],hsrc) if(!usr || !usr.client) return //not necessary but meh...just in-case somebody does something stupid + var/admin = check_rights(R_ADMIN,0) switch(href_list["vote"]) if("close") voting -= usr.client usr << browse(null, "window=vote") return if("cancel") - if(usr.client.holder) + if(admin) reset() if("toggle_restart") - if(usr.client.holder) + if(admin) config.allow_vote_restart = !config.allow_vote_restart if("toggle_gamemode") - if(usr.client.holder) + if(admin) config.allow_vote_mode = !config.allow_vote_mode if("restart") - if(config.allow_vote_restart || usr.client.holder) + if(config.allow_vote_restart || admin) initiate_vote("restart",usr.key) if("gamemode") - if(config.allow_vote_mode || usr.client.holder) + if(config.allow_vote_mode || admin) initiate_vote("gamemode",usr.key) if("crew_transfer") - if(config.allow_vote_restart || usr.client.holder) + if(config.allow_vote_restart || admin) initiate_vote("crew_transfer",usr.key) if("custom") - if(usr.client.holder) + if(admin) initiate_vote("custom",usr.key) else submit_vote(usr.ckey, round(text2num(href_list["vote"]))) From ba163ea3758d653bd59c0fb44a415ba6fc28cb60 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 23:19:41 +0200 Subject: [PATCH 35/39] Area fix --- _maps/map_files/cyberiad/cyberiad.dmm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 1c0163e3b43..eaf7fb4d49d 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -6683,6 +6683,7 @@ "cyA" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology) "cyB" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology) "cyC" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology) +"cyD" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "cyE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cyH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cyI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/camera{c_tag = "Virology Isolation 3"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) @@ -6784,7 +6785,6 @@ "cAP" = (/obj/structure/sink{pixel_y = 30},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) "cAQ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "cAR" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint) -"cAS" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "1"},/turf/simulated/floor/plating,/area/security/checkpoint2) "cAT" = (/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) "cAU" = (/obj/structure/table/glass,/obj/item/seeds/appleseed,/obj/item/seeds/bananaseed,/obj/item/seeds/cocoapodseed,/obj/item/seeds/grapeseed,/obj/item/seeds/orangeseed,/obj/item/seeds/sugarcaneseed,/obj/item/seeds/wheatseed,/obj/item/seeds/watermelonseed,/obj/item/seeds/towermycelium,/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) "cAW" = (/obj/structure/closet,/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line) @@ -8101,9 +8101,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazEaAyaDtaDuazEaAyaDvaDuazEaABaDwaABaABaABaABaABayYaABayYcwjcwkayYayYaABaMnaABcwmaabcwmaABaItaIraABaIPcxEaABaHGaCraABaygaAHaAHaAuaAuaAuaAuaAuaAuaAuaAuaAuaCJaCJaCKaDDaDEaISaDGaDHaDIaDJaDKaDLaDLaDLaDLaDMcmMaDNaDOaDPaDLaDLaDQaDQaDRaDSaDTaDUaDVaDWaCWaDXaDYaDYazZaBbaCgaDZaEaaEbaCgaAxaEdaDeaDecxDaGAaBdaFgaFhaFhaGsaAxaQtazKazBazBazBazBazBazKaEmaDnazKaaaaaaaMUaJeaLHaLHaJYdcmaLqaNaaWacZWaAraMUaOMaAraMUcZYaLHaMUcZZaLHaMUdabdaadacaNodadaNodafdaedahdagdajdaidakaIQaIRaIRaacaacaIRaIRaIRaIRaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaEwaExaEwaEyaEwaEzaEwaEAaEBaECaECaECaECaEDaABayYaABcxHcxGcxIayYcyScwgaMnaABaABaABaABaABaABcwgaABayYcxIaDwayYayYaCJcyTcyUaEKaEJaEJaEJaEJaELaEJaEJaEMaENaEKaEOaEPaEPaEPaEPaEPaEPaEPaEQaERaERaERaERaESaETaERaEUaERaEVaESaERaERaERaERaEWaEXaEYaEZaFaaCdaFbaFcaDYaFdaBbaCgaFeaMBaCYaCgaAxaFfaHCaHCaHIaBcaBdaHJaITaITaPhaAxdamaFmazBazBazBazBazBaFnaFoaFpazKaaaaaaaMUaLHaLHaLHaLHaLHaLHdacaNoaNoaNoaNoaNoaNoaNoaEcaLHaLHaLHaLHaHNaLHaLHaHKaLHdaodandaqdapdaraOCaOCaOCdasaIQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaFyaFzaFAaFBaFCaFDaFEaFFaFDaFGaFHaFDaFDaFIaABayYaABcyVayYayYcyWczLaABaPyaKxayYayYayYayYayYayYcwgczNayYaABaRkaRkaAHczOaAHaFPaACaAwaAwaAwaAEaAwaAwaAwaAFaFPaFUaFVaFVaFVaFVaFVaFVaFVaCJaERaFWaFXaFYaFZaGaaGbaGcaGdaGeaGfaGgaFXaGhaERaGiavVaGjaxzaGkaCWaGlaGmaGmaGnaGoaGpcuNaGraGraGuaGtaDgaGuaGtaGtaGvaGwaGxaAxaAxcwlaAxaEgaBkazBazBazBazBazBaBkazzazzazzaMUaMUaMUaArdcmdcmaxBaMUaMUaHKdcmaMUdaudcmaMUaxBaMUaHKaJedcmaMUaxBaMUaLHaJeaHKaLHaLIaIQdaydaedaAdazdaBdaedaCaIQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaAyaBmaGSaBmaGTaFzaFzaGUaBmaGSaBmaGVaGWaGXaGYaABayYcwgcwgaABaABaABczPczPaABaxFaABczPczPczPczPaCJaAHaAHaAHaAHaAHaAHaAHczOczQaFPaaaaabaaaaabaaaaabaaaaabaaaaFPaFUaFVaHiaHjaHkaHlaHmaFVaCJaERaHnaHnaBQaHpaHqaHraHsaHraHtaHuaBYaHnaHnaERaGiavVaHwaxzaGkaCWaCXazXazYazZaBbaHxaHyaHzaHAaHBaHBcxAaHDaHBaHDdaDdaFdaEaHHdaldbddaGazzaBkazBazBazBazBazBaBkaMUaDjaLHdaIdaJdcmaMUdcmaDjaLHaMUaDjaHKaMUaMjaLHaMUaPzaLHdcmdaPdaOaMUbfwaLHdcmaxBaxBaHKaxBaCxaIQdaUdaedaWbbYdaWdaedaXaIQaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaAyaBmaGSaBmaGTaFzaFzaGUaBmaGSaBmaGVaGWaGXaGYaABayYcwgcwgaABaABaABczPczPczPaxFczPczPczPczPczPaCJaAHaAHaAHaAHaAHaAHaAHczOczQaFPaaaaabaaaaabaaaaabaaaaabaaaaFPaFUaFVaHiaHjaHkaHlaHmaFVaCJaERaHnaHnaBQaHpaHqaHraHsaHraHtaHuaBYaHnaHnaERaGiavVaHwaxzaGkaCWaCXazXazYazZaBbaHxaHyaHzaHAaHBaHBcxAaHDaHBaHDdaDdaFdaEaHHdaldbddaGazzaBkazBazBazBazBazBaBkaMUaDjaLHdaIdaJdcmaMUdcmaDjaLHaMUaDjaHKaMUaMjaLHaMUaPzaLHdcmdaPdaOaMUbfwaLHdcmaxBaxBaHKaxBaCxaIQdaUdaedaWbbYdaWdaedaXaIQaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIfazEaDkaCzaBmaIiaIjaIkaIlaBmaCzaDlaAvazEaIoaIpaABayYayYayYayYayYayYczPczRczTczScAOczUcAPczRczPbgbaIwaEJaEJaEJaEJaEJaEJcAQcARaFPaabaIAaIAaIAaIAaIAaIAaIAaabaFPaFUaFVaIBaICaIDaIEaIBaFVaCJaERaERaERaERaIFaIGaFXaIHaFXaIGaIIaERaERaERaERaGiavVaIJaxzaGkaCWaCeazXazYazZaCfaIKaILaILaILaILaILaILaILaIMaILaINaINaINaINaINaIOaMUazzaBkazBazBazBazBazBaBkaMUaMUaLHdaYdaJdcmdaZaMUaLHaLHaMUaLHaHKdcmaLHaLHaMUaLHaLHdcmaHKaKaaMUaLHaLHdcmdbaaLHaHKaLHdbcdbbdbbaIQaIQaIQaIQaIQaIQaIQaIRaIRaIRaIRaIRaabaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaGSaBmaBmaBmaBmaBmaBmaGSaAvaJnazEaJoaJpaJqaJqaJqaJqaJqaJqcASczPczRcATczScAUcATcATczRczPaJxaJyaJzaJzaJzaJzaJzaJzaJzaJzaJwaaaaIAaJAaJBaJCaJDaJEaIAaaaaFPaFUaFVaIBaJFaJGaJHaIBaFVaCJaERaJIaJIaBQaJJaJKaHraHsaHraJKaJLaDoaHnaHnaERaGiavVaGjaxzaJNazmaJOazXazYazZaBbaIKaILaJPaJQaJRaJRaILaJSaJQaJTaINaJUaJVaJWaINaJXaMUaaaaDqaDraDraDraDraDraDsaaaaMUaLHdbedbfdcmdcmaMUaMUdcmdcmdbgdbhdcmaMUaAsaMUaMUdcmdcmdbjdbiaMUaMUaMUaWadbaaLHaHKaLHdbcaNaaAraOMaMUdbldbmdblaMUaMUaMUaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaGSaBmaBmaBmaBmaBmaBmaGSaAvaJnazEaJoaJpaJqaJqaJqaJqaJqaJqcyDczPczRcATczScAUcATcATczRczPaJxaJyaJzaJzaJzaJzaJzaJzaJzaJzaJwaaaaIAaJAaJBaJCaJDaJEaIAaaaaFPaFUaFVaIBaJFaJGaJHaIBaFVaCJaERaJIaJIaBQaJJaJKaHraHsaHraJKaJLaDoaHnaHnaERaGiavVaGjaxzaJNazmaJOazXazYazZaBbaIKaILaJPaJQaJRaJRaILaJSaJQaJTaINaJUaJVaJWaINaJXaMUaaaaDqaDraDraDraDraDraDsaaaaMUaLHdbedbfdcmdcmaMUaMUdcmdcmdbgdbhdcmaMUaAsaMUaMUdcmdcmdbjdbiaMUaMUaMUaWadbaaLHaHKaLHdbcaNaaAraOMaMUdbldbmdblaMUaMUaMUaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKlaKmaKnaKmaKmaKoaKpaKmaKmaKnaKqaKrazEaGTaKsaJqaKtaKuaKvcBXcZjcBYczPczRcATczScZkcATcATczRczPaKDaKEaKFaKGaKHaKIaKJaKKaKLaKMaJwaabaIAaKNaKOaKPaKQaKRaIAaabaFPaFUaFVaKSaKTaKUaKVaKWaFVaCJaERaFWaFXaKXaKYaIGaFXaKZaFXaIGaLaaLbaFXaGhaERaGiavVaLcaxzaGkaAZaBaazXazYazZaLdaLeaILaLfaJQaJQaJQaLgaLhaLiaLjaINaLkaLlaLmaLnaLoaAsaaaaaaaaaaaaaaaaaaaaaaaaaaaaMUdbodbndbqdbpdbraMUaGyaLHaJeaHKaLHaMUaaaaMUaLHaLHaLHaLHaHKaLyaLzaLAaLAaLAaLAaLCaLBaLDdbtaLEaLFaLEdbvdbudbudbwdbydbxdbAdbzdbzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKlaKqaKmaLKaLLaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaBmaGTaLWaJqaLXaLYaLZaMaaLZaMbczPcZlcATcZmcZwcZvcZwcZxcZyaMkaMlaMmaMmaMmaMmaMmaMmaMoaMpaJwaaaaIAaMqaKOaMraKQaMsaIAaaaaFPaFUaFVaMtaMuaMvaMwaMxaFVaCJaERaMyaMyaBQaMzaJKaHraMAaHraJKaNOaBYaMCaMCaERaMDaxNaMEaxzaGkaAZaMFaMFaMFaMFaMGaMHaMIaMJaMKaMLaMLaMLaMMaMLaMNaMOaMPaMQaMRaMOaMSdbBaAsaMUaMUaMUaMUaMUaMUaMUaMUaMUaMUaMUaMUdbCaMUaMUaMUaMUaLHaHKdboavqaabavqaLHaNbaNcaNddbEaNfaNgaNhaNhaNhaNhaNiaNjaNkdbFaNlaNmaNlaNnaNlaNldbGdbHaNqaNqaDxaLJaNsaNsaNsaNsaNsaNsaNsaNsaNsabCacUaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLUaNuaNvaNwaLTaNxaLMaNxaLMaNxaLMaNxaLTaNyaNzaBmaGTaNAaJqaNBaNCaNDaNEaNFaNGczPcZzcATcZAcZCcZBcZEcZDczPaZqaMmaMmaMmaMmaMmaMmaMmaMoaNPaJwaabaIAaNQaNRaNSaNTaNUaIAaabaFPaFUaFVaNVaNWaNXaNYaNZaFVaCJaERaERaERaERaOaaIGaFXaIHaFXaIGaObaERaERaERaERaOcaOdaOeaxzaJNaOfaOgaOgaOgaOhaOiaCnaOjaOkaOlaOjaOmaOnaOoaOjaOpaOqaOraOsaOtaINaOuaOvaOwaOxaOxaOvaOyaOzaOzaOzaOzaOzaOAaOBaOzdbJaODdbKaOGdbLaOHdbMaOIaDAdbOaDAaOKaOLaLHaMUaONaOOaOPaOQaORaOSaOTaOUaOVaOWaOVaOXaOYaOZaPaaPbaPcaPdaPeaPfaSFdbPaLJaPiaPjaPkaPlaPmaPnaPoaPpaPqaPraaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 2787c2fd46bc58f0a731f97bef50354c3c539055 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 23:52:27 +0200 Subject: [PATCH 36/39] sortAtom improvements --- _maps/map_files/cyberiad/cyberiad.dmm | 2 +- code/_globalvars/lists/objects.dm | 3 +++ code/datums/cache/air_alarm.dm | 2 +- code/datums/cache/powermonitor.dm | 2 +- code/game/machinery/alarm.dm | 7 ++++--- code/game/machinery/computer/power.dm | 5 +++-- code/modules/admin/verbs/adminjump.dm | 2 +- code/modules/computer3/computers/message.dm | 2 +- code/modules/events/money_spam.dm | 2 +- code/modules/mob/living/silicon/pai/software_modules.dm | 2 +- code/modules/power/apc.dm | 3 +++ 11 files changed, 20 insertions(+), 12 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 1c0163e3b43..2e9f5797ef1 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -6110,7 +6110,7 @@ "cnz" = (/turf/simulated/wall/r_wall,/area/maintenance/asmaint) "cnA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/wall,/area/crew_quarters/sleep) "cnB" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/door_control{id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = 24; pixel_y = 8; req_access_txt = "24"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/atmos/control) -"cnC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/hologram/holopad,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor,/area/atmos/control) +"cnC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/atmos/control) "cnD" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/toxins/xenobiology) "cnE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access_txt = "47"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cnF" = (/obj/structure/sign/securearea,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/toxins/xenobiology) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 690ac0e5c5b..2e748d40b7b 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -20,3 +20,6 @@ var/global/list/machines = list() var/global/list/processing_power_items = list() //items that ask to be called every cycle var/global/list/rcd_list = list() //list of Rapid Construction Devices. +var/global/list/apcs = list() +var/global/list/air_alarms = list() +var/global/list/power_monitors = list() \ No newline at end of file diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm index 07caea0f3ad..83b2e8246e5 100644 --- a/code/datums/cache/air_alarm.dm +++ b/code/datums/cache/air_alarm.dm @@ -14,7 +14,7 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new() if(ticker && ticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time alarms[++alarms.len] = passed_alarm.get_nano_data_console() else - for(var/obj/machinery/alarm/alarm in sortAtom((monitored_alarms ? monitored_alarms : machines))) + for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : air_alarms)) if(!monitored_alarms && alarm.z != ZLEVEL_STATION && alarm.z != ZLEVEL_ASTEROID) continue alarms[++alarms.len] = alarm.get_nano_data_console() diff --git a/code/datums/cache/powermonitor.dm b/code/datums/cache/powermonitor.dm index a99b380a13d..e269ddc8afe 100644 --- a/code/datums/cache/powermonitor.dm +++ b/code/datums/cache/powermonitor.dm @@ -11,7 +11,7 @@ var/global/datum/repository/powermonitor/powermonitor_repository = new() if(!refresh) return cache_entry.data - for(var/obj/machinery/computer/monitor/pMon in machines) + for(var/obj/machinery/computer/monitor/pMon in power_monitors) if( !(pMon.stat & (NOPOWER|BROKEN)) ) pMonData[++pMonData.len] = list ("Name" = pMon.name, "ref" = "\ref[pMon]") diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index f9f13d4f907..5d6c2ff7730 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -183,6 +183,9 @@ /obj/machinery/alarm/New(var/loc, var/dir, var/building = 0) ..() + air_alarms += src + air_alarms = sortAtom(air_alarms) + wires = new(src) if(building) @@ -202,11 +205,9 @@ first_run() /obj/machinery/alarm/Destroy() + air_alarms -= src if(radio_controller) radio_controller.remove_object(src, frequency) - - if (src in machines) // So the cache can properly update - removeAtProcessing() air_alarm_repository.update_cache(src) return ..() diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index 55cf68c3234..0676ca917c8 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -13,6 +13,8 @@ /obj/machinery/computer/monitor/New() ..() + power_monitors += src + sortAtom(power_monitors) power_monitor = new(src) powermonitor_repository.update_cache() @@ -21,8 +23,7 @@ powernet = find_powernet() /obj/machinery/computer/monitor/Destroy() - if (src in machines) // So the cache can properly update - removeAtProcessing() + power_monitors -= src powermonitor_repository.update_cache() return ..() diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 99385ee5ff6..a9a07026a5d 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -131,7 +131,7 @@ usr.loc = M.loc feedback_add_details("admin_verb","GK") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/sendmob(var/mob/M in sortmobs()) +/client/proc/sendmob(var/mob/M in mob_list) set category = "Admin" set name = "Send Mob" diff --git a/code/modules/computer3/computers/message.dm b/code/modules/computer3/computers/message.dm index 3eab3f59269..10870c9973e 100644 --- a/code/modules/computer3/computers/message.dm +++ b/code/modules/computer3/computers/message.dm @@ -371,7 +371,7 @@ if(!P.owner || P.toff || P.hidden) continue sendPDAs += P if(PDAs && PDAs.len > 0) - customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortAtom(sendPDAs) + customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sendPDAs else customrecepient = null diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm index 198b483ee10..2bafc9f3cc9 100644 --- a/code/modules/events/money_spam.dm +++ b/code/modules/events/money_spam.dm @@ -29,7 +29,7 @@ // /obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "") var/obj/item/device/pda/P var/list/viables = list() - for(var/obj/item/device/pda/check_pda in sortAtom(PDAs)) + for(var/obj/item/device/pda/check_pda in PDAs) if (!check_pda.owner||check_pda.toff||check_pda == src||check_pda.hidden) continue viables.Add(check_pda) diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 9cba0094d4d..4e04e619c44 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -149,7 +149,7 @@ var/pdas[0] if(!user.pda.toff) - for(var/obj/item/device/pda/P in sortAtom(PDAs)) + for(var/obj/item/device/pda/P in PDAs) if(!P.owner || P.toff || P == user.pda || P.hidden) continue var/pda[0] pda["name"] = "[P]" diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 07c0ea13e8d..c2ee9dbf733 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -115,6 +115,8 @@ /obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0) ..() + apcs += src + sortAtom(apcs) wires = new(src) var/tmp/obj/item/weapon/stock_parts/cell/tmp_cell = new standard_max_charge = tmp_cell.maxcharge @@ -143,6 +145,7 @@ src.update() /obj/machinery/power/apc/Destroy() + apcs -= src if(malfai && operating) if (ticker.mode.config_tag == "malfunction") if (src.z == ZLEVEL_STATION) From 9839376ca0532b04ec190e5524183294126a7214 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 23:56:52 +0200 Subject: [PATCH 37/39] Properly sortAtom the machines --- code/game/machinery/computer/power.dm | 2 +- code/modules/power/apc.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index 0676ca917c8..855b5f7cbb6 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -14,7 +14,7 @@ /obj/machinery/computer/monitor/New() ..() power_monitors += src - sortAtom(power_monitors) + power_monitors = sortAtom(power_monitors) power_monitor = new(src) powermonitor_repository.update_cache() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index c2ee9dbf733..32379a466d6 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -116,7 +116,7 @@ /obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0) ..() apcs += src - sortAtom(apcs) + apcs = sortAtom(apcs) wires = new(src) var/tmp/obj/item/weapon/stock_parts/cell/tmp_cell = new standard_max_charge = tmp_cell.maxcharge From 7e06a35c3b3a2d42581b1e5b6ceba03b1ac661ae Mon Sep 17 00:00:00 2001 From: Markolie Date: Sat, 29 Aug 2015 00:21:29 +0200 Subject: [PATCH 38/39] Get rid of laggy construct Bump code --- .../mob/living/simple_animal/constructs.dm | 34 ------------------- 1 file changed, 34 deletions(-) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index e099f8b3e4d..be304fc4cd8 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -62,40 +62,6 @@ usr << msg return -/mob/living/simple_animal/construct/Bump(atom/movable/AM as mob|obj, yes) - spawn( 0 ) - if ((!( yes ) || now_pushing)) - return - now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) - if(prob(5)) - src << "\red You fail to push [tmob]'s fat ass out of the way." - now_pushing = 0 - return - if(!(tmob.status_flags & CANPUSH)) - now_pushing = 0 - return - - tmob.LAssailant = src - now_pushing = 0 - ..() - if (!( istype(AM, /atom/movable) )) - return - if (!( now_pushing )) - now_pushing = 1 - if (!( AM.anchored )) - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window/full)) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = null - return - return - /mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M as mob) if(istype(M, /mob/living/simple_animal/construct/builder)) health += 5 From 67f1b00291c94d16c23cfc97c80a12dad7b8be8b Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sat, 29 Aug 2015 18:22:29 -0400 Subject: [PATCH 39/39] Transit Tube Update --- _maps/map_files/cyberiad/cyberiad.dmm | 17 ++++++++++------- .../structures/transit_tubes/station.dm | 7 +++---- .../structures/transit_tubes/transit_tube.dm | 9 +++++++-- icons/obj/pipes/transit_tube.dmi | Bin 9791 -> 10656 bytes 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index be9784bef69..678e2ca9a95 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -6685,9 +6685,12 @@ "cyC" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology) "cyD" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "cyE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cyF" = (/turf/simulated/floor{icon_state = "dark"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/transit_tube{icon_state = "Block"},/turf/simulated/floor{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering) +"cyG" = (/turf/simulated/floor{icon_state = "dark"},/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"},/obj/structure/transit_tube_pod,/turf/simulated/floor{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering) "cyH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cyI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/camera{c_tag = "Virology Isolation 3"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cyJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/medical/virology) +"cyK" = (/obj/structure/transit_tube{icon_state = "E-W-Pass"},/turf/space,/area/space) "cyL" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio3"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/toxins/xenobiology) "cyM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cyN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) @@ -6705,10 +6708,12 @@ "cyZ" = (/turf/simulated/floor/plating/airless,/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/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/solar/port) "cza" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) "czb" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area/space) +"czc" = (/obj/structure/transit_tube/station{icon_state = "closed"; dir = 4},/turf/simulated/floor{tag = "icon-brown (EAST)"; icon_state = "brown"; dir = 4},/area/aisat/entrance) "czd" = (/turf/simulated/floor/plating,/area/assembly/assembly_line) "cze" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line) "czf" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line) "czg" = (/obj/item/weapon/paper,/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line) +"czh" = (/obj/machinery/light,/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/obj/structure/transit_tube{dir = 1; icon_state = "Block"},/turf/simulated/floor{tag = "icon-brown (EAST)"; icon_state = "brown"; dir = 4},/area/aisat/entrance) "czi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/aft) "czj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/aft) "czk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 7},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/turf/simulated/floor,/area/engine/break_room) @@ -7641,7 +7646,6 @@ "cUN" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/engine/engineering) "cUO" = (/obj/machinery/camera{c_tag = "Mini Satellite Access"; dir = 4; network = list("SS13","MiniSat")},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/engine/engineering) "cUP" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engine/engineering) -"cUQ" = (/turf/simulated/floor{icon_state = "dark"},/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"},/obj/structure/transit_tube_pod,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering) "cUS" = (/turf/space,/area/syndicate_station/southeast) "cUT" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cUU" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/emp_proof{c_tag = "Engineering Singularity West"; dir = 4; network = list("Singularity","SS13")},/turf/simulated/floor/plating/airless,/area/engine/engineering) @@ -7696,7 +7700,6 @@ "cVX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Teleporter Room"; req_access_txt = "17;75"},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance) "cVY" = (/obj/machinery/bluespace_beacon,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance) "cVZ" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/aisat/entrance) -"cWa" = (/obj/machinery/light,/obj/structure/transit_tube/station{icon_state = "closed"; dir = 4},/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/floor{tag = "icon-brown (EAST)"; icon_state = "brown"; dir = 4},/area/aisat/entrance) "cWb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance) "cWc" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "teledoor"; name = "AI Satellite Teleport Access"},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance) "cWd" = (/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "teledoor"; name = "AI Satellite Teleport Shutters Control"; pixel_x = 0; pixel_y = -25; req_access_txt = "17;75"},/obj/effect/decal/warning_stripes/east,/obj/machinery/camera{c_tag = "Mini Satellite Teleporter"; dir = 1; network = list("SS13","MiniSat")},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance) @@ -8195,12 +8198,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaacaabaacaacaabaabaabaczaczcEEcEEcUCcTwaaaaaaaabaaaaaaaabcUDcUEaacaabaaaaaaaabaaaaaacTwcUFcEEcEEcNbcEEcCDcUwcUGcUwcCDcUycUHcUycCDcUAcUIcUAcCDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaabaaaaaaaabaabaczcEEcEEcTvcTwaaaaaaaabaaacUJaabaacaacaacaabaabcTMaabaaaaaacTwcTvcEEcEEcNbcEEcCDcCDcCDcCDcCDcCDcCDcCDcCDcCDcCDcCDcCDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcEEcUjcUkcTwaaaaaaaabaaaaaaaabaabaabaabaabaaaaaaaabaaaaaacTwcUhcUicEEcUlcEEcEEcEEcEEcEEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaacRzcRzcRzcRzaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaacRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaabcEEcTZcTwcULaaaaaacUMaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaacTwcTwcTZcEEcNbcUNcUOcUPcUQbQYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcEEcUTcUUcTwaabaabaabcTMaaaaaacTMaaaaaaaaaaaacTMaabcUVaabcTwcUWcUXcEEcNbcUYcUZcGTcVabQYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaacRzcRzcRzcRzaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaacRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaabcEEcTZcTwcULaaaaaacUMaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaacTwcTwcTZcEEcNbcUNcUOcUPcyFbQYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcEEcUTcUUcTwaabaabaabcTMaaaaaacTMaaaaaaaaaaaacTMaabcUVaabcTwcUWcUXcEEcNbcUYcUZcGTcyGbQYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEEcVccVdcVeaaaaaaaabaabaabaabaabaabaabaabaabaabaabaaaaaacVfcVdcVgcEEcNbcEEcVhcVicVabNzaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNVcEEcKVcTccVeaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaabaaaaaacVfcTbcKVcEEcEEcNbcEEcEEcEEbQZcEEaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacEEcEEcTccSGcSGcSGcSGcSGcSGcSGcSGcSGcSGcSGcSGcSGcTbcEEcEEcEEcEEcUlcEEaaaaabcVlcVmaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEaaacEEcEEcVncEEaabaabcVocVpcVqcVrcVrcVrcVqcVrcVrcVrcVqcVrcVrcVrcVqcVrcVrcVscVtaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEaaacEEcEEcVncEEaabaabcVocVpcVqcVrcyKcVrcVqcVrcyKcVrcVqcVrcyKcVrcVqcVrcyKcVscVtaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEEcEEcVucEEcEEcEEcEEaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaacVocVvcVmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEEcNbcNbcVwcVxcVxcVyaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabcVzcVvcVtaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEEcUlcNbcVAcVBcVCcVDaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacVocVvcVmaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8208,8 +8211,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNVcEEcEEcEEcEEcEEcEEaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcVzcVIaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcVJbRacVJbRcbRccVNcVNcVNcVNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabcVJcVOcVPcVQcVRcVScVTcVUcVNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcVJcVOcVVcVWcVWcVXcVYcVZcVNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcVJcWacWbcVWcVWcWccWdcWecVNaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcVJczccVVcVWcVWcVXcVYcVZcVNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcVJczhcWbcVWcVWcWccWdcWecVNaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabcVJcVJcWfcVWcVWcVNcWgcVNcVNaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaoMaoMaaaaabaaabRccWicVWcVWcWjcWkbRcaabaabaabaoMaoMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczcWlcWlaczaczaaabRccWncWocWpcWqcWrbRcaaaaczaczcWlcWlaczaczaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index b103179d58b..303f5bd041b 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -6,11 +6,10 @@ name = "station tube station" icon = 'icons/obj/pipes/transit_tube_station.dmi' icon_state = "closed" - exit_delay = 2 - enter_delay = 3 + exit_delay = 1 + enter_delay = 2 var/pod_moving = 0 - var/automatic_launch_time = 100 - var/cooldown_delay = 200 + var/cooldown_delay = 50 var/launch_cooldown = 0 var/reverse_launch = 0 diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index 707dbb015df..5a0b7df79a3 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -10,8 +10,8 @@ layer = 3.1 anchored = 1.0 var/list/tube_dirs = null - var/exit_delay = 2 - var/enter_delay = 1 + var/exit_delay = 1 + var/enter_delay = 0 // alldirs in global.dm is the same list of directions, but since // the specific order matters to get a usable icon_state, it is @@ -20,6 +20,11 @@ var/global/list/tube_dir_list = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) +/obj/structure/transit_tube/CanPass(atom/movable/mover, turf/target) + if(istype(mover) && mover.checkpass(PASSGLASS)) + return 1 + return !density + // When destroyed by explosions, properly handle contents. obj/structure/transit_tube/ex_act(severity) switch(severity) diff --git a/icons/obj/pipes/transit_tube.dmi b/icons/obj/pipes/transit_tube.dmi index 45b2abc3c3efe0aa6dcd7924c99095df6377a408..517a3b238cd67caaf72a67da7ae95973c71f7244 100644 GIT binary patch literal 10656 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