From 145b627464b2b1aa9082dd84bf2baa9af5c756bf Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Fri, 10 Jul 2015 19:12:43 +0800 Subject: [PATCH 01/55] Storage system altered to be storage space based --- code/game/objects/items.dm | 3 +- .../objects/items/weapons/storage/backpack.dm | 4 +- .../objects/items/weapons/storage/bags.dm | 14 +- .../objects/items/weapons/storage/belt.dm | 3 +- .../objects/items/weapons/storage/boxes.dm | 14 +- .../objects/items/weapons/storage/fancy.dm | 7 +- .../objects/items/weapons/storage/firstaid.dm | 2 - .../objects/items/weapons/storage/lockbox.dm | 1 - .../objects/items/weapons/storage/misc.dm | 1 - .../objects/items/weapons/storage/storage.dm | 151 ++++++++++++++++-- .../objects/items/weapons/storage/toolbox.dm | 2 +- .../items/weapons/storage/uplink_kits.dm | 1 - code/modules/mob/inventory.dm | 6 +- code/modules/power/lighting.dm | 2 +- .../research/xenoarchaeology/tools/tools.dm | 3 +- html/changelogs/RavingManiac-PR-10095.yml | 6 + icons/mob/screen1.dmi | Bin 168715 -> 169008 bytes 17 files changed, 165 insertions(+), 55 deletions(-) create mode 100644 html/changelogs/RavingManiac-PR-10095.yml diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d39d0e187ee..fe2004e911d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -9,6 +9,7 @@ var/burning = null var/hitsound = null var/w_class = 3.0 + var/storage_cost = null var/slot_flags = 0 //This is used to determine on which slots an item can fit. var/no_attack_log = 0 //If it's an item we don't want to log attack_logs with, set this to 1 pass_flags = PASSTABLE @@ -339,7 +340,7 @@ var/list/global/slot_flags_enumeration = list( var/allow = 0 if(H.back && istype(H.back, /obj/item/weapon/storage/backpack)) var/obj/item/weapon/storage/backpack/B = H.back - if(B.contents.len < B.storage_slots && w_class <= B.max_w_class) + if(B.can_be_inserted(src,1)) allow = 1 if(!allow) return 0 diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index e4df419e18e..c4b7133a22d 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -50,6 +50,7 @@ icon_state = "holdingpack" max_w_class = 4 max_storage_space = 56 + storage_cost = 29 New() ..() @@ -61,7 +62,7 @@ qdel(W) return ..() - + //Please don't clutter the parent storage item with stupid hacks. can_be_inserted(obj/item/W as obj, stop_messages = 0) if(istype(W, /obj/item/weapon/storage/backpack/holding)) @@ -74,7 +75,6 @@ icon_state = "giftbag0" item_state = "giftbag" w_class = 4.0 - storage_slots = 20 max_w_class = 3 max_storage_space = 400 // can store a ton of shit! item_state_slots = null diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 4c808ad2f5f..8be4acb12c9 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -34,7 +34,6 @@ w_class = 4 max_w_class = 2 - storage_slots = 21 can_hold = list() // any cant_hold = list(/obj/item/weapon/disk/nuclear) @@ -61,7 +60,6 @@ w_class = 4 max_w_class = 2 - storage_slots = 21 can_hold = list() // any cant_hold = list(/obj/item/weapon/disk/nuclear) @@ -76,8 +74,7 @@ icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET w_class = 3 - storage_slots = 50 - max_storage_space = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class + max_storage_space = 200 max_w_class = 3 can_hold = list(/obj/item/weapon/ore) @@ -90,8 +87,7 @@ name = "plant bag" icon = 'icons/obj/hydroponics_machines.dmi' icon_state = "plantbag" - storage_slots = 50; //the number of plant pieces it can carry. - max_storage_space = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class + max_storage_space = 200 max_w_class = 3 w_class = 2 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown) @@ -111,6 +107,7 @@ var/capacity = 300; //the number of sheets it can carry. w_class = 3 + storage_slots = 7 allow_quick_empty = 1 // this function is superceded New() @@ -193,7 +190,7 @@ var/col_count = min(7,storage_slots) -1 if (adjusted_contents > 7) row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. - src.standard_orient_objs(row_num, col_count, numbered_contents) + src.slot_orient_objs(row_num, col_count, numbered_contents) return @@ -248,8 +245,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "cashbag" desc = "A bag for carrying lots of cash. It's got a big dollar sign printed on the front." - storage_slots = 50; //the number of cash pieces it can carry. - max_storage_space = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * cash.w_class + max_storage_space = 200 max_w_class = 3 w_class = 2 can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 7080cd19319..4d5b5e2e463 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -4,6 +4,8 @@ icon = 'icons/obj/clothing/belts.dmi' icon_state = "utilitybelt" item_state = "utility" + storage_slots = 7 + max_w_class = 3 slot_flags = SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined") @@ -100,7 +102,6 @@ desc = "Can hold security gear like handcuffs and flashes." icon_state = "securitybelt" item_state = "security" - storage_slots = 7 max_w_class = 3 max_storage_space = 28 can_hold = list( diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 95c41916222..7a176d82e58 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -437,7 +437,6 @@ desc = "Drymate brand monkey cubes. Just add water!" icon = 'icons/obj/food.dmi' icon_state = "monkeycubebox" - storage_slots = 7 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube) New() ..() @@ -551,11 +550,10 @@ desc = "Eight wrappers of fun! Ages 8 and up. Not suitable for children." icon = 'icons/obj/toy.dmi' icon_state = "spbox" - storage_slots = 8 can_hold = list(/obj/item/toy/snappop) New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1; i <= 8; i++) new /obj/item/toy/snappop(src) /obj/item/weapon/storage/box/matches @@ -564,14 +562,13 @@ icon = 'icons/obj/cigarettes.dmi' icon_state = "matchbox" item_state = "zippo" - storage_slots = 10 w_class = 1 slot_flags = SLOT_BELT can_hold = list(/obj/item/weapon/flame/match) New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1; i <= 10; i++) new /obj/item/weapon/flame/match(src) attackby(obj/item/weapon/flame/match/W as obj, mob/user as mob) @@ -589,7 +586,7 @@ icon_state = "syringe" New() ..() - for (var/i; i < storage_slots; i++) + for (var/i; i < 7; i++) new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src) /obj/item/weapon/storage/box/lights @@ -598,9 +595,7 @@ icon_state = "light" desc = "This box is shaped on the inside so that only light tubes and bulbs fit." item_state = "syringe_kit" - storage_slots=21 can_hold = list(/obj/item/weapon/light/tube, /obj/item/weapon/light/bulb) - max_storage_space = 42 //holds 21 items of w_class 2 use_to_pickup = 1 // for picking up broken bulbs, not that most people will try /obj/item/weapon/storage/box/lights/bulbs/New() @@ -634,8 +629,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "portafreezer" item_state = "medicalpack" - storage_slots=7 max_w_class = 3 can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/food, /obj/item/weapon/reagent_containers/glass) max_storage_space = 21 - use_to_pickup = 1 // for picking up broken bulbs, not that most people will try + use_to_pickup = 1 // for picking up broken bulbs, not that most people will try diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 081d1f7ba65..e352dd2c958 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -46,7 +46,6 @@ icon_state = "eggbox" icon_type = "egg" name = "egg box" - storage_slots = 12 can_hold = list( /obj/item/weapon/reagent_containers/food/snacks/egg, /obj/item/weapon/reagent_containers/food/snacks/boiledegg @@ -54,7 +53,7 @@ /obj/item/weapon/storage/fancy/egg_box/New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1; i <= 12; i++) new /obj/item/weapon/reagent_containers/food/snacks/egg(src) return @@ -69,14 +68,13 @@ icon_state = "candlebox5" icon_type = "candle" item_state = "candlebox5" - storage_slots = 5 throwforce = 2 slot_flags = SLOT_BELT /obj/item/weapon/storage/fancy/candle_box/New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1; i <= 5; i++) new /obj/item/weapon/flame/candle(src) return @@ -90,7 +88,6 @@ icon = 'icons/obj/crayons.dmi' icon_state = "crayonbox" w_class = 2.0 - storage_slots = 6 icon_type = "crayon" can_hold = list( /obj/item/weapon/pen/crayon diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index c23dfcdb516..e58b0ac0a85 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -131,7 +131,6 @@ /obj/item/weapon/storage/firstaid/surgery name = "surgery kit" desc = "Contains tools for surgery." - storage_slots = 10 /obj/item/weapon/storage/firstaid/surgery/New() ..() @@ -161,7 +160,6 @@ can_hold = list(/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/dice,/obj/item/weapon/paper) allow_quick_gather = 1 use_to_pickup = 1 - storage_slots = 14 use_sound = null /obj/item/weapon/storage/pill_bottle/antitox diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 297ac1d4b18..f88f731e36d 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -8,7 +8,6 @@ w_class = 4 max_w_class = 3 max_storage_space = 14 //The sum of the w_classes of all the items in this storage item. - storage_slots = 4 req_access = list(access_armory) var/locked = 1 var/broken = 0 diff --git a/code/game/objects/items/weapons/storage/misc.dm b/code/game/objects/items/weapons/storage/misc.dm index 6bd9495714f..755ba299e1b 100644 --- a/code/game/objects/items/weapons/storage/misc.dm +++ b/code/game/objects/items/weapons/storage/misc.dm @@ -15,7 +15,6 @@ icon = 'icons/obj/food.dmi' icon_state = "donutbox" name = "donut box" - storage_slots = 6 var/startswith = 6 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/donut) foldable = /obj/item/stack/material/cardboard diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 70c1d33d732..0bec6598b08 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -12,10 +12,16 @@ var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else) var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set) var/list/is_seeing = new/list() //List of mobs which are currently seeing the contents of this item's storage - var/max_w_class = 2 //Max size of objects that this object can store (in effect only if can_hold isn't set) + var/max_w_class = null //Max size of objects that this object can store (in effect only if can_hold isn't set) var/max_storage_space = 14 //The sum of the storage costs of all the items in this storage item. - var/storage_slots = 7 //The number of storage slots in this container. + var/storage_slots = null //The number of storage slots in this container. var/obj/screen/storage/boxes = null + var/obj/screen/storage/storage_start = null //storage UI + var/obj/screen/storage/storage_continue = null + var/obj/screen/storage/storage_end = null + var/obj/screen/storage/stored_start = null + var/obj/screen/storage/stored_continue = null + var/obj/screen/storage/stored_end = null var/obj/screen/close/closer = null var/use_to_pickup //Set this to make it possible to use this item in an inverse way, so you can have the item in your hand and click items on the floor to pick them up. var/display_contents_with_number //Set this to make the storage item group contents of the same type and display them as a number. @@ -27,6 +33,12 @@ /obj/item/weapon/storage/Destroy() close_all() qdel(boxes) + qdel(src.storage_start) + qdel(src.storage_continue) + qdel(src.storage_end) + qdel(src.stored_start) + qdel(src.stored_continue) + qdel(src.stored_end) qdel(closer) ..() @@ -90,11 +102,19 @@ if(user.s_active) user.s_active.hide_from(user) user.client.screen -= src.boxes + user.client.screen -= src.storage_start + user.client.screen -= src.storage_continue + user.client.screen -= src.storage_end user.client.screen -= src.closer user.client.screen -= src.contents - user.client.screen += src.boxes user.client.screen += src.closer user.client.screen += src.contents + if(storage_slots) + user.client.screen += src.boxes + else + user.client.screen += src.storage_start + user.client.screen += src.storage_continue + user.client.screen += src.storage_end user.s_active = src is_seeing |= user return @@ -104,6 +124,9 @@ if(!user.client) return user.client.screen -= src.boxes + user.client.screen -= src.storage_start + user.client.screen -= src.storage_continue + user.client.screen -= src.storage_end user.client.screen -= src.closer user.client.screen -= src.contents if(user.s_active == src) @@ -155,7 +178,7 @@ return //This proc draws out the inventory and places the items on it. It uses the standard position. -/obj/item/weapon/storage/proc/standard_orient_objs(var/rows, var/cols, var/list/obj/item/display_contents) +/obj/item/weapon/storage/proc/slot_orient_objs(var/rows, var/cols, var/list/obj/item/display_contents) var/cx = 4 var/cy = 2+rows src.boxes.screen_loc = "4:16,2:16 to [4+cols]:16,[2+rows]:16" @@ -181,6 +204,50 @@ src.closer.screen_loc = "[4+cols+1]:16,2:16" return +/obj/item/weapon/storage/proc/space_orient_objs(var/list/obj/item/display_contents) + + var/storage_cap_width = 2 //length of sprite for storage box start and end + var/stored_cap_width = 4 + var/storage_width = min(max_storage_space*8,284) + + storage_start.overlays.Cut() + + var/matrix/M = matrix() + M.Scale((storage_width-storage_cap_width*2+3)/32,1) + src.storage_continue.transform = M + + src.storage_start.screen_loc = "4:16,2:16" + src.storage_continue.screen_loc = "4:[storage_cap_width+(storage_width-storage_cap_width*2)/2+2],2:16" + src.storage_end.screen_loc = "4:[19+storage_width-storage_cap_width],2:16" + + var/startpoint = 0 + var/endpoint = 1 + + for(var/obj/item/O in contents) + startpoint = endpoint + 1 + endpoint += storage_width * O.get_storage_cost()/max_storage_space + + var/matrix/M_start = matrix() + var/matrix/M_continue = matrix() + var/matrix/M_end = matrix() + M_start.Translate(startpoint,0) + M_continue.Scale((endpoint-startpoint-stored_cap_width*2)/32,1) + M_continue.Translate(startpoint+stored_cap_width+(endpoint-startpoint-stored_cap_width*2)/2 - 16,0) + M_end.Translate(endpoint-stored_cap_width,0) + src.stored_start.transform = M_start + src.stored_continue.transform = M_continue + src.stored_end.transform = M_end + storage_start.overlays += src.stored_start + storage_start.overlays += src.stored_continue + storage_start.overlays += src.stored_end + + O.screen_loc = "4:[round((startpoint+endpoint)/2)+2],2:16" + O.maptext = "" + O.layer = 20 + + src.closer.screen_loc = "4:[storage_width+19],2:16" + return + /datum/numbered_display var/obj/item/sample_object var/number @@ -212,12 +279,14 @@ adjusted_contents++ numbered_contents.Add( new/datum/numbered_display(I) ) - //var/mob/living/carbon/human/H = user - var/row_num = 0 - var/col_count = min(7,storage_slots) -1 - if (adjusted_contents > 7) - row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. - src.standard_orient_objs(row_num, col_count, numbered_contents) + if(storage_slots == null) + src.space_orient_objs(numbered_contents) + else + var/row_num = 0 + var/col_count = min(7,storage_slots) -1 + if (adjusted_contents > 7) + row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. + src.slot_orient_objs(row_num, col_count, numbered_contents) return //This proc return 1 if the item can be picked up and 0 if it can't. @@ -227,7 +296,7 @@ if(src.loc == W) return 0 //Means the item is already in the storage item - if(contents.len >= storage_slots) + if(storage_slots != null && contents.len >= storage_slots) if(!stop_messages) usr << "[src] is full, make some space." return 0 //Storage item is full @@ -244,9 +313,9 @@ usr << "[src] cannot hold [W]." return 0 - if (W.w_class > max_w_class) + if (max_w_class != null && W.w_class > max_w_class) if(!stop_messages) - usr << "[W] is too big for this [src]." + usr << "[W] is too long for this [src]." return 0 var/total_storage_space = W.get_storage_cost() @@ -255,7 +324,7 @@ if(total_storage_space > max_storage_space) if(!stop_messages) - usr << "[src] is full, make some space." + usr << "[src] is too full, make some space." return 0 if(W.w_class >= src.w_class && (istype(W, /obj/item/weapon/storage))) @@ -418,12 +487,48 @@ else verbs -= /obj/item/weapon/storage/verb/toggle_gathering_mode + spawn(5) + var/total_storage_space = 0 + for(var/obj/item/I in contents) + total_storage_space += I.get_storage_cost() + max_storage_space = max(total_storage_space,max_storage_space) //prevents spawned containers from being too small for their contents + src.boxes = new /obj/screen/storage( ) src.boxes.name = "storage" src.boxes.master = src src.boxes.icon_state = "block" src.boxes.screen_loc = "7,7 to 10,8" src.boxes.layer = 19 + + src.storage_start = new /obj/screen/storage( ) + src.storage_start.name = "storage" + src.storage_start.master = src + src.storage_start.icon_state = "storage_start" + src.storage_start.screen_loc = "7,7 to 10,8" + src.storage_start.layer = 19 + src.storage_continue = new /obj/screen/storage( ) + src.storage_continue.name = "storage" + src.storage_continue.master = src + src.storage_continue.icon_state = "storage_continue" + src.storage_continue.screen_loc = "7,7 to 10,8" + src.storage_continue.layer = 19 + src.storage_end = new /obj/screen/storage( ) + src.storage_end.name = "storage" + src.storage_end.master = src + src.storage_end.icon_state = "storage_end" + src.storage_end.screen_loc = "7,7 to 10,8" + src.storage_end.layer = 19 + + src.stored_start = new /obj //we just need these to hold the icon + src.stored_start.icon_state = "stored_start" + src.stored_start.layer = 19 + src.stored_continue = new /obj + src.stored_continue.icon_state = "stored_continue" + src.stored_continue.layer = 19 + src.stored_end = new /obj + src.stored_end.icon_state = "stored_end" + src.stored_end.layer = 19 + src.closer = new /obj/screen/close( ) src.closer.master = src src.closer.icon_state = "x" @@ -481,4 +586,20 @@ return depth /obj/item/proc/get_storage_cost() - return 2**(w_class-1) //1,2,4,8,16,... + if (storage_cost) + return storage_cost + else + if(w_class == 1) + return 1 + if(w_class == 2) + return 2 + if(w_class == 3) + return 4 + if(w_class == 4) + return 8 + if(w_class == 5) + return 16 + else + return 1000 + + //return 2**(w_class-1) //1,2,4,8,16,... diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 11c2d6a8539..4bf67deaa0e 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -11,7 +11,7 @@ throw_range = 7 w_class = 4 max_w_class = 3 - max_storage_space = 14 //can hold 7 w_class-2 items or up to 3 w_class-3 items (with 1 w_class-2 item as change). + max_storage_space = 14 //enough to hold all starting contents origin_tech = list(TECH_COMBAT = 1) attack_verb = list("robusted") diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 6b3fdd04ae5..c24126a0db2 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -127,7 +127,6 @@ /obj/item/weapon/storage/box/syndie_kit/chameleon name = "chameleon kit" desc = "Comes with all the clothes you need to impersonate most people. Acting lessons sold seperately." - storage_slots = 10 /obj/item/weapon/storage/box/syndie_kit/chameleon/New() ..() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 1115826be80..dcdf91f4c38 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -77,13 +77,13 @@ var/list/slot_equipment_priority = list( \ // Try put it in their backpack if(istype(src.back,/obj/item/weapon/storage)) var/obj/item/weapon/storage/backpack = src.back - if(backpack.contents.len < backpack.storage_slots) - newitem.loc = src.back + if(backpack.can_be_inserted(newitem, 1)) + newitem.loc = backpack return 1 // Try to place it in any item that can store stuff, on the mob. for(var/obj/item/weapon/storage/S in src.contents) - if (S.contents.len < S.storage_slots) + if(S.can_be_inserted(newitem, 1)) newitem.loc = S return 1 return 0 diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 37133f7ff3d..4ef2ab4f49c 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -598,7 +598,7 @@ icon = 'icons/obj/lighting.dmi' force = 2 throwforce = 5 - w_class = 2 + w_class = 1 var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN var/base_state var/switchcount = 0 // number of times switched diff --git a/code/modules/research/xenoarchaeology/tools/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm index e16db119c55..6d281eeedb7 100644 --- a/code/modules/research/xenoarchaeology/tools/tools.dm +++ b/code/modules/research/xenoarchaeology/tools/tools.dm @@ -30,7 +30,6 @@ icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET w_class = 3 - storage_slots = 50 - max_storage_space = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class + max_storage_space = 200 max_w_class = 3 can_hold = list(/obj/item/weapon/fossil) diff --git a/html/changelogs/RavingManiac-PR-10095.yml b/html/changelogs/RavingManiac-PR-10095.yml new file mode 100644 index 00000000000..05c9267af93 --- /dev/null +++ b/html/changelogs/RavingManiac-PR-10095.yml @@ -0,0 +1,6 @@ +author: RavingManiac + +delete-after: True + +changes: + - rscadd: "Storage in backpacks, boxes and other containers is now capacity-based. Some containers like belts remain slot-based." diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi index 8181013f7ee1be7be12bec1c7496197e1c2a0c74..960bcfc32b2ecca9d5c5850d189136a6a6040a21 100644 GIT binary patch delta 13307 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 From 238406ae1d6ef4c0b2b9b6a7dd1b5391aadff7c6 Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Tue, 14 Jul 2015 19:52:46 +0800 Subject: [PATCH 02/55] Tweaks to storage items --- code/game/objects/items/weapons/storage/bags.dm | 6 +++--- code/game/objects/items/weapons/storage/fancy.dm | 3 ++- code/game/objects/items/weapons/storage/storage.dm | 3 ++- code/modules/research/xenoarchaeology/tools/tools.dm | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 8be4acb12c9..295c8db5b0b 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -74,7 +74,7 @@ icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET w_class = 3 - max_storage_space = 200 + max_storage_space = 100 max_w_class = 3 can_hold = list(/obj/item/weapon/ore) @@ -87,7 +87,7 @@ name = "plant bag" icon = 'icons/obj/hydroponics_machines.dmi' icon_state = "plantbag" - max_storage_space = 200 + max_storage_space = 100 max_w_class = 3 w_class = 2 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown) @@ -245,7 +245,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "cashbag" desc = "A bag for carrying lots of cash. It's got a big dollar sign printed on the front." - max_storage_space = 200 + max_storage_space = 100 max_w_class = 3 w_class = 2 can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash) diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index e352dd2c958..6f23e6f9501 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -46,6 +46,7 @@ icon_state = "eggbox" icon_type = "egg" name = "egg box" + storage_slots = 12 can_hold = list( /obj/item/weapon/reagent_containers/food/snacks/egg, /obj/item/weapon/reagent_containers/food/snacks/boiledegg @@ -53,7 +54,7 @@ /obj/item/weapon/storage/fancy/egg_box/New() ..() - for(var/i=1; i <= 12; i++) + for(var/i=1; i <= storage_slots; i++) new /obj/item/weapon/reagent_containers/food/snacks/egg(src) return diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 0bec6598b08..60cfa4e1bae 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -206,9 +206,10 @@ /obj/item/weapon/storage/proc/space_orient_objs(var/list/obj/item/display_contents) + var/baseline_max_storage_space = 28 //should be equal to backpack capacity var/storage_cap_width = 2 //length of sprite for storage box start and end var/stored_cap_width = 4 - var/storage_width = min(max_storage_space*8,284) + var/storage_width = min( round( 224 * max_storage_space/baseline_max_storage_space ,1) ,284) storage_start.overlays.Cut() diff --git a/code/modules/research/xenoarchaeology/tools/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm index 6d281eeedb7..bc9d0ca21f5 100644 --- a/code/modules/research/xenoarchaeology/tools/tools.dm +++ b/code/modules/research/xenoarchaeology/tools/tools.dm @@ -30,6 +30,6 @@ icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET w_class = 3 - max_storage_space = 200 + max_storage_space = 100 max_w_class = 3 can_hold = list(/obj/item/weapon/fossil) From 6633fb4e08f252a6b1a774a30e9b4fc52437998d Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Tue, 29 Dec 2015 00:33:34 -0500 Subject: [PATCH 03/55] Unit Tests Adds an example, edits Travis to run them. --- .travis.yml | 5 ++- baystation12.dme | 3 ++ code/__defines/unit_testing.dm | 10 +++++ code/_helpers/logging.dm | 4 ++ code/unit_tests/mob_tests.dm | 35 +++++++++++++++++ code/unit_tests/unit_test.dm | 72 ++++++++++++++++++++++++++++++++++ code/world.dm | 11 +++++- 7 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 code/__defines/unit_testing.dm create mode 100644 code/unit_tests/mob_tests.dm create mode 100644 code/unit_tests/unit_test.dm diff --git a/.travis.yml b/.travis.yml index eaf5ce5ac75..dd97bc8aebb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,5 +40,8 @@ script: - python tools/TagMatcher/tag-matcher.py ../.. - python tools/GenerateChangelog/ss13_genchangelog.py html/changelog.html html/changelogs - source $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin/byondsetup + - echo "#define UNIT_TEST 1" >> code/__defines/unit_testing.dm + - cp config/example/* config/ - DreamMaker baystation12.dme - + - DreamDaemon baystation12.dmb -invisible -trusted -core 2>&1 | tee log.txt + - grep "All Unit Tests Passed" log.txt diff --git a/baystation12.dme b/baystation12.dme index b2fadd2aaaf..09a2198fef2 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -10,6 +10,7 @@ #define DEBUG // END_PREFERENCES // BEGIN_INCLUDE +#include "code\__defines\unit_testing.dm" #include "code\_macros.dm" #include "code\global.dm" #include "code\hub.dm" @@ -1865,6 +1866,8 @@ #include "code\modules\wireless\interfaces.dm" #include "code\modules\xgm\xgm_gas_data.dm" #include "code\modules\xgm\xgm_gas_mixture.dm" +#include "code\unit_tests\unit_test.dm" +#include "code\unit_tests\mob_tests.dm" #include "code\ZAS\_docs.dm" #include "code\ZAS\Airflow.dm" #include "code\ZAS\Atom.dm" diff --git a/code/__defines/unit_testing.dm b/code/__defines/unit_testing.dm new file mode 100644 index 00000000000..88eebd5aec1 --- /dev/null +++ b/code/__defines/unit_testing.dm @@ -0,0 +1,10 @@ +/* + * + * This file is used by Travis to indicate that Unit Tests are to be ran. + * Do not add anything but the UNIT_TEST definition here as it will be overwritten by Travis when running tests. + * + * + * Should you wish to edit set UNIT_TEST to 1 like so: + * #define UNIT_TEST 1 + */ +#define UNIT_TEST 0 diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index f14d70c8385..294599d8023 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -85,6 +85,10 @@ /proc/log_misc(text) diary << "\[[time_stamp()]]MISC: [text][log_end]" +/proc/log_unit_test(text) + world.log << "## UNIT_TEST ##: [text]" + + //pretty print a direction bitflag, can be useful for debugging. /proc/print_dir(var/dir) var/list/comps = list() diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm new file mode 100644 index 00000000000..38f83352ae6 --- /dev/null +++ b/code/unit_tests/mob_tests.dm @@ -0,0 +1,35 @@ +datum/unit_test/human_breath + name = "Human Suffocates in Space" + var/starting_oxyloss = null + var/ending_oxyloss = null + var/mob/living/carbon/human/H + async = 1 + + +datum/unit_test/human_breath/start_test() + var/turf/T = locate(20,20,1) //TODO: Find better way. + + if(!istype(T, /turf/space)) //If the above isn't a space turf then we force it to find one will most likely pick 1,1,1 + T = locate(/turf/space) + + H = new(T) + + starting_oxyloss = H.oxyloss + + return + +datum/unit_test/human_breath/check_result() + + if(H.life_tick < 10) // Finish Condition + return 0 // Return 0 to try again later. + + ending_oxyloss = H.oxyloss + + if(starting_oxyloss < ending_oxyloss) + pass("Oxyloss = [ending_oxyloss]") + else + fail("Mob is not taking oxygen damage. Oxyloss is [ending_oxyloss]") + + qdel(H) + return 1 // return 1 to show we're done. + diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm new file mode 100644 index 00000000000..3da5bb7fe2c --- /dev/null +++ b/code/unit_tests/unit_test.dm @@ -0,0 +1,72 @@ +var/all_unit_tests_passed = 1 +var/failed_unit_tests = 0 +var/total_unit_tests = 0 + +datum/unit_test + var/name = "Fix Me" + var/success = 0 // Not currently used. + var/async = 0 // If the check can be left to do it's own thing, you must define a check_result() proc if you use this. + +datum/unit_test/proc/fail(var/message) + all_unit_tests_passed = 0 + log_unit_test(" *** FAILURE *** \[[name]\]: [message]") + +datum/unit_test/proc/pass(var/message) + success = 1 + log_unit_test("*** SUCCESS *** \[[name]\]: [message]") + +datum/unit_test/proc/start_test() + fail("No test proc.") + +datum/unit_test/proc/check_result() + fail("No check results") + return 1 + +proc/initialize_unit_tests() + log_unit_test("Initializing Unit Testing") + + // + //Start the Round. + // + + world.save_mode("extended") + + sleep(1) + + if(!ticker) + CRASH("No Ticker") + if(ticker.current_state == GAME_STATE_PREGAME) + ticker.current_state = GAME_STATE_SETTING_UP + else + CRASH("Game wasn't in pregame.") + + // + // Run Tests + // + + var/list/test_datums = typesof(/datum/unit_test) - /datum/unit_test + + var/testnum = 1 + var/list/test_running = list() + + for (var/test in test_datums) + var/datum/unit_test/d = new test() + log_unit_test("Now starting [d.name] [testnum++] of [test_datums.len]") + d.start_test() + if(d.async) + test_running.Add(d) + total_unit_tests++ + + while(test_running.len) + for(var/datum/unit_test/test in test_running) + if(test.check_result()) + test_running.Remove(test) + sleep(1) + + + if(all_unit_tests_passed) + log_unit_test("**** All Unit Tests Passed ****") + world.Del() + else + log_unit_test("**** \[[failed_unit_tests]\\[total_unit_tests]\] Unit Tests Failed ****") + world.Del() diff --git a/code/world.dm b/code/world.dm index 58651d8d3ca..0f8dc3bf65d 100644 --- a/code/world.dm +++ b/code/world.dm @@ -34,7 +34,7 @@ var/global/datum/global_init/init = new () -#define RECOMMENDED_VERSION 501 +#define RECOMMENDED_VERSION 508 /world/New() //logs var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day") @@ -64,7 +64,11 @@ var/global/datum/global_init/init = new () . = ..() +#if !UNIT_TEST sleep_offline = 1 +#elseif + log_unit_test("Continuing to load to run Unit Tests") +#endif // Set up roundstart seed list. plant_controller = new() @@ -99,6 +103,11 @@ var/global/datum/global_init/init = new () processScheduler.deferSetupFor(/datum/controller/process/ticker) processScheduler.setup() master_controller.setup() +#if UNIT_TEST + initialize_unit_tests() +#endif + + spawn(3000) //so we aren't adding to the round-start lag if(config.ToRban) From bc34fb7ba646c4895d165f1d03e7b4af3396b029 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Tue, 29 Dec 2015 09:57:50 -0500 Subject: [PATCH 04/55] Fixed travis.yml to have the correct redirection --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index dd97bc8aebb..9f2b639ba02 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ script: - python tools/TagMatcher/tag-matcher.py ../.. - python tools/GenerateChangelog/ss13_genchangelog.py html/changelog.html html/changelogs - source $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin/byondsetup - - echo "#define UNIT_TEST 1" >> code/__defines/unit_testing.dm + - echo "#define UNIT_TEST 1" > code/__defines/unit_testing.dm - cp config/example/* config/ - DreamMaker baystation12.dme - DreamDaemon baystation12.dmb -invisible -trusted -core 2>&1 | tee log.txt From 94eb03c5911aa282a5c699523098a37bf3bb4025 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Tue, 29 Dec 2015 17:03:24 -0500 Subject: [PATCH 05/55] Unit Test: Escape Shuttle ZAS check. + Templates --- baystation12.dme | 1 + code/unit_tests/_template.dm | 38 ++++++++++++++++++++++ code/unit_tests/mob_tests.dm | 27 +++++++++++++--- code/unit_tests/unit_test.dm | 63 ++++++++++++++++++++++++++---------- code/unit_tests/zas_tests.dm | 51 +++++++++++++++++++++++++++++ 5 files changed, 159 insertions(+), 21 deletions(-) create mode 100644 code/unit_tests/_template.dm create mode 100644 code/unit_tests/zas_tests.dm diff --git a/baystation12.dme b/baystation12.dme index 09a2198fef2..dde26884232 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1868,6 +1868,7 @@ #include "code\modules\xgm\xgm_gas_mixture.dm" #include "code\unit_tests\unit_test.dm" #include "code\unit_tests\mob_tests.dm" +#include "code/unit_tests\zas_tests.dm" #include "code\ZAS\_docs.dm" #include "code\ZAS\Airflow.dm" #include "code\ZAS\Atom.dm" diff --git a/code/unit_tests/_template.dm b/code/unit_tests/_template.dm new file mode 100644 index 00000000000..0eb879ef571 --- /dev/null +++ b/code/unit_tests/_template.dm @@ -0,0 +1,38 @@ +/* + * + * Unit Test Template + * This file is not used. + * + */ + +datum/unit_test/template + name = "Test Template - Change My name" // Set it's name. + + async = 1 // Set if we should continue testing elsewhere and come back and check on the results. + + +datum/unit_test/template/start_test() + // This must return something, if it's null the unit_test runner will think we runtimed. + // If your test requires any kind of delay use async so we can finish tests faster. + // Be sure and have a pass/fail procs in here if it's not using async. + + if(0) + fail("Zero is somehow True, that sucks") + else + pass("Zero is false, yay") + + + return 1 + +datum/unit_test/template/check_result() + // Only Ran if async is set. Use this proc for checking back if the test passed or not. + // Return 0 if we need to come back again and check this. + // Return 1 if the test is complete. + + // + + pass("Winner is you") + + return 1 + +// ============================================================================ diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index 38f83352ae6..fedab53706c 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -1,3 +1,14 @@ +/* + * + * Mob Unit Tests. + * Human suffocation in Space. + * Human + * + */ + +// +// Tests Life() and mob breathing in space. + datum/unit_test/human_breath name = "Human Suffocates in Space" var/starting_oxyloss = null @@ -14,16 +25,16 @@ datum/unit_test/human_breath/start_test() H = new(T) - starting_oxyloss = H.oxyloss + starting_oxyloss = H.getOxyLoss() - return + return 1 datum/unit_test/human_breath/check_result() if(H.life_tick < 10) // Finish Condition return 0 // Return 0 to try again later. - ending_oxyloss = H.oxyloss + ending_oxyloss = H.getOxyLoss() if(starting_oxyloss < ending_oxyloss) pass("Oxyloss = [ending_oxyloss]") @@ -32,4 +43,12 @@ datum/unit_test/human_breath/check_result() qdel(H) return 1 // return 1 to show we're done. - + +// ============================================================================ + +/* +datum/unit_test/human_cold + name "Human Reaction to Cold" + + var/turf/T = locate( +*/ diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index 3da5bb7fe2c..cd0fdfdfb09 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -4,15 +4,18 @@ var/total_unit_tests = 0 datum/unit_test var/name = "Fix Me" - var/success = 0 // Not currently used. - var/async = 0 // If the check can be left to do it's own thing, you must define a check_result() proc if you use this. + var/DISABLED = 0 // If we want to keep a unit test in the codebase but not run it for some reason. + var/async = 0 // If the check can be left to do it's own thing, you must define a check_result() proc if you use this. + var/reported = 0 datum/unit_test/proc/fail(var/message) all_unit_tests_passed = 0 - log_unit_test(" *** FAILURE *** \[[name]\]: [message]") + failed_unit_tests++ + reported = 1 + log_unit_test("*** FAILURE *** \[[name]\]: [message]") datum/unit_test/proc/pass(var/message) - success = 1 + reported = 1 log_unit_test("*** SUCCESS *** \[[name]\]: [message]") datum/unit_test/proc/start_test() @@ -24,7 +27,7 @@ datum/unit_test/proc/check_result() proc/initialize_unit_tests() log_unit_test("Initializing Unit Testing") - + // //Start the Round. // @@ -34,11 +37,18 @@ proc/initialize_unit_tests() sleep(1) if(!ticker) - CRASH("No Ticker") + crash_with("No Ticker") + world.Del() + if(ticker.current_state == GAME_STATE_PREGAME) ticker.current_state = GAME_STATE_SETTING_UP else - CRASH("Game wasn't in pregame.") + crash_with("Game wasn't in pregame.") + world.Del() + + + log_unit_test("Waiting 10 seconds for roundstart functions to finish") + sleep(100) // // Run Tests @@ -46,26 +56,45 @@ proc/initialize_unit_tests() var/list/test_datums = typesof(/datum/unit_test) - /datum/unit_test + var/testnum = 1 - var/list/test_running = list() + var/list/async_test = list() + var/list/started_tests = list() for (var/test in test_datums) var/datum/unit_test/d = new test() - log_unit_test("Now starting [d.name] [testnum++] of [test_datums.len]") - d.start_test() - if(d.async) - test_running.Add(d) - total_unit_tests++ + log_unit_test("Now starting \[[d.name]\] [testnum++] of [test_datums.len]") - while(test_running.len) - for(var/datum/unit_test/test in test_running) + if(isnull(d.start_test())) // Start the test. + d.fail("Test Runtimed") + if(d.async) // If it's async then we'll need to check back on it later. + async_test.Add(d) + total_unit_tests++ + + + + // + // Check the async tests to see if they are finished. + // + + while(async_test.len) + for(var/datum/unit_test/test in async_test) if(test.check_result()) - test_running.Remove(test) + async_test.Remove(test) sleep(1) + // + // Make sure all Unit Tests reported a result + // + + for(var/datum/unit_test/test in started_tests) + if(!test.reported) + test.fail("Test failed to report a result.") + + if(all_unit_tests_passed) - log_unit_test("**** All Unit Tests Passed ****") + log_unit_test("**** All Unit Tests Passed \[[total_unit_tests]\] ****") world.Del() else log_unit_test("**** \[[failed_unit_tests]\\[total_unit_tests]\] Unit Tests Failed ****") diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm new file mode 100644 index 00000000000..fcb1d9f4831 --- /dev/null +++ b/code/unit_tests/zas_tests.dm @@ -0,0 +1,51 @@ +/* + * + * Zas Unit Tests. + * Shuttle Pressurized. + * + * + */ + +// +// Tests Life() and mob breathing in space. + +datum/unit_test/zas_shuttle_pressure + name = "Escape Shuttle Pressurized" + +datum/unit_test/zas_shuttle_pressure/start_test() + //This needs to be broken down into a helper proc. + var/area/A = locate(/area/shuttle/escape/centcom) + + if(!istype(A, /area/shuttle/escape/centcom)) + fail("Unable to get /area/shuttle/escape/centcom") + + var/list/GM_checked = list() + + for(var/turf/simulated/T in A) + + if(!istype(T) || isnull(T.zone) || istype(T, /turf/simulated/floor/airless)) + continue + if(T.zone.air in GM_checked) + continue + + var/datum/gas_mixture/GM = T.return_air() + + var/pressure = GM.return_pressure() + + if(abs(pressure - ONE_ATMOSPHERE) > 10) + fail("Pressure out of bounds: [pressure]") + return 0 + + var/temp = GM.temperature + + if(abs(temp - T20C) > 10) + fail("Temperature out of bounds: [temp]") + return 0 + + GM_checked.Add(GM) + + + pass("Pass. Checked [GM_checked.len] zones") + return 1 + +// ============================================================================ From 997a6c66fd30db69f7d336c87601f877ab645f29 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Tue, 29 Dec 2015 19:34:51 -0500 Subject: [PATCH 06/55] Adds Supply Shuttle Unit Tests. Moves the Supply Shuttle and tests air in both locations. turned the air test into a "helper" proc. Changed the world.dm message when unit testing is enabled so folks aren't caught off guard when the server shutsdown after testing. --- code/unit_tests/mob_tests.dm | 2 +- code/unit_tests/unit_test.dm | 6 +- code/unit_tests/zas_tests.dm | 106 +++++++++++++++++++++++++++++------ code/world.dm | 3 +- 4 files changed, 96 insertions(+), 21 deletions(-) diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index fedab53706c..7bd1eca150d 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -10,7 +10,7 @@ // Tests Life() and mob breathing in space. datum/unit_test/human_breath - name = "Human Suffocates in Space" + name = "Mob: Human Suffocates in Space" var/starting_oxyloss = null var/ending_oxyloss = null var/mob/living/carbon/human/H diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index cd0fdfdfb09..b50e6a5c913 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -47,7 +47,7 @@ proc/initialize_unit_tests() world.Del() - log_unit_test("Waiting 10 seconds for roundstart functions to finish") + log_unit_test("Waiting 10 seconds or more for roundstart functions to finish") sleep(100) // @@ -57,13 +57,13 @@ proc/initialize_unit_tests() var/list/test_datums = typesof(/datum/unit_test) - /datum/unit_test - var/testnum = 1 + //var/testnum = 1 var/list/async_test = list() var/list/started_tests = list() for (var/test in test_datums) var/datum/unit_test/d = new test() - log_unit_test("Now starting \[[d.name]\] [testnum++] of [test_datums.len]") + //log_unit_test("Now starting \[[d.name]\] [testnum++] of [test_datums.len]") if(isnull(d.start_test())) // Start the test. d.fail("Test Runtimed") diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm index fcb1d9f4831..a4435fc4a76 100644 --- a/code/unit_tests/zas_tests.dm +++ b/code/unit_tests/zas_tests.dm @@ -7,17 +7,30 @@ */ // -// Tests Life() and mob breathing in space. +// Tests Pressurization of known problem areas. -datum/unit_test/zas_shuttle_pressure - name = "Escape Shuttle Pressurized" +datum/unit_test/zas_escape_shuttle + name = "ZAS: Escape Shuttle" -datum/unit_test/zas_shuttle_pressure/start_test() - //This needs to be broken down into a helper proc. - var/area/A = locate(/area/shuttle/escape/centcom) +datum/unit_test/zas_escape_shuttle/start_test() + var/list/result = test_air_in_area("/area/shuttle/escape/centcom") + if(isnull(result)) + fail("Check Runtimed") - if(!istype(A, /area/shuttle/escape/centcom)) - fail("Unable to get /area/shuttle/escape/centcom") + if(result["success"]) + pass(result["msg"]) + else + fail(result["msg"]) + return 1 + +// ============================================================================ + +proc/test_air_in_area(var/A_txt) + var/test_area = text2path(A_txt) + var/area/A = locate(test_area) + + if(!istype(A, test_area)) + return(list("success" = 0, "msg" = "Unable to get [A_txt]")) var/list/GM_checked = list() @@ -33,19 +46,80 @@ datum/unit_test/zas_shuttle_pressure/start_test() var/pressure = GM.return_pressure() if(abs(pressure - ONE_ATMOSPHERE) > 10) - fail("Pressure out of bounds: [pressure]") - return 0 - + return(list("success" = 0, "msg" = "Pressure out of bounds: [pressure]")) + var/temp = GM.temperature if(abs(temp - T20C) > 10) - fail("Temperature out of bounds: [temp]") - return 0 + return(list("success" = 0, "msg" = "Temperature out of bounds: [temp]")) GM_checked.Add(GM) - - pass("Pass. Checked [GM_checked.len] zones") + if(GM_checked.len) + return(list("success"=1, "msg" = "Checked [GM_checked.len] zones")) + else + return(list("success"=0, "msg" = "No zones checked.")) + + +datum/unit_test/zas_supply_shuttle_centcomm + name = "ZAS: Supply Shuttle (At CentComm)" + +datum/unit_test/zas_supply_shuttle_centcomm/start_test() + var/list/result = test_air_in_area("/area/supply/dock") + if(isnull(result)) + fail("Check Runtimed") + return 1 + + if(result["success"]) + pass(result["msg"]) + else + fail(result["msg"]) return 1 -// ============================================================================ +datum/unit_test/zas_supply_shuttle_moved + name = "ZAS: Supply Shuttle (When Moved)" + + async=1 // We're moving the shuttle using built in procs. + + var/datum/shuttle/ferry/supply/Shuttle = null + +datum/unit_test/zas_supply_shuttle_moved/start_test() + + if(!shuttle_controller || !shuttle_controller.shuttles.len) + fail("Shuttle Controller not setup at time of test.") + + Shuttle = shuttle_controller.shuttles["Supply"] + supply_controller.movetime = 5 // Speed up the shuttle movement. + + if(isnull(Shuttle)) + fail("Unable to locate the supply shuttle") + + // Initiate the Move. + Shuttle.short_jump(Shuttle.area_offsite, Shuttle.area_station) + + sleep(20) // Give the shuttle some time to do it's thing. + + return 1 + +datum/unit_test/zas_supply_shuttle_moved/check_result() + if(Shuttle.moving_status == SHUTTLE_IDLE && !Shuttle.at_station()) + fail("Shuttle Did not Move") + return 1 + + if(!Shuttle.at_station()) + return 0 + + sleep(20) // Give ZAS a chance to catchup. + + var/list/result = test_air_in_area("/area/supply/station") + if(isnull(result)) + fail("Check Runtimed") + return 1 + + if(result["success"]) + pass(result["msg"]) + else + fail(result["msg"]) + return 1 + + diff --git a/code/world.dm b/code/world.dm index 0f8dc3bf65d..4b39076cd9e 100644 --- a/code/world.dm +++ b/code/world.dm @@ -67,7 +67,8 @@ var/global/datum/global_init/init = new () #if !UNIT_TEST sleep_offline = 1 #elseif - log_unit_test("Continuing to load to run Unit Tests") + log_unit_test("Unit Tests Enabled. This will destroy the world when testing is complete.") + log_unit_test("If you did not intend to enable this please check code/__defines/unit_testing.dm") #endif // Set up roundstart seed list. From c159656dab04ec889901657d561738e770a0a963 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Wed, 30 Dec 2015 10:14:53 -0500 Subject: [PATCH 07/55] Removed text2path. Kudos PsiOmegaDelta --- code/unit_tests/zas_tests.dm | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm index a4435fc4a76..3c7b86f2a7a 100644 --- a/code/unit_tests/zas_tests.dm +++ b/code/unit_tests/zas_tests.dm @@ -13,7 +13,7 @@ datum/unit_test/zas_escape_shuttle name = "ZAS: Escape Shuttle" datum/unit_test/zas_escape_shuttle/start_test() - var/list/result = test_air_in_area("/area/shuttle/escape/centcom") + var/list/result = test_air_in_area(/area/shuttle/escape/centcom) if(isnull(result)) fail("Check Runtimed") @@ -23,14 +23,13 @@ datum/unit_test/zas_escape_shuttle/start_test() fail(result["msg"]) return 1 -// ============================================================================ +// ================================================================================================== -proc/test_air_in_area(var/A_txt) - var/test_area = text2path(A_txt) +proc/test_air_in_area(var/test_area) var/area/A = locate(test_area) if(!istype(A, test_area)) - return(list("success" = 0, "msg" = "Unable to get [A_txt]")) + return(list("success" = 0, "msg" = "Unable to get [test_area]")) var/list/GM_checked = list() @@ -61,11 +60,13 @@ proc/test_air_in_area(var/A_txt) return(list("success"=0, "msg" = "No zones checked.")) +// ================================================================================================== + datum/unit_test/zas_supply_shuttle_centcomm name = "ZAS: Supply Shuttle (At CentComm)" datum/unit_test/zas_supply_shuttle_centcomm/start_test() - var/list/result = test_air_in_area("/area/supply/dock") + var/list/result = test_air_in_area(/area/supply/dock) if(isnull(result)) fail("Check Runtimed") return 1 @@ -76,6 +77,8 @@ datum/unit_test/zas_supply_shuttle_centcomm/start_test() fail(result["msg"]) return 1 +// ================================================================================================== + datum/unit_test/zas_supply_shuttle_moved name = "ZAS: Supply Shuttle (When Moved)" @@ -111,7 +114,7 @@ datum/unit_test/zas_supply_shuttle_moved/check_result() sleep(20) // Give ZAS a chance to catchup. - var/list/result = test_air_in_area("/area/supply/station") + var/list/result = test_air_in_area(/area/supply/station) if(isnull(result)) fail("Check Runtimed") return 1 From 218c84064bafa10c83e10425629dba72272849ed Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Thu, 31 Dec 2015 03:22:27 -0500 Subject: [PATCH 08/55] Updated ZAS unit test to be more re-useable. Went nuts adding some. This will fail travis due to some existing bugs. --- code/unit_tests/mob_tests.dm | 8 +- code/unit_tests/unit_test.dm | 30 ++++---- code/unit_tests/zas_tests.dm | 140 ++++++++++++++++++++++++++++------- 3 files changed, 131 insertions(+), 47 deletions(-) diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index 7bd1eca150d..9ceb0c74a21 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -10,7 +10,7 @@ // Tests Life() and mob breathing in space. datum/unit_test/human_breath - name = "Mob: Human Suffocates in Space" + name = "MOB: Human Suffocates in Space" var/starting_oxyloss = null var/ending_oxyloss = null var/mob/living/carbon/human/H @@ -46,9 +46,3 @@ datum/unit_test/human_breath/check_result() // ============================================================================ -/* -datum/unit_test/human_cold - name "Human Reaction to Cold" - - var/turf/T = locate( -*/ diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index b50e6a5c913..bdff6e88462 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -4,8 +4,8 @@ var/total_unit_tests = 0 datum/unit_test var/name = "Fix Me" - var/DISABLED = 0 // If we want to keep a unit test in the codebase but not run it for some reason. - var/async = 0 // If the check can be left to do it's own thing, you must define a check_result() proc if you use this. + var/disabled = 0 // If we want to keep a unit test in the codebase but not run it for some reason. + var/async = 0 // If the check can be left to do it's own thing, you must define a check_result() proc if you use this. var/reported = 0 datum/unit_test/proc/fail(var/message) @@ -32,22 +32,24 @@ proc/initialize_unit_tests() //Start the Round. // - world.save_mode("extended") - - sleep(1) - if(!ticker) crash_with("No Ticker") world.Del() - if(ticker.current_state == GAME_STATE_PREGAME) - ticker.current_state = GAME_STATE_SETTING_UP - else - crash_with("Game wasn't in pregame.") - world.Del() + var/said_msg = 0 + while(ticker.pregame_timeleft && ticker.pregame_timeleft > 160) // Make sure the initial startup is complete. + if(ticker.pregame_timeleft > 178 && !said_msg) + said_msg = 1 + log_unit_test("Pregame Count down has started, giving it 20 seconds to finish.") + sleep(1) + world.save_mode("extended") - log_unit_test("Waiting 10 seconds or more for roundstart functions to finish") + sleep(1) + + ticker.current_state = GAME_STATE_SETTING_UP + + log_unit_test("RoundStart: waiting 10 seconds to start tests.") sleep(100) // @@ -57,13 +59,13 @@ proc/initialize_unit_tests() var/list/test_datums = typesof(/datum/unit_test) - /datum/unit_test - //var/testnum = 1 var/list/async_test = list() var/list/started_tests = list() + log_unit_test("Testing Started.") + for (var/test in test_datums) var/datum/unit_test/d = new test() - //log_unit_test("Now starting \[[d.name]\] [testnum++] of [test_datums.len]") if(isnull(d.start_test())) // Start the test. d.fail("Test Runtimed") diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm index 3c7b86f2a7a..877744b2ba2 100644 --- a/code/unit_tests/zas_tests.dm +++ b/code/unit_tests/zas_tests.dm @@ -6,14 +6,22 @@ * */ +#define UT_NORMAL 1 // Standard one atmosphere 20celsius +#define UT_VACUME 2 // Vacume on simulated turfs +#define UT_NORMAL_COLD 3 // Cold but standard atmosphere. + +// +// Generic check for an area. // -// Tests Pressurization of known problem areas. -datum/unit_test/zas_escape_shuttle - name = "ZAS: Escape Shuttle" +datum/unit_test/zas_area_test + name = "ZAS: Area Test Template" + disabled = 1 // For all child objects we have to put 0 so the test runs + var/area_path = null // Put the area you are testing here. + var/expectation = UT_NORMAL // If the area is supposed to be a vacume set to 1 -datum/unit_test/zas_escape_shuttle/start_test() - var/list/result = test_air_in_area(/area/shuttle/escape/centcom) +datum/unit_test/zas_area_test/start_test() + var/list/result = test_air_in_area(area_path, expectation) if(isnull(result)) fail("Check Runtimed") @@ -25,7 +33,10 @@ datum/unit_test/zas_escape_shuttle/start_test() // ================================================================================================== -proc/test_air_in_area(var/test_area) +// +// The primary helper proc. +// +proc/test_air_in_area(var/test_area, var/expectation = UT_NORMAL) var/area/A = locate(test_area) if(!istype(A, test_area)) @@ -40,17 +51,32 @@ proc/test_air_in_area(var/test_area) if(T.zone.air in GM_checked) continue + var/t_msg = "Turf: [T] | Location: [T.x] // [T.y] // [T.z]" + var/datum/gas_mixture/GM = T.return_air() - var/pressure = GM.return_pressure() - - if(abs(pressure - ONE_ATMOSPHERE) > 10) - return(list("success" = 0, "msg" = "Pressure out of bounds: [pressure]")) - var/temp = GM.temperature - if(abs(temp - T20C) > 10) - return(list("success" = 0, "msg" = "Temperature out of bounds: [temp]")) + switch(expectation) + + if(UT_VACUME) + if(pressure > 10) + return(list("success" = 0, "msg" = "Pressure out of bounds: [pressure] | [t_msg]")) + + + if(UT_NORMAL || UT_NORMAL_COLD) + if(abs(pressure - ONE_ATMOSPHERE) > 10) + return(list("success" = 0, "msg" = "Pressure out of bounds: [pressure] | [t_msg]")) + + if(expectation == UT_NORMAL) + + if(abs(temp - T20C) > 10) + return(list("success" = 0, "msg" = "Temperature out of bounds: [temp] | [t_msg]")) + + if(expectation == UT_NORMAL_COLD) + + if(temp > 120) + return(list("success" = 0, "msg" = "Temperature out of bounds: [temp] | [t_msg]")) GM_checked.Add(GM) @@ -62,23 +88,83 @@ proc/test_air_in_area(var/test_area) // ================================================================================================== -datum/unit_test/zas_supply_shuttle_centcomm - name = "ZAS: Supply Shuttle (At CentComm)" +datum/unit_test/zas_area_test/supply_centcomm + name = "ZAS: Supply Shuttle (CentComm)" + area_path = /area/supply/dock + disabled = 0 -datum/unit_test/zas_supply_shuttle_centcomm/start_test() - var/list/result = test_air_in_area(/area/supply/dock) - if(isnull(result)) - fail("Check Runtimed") - return 1 +datum/unit_test/zas_area_test/emergency_shuttle + name = "ZAS: Emergency Shuttle" + area_path = /area/shuttle/escape/centcom + disabled = 0 + +datum/unit_test/zas_area_test/ai_chamber + name = "ZAS: AI Chamber" + area_path = /area/turret_protected/ai + disabled = 0 + +datum/unit_test/zas_area_test/arrival_maint + name = "ZAS: Arrival Maintenance" + area_path = /area/maintenance/arrivals + disabled = 0 + +datum/unit_test/zas_area_test/mining_shuttle_at_station + name = "ZAS: Mining Shuttle (Station)" + area_path = /area/shuttle/mining/station + disabled = 0 + +datum/unit_test/zas_area_test/ + name = "ZAS: Cargo Maintenance" + area_path = /area/maintenance/cargo + disabled = 0 + +datum/unit_test/zas_area_test/eng_shuttle + name = "ZAS: Construction Site Shuttle (Station)" + area_path = /area/shuttle/constructionsite/station + disabled = 0 + +datum/unit_test/zas_area_test/incinerator + name = "ZAS: Incinerator" + area_path = /area/maintenance/incinerator + disabled = 1 //Failing currently for existing bug: #11846 + +datum/unit_test/zas_area_test/virology + name = "ZAS: Virology" + area_path = /area/medical/virology + disabled = 0 + +datum/unit_test/zas_area_test/xenobio + name = "ZAS: Xenobiology" + area_path = /area/rnd/xenobiology + disabled = 0 + +datum/unit_test/zas_area_test/research_maint_starboard + name = "ZAS: Research Starboard Maintenance" + area_path = /area/maintenance/research_starboard + disabled = 0 + +datum/unit_test/zas_area_test/west_hall_mining_outpost + name = "ZAS: Mining outpost West Hallway" + area_path = /area/outpost/mining_main/west_hall + disabled = 0 + +datum/unit_test/zas_area_test/mining_area + name = "ZAS: Mining Area (Vacume)" + area_path = /area/mine/explored + disabled = 0 + expectation = UT_VACUME + +datum/unit_test/zas_area_test/ + name = "ZAS: Cargo Bay" + area_path = /area/quartermaster/storage + disabled = 0 - if(result["success"]) - pass(result["msg"]) - else - fail(result["msg"]) - return 1 // ================================================================================================== + +// Here we move a shuttle then test it's area once the shuttle has arrived. + datum/unit_test/zas_supply_shuttle_moved name = "ZAS: Supply Shuttle (When Moved)" @@ -125,4 +211,6 @@ datum/unit_test/zas_supply_shuttle_moved/check_result() fail(result["msg"]) return 1 - +#undef UT_NORMAL +#undef UT_VACUME +#undef UT_NORMAL_COLD From e084244a6aadd7030c824953a1c5e1858e747a54 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Thu, 31 Dec 2015 03:43:06 -0500 Subject: [PATCH 09/55] Vacuum not Vacume. --- code/unit_tests/unit_test.dm | 6 +++++- code/unit_tests/zas_tests.dm | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index bdff6e88462..f08121af298 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -38,7 +38,7 @@ proc/initialize_unit_tests() var/said_msg = 0 while(ticker.pregame_timeleft && ticker.pregame_timeleft > 160) // Make sure the initial startup is complete. - if(ticker.pregame_timeleft > 178 && !said_msg) + if(ticker.pregame_timeleft < 178 && !said_msg) said_msg = 1 log_unit_test("Pregame Count down has started, giving it 20 seconds to finish.") sleep(1) @@ -66,6 +66,10 @@ proc/initialize_unit_tests() for (var/test in test_datums) var/datum/unit_test/d = new test() + + if(d.disabled) + qdel(d) + continue if(isnull(d.start_test())) // Start the test. d.fail("Test Runtimed") diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm index 877744b2ba2..b07f31dcd34 100644 --- a/code/unit_tests/zas_tests.dm +++ b/code/unit_tests/zas_tests.dm @@ -7,7 +7,7 @@ */ #define UT_NORMAL 1 // Standard one atmosphere 20celsius -#define UT_VACUME 2 // Vacume on simulated turfs +#define UT_VACUUM 2 // Vacume on simulated turfs #define UT_NORMAL_COLD 3 // Cold but standard atmosphere. // @@ -59,7 +59,7 @@ proc/test_air_in_area(var/test_area, var/expectation = UT_NORMAL) switch(expectation) - if(UT_VACUME) + if(UT_VACUUM) if(pressure > 10) return(list("success" = 0, "msg" = "Pressure out of bounds: [pressure] | [t_msg]")) @@ -152,7 +152,7 @@ datum/unit_test/zas_area_test/mining_area name = "ZAS: Mining Area (Vacume)" area_path = /area/mine/explored disabled = 0 - expectation = UT_VACUME + expectation = UT_VACUUM datum/unit_test/zas_area_test/ name = "ZAS: Cargo Bay" @@ -212,5 +212,5 @@ datum/unit_test/zas_supply_shuttle_moved/check_result() return 1 #undef UT_NORMAL -#undef UT_VACUME +#undef UT_VACUUM #undef UT_NORMAL_COLD From 9d9eee35ef266c4906cb487163373bcaebdc94f2 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Thu, 31 Dec 2015 11:18:00 -0500 Subject: [PATCH 10/55] Made failed unit tests a little more noticeable. --- code/unit_tests/unit_test.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index f08121af298..87a0fef73ee 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -12,7 +12,7 @@ datum/unit_test/proc/fail(var/message) all_unit_tests_passed = 0 failed_unit_tests++ reported = 1 - log_unit_test("*** FAILURE *** \[[name]\]: [message]") + log_unit_test("!!! FAILURE !!! \[[name]\]: [message]") datum/unit_test/proc/pass(var/message) reported = 1 From 4d24790c2e7ea48862556b83666dfd294011e7a7 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Thu, 31 Dec 2015 13:08:05 -0500 Subject: [PATCH 11/55] Unit Tests now sets some config options if they aren't already set. --- code/unit_tests/unit_test.dm | 12 +++++++++++- code/world.dm | 6 ++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index 87a0fef73ee..293d1e9648a 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -22,9 +22,19 @@ datum/unit_test/proc/start_test() fail("No test proc.") datum/unit_test/proc/check_result() - fail("No check results") + fail("No check results proc") return 1 + +proc/load_unit_test_changes() + + if(config.generate_asteroid != 1) + log_unit_test("Overiding Configuration option for Asteroid Generation") + config.generate_asteroid = 1 // The default map requires it, the example config doesn't have this enabled. + + + + proc/initialize_unit_tests() log_unit_test("Initializing Unit Testing") diff --git a/code/world.dm b/code/world.dm index 4b39076cd9e..67a2e48c547 100644 --- a/code/world.dm +++ b/code/world.dm @@ -65,10 +65,16 @@ var/global/datum/global_init/init = new () . = ..() #if !UNIT_TEST + sleep_offline = 1 + #elseif + log_unit_test("Unit Tests Enabled. This will destroy the world when testing is complete.") log_unit_test("If you did not intend to enable this please check code/__defines/unit_testing.dm") + + load_unit_test_changes() + #endif // Set up roundstart seed list. From 2a44128b785ea223db46bd8351d24352846323e6 Mon Sep 17 00:00:00 2001 From: Kearel Date: Thu, 31 Dec 2015 17:54:25 -0600 Subject: [PATCH 12/55] Modifications to actor verb, orion trail, and board game. Orion Trail only works when power is on now. 'Join as Actor' verb will now prompt you to make sure. Boardgame can now be picked up by those viewing it (makes it easier to view) --- code/game/antagonist/outsider/actors.dm | 3 +++ code/game/machinery/computer/arcade_orion.dm | 2 ++ code/modules/games/boardgame.dm | 18 +++++++++++++----- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/code/game/antagonist/outsider/actors.dm b/code/game/antagonist/outsider/actors.dm index 013d7348fb4..7d5deb39e76 100644 --- a/code/game/antagonist/outsider/actors.dm +++ b/code/game/antagonist/outsider/actors.dm @@ -48,6 +48,9 @@ var/datum/antagonist/actor/actor if(!MayRespawn(1)) return + var/choice = alert("Are you sure you'd like to join as an actor?", "Confirmation","Yes", "No") + if(choice != "Yes") + return if(istype(usr,/mob/dead/observer) || istype(usr,/mob/new_player)) if(actor.current_antagonists.len >= actor.hard_cap) diff --git a/code/game/machinery/computer/arcade_orion.dm b/code/game/machinery/computer/arcade_orion.dm index 32fe89966fb..b713e69fb2d 100644 --- a/code/game/machinery/computer/arcade_orion.dm +++ b/code/game/machinery/computer/arcade_orion.dm @@ -85,6 +85,8 @@ view = ORION_VIEW_MAIN /obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user) + if(..()) + return var/dat = "" if(event == null) newgame() diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index a5c11902889..56f8c968a53 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -1,8 +1,3 @@ -/*TODO: - implement icon loading that is efficient using browse_rsc - implement being able to move pieces -*/ - /obj/item/weapon/board name = "board" desc = "A standard 12' checkerboard. Well used." @@ -14,6 +9,13 @@ var/board = list() var/selected = -1 +/obj/item/weapon/board/New() + ..() + var i + for(i = 0; i < 12; i++) + new /obj/item/weapon/checker(src.loc) + new /obj/item/weapon/checker/red(src.loc) + /obj/item/weapon/board/examine(mob/user, var/distance = -1) if(in_range(user,src)) user.set_machine(src) @@ -21,6 +23,12 @@ return ..() +/obj/item/weapon/board/attack_hand(mob/living/carbon/human/M as mob) + if(M.machine == src) + ..() + else + src.examine(M) + obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob) if(I.w_class != 1) //only small stuff user.show_message("\The [I] is too big to be used as a board piece.") From bd083ca164de81db6141034ac063ad71e2b336c8 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Fri, 1 Jan 2016 23:33:13 +0100 Subject: [PATCH 13/55] Fixes random floor plating in the primary tool storage and HoP's office. --- maps/exodus-1.dmm | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 0c9ee108997..4a3aef8be1a 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -1567,7 +1567,7 @@ "aEg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/dark,/area/gateway) "aEh" = (/obj/structure/table/woodentable,/obj/machinery/reagentgrinder,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/packageWrap,/obj/machinery/camera/network/civilian_east{c_tag = "Bar Backroom"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aEi" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/gateway) -"aEj" = (/obj/machinery/vending/tool,/turf/simulated/floor,/area/storage/primary) +"aEj" = (/obj/machinery/vending/tool,/turf/simulated/floor/tiled,/area/storage/primary) "aEk" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hardsuits"; req_one_access = list(11,24)},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) "aEl" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) "aEm" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/eva) @@ -1650,7 +1650,7 @@ "aFL" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/fore) "aFM" = (/obj/structure/bed/chair{dir = 8},/obj/effect/landmark{name = "JoinLate"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aFN" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/corner/blue{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) -"aFO" = (/obj/machinery/lapvend,/turf/simulated/floor,/area/storage/primary) +"aFO" = (/obj/machinery/lapvend,/turf/simulated/floor/tiled,/area/storage/primary) "aFP" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) "aFQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/maintenance/dormitory) "aFR" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/sensor{name = "Powernet Sensor - Civilian East Subgrid"; name_tag = "Civilian East Subgrid"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) @@ -1813,7 +1813,7 @@ "aIS" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Dormitory"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "aIT" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) "aIU" = (/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) -"aIV" = (/obj/structure/table/standard,/obj/machinery/light{dir = 4},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/storage/primary) +"aIV" = (/obj/structure/table/standard,/obj/machinery/light{dir = 4},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor/tiled,/area/storage/primary) "aIW" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/evahallway) "aIX" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/evahallway) "aIY" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) @@ -1889,7 +1889,7 @@ "aKq" = (/obj/machinery/suit_cycler/mining,/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/eva) "aKr" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) "aKs" = (/obj/structure/reagent_dispensers/fueltank,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) -"aKt" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor,/area/storage/primary) +"aKt" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/tiled,/area/storage/primary) "aKu" = (/turf/simulated/wall/r_wall,/area/hallway/primary/port) "aKv" = (/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aKw" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) @@ -1911,7 +1911,7 @@ "aKM" = (/obj/machinery/light,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) "aKN" = (/obj/machinery/door/airlock{name = "Bar Backroom"; req_access = list(25)},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/lino,/area/crew_quarters/bar) "aKO" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/bar) -"aKP" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/storage/primary) +"aKP" = (/obj/machinery/door/airlock/command{id_tag = "hopdoor"; name = "Head of Personnel"; req_access = list(57)},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "aKQ" = (/obj/structure/closet/chefcloset,/obj/machinery/light/small{dir = 1},/obj/item/device/eftpos{eftpos_name = "Kitchen EFTPOS scanner"},/obj/item/glass_jar,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) "aKR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/chapel/main) "aKS" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) @@ -4465,7 +4465,6 @@ "bHS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - South Southwest"},/obj/structure/sign/securearea{pixel_y = 32},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bHT" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bHU" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) -"bHV" = (/obj/machinery/door/airlock/command{id_tag = "hopdoor"; name = "Head of Personnel"; req_access = list(57)},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/crew_quarters/heads/hop) "bHW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bHX" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bHY" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) @@ -7425,7 +7424,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDhaDgaDKaDgaDgaDiaDjaDgaDgaDKaDlaDkaBIaDnaDoaBLaDtaDraDxaDwaDIaDzaCEavHaDXauQaAFaAFawfaDZaCMaDJaDMaDLaDOaDNaChaDPaDTaDSaEjaCMaafaBYaDUaDUaDWaDUaEaaBYaafazJazOazPaEeaEbaEgaEfaEiazPazQaEuayLazwazyaEkaElaBQaEnaEmaAIaEoaEAaEpaEparAazUayuaywarEaAiaCmaCmaCmaCmaCmaEraEqatEaEsaEtaEtaExaEwaEtaEyaEBaBjaEPaEQaERaFZaETawgaDsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaDCaBsaBqaDCaECaSGaEDaFdaFdaFdaFdaFeaFfaFgaFgaFgaFgaFgaFgaFgawiawoaEGaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaDhaDlaDgaEHaGqaFlaFmaGraFoaFpaGxaFlaGHaEJaEIaEKaDnaELaBLaENaEMaESaEOaESaEUaGPavHawVawNaFxawXawZaFhaHdaFkaFqaFnaFnaFnaFraFnaFnaFsaFOaCMaaaaBYaFtaDUaFvaDUaFyaBYaaaazJazOazPaFEaFAaFFaFAaFGazPazQaFWayLayLayLayLaDRaBQaCbazyaBQaFIaFJazyaFKarAaFNaFLaFParEaFQaDeaDvaDuaFRaDeaFTaFSaFVaFUaFXaBjaBjaBjaBjaBjaBjaGnaGoaGpaDVaDpaInaIlaDsaDsaDsaDsaDsaDsaDsaDsaDsaFaaFbaDsaDsaFaaGtaDsaDsaaaaaaaDsaDCaDCaDCaDCaEZaEWaFdaFcaFwaDCaDCaDCaDCaDCaxdaJRaGFaGFaGFaGFaGFaGFaGGaGGaIzaGGaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaEJaFYaIDaGaaFlaFMaFlaFMaFlaFMaFlaFMaFlaGbaEIaGcaDnaELaBLaGfaGdaGjaGhaGmaFHaCEaFBaFDaFCaFCaFCbazaIKaFCaGuaFnaFnaFnaFnaFnaFnaFnaFsaIVaCMaafaBYaDUaGvaGDaGzaGIaBYaafazJazOazPaGlaGKaGRaGNaGSazPaHnaHoayLaGTazyaAXaGUaAIaGWazyaBQaFIaFzazyaGYarAaHaaGZaHbarEayiaHcaHgaHfaHiaHhaHkaHjatEaHlaHmaBjaHpaBjaHpaBjaHraBjaHHaGpaHtaDpaJBaJwaHLaHKaHKaHKaHOaHKaHKaHKaHKaHKaHPaHKaHKaHKaKOaytaDsaDsaDsaDsayFayBaGCaGCaGLaugaDCaDCaJDaDCaGMaIeaIfaIgaGFayKaGFaHvaHxaHwaHzaHyaHCaHAaHEaHDaHGaHFbjFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaIwaFlaFlaDKaFlaFMaFlaFMaIxaFMaIyaFMaFlaGbaEIaGcaDnaHIaIAaIAaHJaGXaHRaGXaIAaIAaIEaIFaFCaGQaHSaHUayNaFCaHYaIhaIcaFnaFnaIiaFnaImaIjaKPaCMaaaaBYaBYaIQaIoaIQaBYaBYaaaazJazOazPaMSaIpaItaIsaBMazIaIWaIXayLaIBazyaICaElaBQaIGaEmaAIaIHaHsazyaIIaJeaILaIJaIMaMbaIOaCuaCuaCuaCuaCuaISaIPaJlaITaIUaBjaIYaBjaIZaBjaJaaBjaJraGpaJcaJbaGsaGsavOaGsaDsaDsaLdaDsaDsaJdaDsaGsaJyaGsaGsaGsaJzaAKaHXaHWaIaaLeaIraIbaIbaIbaIRaINaIgaJIaJJaLiaJkaJMaJNaIgaJgaJfaGFaJhaJmaJjaJnaHyaJoaHAaJqaJpaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaIwaFlaFlaDKaFlaFMaFlaFMaIxaFMaIyaFMaFlaGbaEIaGcaDnaHIaIAaIAaHJaGXaHRaGXaIAaIAaIEaIFaFCaGQaHSaHUayNaFCaHYaIhaIcaFnaFnaIiaFnaImaIjaHYaCMaaaaBYaBYaIQaIoaIQaBYaBYaaaazJazOazPaMSaIpaItaIsaBMazIaIWaIXayLaIBazyaICaElaBQaIGaEmaAIaIHaHsazyaIIaJeaILaIJaIMaMbaIOaCuaCuaCuaCuaCuaISaIPaJlaITaIUaBjaIYaBjaIZaBjaJaaBjaJraGpaJcaJbaGsaGsavOaGsaDsaDsaLdaDsaDsaJdaDsaGsaJyaGsaGsaGsaJzaAKaHXaHWaIaaLeaIraIbaIbaIbaIRaINaIgaJIaJJaLiaJkaJMaJNaIgaJgaJfaGFaJhaJmaJjaJnaHyaJoaHAaJqaJpaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaEJaJsaIDaGaaFlaFMaFlaFMaFlaFMaFlaFMaFlaGbaEIaGcaDnaJAaJtaIdaJEaJHaJHaJLaJKaJPaJOaJQaLwaJZaJSaJGaKaaFCaHYaJUaJTaJXaJVaHYaJYaKiaKdaKtaKuaaaaafaaaaJxaKjaJxaaaaafaaaaKuazOazPaKmaKlaKoaKnaKpazPaKCaKDayLaKqazyaAXaKsaKraGWazyaKxaKwaKvaKyaKzaJeaKBaKAaKFaKEaKGaKJaaaaaaaJlaKHaKKaKIaJlaKLaIUaIUaIUaKMaIUaIUaIUaBjaDpaKNaDpaDpaDpaDpaMEaDpaKZaMwaKSaKQaKUaKTaLfaKWaLhaLfaLfaLfaLfaLfaNcaLfaLfaLfaLfaLfaLfaLfaLfaJRaIgaLjaJWaLlaEFaKbaLoaIgaKYaKXaGFaLaaLcaLbaJnaLgaJoaHAaJqaHAaLmaLkaKRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaLnaLpaDgaEHaGqaFlaFlaIkaFlaFlaNPaFlaGHaEJaEIaLraDnaLtaLsaLyaLuaLyaLyaLyaLyaLyaLzaLAaFCaFCaFCaFCaFCaFCaLLaLBaLNaLOaLOaLOaLOaLPaLCaLRaKuaLFaLxaLxaLSaLEaLTaLxaLxaLUaKuaNXaKuaKuaLWaLGaLWaJeaJeaMbaOiaJeaJeaJeaJeaLZaLXaLIaLHaMeaMdaJeaJeaJeaJeaLJaKAaLMaLMaLQaMhaMmaMiaJlaLVaMaaLYaJlaJlaJlaJlaJlaJlaJlaJlaBjaBjaMjaMcaMlaJFaMpaLvaMyaMfaKZaMraMtaMsaMsaMuaLfaMvaMxaMFaAzaMzaMCaLqaMDaMnaSuaAzaMCaMzaAzaMGaLfaJRaIgaMPaMgaMRaOLaMqaMUaIgaMIaMHaMKaMJaMNaMLaMOaGFaGGaMQaJqaHAaLmaMTaMoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaLnaDgaDKaDgaDgaDiaDjaDgaDgaDKaLpaMVaBIaMWaLtaMMaMXaMXaMYaMXaNaaIAaNbaLzaNfaNeaNhaNgaNkaNiaNlaNkaNmaNkaNkaNkaNnaNkaNkaNoaNqaNpaNraNraNtaNsaNuaNraNraNraNraNvaNxaNwaNyaNkaNAaNzaNCaNBaNEaNDaNEaMkaNHaNGaNIaNIaNKaNJaNLaNJaNNaNMaNFaNOaLMaKAaLMaLMaLMaLMaLMaLMaNRaLYaNTaNSaNWaNVaNQaNYaObaOaaOcaJlaBfaOeaOkaOjaOlaOlaOmaMZaOwaNdaKZaOnaOpaOoaOoaOqaLfaOraOtaOsaOsaOsaOsaOuaOxaOvaOzaOyaOAaOAaOCaNZaLfaJRaIgaONaOOaNjaOfaONaONaIgaOEaODaGFaOFaOHaOGaOIaGFaHAaHAaJqaHAaGGaGGaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7456,7 +7455,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbCobyPbCzbqWbrdbBmbrdbrdbrdbrdbrdbxWbrfbzubBnbdPbBqbgabBsbBtbgabBvbghbgabgabBwbvsbBxbzBbzHbAdbyjbvwbBzbBybBAbBybBBbvwbCKbCIbBEbBCbBGbBFbBIbBHbBKbDbbBVbyNbBMbBLbBObBNbBQbBQbBSbBRbAbaQSaLYaJibBWbBUbBUbytbBXbxCbBZbBYbxCbCabyzbyzbzWbwkbCdbCcbwkbwkbwkbwkbwkbwkbCebwkbwkbwmbCfaXKaXKaXKaXKbDibpjbwwbzAbzAbzAbzAbppbppbppbppbppbIYbJKbJIbKvbARbCibChbCkbCjbCjbCjbCmbClbCqbCnbiebhZbjfbiqbjubjrbjAbCBbDubCCbvRbuRbDQbuRbvRbCDaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBubCEbBubwbbCGbCHbvUbvUbvUbCGbvUbxWbrfbzubCLbdPbCMbgabrkbwobgabqlbCNbgabgabCbbxcbBxbzBbCPbxcbCQbvwbCSbCRbCUbCTbwKbvwbCObCVbCXbAhbErbErbErbAjbCZbCYbCWbyNbDdbDcbDcbDebDgbDfbDhaJibDkbDjbDlaJibDtbDmbDvbDnbDxbDybDpbDobyWbDqbDrbyzbDsbwmbDzbDwbwmbDAbDAbDabDJbDCbDEbDBbCpbjBbDObBTbEVbFDbCpbDFbDGbDUbDIbDHbDKbDKbDMbDDbDPbDNbDXbDTbDZbDYbEbbEabEcbChbKzbKwbKBbGabGabGabGabGabFybFrbEnbBobBrbCJbHsbEdbCJbBobBpbBrbFQbCJbFUaafcHOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbFbbEfbFbbEhbDLbEibEibEibEibEibEjbElbEkbzubEmbdPbEobEqbEpbEtbEsbGibGhbGkbGjbGvbtCbEubzBbExbEwbyjbvwbEgbEybEAbBybEBbvwbBPbGCbECbAhaaaaaaaaabAjbEDbGEbFcbyNbEFbEEbEHbEGbDgbDfbEIaJibwWaQSaLYbEJbELbEKbENbEMbEPbEObERbEQbxCbxFbxFbESbxFbwkbEWbETbEYbEXbFdbEZbDJbFebDEbFfbFAbFBbDObFCbFDbjGbFhbFgbFkbFjbDIbFlbDKbFmbFobFnbFqbFpbFtbFsbFvbFubFxbFwbFzbChbKDbmFbsObrebILbzbbMbbGabGbbGcbGdaafaafbCJbkobkcbktbkrbkUbFWbFYbFTaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbFVbGmbGlbdPbdPbGnbyPbyPbyPbGobdPbdPbGpbGrbGqbdPbGtbGtbGtbFZbGtbGvbGebGgbGfbGsbtCbBxbzBbGubGBbtCbtGbtGbtGbtGbtGbHVbtGbtGbtGbGwbtGbtGbtGbtGbtGbGxbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJibwWaQSaLYbEJbGybEKbGAbGzbGFbGDbGIbGGbGJbEzbGLbyzbGNbGMbGPbGObGRbGQbGTbGSbGVbGUbGXbGWbGYbHbbHcbGZbmdbHabCpbHdbHfbwwbwwbwwbwwbwwbHibwwbwwbwwbzAbFHbzAbzAbHjbARbHkbChbKDbzEbzGbzFbzIbVocsBbGabGbbGcbHraaaaaabCJbNlbBkbHwbHvbHybHxbHzbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbFVbGmbGlbdPbdPbGnbyPbyPbyPbGobdPbdPbGpbGrbGqbdPbGtbGtbGtbFZbGtbGvbGebGgbGfbGsbtCbBxbzBbGubGBbtCbtGbtGbtGbtGbtGaKPbtGbtGbtGbGwbtGbtGbtGbtGbtGbGxbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJibwWaQSaLYbEJbGybEKbGAbGzbGFbGDbGIbGGbGJbEzbGLbyzbGNbGMbGPbGObGRbGQbGTbGSbGVbGUbGXbGWbGYbHbbHcbGZbmdbHabCpbHdbHfbwwbwwbwwbwwbwwbHibwwbwwbwwbzAbFHbzAbzAbHjbARbHkbChbKDbzEbzGbzFbzIbVocsBbGabGbbGcbHraaaaaabCJbNlbBkbHwbHvbHybHxbHzbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbHBbHAbHDbHCbLrbHEbHHbHFbGKbtCbBxbzBbzHbzCbHLbHKbHNbHMbHPbHObHRbHQbHTbHSbHWbHUbHXbzCbzCbHYbIbbHZbzCbIcbzCbzzbHPbzzbIebIdbIgbIfbwWaQSbDlaJlbDtbIBbDtbIhbIibxCbIkbIjbImbIlbIobInbIrbIpbIubItbwmbIvbICbIAbDJbIDbIHbIGbIqbKfbFDbmpbFDbEVbCpbKhbIwbIxbIybNnbmxbmqbmUbIMbIObIFbIQbIPbIRbIJbzAbITbHkbChcsXbBgbCsbCgcvqcuUcvBbGabGbbISbEnbEnbEnbCJbCJbCJbJjbJhbCJbCJbHIbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabLaaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbJbbJabJdbJccLYbJebJgbJfbJibtCbBxbJkbJmbJlbJlbJnbJpbJobJqbJobJpbJnbJlbJlbJsbJrbJubJtbJwbJvbJxbJlbJlbJybJpbJobJqbJobJCbJAbJDbJAbJHbJGbvjaJlbJJbELcwqbELbJLbGHbDpbJMbFibDVbxFbJObCFbDSbDzbJSbwkbJTbJVbJUbDJbJWbJYbJXbJNbFDbFDbJPbFDbFDbCpbmXbnPbIxbKabKcbKcbKbbKebKdbodbIFbKkbKjbKobKobzAbKpbKrbKqcwtbCtbDWcwAcwZcwZcxsbGabGbbKlbEnbKmbMIboebEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKFbKEbKEbKGbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKIbKHbKxbKHbKJaaaaaaaaabGtbGtbIZbKKbJdbKKbMPbKMbKObKNbKPbtCbKQbBxbKSbKLbzCbKTbzCbzzbHPbzzbzCbKRbKYbKXbLbbKZbzHbzCbLdbLcbHTbLebHTbHTbLgbLfbLhbLfbLjbLibcvbKWaLYaLYaLYaJlbpobENbEPbLpbLxbLtbLzbLybFIbLAbLCbLBbLDbHgbDzbItbIabIzbHhbDJbDJbLobLobLobCpbLEbLqbLFbLsbLGbCpbprbpvbIxbLwbFGbmxbpXbpYbLHbLJbIFbLLbLKbKobKobzAbLQbLSbLkbGabEvbFacxCcyhcxJcyibGabqybLNbqBbqBbqBbsUbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbMcbLTbMdbLTbKsbKtbKtbMebPCbMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 47af67b72fcbb7a4eb180eb0b16111ac1dda68a3 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Fri, 1 Jan 2016 06:58:35 -0500 Subject: [PATCH 14/55] Terminal Colors Green and Red for success states. --- code/unit_tests/mob_tests.dm | 29 ++++++++++++++- code/unit_tests/unit_test.dm | 64 ++++++++++++++++++++++++-------- code/unit_tests/zas_tests.dm | 72 ++++++++++++++++++------------------ 3 files changed, 114 insertions(+), 51 deletions(-) diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index 9ceb0c74a21..b0497943a8c 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -8,6 +8,9 @@ // // Tests Life() and mob breathing in space. +// + + datum/unit_test/human_breath name = "MOB: Human Suffocates in Space" @@ -42,7 +45,31 @@ datum/unit_test/human_breath/check_result() fail("Mob is not taking oxygen damage. Oxyloss is [ending_oxyloss]") qdel(H) - return 1 // return 1 to show we're done. + return 1 // return 1 to show we're done and don't want to recheck the result. // ============================================================================ +//#define BRUTE "brute" +//#define BURN "fire" +//#define TOX "tox" +//#define OXY "oxy" +//#define CLONE "clone" +//#define HALLOSS "halloss" + + +proc/create_test_mob_with_mind(var/turf/mobloc = null) + if(isnull(mobloc)) + mobloc = locate("landmark*tdome1") + if(mobloc) + return 0 + + + return 1 + +datum/unit_test/mob_damage + name = "MOB: Template for enviromental damage" + var/mob/living/carbon/human/testmob = null + var/damagetype = BRUTE + + +datum/unit_test/mob_damage diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index 293d1e9648a..adc892ab0b6 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -1,22 +1,56 @@ +/* Unit Tests originally designed by Ccomp5950 + * + * Tests are created to prevent changes that would create bugs or change expected behaviour. + * For the most part I think any test can be created that doesn't require a client in a mob or require a game mode other then extended + * + * The easiest way to make effective tests is to create a "template" if you intend to run the same test over and over and make your actual + * tests be a "child object" of those templates. Be sure and name your templates with the word "template" somewhere in var/name. + * + * The goal is to have all sorts of tests that run and to run them as quickly as possible. + * + * Tests that require time to run we instead just check back on their results later instead of waiting around in a sleep(1) for each test. + * This allows us to finish unit testing quicker since we can start other tests while we're waiting on that one to finish. + * + * An example of that is listed in mob_tests.dm with the human_breath test. We spawn the mob in space and set the async flag to 1 so that we run the check later. + * After 10 life ticks for that mob we check it's oxyloss but while that is going on we've already ran other tests. + * + * If your test requires a significant amount of time...cheat on the timers. Either speed up the process/life runs or do as we did in the timers for the shuttle + * transfers in zas_tests.dm we move a shuttle but instead of waiting 3 minutes we set the travel time to a very low number. + * + * At the same time, Unit tests are intended to reflect standard usage so avoid changing to much about how stuff is processed. + * + */ + + var/all_unit_tests_passed = 1 var/failed_unit_tests = 0 var/total_unit_tests = 0 +var/ascii_esc = ascii2text(27) +var/ascii_red = "[ascii_esc]\[31m" +var/ascii_green = "[ascii_esc]\[32m" +var/ascii_reset = "[ascii_esc]\[0m" + + +// We list these here so we can remove them from the for loop running this. +// Templates aren't intended to be ran but just serve as a way to create child objects of it with inheritable tests for quick test creation. datum/unit_test - var/name = "Fix Me" + var/name = "template - should not be ran." var/disabled = 0 // If we want to keep a unit test in the codebase but not run it for some reason. var/async = 0 // If the check can be left to do it's own thing, you must define a check_result() proc if you use this. - var/reported = 0 + var/reported = 0 // If it's reported a success or failure. Any tests that have not are assumed to be failures. + var/why_disabled = "" // If we disable a unit test we will display why so it reminds us to check back on it later. + datum/unit_test/proc/fail(var/message) all_unit_tests_passed = 0 failed_unit_tests++ reported = 1 - log_unit_test("!!! FAILURE !!! \[[name]\]: [message]") + log_unit_test("[ascii_red]!!! FAILURE !!! \[[name]\]: [message][ascii_reset]") datum/unit_test/proc/pass(var/message) reported = 1 - log_unit_test("*** SUCCESS *** \[[name]\]: [message]") + log_unit_test("[ascii_green]*** SUCCESS *** \[[name]\]: [message][ascii_reset]") datum/unit_test/proc/start_test() fail("No test proc.") @@ -29,7 +63,7 @@ datum/unit_test/proc/check_result() proc/load_unit_test_changes() if(config.generate_asteroid != 1) - log_unit_test("Overiding Configuration option for Asteroid Generation") + log_unit_test("Overiding Configuration option for Asteroid Generation to ENABLED") config.generate_asteroid = 1 // The default map requires it, the example config doesn't have this enabled. @@ -48,7 +82,7 @@ proc/initialize_unit_tests() var/said_msg = 0 while(ticker.pregame_timeleft && ticker.pregame_timeleft > 160) // Make sure the initial startup is complete. - if(ticker.pregame_timeleft < 178 && !said_msg) + if(ticker.pregame_timeleft < 175 && !said_msg) said_msg = 1 log_unit_test("Pregame Count down has started, giving it 20 seconds to finish.") sleep(1) @@ -59,15 +93,14 @@ proc/initialize_unit_tests() ticker.current_state = GAME_STATE_SETTING_UP - log_unit_test("RoundStart: waiting 10 seconds to start tests.") + log_unit_test("Round has been started. Waiting 10 seconds to start tests.") sleep(100) // // Run Tests // - var/list/test_datums = typesof(/datum/unit_test) - /datum/unit_test - + var/list/test_datums = typesof(/datum/unit_test) var/list/async_test = list() var/list/started_tests = list() @@ -76,9 +109,12 @@ proc/initialize_unit_tests() for (var/test in test_datums) var/datum/unit_test/d = new test() - + if(d.disabled) - qdel(d) + d.pass("[ascii_red]Check Disabled: [d.why_disabled]") + continue + + if(findtext(d.name, "template")) continue if(isnull(d.start_test())) // Start the test. @@ -107,11 +143,9 @@ proc/initialize_unit_tests() if(!test.reported) test.fail("Test failed to report a result.") - - if(all_unit_tests_passed) - log_unit_test("**** All Unit Tests Passed \[[total_unit_tests]\] ****") + log_unit_test("[ascii_green]**** All Unit Tests Passed \[[total_unit_tests]\] ****[ascii_reset]") world.Del() else - log_unit_test("**** \[[failed_unit_tests]\\[total_unit_tests]\] Unit Tests Failed ****") + log_unit_test("[ascii_red]**** \[[failed_unit_tests]\\[total_unit_tests]\] Unit Tests Failed ****[ascii_reset]") world.Del() diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm index b07f31dcd34..7b69f0441b3 100644 --- a/code/unit_tests/zas_tests.dm +++ b/code/unit_tests/zas_tests.dm @@ -10,25 +10,28 @@ #define UT_VACUUM 2 // Vacume on simulated turfs #define UT_NORMAL_COLD 3 // Cold but standard atmosphere. +#define FAILURE 0 +#define SUCCESS 1 + // // Generic check for an area. // datum/unit_test/zas_area_test name = "ZAS: Area Test Template" - disabled = 1 // For all child objects we have to put 0 so the test runs var/area_path = null // Put the area you are testing here. - var/expectation = UT_NORMAL // If the area is supposed to be a vacume set to 1 + var/expectation = UT_NORMAL // See defines above. datum/unit_test/zas_area_test/start_test() - var/list/result = test_air_in_area(area_path, expectation) - if(isnull(result)) + var/list/test = test_air_in_area(area_path, expectation) + + if(isnull(test)) fail("Check Runtimed") - if(result["success"]) - pass(result["msg"]) + if(test["result"] == SUCCESS) + pass(test["msg"]) else - fail(result["msg"]) + fail(test["msg"]) return 1 // ================================================================================================== @@ -37,10 +40,13 @@ datum/unit_test/zas_area_test/start_test() // The primary helper proc. // proc/test_air_in_area(var/test_area, var/expectation = UT_NORMAL) + var/test_result = list("result" = FAILURE, "msg" = "") + var/area/A = locate(test_area) if(!istype(A, test_area)) - return(list("success" = 0, "msg" = "Unable to get [test_area]")) + test_result["msg"] = "Unable to get [test_area]" + return test_result var/list/GM_checked = list() @@ -61,29 +67,36 @@ proc/test_air_in_area(var/test_area, var/expectation = UT_NORMAL) if(UT_VACUUM) if(pressure > 10) - return(list("success" = 0, "msg" = "Pressure out of bounds: [pressure] | [t_msg]")) + test_result["msg"] = "Pressure out of bounds: [pressure] | [t_msg]" + return test_result if(UT_NORMAL || UT_NORMAL_COLD) if(abs(pressure - ONE_ATMOSPHERE) > 10) - return(list("success" = 0, "msg" = "Pressure out of bounds: [pressure] | [t_msg]")) + test_result["msg"] = "Pressure out of bounds: [pressure] | [t_msg]" + return test_result if(expectation == UT_NORMAL) if(abs(temp - T20C) > 10) - return(list("success" = 0, "msg" = "Temperature out of bounds: [temp] | [t_msg]")) + test_result["msg"] = "Temperature out of bounds: [temp] | [t_msg]" + return test_result if(expectation == UT_NORMAL_COLD) if(temp > 120) - return(list("success" = 0, "msg" = "Temperature out of bounds: [temp] | [t_msg]")) + test_result["msg"] = "Temperature out of bounds: [temp] | [t_msg]" + return test_result GM_checked.Add(GM) if(GM_checked.len) - return(list("success"=1, "msg" = "Checked [GM_checked.len] zones")) + test_result["result"] = SUCCESS + test_result["msg"] = "Checked [GM_checked.len] zones" else - return(list("success"=0, "msg" = "No zones checked.")) + test_result["msg"] = "No zones checked." + + return test_result // ================================================================================================== @@ -91,73 +104,61 @@ proc/test_air_in_area(var/test_area, var/expectation = UT_NORMAL) datum/unit_test/zas_area_test/supply_centcomm name = "ZAS: Supply Shuttle (CentComm)" area_path = /area/supply/dock - disabled = 0 datum/unit_test/zas_area_test/emergency_shuttle name = "ZAS: Emergency Shuttle" area_path = /area/shuttle/escape/centcom - disabled = 0 datum/unit_test/zas_area_test/ai_chamber name = "ZAS: AI Chamber" area_path = /area/turret_protected/ai - disabled = 0 datum/unit_test/zas_area_test/arrival_maint name = "ZAS: Arrival Maintenance" area_path = /area/maintenance/arrivals - disabled = 0 datum/unit_test/zas_area_test/mining_shuttle_at_station name = "ZAS: Mining Shuttle (Station)" area_path = /area/shuttle/mining/station - disabled = 0 datum/unit_test/zas_area_test/ name = "ZAS: Cargo Maintenance" area_path = /area/maintenance/cargo - disabled = 0 datum/unit_test/zas_area_test/eng_shuttle name = "ZAS: Construction Site Shuttle (Station)" area_path = /area/shuttle/constructionsite/station - disabled = 0 datum/unit_test/zas_area_test/incinerator name = "ZAS: Incinerator" area_path = /area/maintenance/incinerator - disabled = 1 //Failing currently for existing bug: #11846 + disabled = 1 + why_disabled = "Failing currently for existing bug: #11846" datum/unit_test/zas_area_test/virology name = "ZAS: Virology" area_path = /area/medical/virology - disabled = 0 datum/unit_test/zas_area_test/xenobio name = "ZAS: Xenobiology" area_path = /area/rnd/xenobiology - disabled = 0 datum/unit_test/zas_area_test/research_maint_starboard name = "ZAS: Research Starboard Maintenance" area_path = /area/maintenance/research_starboard - disabled = 0 datum/unit_test/zas_area_test/west_hall_mining_outpost name = "ZAS: Mining outpost West Hallway" area_path = /area/outpost/mining_main/west_hall - disabled = 0 datum/unit_test/zas_area_test/mining_area name = "ZAS: Mining Area (Vacume)" area_path = /area/mine/explored - disabled = 0 expectation = UT_VACUUM datum/unit_test/zas_area_test/ - name = "ZAS: Cargo Bay" + name = "ZAS: Cargo Bay" area_path = /area/quartermaster/storage - disabled = 0 // ================================================================================================== @@ -167,7 +168,6 @@ datum/unit_test/zas_area_test/ datum/unit_test/zas_supply_shuttle_moved name = "ZAS: Supply Shuttle (When Moved)" - async=1 // We're moving the shuttle using built in procs. var/datum/shuttle/ferry/supply/Shuttle = null @@ -200,17 +200,19 @@ datum/unit_test/zas_supply_shuttle_moved/check_result() sleep(20) // Give ZAS a chance to catchup. - var/list/result = test_air_in_area(/area/supply/station) - if(isnull(result)) + var/list/test = test_air_in_area(/area/supply/station) + if(isnull(test)) fail("Check Runtimed") return 1 - if(result["success"]) - pass(result["msg"]) + if(test["result"] == SUCCESS) + pass(test["msg"]) else - fail(result["msg"]) + fail(test["msg"]) return 1 #undef UT_NORMAL #undef UT_VACUUM #undef UT_NORMAL_COLD +#undef SUCCESS +#undef FAILURE From eab39185e2c559572a92c1512f3d2ba2bf27681c Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Sat, 2 Jan 2016 01:45:40 -0500 Subject: [PATCH 15/55] Change to _template. --- code/unit_tests/_template.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/unit_tests/_template.dm b/code/unit_tests/_template.dm index 0eb879ef571..200940bd77a 100644 --- a/code/unit_tests/_template.dm +++ b/code/unit_tests/_template.dm @@ -6,7 +6,7 @@ */ datum/unit_test/template - name = "Test Template - Change My name" // Set it's name. + name = "Test Template - Change My name" // If it's a template leave the word "template" in it's name so it's not ran. async = 1 // Set if we should continue testing elsewhere and come back and check on the results. From a2a5e367f6f92db41b1c76c5c82ac03537e276d4 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sat, 2 Jan 2016 17:13:23 +0100 Subject: [PATCH 16/55] Adds a chilled N2 canister to Research Server room. With minor cleanup included. Fixes #11790. --- code/game/machinery/atmoalter/canister.dm | 13 +++++++++---- code/game/turfs/flooring/flooring_decals.dm | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 80b33cfaa05..09712f7f7c5 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -36,6 +36,9 @@ icon_state = "red" canister_color = "red" can_label = 0 + +/obj/machinery/portable_atmospherics/canister/nitrogen/prechilled + name = "Canister: \[N2 (Cooling)\]" /obj/machinery/portable_atmospherics/canister/oxygen name = "Canister: \[O2\]" @@ -380,8 +383,6 @@ update_flag /obj/machinery/portable_atmospherics/canister/oxygen/prechilled/New() ..() - - src.air_contents.adjust_gas("oxygen", MolesForPressure()) src.air_contents.temperature = 80 src.update_icon() return 1 @@ -407,13 +408,17 @@ update_flag return 1 /obj/machinery/portable_atmospherics/canister/nitrogen/New() - ..() - src.air_contents.adjust_gas("nitrogen", MolesForPressure()) src.update_icon() return 1 +/obj/machinery/portable_atmospherics/canister/nitrogen/prechilled/New() + ..() + src.air_contents.temperature = 80 + src.update_icon() + return 1 + /obj/machinery/portable_atmospherics/canister/carbon_dioxide/New() ..() src.air_contents.adjust_gas("carbon_dioxide", MolesForPressure()) diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index 1396011e985..66434456f92 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -21,7 +21,7 @@ var/list/floor_decals = list() var/cache_key = "[alpha]-[color]-[dir]-[icon_state]-[layer]" if(!floor_decals[cache_key]) var/image/I = image(icon = src.icon, icon_state = src.icon_state, dir = src.dir) - I.layer = T.layer - 0.01 + I.layer = T.layer I.color = src.color I.alpha = src.alpha floor_decals[cache_key] = I From 7e100bb84479db412df37892c1363a651b597b2d Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Sun, 3 Jan 2016 02:49:58 -0500 Subject: [PATCH 17/55] Adding mob damage tests. -- This will fail in travis -- Species damage modifications haven't been completed in here. And IPC's are dumb. --- code/unit_tests/mob_tests.dm | 416 +++++++++++++++++++++++++++++++++-- code/unit_tests/unit_test.dm | 8 +- 2 files changed, 410 insertions(+), 14 deletions(-) diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index b0497943a8c..515e21fde10 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -1,11 +1,16 @@ + /* * * Mob Unit Tests. + * * Human suffocation in Space. - * Human + * Mob damage Template * */ +#define SUCCESS 1 +#define FAILURE 0 + // // Tests Life() and mob breathing in space. // @@ -28,7 +33,7 @@ datum/unit_test/human_breath/start_test() H = new(T) - starting_oxyloss = H.getOxyLoss() + starting_oxyloss = damage_check(H, OXY) return 1 @@ -37,12 +42,12 @@ datum/unit_test/human_breath/check_result() if(H.life_tick < 10) // Finish Condition return 0 // Return 0 to try again later. - ending_oxyloss = H.getOxyLoss() + ending_oxyloss = damage_check(H, OXY) if(starting_oxyloss < ending_oxyloss) pass("Oxyloss = [ending_oxyloss]") else - fail("Mob is not taking oxygen damage. Oxyloss is [ending_oxyloss]") + fail("Mob is not taking oxygen damage. Damange is [ending_oxyloss]") qdel(H) return 1 // return 1 to show we're done and don't want to recheck the result. @@ -57,19 +62,404 @@ datum/unit_test/human_breath/check_result() //#define HALLOSS "halloss" -proc/create_test_mob_with_mind(var/turf/mobloc = null) +proc/create_test_mob_with_mind(var/turf/mobloc = null, var/mobtype = /mob/living/carbon/human) + var/list/test_result = list("result" = FAILURE, "msg" = "", "mobref" = null) + if(isnull(mobloc)) - mobloc = locate("landmark*tdome1") - if(mobloc) + mobloc = pick(tdome1) + if(!mobloc) + test_result["msg"] = "Unable to find a location to create test mob" + return test_result + + var/mob/living/carbon/human/H = new mobtype(mobloc) + + H.mind_initialize("TestKey[rand(0,10000)]") + + test_result["result"] = SUCCESS + test_result["msg"] = "Mob created" + test_result["mobref"] = "\ref[H]" + + return test_result + +//Generic Check +// TODO: Need to make sure I didn't just recreate the wheel here. + +proc/damage_check(var/mob/living/M, var/damage_type, var/amount = 0) + var/loss = null + switch(damage_type) + if(BRUTE) + if(amount) M.adjustBruteLoss(amount) + loss = M.getBruteLoss() + if(BURN) + if(amount) M.adjustFireLoss(amount) + loss = M.getFireLoss() + if(TOX) + if(amount) M.adjustToxLoss(amount) + loss = M.getToxLoss() + if(OXY) + if(amount) M.adjustOxyLoss(amount) + loss = M.getOxyLoss() + if(CLONE) + if(amount) M.adjustCloneLoss(amount) + loss = M.getCloneLoss() + if(HALLOSS) + if(amount) M.adjustHalLoss(amount) + loss = M.getHalLoss() + return loss + +// ============================================================================================================== + +// +//DAMAGE EXPECTATIONS +// used with expectected_vunerability + +#define STANDARD 0 // Will take standard damage (damage_ratio of 1) +#define ARMORED 1 // Will take less damage than applied +#define EXTRA_VULNERABLE 2 // Will take more dmage than applied +#define IMMUNE 3 // Will take no damage + +//============================================================================================================== + + +datum/unit_test/mob_damage + name = "MOB: Template for mob damage" + var/mob/living/carbon/human/testmob = null + var/damagetype = BRUTE + var/mob_type = /mob/living/carbon/human + var/expected_vulnerability = STANDARD + +datum/unit_test/mob_damage/start_test() + var/list/test = create_test_mob_with_mind(null, mob_type) + var/damage_amount = 10 + + if(isnull(test)) + fail("Check Runtimed in Mob creation") + + if(test["result"] == FAILURE) + fail(test["msg"]) return 0 + var/mob/living/carbon/human/H = locate(test["mobref"]) + + if(isnull(H)) + fail("Test unable to set test mob from reference") + return 0 + + if(H.stat) + + fail("Test needs to be re-written, mob has a stat = [H.stat]") + return 0 + + if(H.sleeping) + fail("Test needs to be re-written, mob is sleeping for some unknown reason") + return 0 + + // Damage the mob + + H.apply_damage(damage_amount, damagetype) + + var/ending_damage = damage_check(H, damagetype) + + // Now test this stuff. + + var/failure = 0 + + var/damage_ratio = STANDARD + + if (ending_damage < damage_amount) + damage_ratio = ARMORED + + else if (ending_damage > damage_amount) + damage_ratio = EXTRA_VULNERABLE + + else if (ending_damage == 0) + damage_ratio = IMMUNE + + if(damage_ratio != expected_vulnerability) + failure = 1 + + // Now generate the message for this test. + + var/expected_msg = null + + switch(expected_vulnerability) + if(STANDARD) + expected_msg = "to take standard damage" + if(ARMORED) + expected_msg = "To take less damage" + if(EXTRA_VULNERABLE) + expected_msg = "To take extra damage" + if(IMMUNE) + expected_msg = "To take no damage" + + + var/msg = "Damage taken: [ending_damage] out of [damage_amount] || expected: [expected_msg] \[Overall Health:[H.health] \]" + + if(failure) + fail(msg) + else + pass(msg) + + qdel(H) return 1 -datum/unit_test/mob_damage - name = "MOB: Template for enviromental damage" - var/mob/living/carbon/human/testmob = null - var/damagetype = BRUTE - +// ================================================================= +// Human damage check. +// ================================================================= -datum/unit_test/mob_damage +datum/unit_test/mob_damage/brute + name = "MOB: Human Brute damage check" + damagetype = BRUTE + +datum/unit_test/mob_damage/fire + name = "MOB: Human Fire damage check" + damagetype = BURN + +datum/unit_test/mob_damage/tox + name = "MOB: Human Toxin damage check" + damagetype = TOX + +datum/unit_test/mob_damage/oxy + name = "MOB: Human Oxygen damage check" + damagetype = OXY + +datum/unit_test/mob_damage/clone + name = "MOB: Human Clone damage check" + damagetype = CLONE + +datum/unit_test/mob_damage/halloss + name = "MOB: Human Halloss damage check" + damagetype = HALLOSS + +// ================================================================= +// Unathi damage check. +// ================================================================= + +datum/unit_test/mob_damage/unathi + name = "MOB: Unathi damage check template" + mob_type = /mob/living/carbon/human/unathi + +datum/unit_test/mob_damage/unathi/brute + name = "MOB: Unathi Brute Damage Check" + damagetype = BRUTE + expected_vulnerability = ARMORED + +datum/unit_test/mob_damage/unathi/fire + name = "MOB: Unathi Fire Damage Check" + damagetype = BURN + +datum/unit_test/mob_damage/unathi/tox + name = "MOB: Unathi Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/unathi/oxy + name = "MOB: Unathi Oxygen Damage Check" + damagetype = OXY + +datum/unit_test/mob_damage/unathi/clone + name = "MOB: Unathi Clone Damage Check" + damagetype = CLONE + +datum/unit_test/mob_damage/unathi/halloss + name = "MOB: Unathi Halloss Damage Check" + damagetype = HALLOSS + +// ================================================================= +// SpessKahjit damage check. +// ================================================================= + +datum/unit_test/mob_damage/tajaran + name = "MOB: Tajaran damage check template" + mob_type = /mob/living/carbon/human/tajaran + +datum/unit_test/mob_damage/tajaran/brute + name = "MOB: Tajaran Brute Damage Check" + damagetype = BRUTE + expected_vulnerability = EXTRA_VULNERABLE + +datum/unit_test/mob_damage/tajaran/fire + name = "MOB: Tajaran Fire Damage Check" + damagetype = BURN + expected_vulnerability = EXTRA_VULNERABLE + +datum/unit_test/mob_damage/tajaran/tox + name = "MOB: Tajaran Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/tajaran/oxy + name = "MOB: Tajaran Oxygen Damage Check" + damagetype = OXY + +datum/unit_test/mob_damage/tajaran/clone + name = "MOB: Tajaran Clone Damage Check" + damagetype = CLONE + +datum/unit_test/mob_damage/tajaran/halloss + name = "MOB: Tajaran Halloss Damage Check" + damagetype = HALLOSS + +// ================================================================= +// Resomi damage check +// ================================================================= + +datum/unit_test/mob_damage/resomi + name = "MOB: Resomi damage check template" + mob_type = /mob/living/carbon/human/resomi + +datum/unit_test/mob_damage/resomi/brute + name = "MOB: Resomi Brute Damage Check" + damagetype = BRUTE + +datum/unit_test/mob_damage/resomi/fire + name = "MOB: Resomi Fire Damage Check" + damagetype = BURN + +datum/unit_test/mob_damage/resomi/tox + name = "MOB: Resomi Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/resomi/oxy + name = "MOB: Resomi Oxygen Damage Check" + damagetype = OXY + +datum/unit_test/mob_damage/resomi/clone + name = "MOB: Resomi Clone Damage Check" + damagetype = CLONE + +datum/unit_test/mob_damage/resomi/halloss + name = "MOB: Resomi Halloss Damage Check" + damagetype = HALLOSS + +// ================================================================= +// Skrell +// ================================================================= + +datum/unit_test/mob_damage/skrell + name = "MOB: Skrell damage check template" + mob_type = /mob/living/carbon/human/skrell + +datum/unit_test/mob_damage/skrell/brute + name = "MOB: Skrell Brute Damage Check" + damagetype = BRUTE + +datum/unit_test/mob_damage/skrell/fire + name = "MOB: Skrell Fire Damage Check" + damagetype = BURN + +datum/unit_test/mob_damage/skrell/tox + name = "MOB: Skrell Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/skrell/oxy + name = "MOB: Skrell Oxygen Damage Check" + damagetype = OXY + +datum/unit_test/mob_damage/skrell/clone + name = "MOB: Skrell Clone Damage Check" + damagetype = CLONE + +datum/unit_test/mob_damage/skrell/halloss + name = "MOB: Skrell Halloss Damage Check" + damagetype = HALLOSS + +// ================================================================= +// Vox +// ================================================================= + +datum/unit_test/mob_damage/vox + name = "MOB: Vox damage check template" + mob_type = /mob/living/carbon/human/vox + +datum/unit_test/mob_damage/vox/brute + name = "MOB: Vox Brute Damage Check" + damagetype = BRUTE + +datum/unit_test/mob_damage/vox/fire + name = "MOB: Vox Fire Damage Check" + damagetype = BURN + +datum/unit_test/mob_damage/vox/tox + name = "MOB: Vox Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/vox/oxy + name = "MOB: Vox Oxygen Damage Check" + damagetype = OXY + +datum/unit_test/mob_damage/vox/clone + name = "MOB: Vox Clone Damage Check" + damagetype = CLONE + +datum/unit_test/mob_damage/vox/halloss + name = "MOB: Vox Halloss Damage Check" + damagetype = HALLOSS + +// ================================================================= +// Diona +// ================================================================= + +datum/unit_test/mob_damage/diona + name = "MOB: Diona damage check template" + mob_type = /mob/living/carbon/human/diona + +datum/unit_test/mob_damage/diona/brute + name = "MOB: Diona Brute Damage Check" + damagetype = BRUTE + +datum/unit_test/mob_damage/diona/fire + name = "MOB: Diona Fire Damage Check" + damagetype = BURN + +datum/unit_test/mob_damage/diona/tox + name = "MOB: Diona Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/diona/oxy + name = "MOB: Diona Oxygen Damage Check" + damagetype = OXY + +datum/unit_test/mob_damage/diona/clone + name = "MOB: Diona Clone Damage Check" + damagetype = CLONE + +datum/unit_test/mob_damage/diona/halloss + name = "MOB: Diona Halloss Damage Check" + damagetype = HALLOSS + +// ================================================================= +// IPC +// ================================================================= + +datum/unit_test/mob_damage/machine + name = "MOB: IPC damage check template" + mob_type = /mob/living/carbon/human/machine + +datum/unit_test/mob_damage/machine/brute + name = "MOB: IPC Brute Damage Check" + damagetype = BRUTE + +datum/unit_test/mob_damage/machine/fire + name = "MOB: IPC Fire Damage Check" + damagetype = BURN + +datum/unit_test/mob_damage/machine/tox + name = "MOB: IPC Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/machine/oxy + name = "MOB: IPC Oxygen Damage Check" + damagetype = OXY + +datum/unit_test/mob_damage/machine/clone + name = "MOB: IPC Clone Damage Check" + damagetype = CLONE + +datum/unit_test/mob_damage/machine/halloss + name = "MOB: IPC Halloss Damage Check" + damagetype = HALLOSS + +#undef VULNERABLE +#undef IMMUNE +#undef SUCCESS +#undef FAILURE diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index adc892ab0b6..e8a413f07f9 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -19,12 +19,18 @@ * * At the same time, Unit tests are intended to reflect standard usage so avoid changing to much about how stuff is processed. * + * + * WRITE UNIT TEST TEMPLATES AS GENERIC AS POSSIBLE (makes for easy reusability) + * */ var/all_unit_tests_passed = 1 var/failed_unit_tests = 0 var/total_unit_tests = 0 + +// For console out put in Linux/Bash makes the output green or red. +// Should probably only be used for unit tests/Travis since some special folks use winders to host servers. var/ascii_esc = ascii2text(27) var/ascii_red = "[ascii_esc]\[31m" var/ascii_green = "[ascii_esc]\[32m" @@ -39,7 +45,7 @@ datum/unit_test var/disabled = 0 // If we want to keep a unit test in the codebase but not run it for some reason. var/async = 0 // If the check can be left to do it's own thing, you must define a check_result() proc if you use this. var/reported = 0 // If it's reported a success or failure. Any tests that have not are assumed to be failures. - var/why_disabled = "" // If we disable a unit test we will display why so it reminds us to check back on it later. + var/why_disabled = "No reason set." // If we disable a unit test we will display why so it reminds us to check back on it later. datum/unit_test/proc/fail(var/message) From d02e19bd5f5655cc5a3ada52c76be8dc6827475f Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 3 Jan 2016 12:30:23 +0100 Subject: [PATCH 18/55] Actually adds the pre-chilled nitrogen canisters. --- maps/exodus-1.dmm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 4a3aef8be1a..00fb0fdbfe1 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -2921,7 +2921,7 @@ "bei" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bej" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bek" = (/obj/effect/floor_decal/chapel,/turf/simulated/floor/tiled/dark,/area/chapel/main) -"bel" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/red{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bel" = (/obj/structure/cable/green,/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/power/apc/super/critical{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "bem" = (/obj/machinery/light/small,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/bar) "ben" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "beo" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) @@ -4465,6 +4465,7 @@ "bHS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - South Southwest"},/obj/structure/sign/securearea{pixel_y = 32},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bHT" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bHU" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHV" = (/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/network/research{c_tag = "Research - Server Room"},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/nitrogen/prechilled,/turf/simulated/floor/tiled/dark,/area/server) "bHW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bHX" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bHY" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) @@ -4507,7 +4508,7 @@ "bIJ" = (/turf/simulated/wall,/area/rnd/storage) "bIK" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = 32},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/engineering) "bIL" = (/obj/item/device/radio/intercom{dir = 2; pixel_y = 22},/obj/effect/floor_decal/corner/purple/diagonal{dir = 4},/obj/machinery/modular_computer/console/preset/research,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/hor) -"bIM" = (/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/network/research{c_tag = "Research - Server Room"},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/tiled/dark,/area/server) +"bIM" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/portable_atmospherics/canister/nitrogen/prechilled,/turf/simulated/floor/plating,/area/engineering/engine_room) "bIN" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/rnd/mixing) "bIO" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer_1"; use_power = 1; power_setting = 20; set_temperature = 73},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/server) "bIP" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/rnd/storage) @@ -7254,7 +7255,6 @@ "cKX" = (/turf/simulated/shuttle/wall,/area/shuttle/constructionsite/station) "cKY" = (/obj/machinery/light/small{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "virology_pump"},/turf/simulated/floor/plating,/area/maintenance/medbay) "cKZ" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/plating,/area/maintenance/medbay) -"cLa" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) "cLc" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "engineering_shuttle"; pixel_x = 0; pixel_y = 25; req_one_access = list(13,11,24); tag_door = "engineering_shuttle_hatch"},/obj/structure/bed/chair{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) "cLd" = (/obj/machinery/power/supermatter{layer = 4},/obj/machinery/mass_driver{id = "enginecore"},/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room) "cLe" = (/obj/machinery/door/airlock/maintenance{name = "Drone Fabrication/Engine Waste Handling"; req_one_access = list(10,24)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) @@ -7456,7 +7456,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBubCEbBubwbbCGbCHbvUbvUbvUbCGbvUbxWbrfbzubCLbdPbCMbgabrkbwobgabqlbCNbgabgabCbbxcbBxbzBbCPbxcbCQbvwbCSbCRbCUbCTbwKbvwbCObCVbCXbAhbErbErbErbAjbCZbCYbCWbyNbDdbDcbDcbDebDgbDfbDhaJibDkbDjbDlaJibDtbDmbDvbDnbDxbDybDpbDobyWbDqbDrbyzbDsbwmbDzbDwbwmbDAbDAbDabDJbDCbDEbDBbCpbjBbDObBTbEVbFDbCpbDFbDGbDUbDIbDHbDKbDKbDMbDDbDPbDNbDXbDTbDZbDYbEbbEabEcbChbKzbKwbKBbGabGabGabGabGabFybFrbEnbBobBrbCJbHsbEdbCJbBobBpbBrbFQbCJbFUaafcHOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbFbbEfbFbbEhbDLbEibEibEibEibEibEjbElbEkbzubEmbdPbEobEqbEpbEtbEsbGibGhbGkbGjbGvbtCbEubzBbExbEwbyjbvwbEgbEybEAbBybEBbvwbBPbGCbECbAhaaaaaaaaabAjbEDbGEbFcbyNbEFbEEbEHbEGbDgbDfbEIaJibwWaQSaLYbEJbELbEKbENbEMbEPbEObERbEQbxCbxFbxFbESbxFbwkbEWbETbEYbEXbFdbEZbDJbFebDEbFfbFAbFBbDObFCbFDbjGbFhbFgbFkbFjbDIbFlbDKbFmbFobFnbFqbFpbFtbFsbFvbFubFxbFwbFzbChbKDbmFbsObrebILbzbbMbbGabGbbGcbGdaafaafbCJbkobkcbktbkrbkUbFWbFYbFTaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbFVbGmbGlbdPbdPbGnbyPbyPbyPbGobdPbdPbGpbGrbGqbdPbGtbGtbGtbFZbGtbGvbGebGgbGfbGsbtCbBxbzBbGubGBbtCbtGbtGbtGbtGbtGaKPbtGbtGbtGbGwbtGbtGbtGbtGbtGbGxbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJibwWaQSaLYbEJbGybEKbGAbGzbGFbGDbGIbGGbGJbEzbGLbyzbGNbGMbGPbGObGRbGQbGTbGSbGVbGUbGXbGWbGYbHbbHcbGZbmdbHabCpbHdbHfbwwbwwbwwbwwbwwbHibwwbwwbwwbzAbFHbzAbzAbHjbARbHkbChbKDbzEbzGbzFbzIbVocsBbGabGbbGcbHraaaaaabCJbNlbBkbHwbHvbHybHxbHzbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbHBbHAbHDbHCbLrbHEbHHbHFbGKbtCbBxbzBbzHbzCbHLbHKbHNbHMbHPbHObHRbHQbHTbHSbHWbHUbHXbzCbzCbHYbIbbHZbzCbIcbzCbzzbHPbzzbIebIdbIgbIfbwWaQSbDlaJlbDtbIBbDtbIhbIibxCbIkbIjbImbIlbIobInbIrbIpbIubItbwmbIvbICbIAbDJbIDbIHbIGbIqbKfbFDbmpbFDbEVbCpbKhbIwbIxbIybNnbmxbmqbmUbIMbIObIFbIQbIPbIRbIJbzAbITbHkbChcsXbBgbCsbCgcvqcuUcvBbGabGbbISbEnbEnbEnbCJbCJbCJbJjbJhbCJbCJbHIbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbHBbHAbHDbHCbLrbHEbHHbHFbGKbtCbBxbzBbzHbzCbHLbHKbHNbHMbHPbHObHRbHQbHTbHSbHWbHUbHXbzCbzCbHYbIbbHZbzCbIcbzCbzzbHPbzzbIebIdbIgbIfbwWaQSbDlaJlbDtbIBbDtbIhbIibxCbIkbIjbImbIlbIobInbIrbIpbIubItbwmbIvbICbIAbDJbIDbIHbIGbIqbKfbFDbmpbFDbEVbCpbKhbIwbIxbIybNnbmxbmqbmUbHVbIObIFbIQbIPbIRbIJbzAbITbHkbChcsXbBgbCsbCgcvqcuUcvBbGabGbbISbEnbEnbEnbCJbCJbCJbJjbJhbCJbCJbHIbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabLaaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbJbbJabJdbJccLYbJebJgbJfbJibtCbBxbJkbJmbJlbJlbJnbJpbJobJqbJobJpbJnbJlbJlbJsbJrbJubJtbJwbJvbJxbJlbJlbJybJpbJobJqbJobJCbJAbJDbJAbJHbJGbvjaJlbJJbELcwqbELbJLbGHbDpbJMbFibDVbxFbJObCFbDSbDzbJSbwkbJTbJVbJUbDJbJWbJYbJXbJNbFDbFDbJPbFDbFDbCpbmXbnPbIxbKabKcbKcbKbbKebKdbodbIFbKkbKjbKobKobzAbKpbKrbKqcwtbCtbDWcwAcwZcwZcxsbGabGbbKlbEnbKmbMIboebEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKFbKEbKEbKGbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKIbKHbKxbKHbKJaaaaaaaaabGtbGtbIZbKKbJdbKKbMPbKMbKObKNbKPbtCbKQbBxbKSbKLbzCbKTbzCbzzbHPbzzbzCbKRbKYbKXbLbbKZbzHbzCbLdbLcbHTbLebHTbHTbLgbLfbLhbLfbLjbLibcvbKWaLYaLYaLYaJlbpobENbEPbLpbLxbLtbLzbLybFIbLAbLCbLBbLDbHgbDzbItbIabIzbHhbDJbDJbLobLobLobCpbLEbLqbLFbLsbLGbCpbprbpvbIxbLwbFGbmxbpXbpYbLHbLJbIFbLLbLKbKobKobzAbLQbLSbLkbGabEvbFacxCcyhcxJcyibGabqybLNbqBbqBbqBbsUbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbMcbLTbMdbLTbKsbKtbKtbMebPCbMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMgbNAbLXbNBbMgbKUbLZbKVbGtbMhbMjbMibMlbMkbMnbMmbMobMobMpbtCbtCbtCbNQbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbMrbMqbMubtCbtCbtCbtCbtCbMvbtCbtCbtCaJlaJlbObaJlaKHaLVbMwaJlbMxbLRbMzbELbMAbxCbDpbMybxCbMCbLCbMDbMFbwkbMBbMGbMEbMJbMMbMLbMRbMQbMKbFDbFDbFDbFDbFDbMTbFDbCpbPObMObMObMObMObMObMObMObMObMObMObMXbMWbMYbMYbzAbMZbNdbNcbMVbMVbMVbMVbNfbNebNhbMVbMVbMVbMVbMVbMVbGbbNbaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapbNjbLTbLTbNkbKtbKtbMebMebNmbMebMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7508,8 +7508,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacIucIUcIvaafcIucIUcIvaaacIucIUcIvaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaaaaafcIpcIrcIqcIscMbcJDcGJcHbcHbcHbcHbcJFcoFcJJcJHcJMcJLcJPcJOcIFcIEcIHcJQcJRcIIcImcIOcIPcIOcIPcIOcIPcIOcIPcIOcIPcIOcHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaaacIucIUcIvaafcIucIUcIvaaacIucIUcIvaafaaaaaaaaaaaaaafaafcJScIKcIKcIKcIKcILcILcILcILcILcItcILcGtcIQcHbcHbcHbcJUcGtcLEcIScLFcGtcKacJVcKdcKccKfcKecKkcGtaaacHPcHPcHPcHPcJmcHPcHPcHPcHPcHPcHPcHPaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcKmaafaafaafcKmaafaaaaafcKmaafaaaaaaaaaaaaaaacKocKqcKpcKscKrcJncJacKtcJcciFcJecJfcJgcJecGtcLIcJocHbcHbcKucJqcKwcKvcKBcJNcKEcKCcJxcJwcKKcKJcKLcGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcKNcKMcKRcKQcKQcKQcKQcKQcKQcKQcKQcKQcKQcKQcKScKMcKMcKMcKTcLKcMdcfvcMfcMecMgcJGcMhcJIcJIcJIcLJcLCcJKcGtcLacLacHbcHbcKucKbcLhcLdcLicLVcKEcKucIFcJZcIHcLmcLncGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcLoaafaaaaafcLoaafaaaaafcLoaafaaaaaaaaaaaaaaacKocKqcLrcLscJTcLQcIKcLvcJWcJecJecJXcJXcJYcGtcLacLacHbcHbcKucLWcLhcLwcLxcLXcLzcLycLBcLAcLGcLDcLHcGtaaacHPcHPcHPcHPcJmcHPcHPcHPcHPcHPcHPcHPaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcKNcKMcKRcKQcKQcKQcKQcKQcKQcKQcKQcKQcKQcKQcKScKMcKMcKMcKTcLKcMdcfvcMfcMecMgcJGcMhcJIcJIcJIcLJcLCcJKcGtbIMbIMcHbcHbcKucKbcLhcLdcLicLVcKEcKucIFcJZcIHcLmcLncGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcLoaafaaaaafcLoaafaaaaafcLoaafaaaaaaaaaaaaaaacKocKqcLrcLscJTcLQcIKcLvcJWcJecJecJXcJXcJYcGtbIMbIMcHbcHbcKucLWcLhcLwcLxcLXcLzcLycLBcLAcLGcLDcLHcGtaaacHPcHPcHPcHPcJmcHPcHPcHPcHPcHPcHPcHPaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaafcIucLLcIvaaacIucLLcIvaaacIucLLcIvaafaaaaaaaaaaaaaafaafcLNcIKcIKcIKcIKcKgcKhcKicKicKjcKgcKgcGtcGtcGJcGtcGtcGtcGtcGtcLOcGtcGtcGtcGtcGtcGJcGtcGtcGtcGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIucLLcIvaafcIucLLcIvaaacIucLLcIvaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacKxaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaacHqcKycHqcKycKzcKycHqcKycHqcKycHqcKyaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcIucLLcIvaaacIucLLcIvaaacIucLLcIvaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaapaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From b22d7c58bbb4d49a7fc9abd38886320fd5438844 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 3 Jan 2016 12:30:49 +0100 Subject: [PATCH 19/55] Makes it possible to connect to cable nodes on shuttle plating. Fixes #11852. --- code/game/turfs/simulated/floor_types.dm | 4 ++++ code/modules/power/powernet.dm | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm index f1db688d0a7..f127b926dd0 100644 --- a/code/game/turfs/simulated/floor_types.dm +++ b/code/game/turfs/simulated/floor_types.dm @@ -27,6 +27,10 @@ name = "plating" icon = 'icons/turf/floors.dmi' icon_state = "plating" + level = 1 + +/turf/simulated/shuttle/plating/is_plating() + return 1 /turf/simulated/shuttle/plating/vox //Skipjack plating oxygen = 0 diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index ebd88df3e2c..681cd2b36ce 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -148,7 +148,7 @@ // return a knot cable (O-X) if one is present in the turf // null if there's none /turf/proc/get_cable_node() - if(!istype(src, /turf/simulated/floor)) + if(!istype(src, /turf/simulated)) return null for(var/obj/structure/cable/C in src) if(C.d1 == 0) From dbe1f155c75942bc4cf2091028989856f2a76b3b Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Sun, 3 Jan 2016 06:54:47 -0500 Subject: [PATCH 20/55] Finalized mob damage procs. I'm done. --- code/unit_tests/mob_tests.dm | 60 ++++++++++++++++++++++++------------ code/unit_tests/zas_tests.dm | 2 +- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index 515e21fde10..c247803831e 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -84,27 +84,28 @@ proc/create_test_mob_with_mind(var/turf/mobloc = null, var/mobtype = /mob/living //Generic Check // TODO: Need to make sure I didn't just recreate the wheel here. -proc/damage_check(var/mob/living/M, var/damage_type, var/amount = 0) +proc/damage_check(var/mob/living/M, var/damage_type) var/loss = null + switch(damage_type) - if(BRUTE) - if(amount) M.adjustBruteLoss(amount) + if(BRUTE) loss = M.getBruteLoss() if(BURN) - if(amount) M.adjustFireLoss(amount) loss = M.getFireLoss() if(TOX) - if(amount) M.adjustToxLoss(amount) loss = M.getToxLoss() if(OXY) - if(amount) M.adjustOxyLoss(amount) loss = M.getOxyLoss() if(CLONE) - if(amount) M.adjustCloneLoss(amount) loss = M.getCloneLoss() if(HALLOSS) - if(amount) M.adjustHalLoss(amount) loss = M.getHalLoss() + + if(!loss && istype(M, /mob/living/carbon/human)) // Revert IPC's when? + var/mob/living/carbon/human/H = M // IPC's have robot limbs which don't report damage to getXXXLoss() + if(istype(H.species, /datum/species/machine)) // So we have ot hard code this check or create a different one for them. + return 100 - H.health // TODO: Find better way to do this then hardcoding this formula + return loss // ============================================================================================================== @@ -127,10 +128,13 @@ datum/unit_test/mob_damage var/damagetype = BRUTE var/mob_type = /mob/living/carbon/human var/expected_vulnerability = STANDARD + var/check_health = 0 + var/damage_location = "chest" datum/unit_test/mob_damage/start_test() var/list/test = create_test_mob_with_mind(null, mob_type) - var/damage_amount = 10 + var/damage_amount = 5 // Do not raise, if damage >= 10 there is a % chance to reduce damage by half in /obj/item/organ/external/take_damage() + // Which makes checks impossible. if(isnull(test)) fail("Check Runtimed in Mob creation") @@ -156,25 +160,32 @@ datum/unit_test/mob_damage/start_test() // Damage the mob - H.apply_damage(damage_amount, damagetype) + var/initial_health = H.health + + H.apply_damage(damage_amount, damagetype, damage_location) + + H.updatehealth() // Just in case, though at this time apply_damage does this for us. + // We operate with the assumption that someone might mess with that proc one day. var/ending_damage = damage_check(H, damagetype) + var/ending_health = H.health + // Now test this stuff. var/failure = 0 var/damage_ratio = STANDARD - if (ending_damage < damage_amount) + if (ending_damage == 0) + damage_ratio = IMMUNE + + else if (ending_damage < damage_amount) damage_ratio = ARMORED else if (ending_damage > damage_amount) damage_ratio = EXTRA_VULNERABLE - else if (ending_damage == 0) - damage_ratio = IMMUNE - if(damage_ratio != expected_vulnerability) failure = 1 @@ -193,7 +204,7 @@ datum/unit_test/mob_damage/start_test() expected_msg = "To take no damage" - var/msg = "Damage taken: [ending_damage] out of [damage_amount] || expected: [expected_msg] \[Overall Health:[H.health] \]" + var/msg = "Damage taken: [ending_damage] out of [damage_amount] || expected: [expected_msg] \[Overall Health:[ending_health] (Initial: [initial_health]\]" if(failure) fail(msg) @@ -233,7 +244,7 @@ datum/unit_test/mob_damage/halloss damagetype = HALLOSS // ================================================================= -// Unathi damage check. +// Unathi // ================================================================= datum/unit_test/mob_damage/unathi @@ -266,7 +277,7 @@ datum/unit_test/mob_damage/unathi/halloss damagetype = HALLOSS // ================================================================= -// SpessKahjit damage check. +// SpessKahjit aka Tajaran // ================================================================= datum/unit_test/mob_damage/tajaran @@ -300,7 +311,7 @@ datum/unit_test/mob_damage/tajaran/halloss damagetype = HALLOSS // ================================================================= -// Resomi damage check +// Resomi // ================================================================= datum/unit_test/mob_damage/resomi @@ -310,10 +321,12 @@ datum/unit_test/mob_damage/resomi datum/unit_test/mob_damage/resomi/brute name = "MOB: Resomi Brute Damage Check" damagetype = BRUTE + expected_vulnerability = EXTRA_VULNERABLE datum/unit_test/mob_damage/resomi/fire name = "MOB: Resomi Fire Damage Check" damagetype = BURN + expected_vulnerability = EXTRA_VULNERABLE datum/unit_test/mob_damage/resomi/tox name = "MOB: Resomi Toxins Damage Check" @@ -390,6 +403,8 @@ datum/unit_test/mob_damage/vox/oxy datum/unit_test/mob_damage/vox/clone name = "MOB: Vox Clone Damage Check" damagetype = CLONE + expected_vulnerability = IMMUNE + datum/unit_test/mob_damage/vox/halloss name = "MOB: Vox Halloss Damage Check" @@ -418,17 +433,19 @@ datum/unit_test/mob_damage/diona/tox datum/unit_test/mob_damage/diona/oxy name = "MOB: Diona Oxygen Damage Check" damagetype = OXY + expected_vulnerability = IMMUNE datum/unit_test/mob_damage/diona/clone name = "MOB: Diona Clone Damage Check" damagetype = CLONE + expected_vulnerability = IMMUNE datum/unit_test/mob_damage/diona/halloss name = "MOB: Diona Halloss Damage Check" damagetype = HALLOSS // ================================================================= -// IPC +// SPECIAL WHITTLE SNOWFLAKES aka IPC // ================================================================= datum/unit_test/mob_damage/machine @@ -438,22 +455,27 @@ datum/unit_test/mob_damage/machine datum/unit_test/mob_damage/machine/brute name = "MOB: IPC Brute Damage Check" damagetype = BRUTE + expected_vulnerability = EXTRA_VULNERABLE datum/unit_test/mob_damage/machine/fire name = "MOB: IPC Fire Damage Check" damagetype = BURN + expected_vulnerability = EXTRA_VULNERABLE datum/unit_test/mob_damage/machine/tox name = "MOB: IPC Toxins Damage Check" damagetype = TOX + expected_vulnerability = IMMUNE datum/unit_test/mob_damage/machine/oxy name = "MOB: IPC Oxygen Damage Check" damagetype = OXY + expected_vulnerability = IMMUNE datum/unit_test/mob_damage/machine/clone name = "MOB: IPC Clone Damage Check" damagetype = CLONE + expected_vulnerability = IMMUNE datum/unit_test/mob_damage/machine/halloss name = "MOB: IPC Halloss Damage Check" diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm index 7b69f0441b3..e39ead59a0e 100644 --- a/code/unit_tests/zas_tests.dm +++ b/code/unit_tests/zas_tests.dm @@ -152,7 +152,7 @@ datum/unit_test/zas_area_test/west_hall_mining_outpost area_path = /area/outpost/mining_main/west_hall datum/unit_test/zas_area_test/mining_area - name = "ZAS: Mining Area (Vacume)" + name = "ZAS: Mining Area (Vacuum)" area_path = /area/mine/explored expectation = UT_VACUUM From 16ca56e1976fd01c913dc523a0cc200e38154463 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Sun, 3 Jan 2016 07:09:59 -0500 Subject: [PATCH 21/55] Fixes #11885 --- code/modules/organs/subtypes/diona.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm index 27f63ea5e36..61652aafd44 100644 --- a/code/modules/organs/subtypes/diona.dm +++ b/code/modules/organs/subtypes/diona.dm @@ -153,18 +153,23 @@ /obj/item/organ/diona/strata name = "neural strata" parent_organ = "chest" + organ_tag = "neural strata" + /obj/item/organ/diona/bladder name = "gas bladder" parent_organ = "head" + organ_tag = "gas bladder" /obj/item/organ/diona/polyp name = "polyp segment" parent_organ = "groin" + organ_tag = "polyp segment" /obj/item/organ/diona/ligament name = "anchoring ligament" parent_organ = "groin" + organ_tag = "anchoring ligament" /obj/item/organ/diona name = "diona nymph" @@ -195,7 +200,7 @@ /obj/item/organ/diona/node name = "response node" parent_organ = "head" - organ_tag = "receptor node" + organ_tag = "response node" icon = 'icons/mob/alien.dmi' icon_state = "claw" From 9984d72ff6c977dc7a4b94352b2e11f9b338efb6 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 3 Jan 2016 17:31:49 +0100 Subject: [PATCH 22/55] It should now be possible to give species with blood IV, rather than species without blood. --- code/modules/organs/blood.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index ebc490601d3..2edf11ae521 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -216,7 +216,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 //Transfers blood from reagents to vessel, respecting blood types compatability. /mob/living/carbon/human/inject_blood(var/datum/reagent/blood/injected, var/amount) - if(species.flags & NO_BLOOD) + if(!(species.flags & NO_BLOOD)) reagents.add_reagent("blood", amount, injected.data) reagents.update_total() return From 6aea83aeb37302e3fd2c5f80c689076132197e9e Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 3 Jan 2016 20:57:34 +0100 Subject: [PATCH 23/55] Replaces mega-health windows. Mega health windows (the old 1e007 Crescent windows) are now replaced with with either normal reinforced windows or the Crescent window sub-type or relevant window spawners. Also changes the security sub-armory window from dir 5 to 2 (non-cardinal directions transforms windows into full-tile ones, it's no longer visible in the mapper). Fixes #11889. Adds pre-defined full tile reinforced windows for when those are needed. --- code/game/objects/structures/window.dm | 4 + maps/exodus-1.dmm | 45 ++--- maps/exodus-2.dmm | 250 +++++++++++-------------- 3 files changed, 130 insertions(+), 169 deletions(-) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 07d32e100b0..a77066c9aa6 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -455,6 +455,10 @@ if (constructed) state = 0 +/obj/structure/window/reinforced/full + dir = 5 + icon_state = "fwindow" + /obj/structure/window/reinforced/tinted name = "tinted window" desc = "It looks rather strong and opaque. Might take a few good hits to shatter it." diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 00fb0fdbfe1..94b3eee8057 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -247,7 +247,7 @@ "aeM" = (/obj/machinery/deployable/barrier,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/warden) "aeN" = (/obj/structure/closet/l3closet/security,/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) "aeO" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/warden) -"aeP" = (/obj/structure/table/rack{pixel_y = 6},/obj/machinery/door/window/brigdoor/eastleft{name = "Sub-Armory Storage"; req_access = list(2)},/obj/machinery/door/window/brigdoor/westleft{name = "Sub-Armory Storage"; req_access = list(3)},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/machinery/door/blast/shutters{dir = 2; id = "subarmory"; name = "Sub-Armory Storage"},/turf/simulated/floor/tiled/red,/area/security/warden) +"aeP" = (/obj/structure/table/rack{pixel_y = 6},/obj/machinery/door/window/brigdoor/eastleft{name = "Sub-Armory Storage"; req_access = list(2)},/obj/machinery/door/window/brigdoor/westleft{name = "Sub-Armory Storage"; req_access = list(3)},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{dir = 2; id = "subarmory"; name = "Sub-Armory Storage"},/turf/simulated/floor/tiled/red,/area/security/warden) "aeQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "aeR" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "aeS" = (/turf/simulated/wall/r_wall,/area/maintenance/security_starboard) @@ -4604,9 +4604,9 @@ "bKB" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hor) "bKC" = (/obj/machinery/modular_computer/console/preset/engineering,/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) "bKD" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hor) -"bKE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/rnd/test_area) -"bKF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/rnd/test_area) -"bKG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/rnd/test_area) +"bKE" = (/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/airless,/area/rnd/test_area) +"bKF" = (/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled/airless,/area/rnd/test_area) +"bKG" = (/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "bKH" = (/turf/simulated/shuttle/wall{icon_state = "swall_straight"; dir = 4},/area/shuttle/mining/station) "bKI" = (/turf/simulated/shuttle/wall{icon_state = "swall_s"; dir = 4},/area/shuttle/mining/station) "bKJ" = (/turf/simulated/shuttle/wall{icon_state = "swall_s"; dir = 2},/area/shuttle/mining/station) @@ -4639,6 +4639,7 @@ "bLk" = (/obj/effect/floor_decal/corner/purple,/obj/item/device/radio/intercom{dir = 8; pixel_x = 22},/turf/simulated/floor/tiled/white,/area/rnd/research) "bLl" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay4) "bLm" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay4) +"bLn" = (/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "bLo" = (/turf/simulated/wall,/area/medical/genetics_cloning) "bLp" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bLq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor/plating,/area/medical/genetics) @@ -4675,14 +4676,10 @@ "bLV" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/modular_computer/console/preset/engineering,/turf/simulated/floor/tiled,/area/engineering/break_room) "bLW" = (/obj/item/weapon/tank/emergency_oxygen/engi,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor,/area/construction) "bLX" = (/obj/machinery/computer/shuttle_control/mining,/turf/simulated/shuttle/floor,/area/shuttle/mining/station) -"bLY" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "bLZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/quartermaster/miningdock) -"bMa" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "bMb" = (/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/hor) -"bMc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/rnd/test_area) "bMd" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/airless,/area/rnd/test_area) "bMe" = (/turf/simulated/floor/tiled/airless,/area/rnd/test_area) -"bMf" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/tiled/airless,/area/rnd/test_area) "bMg" = (/turf/simulated/shuttle/wall{icon_state = "swall_straight"; dir = 1},/area/shuttle/mining/station) "bMh" = (/obj/machinery/computer/shuttle_control/mining,/obj/effect/floor_decal/corner/brown/full{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) "bMi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) @@ -4770,7 +4767,6 @@ "bNM" = (/obj/structure/closet/jcloset,/turf/simulated/floor/tiled,/area/janitor) "bNN" = (/obj/machinery/newscaster{pixel_y = 30},/turf/simulated/floor/tiled,/area/janitor) "bNO" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera/network/security{c_tag = "Custodial Closet"},/turf/simulated/floor/tiled,/area/janitor) -"bNP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "bNQ" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_three) "bNR" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/janitor) "bNS" = (/obj/machinery/light/small,/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor,/area/maintenance/atmos_control) @@ -4861,7 +4857,6 @@ "bPz" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/janitor) "bPA" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/janitor) "bPB" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/floor/tiled,/area/janitor) -"bPC" = (/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/tiled/airless,/area/rnd/test_area) "bPD" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/button/remote/blast_door{id = "acutesep"; name = "Acute Separation Shutters"; pixel_y = 25; req_access = list(5)},/obj/machinery/camera/network/medbay{c_tag = "Medbay Acute"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bPE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; name = "Acute Treatment"; req_access = list(5)},/turf/simulated/floor/tiled/white,/area/medical/medbay) "bPF" = (/obj/structure/disposalpipe/segment,/obj/machinery/light_switch{pixel_x = 22; pixel_y = -9},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera/network/medbay{c_tag = "Medbay Port Corridor"; dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/medbay) @@ -4985,7 +4980,6 @@ "bRT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/miningdock) "bRU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/shuttle/mining/station) "bRV" = (/obj/structure/closet/secure_closet/miner,/obj/effect/floor_decal/corner/brown{dir = 10},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) -"bRW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "bRX" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/storage/tech) "bRY" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/storage/tech) "bRZ" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/storage/tech) @@ -5690,7 +5684,6 @@ "cfw" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "cfx" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/reagent_containers/spray/sterilizine,/turf/simulated/floor/plating,/area/maintenance/engineering) "cfy" = (/obj/item/clothing/mask/smokable/cigarette,/turf/simulated/floor/airless,/area/rnd/test_area) -"cfz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/rnd/test_area) "cfA" = (/obj/machinery/light/small,/turf/simulated/floor/airless,/area/rnd/test_area) "cfB" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) "cfC" = (/obj/machinery/airlock_sensor/airlock_interior{id_tag = "eng_al_int_snsr"; master_tag = "engine_room_airlock"; pixel_y = 22; req_access = list(10)},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room) @@ -5772,7 +5765,6 @@ "cha" = (/obj/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) "chb" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) "chc" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/purple{dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) -"chd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/rnd/test_area) "che" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/corner/purple{dir = 9},/obj/item/device/radio/intercom{dir = 4; pixel_x = -22},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora_storage) "chf" = (/turf/simulated/floor/tiled,/area/construction) "chg" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/clothing/gloves/black,/obj/item/device/multitool{pixel_x = 5},/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/construction) @@ -6156,7 +6148,6 @@ "cou" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) "cov" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/obj/machinery/atmospherics/pipe/simple/visible/supply,/turf/simulated/floor,/area/maintenance/atmos_control) "cow" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor,/area/maintenance/atmos_control) -"cox" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "coy" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(11,24)},/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/substation/engineering) "coz" = (/obj/machinery/meter{frequency = 1443; id = "wloop_atm_meter"; name = "Waste Loop"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/tiled,/area/engineering/atmos) "coA" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/meter,/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -6178,7 +6169,6 @@ "coQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/workshop) "coR" = (/turf/simulated/floor/tiled,/area/engineering/workshop) "coS" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 1 Storage"; req_access = list(45)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/surgery) -"coT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "coU" = (/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/structure/table/standard,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera/network/medbay{c_tag = "Medbay Surgery Prep"; dir = 8},/obj/effect/floor_decal/corner/blue{dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryprep) "coV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 2 Storage"; req_access = list(45)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "coW" = (/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "virologyquar"; name = "Virology Emergency Quarantine Blast Doors"; opacity = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/medical/virologyaccess) @@ -6234,7 +6224,6 @@ "cpU" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/engineering/atmos) "cpV" = (/obj/machinery/atmospherics/binary/pump/on{name = "Ports to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cpW" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics Monitoring Room"; req_access = list(24)},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) -"cpX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "cpY" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Monitoring Room"; req_one_access = list(10)},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) "cpZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10},/turf/simulated/floor/plating,/area/engineering/atmos) "cqa" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) @@ -6277,7 +6266,6 @@ "cqL" = (/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cqM" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) "cqN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/computer/general_air_control/supermatter_core{frequency = 1438; input_tag = "cooling_in"; name = "Engine Cooling Control"; output_tag = "cooling_out"; pressure_setting = 100; sensors = list("engine_sensor" = "Engine Core")},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) -"cqO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/machinery/status_display{pixel_y = 32},/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "cqP" = (/obj/machinery/shield_capacitor,/turf/simulated/floor/plating,/area/engineering/storage) "cqQ" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "cqR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/virology) @@ -6343,7 +6331,6 @@ "csd" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos) "cse" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "csf" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos) -"csg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "csh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "csi" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/pipedispenser,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos) "csl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/rnd/xenobiology) @@ -7457,34 +7444,34 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbFbbEfbFbbEhbDLbEibEibEibEibEibEjbElbEkbzubEmbdPbEobEqbEpbEtbEsbGibGhbGkbGjbGvbtCbEubzBbExbEwbyjbvwbEgbEybEAbBybEBbvwbBPbGCbECbAhaaaaaaaaabAjbEDbGEbFcbyNbEFbEEbEHbEGbDgbDfbEIaJibwWaQSaLYbEJbELbEKbENbEMbEPbEObERbEQbxCbxFbxFbESbxFbwkbEWbETbEYbEXbFdbEZbDJbFebDEbFfbFAbFBbDObFCbFDbjGbFhbFgbFkbFjbDIbFlbDKbFmbFobFnbFqbFpbFtbFsbFvbFubFxbFwbFzbChbKDbmFbsObrebILbzbbMbbGabGbbGcbGdaafaafbCJbkobkcbktbkrbkUbFWbFYbFTaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbFVbGmbGlbdPbdPbGnbyPbyPbyPbGobdPbdPbGpbGrbGqbdPbGtbGtbGtbFZbGtbGvbGebGgbGfbGsbtCbBxbzBbGubGBbtCbtGbtGbtGbtGbtGaKPbtGbtGbtGbGwbtGbtGbtGbtGbtGbGxbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJibwWaQSaLYbEJbGybEKbGAbGzbGFbGDbGIbGGbGJbEzbGLbyzbGNbGMbGPbGObGRbGQbGTbGSbGVbGUbGXbGWbGYbHbbHcbGZbmdbHabCpbHdbHfbwwbwwbwwbwwbwwbHibwwbwwbwwbzAbFHbzAbzAbHjbARbHkbChbKDbzEbzGbzFbzIbVocsBbGabGbbGcbHraaaaaabCJbNlbBkbHwbHvbHybHxbHzbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbHBbHAbHDbHCbLrbHEbHHbHFbGKbtCbBxbzBbzHbzCbHLbHKbHNbHMbHPbHObHRbHQbHTbHSbHWbHUbHXbzCbzCbHYbIbbHZbzCbIcbzCbzzbHPbzzbIebIdbIgbIfbwWaQSbDlaJlbDtbIBbDtbIhbIibxCbIkbIjbImbIlbIobInbIrbIpbIubItbwmbIvbICbIAbDJbIDbIHbIGbIqbKfbFDbmpbFDbEVbCpbKhbIwbIxbIybNnbmxbmqbmUbHVbIObIFbIQbIPbIRbIJbzAbITbHkbChcsXbBgbCsbCgcvqcuUcvBbGabGbbISbEnbEnbEnbCJbCJbCJbJjbJhbCJbCJbHIbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabLaaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbJbbJabJdbJccLYbJebJgbJfbJibtCbBxbJkbJmbJlbJlbJnbJpbJobJqbJobJpbJnbJlbJlbJsbJrbJubJtbJwbJvbJxbJlbJlbJybJpbJobJqbJobJCbJAbJDbJAbJHbJGbvjaJlbJJbELcwqbELbJLbGHbDpbJMbFibDVbxFbJObCFbDSbDzbJSbwkbJTbJVbJUbDJbJWbJYbJXbJNbFDbFDbJPbFDbFDbCpbmXbnPbIxbKabKcbKcbKbbKebKdbodbIFbKkbKjbKobKobzAbKpbKrbKqcwtbCtbDWcwAcwZcwZcxsbGabGbbKlbEnbKmbMIboebEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKFbKEbKEbKGbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKIbKHbKxbKHbKJaaaaaaaaabGtbGtbIZbKKbJdbKKbMPbKMbKObKNbKPbtCbKQbBxbKSbKLbzCbKTbzCbzzbHPbzzbzCbKRbKYbKXbLbbKZbzHbzCbLdbLcbHTbLebHTbHTbLgbLfbLhbLfbLjbLibcvbKWaLYaLYaLYaJlbpobENbEPbLpbLxbLtbLzbLybFIbLAbLCbLBbLDbHgbDzbItbIabIzbHhbDJbDJbLobLobLobCpbLEbLqbLFbLsbLGbCpbprbpvbIxbLwbFGbmxbpXbpYbLHbLJbIFbLLbLKbKobKobzAbLQbLSbLkbGabEvbFacxCcyhcxJcyibGabqybLNbqBbqBbqBbsUbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbMcbLTbMdbLTbKsbKtbKtbMebPCbMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabLaaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbJbbJabJdbJccLYbJebJgbJfbJibtCbBxbJkbJmbJlbJlbJnbJpbJobJqbJobJpbJnbJlbJlbJsbJrbJubJtbJwbJvbJxbJlbJlbJybJpbJobJqbJobJCbJAbJDbJAbJHbJGbvjaJlbJJbELcwqbELbJLbGHbDpbJMbFibDVbxFbJObCFbDSbDzbJSbwkbJTbJVbJUbDJbJWbJYbJXbJNbFDbFDbJPbFDbFDbCpbmXbnPbIxbKabKcbKcbKbbKebKdbodbIFbKkbKjbKobKobzAbKpbKrbKqcwtbCtbDWcwAcwZcwZcxsbGabGbbKlbEnbKmbMIboebEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKEbKEbKEbKEbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKIbKHbKxbKHbKJaaaaaaaaabGtbGtbIZbKKbJdbKKbMPbKMbKObKNbKPbtCbKQbBxbKSbKLbzCbKTbzCbzzbHPbzzbzCbKRbKYbKXbLbbKZbzHbzCbLdbLcbHTbLebHTbHTbLgbLfbLhbLfbLjbLibcvbKWaLYaLYaLYaJlbpobENbEPbLpbLxbLtbLzbLybFIbLAbLCbLBbLDbHgbDzbItbIabIzbHhbDJbDJbLobLobLobCpbLEbLqbLFbLsbLGbCpbprbpvbIxbLwbFGbmxbpXbpYbLHbLJbIFbLLbLKbKobKobzAbLQbLSbLkbGabEvbFacxCcyhcxJcyibGabqybLNbqBbqBbqBbsUbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbKEbLTbMdbLTbKsbKtbKtbMebKFbMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMgbNAbLXbNBbMgbKUbLZbKVbGtbMhbMjbMibMlbMkbMnbMmbMobMobMpbtCbtCbtCbNQbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbMrbMqbMubtCbtCbtCbtCbtCbMvbtCbtCbtCaJlaJlbObaJlaKHaLVbMwaJlbMxbLRbMzbELbMAbxCbDpbMybxCbMCbLCbMDbMFbwkbMBbMGbMEbMJbMMbMLbMRbMQbMKbFDbFDbFDbFDbFDbMTbFDbCpbPObMObMObMObMObMObMObMObMObMObMObMXbMWbMYbMYbzAbMZbNdbNcbMVbMVbMVbMVbNfbNebNhbMVbMVbMVbMVbMVbMVbGbbNbaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapbNjbLTbLTbNkbKtbKtbMebMebNmbMebMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbNgbMsbNgbKxbMtbNobqYbGtbNubNrbKKbNtbNsbGvbNzbNHbNGbNIbGvbrabNvbOXbNxaaaaaaaaaaaabNybOLbONbOMbNDbNCbNEbNFbNJbNJbNKbNFbNMbNLbNObNNbNRbFFbNXbNWbNYbPxbrbbNUbNUbNUbNUbDtbDtbDtbDtbNZbNZbxCbOcbOabOdbLCbOfbOebOhbOgbOjbOibOlbOkbOnbOmbOqbOpbMKbsrbFDbFDbNVbFDbFDbsrbCpbPObMObOrbOtbOsbHGbOsbOxbOwbOybMObOAbOzbOBbOBbzAbOEbOFbChcymbOGbOIbOHbOKbOJbORbOQbOUbOubOWbOVbMVbPZbEnbOObOObOObOObOOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabOPbKtbNjbKtbKtbMebMebMebMebMebMebMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMgbNgbNgbNgbPbbPabKAbPcbsKbsJbuobtVbPmbPibGvbGvbGvbGvbGvbGvbuxbOYbOZbMUaaabNibOCbOCbODbQjbPfbPgbPhbPfbPnbNFbPpbPobPqbNFbPsbPrbPvbPubPAbPzbPBbPtbPtbPxbvSbQpbPxbPxbCvbDtbOTbELbPDbELbELbPEbDpbPFbxCbPGbPIbPHbPJbwkbPLbPKbwkbPMbPPbPNbPRbPQbMKbCpbCpbCpbCpbCpbCpbCpbCpbPObMObPSbPUbPTbOsbOsbOsbOsbPVbMObCwbLKbPXbPXbzAbARbLSbChcyqbPYbPYbQbbQdbQcbQgbQfbQhbQhbQhbQibMVbQkbQlbOObQnbQmbQobPdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbQsbQrbQrbMebMebMebMebMebMebMebMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbMsbMsbMsbKxbPjbQAbCxbQqbQBbKKbCybDRbCAbEUbEebFEbQvbQvbQvbVTbQwbQxbPkaaabPlbQJbQIbQCbSlbPfbQEbQGbQFbQKbNFbQMbQLbQNbNFbQPbQObQRbQQbQWbQVbQXbPtbPxbPxbQTbNUbPxbPxbQUbDtbQYbELbRabQZbELbRbbDpbDobRCbLCbRdbRcbRebRGbDzbItbSpbPMbPNbPNbPRbIUbMKbRgbRibRhbRjbRkbRmbRlbRnbPObMObOsbOsbRobOsbOsbOsbOsbRpbMObCwbLKbRrbRrbzAbLQbRtbRscyCbRubRxbRwbRzbRybRBbRAbREbRDbRHbRFbRJbRIbRMbRLbRObRNbQobQyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRQbMebMebMebMebMebMebMebMebMebMebMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaabMgbUbbRUbUkbMgbQzbLZbKVbGtbGtbRVbRVbRVbGtbGtbNxbFObFLbFLbFLbYEbRSbNwbPkaaabRKbFJbRXbUobRXbRYbRZbsVbSbbSbbScbSebSdbSfbNFbPtbPtbPtbPtbPtbUAbPtbPtbShbUGbSjbNUbPxbSkbUObDtbXkbELbRabSmbSnbRbbSobEQbJBbSqbSibSrbIVbJzbEWbSubIEbSvbSxbSsbSwbSybMKbSzbSCbSBbRjbSAbSGbSEbRnbPObMObMObMObRobOsbOsbOsbMObMObMObSIbSHbRrbRrbzAbSDbLSbChcymbSKbSMbSLbSObSNbSQbSPbSSbSRbSVbSTbMVbSWbSXbOObTbbSZbTcbRPaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbMebMebMebMebMebMebTdbMebMebMebMebMebMebMebKtbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTfbKHbTebKHbTgbWoaafaaaaaabGtbTabRTbThbGtaaabNxcxKbFPbFRbTncbrbTncctbPkaaabPlbTibPfbTrbWIbPfbTtbTvbWMbTwbNFbTpbTjbTqbWVbTCbTCbTCbTCbTCbTDbTEbULbPxbPxbTFbNUbNUbNUbNUbDtbDtbTsbTxbTubDtbTJbTzbTybJFbJEbTJbOdbLlbLmbTGbTAbTJbMKbMKbMKbMKbMKbMKbTHbTKbTIbRjbTLbTNbTMbRnbPObMObTPbTRbTQbTUbTSbTWbTVbTPbUgbTYbTXbIRbIJbzAbITbLSbTZbMVbMVbMVbXibXnbMVbMVbMVbMVbUabUcbSSbMVbXqbUnbOObUebFSbTObOOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbUfbUfbUfbUfbUfbUfbUibMebUjbUfbMebMebMebMebMebKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUvbNxbNxbNxbNxccvbRSbNwbTTaaabUhbOCbOCbUpbXxbPfbPfbUBbPfbSFbNFbUrbUqbUsbNFbSUbSUbSUbSUbSUbSUbSUbSUbUHbUIbUJbUKbUKbUMbNUbDtbUubUtbUxbUwbUzbwabUEbUDbUNbUFbSJbUEbURbUQbUTbUSbUVbUUbUPbUWbVabUZbVibUlbVbbUmbRjbUCbVdbUCbRnbPObMObVebVhbVgbVkbVjbVmbVlbVnbUgbzAcyEbzAbzAbVpbARbLSbChbUyaafbVrbVqbVtbVsbFXbVubHebVvbVybSSbMVbVHbVIbOObVAbVzbVGbVFaapaapaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVJbLTbLTbLTbLTbLTbLTbLTbuAbMfbMebMebMebMebVLbPCbKuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUvbNxbNxbNxbNxccvbRSbNwbTTaaabUhbOCbOCbUpbXxbPfbPfbUBbPfbSFbNFbUrbUqbUsbNFbSUbSUbSUbSUbSUbSUbSUbSUbUHbUIbUJbUKbUKbUMbNUbDtbUubUtbUxbUwbUzbwabUEbUDbUNbUFbSJbUEbURbUQbUTbUSbUVbUUbUPbUWbVabUZbVibUlbVbbUmbRjbUCbVdbUCbRnbPObMObVebVhbVgbVkbVjbVmbVlbVnbUgbzAcyEbzAbzAbVpbARbLSbChbUyaafbVrbVqbVtbVsbFXbVubHebVvbVybSSbMVbVHbVIbOObVAbVzbVGbVFaapaapaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVJbLTbLTbLTbLTbLTbLTbLTbuAbKFbMebMebMebMebVLbKFbKuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVNbVMbVMbVObVSbNxcczbRSbVUbNxaaaaaaaaaaaabNybZrbVWbVXbVZbIWbPfbNFbVQbVPbVRbNFbSUbUXbVfbVcbVDbVCbVEbSUcaqcaqcaqcaqcaqbTFbWabVVbWcbWbbWebWdbWgbWfbWibWhbWkbWjbWkbWlbWkbWmbWqbWpbWsbWrbWtbWrbWvbWubWwbWvbWybWxbWzbWxbWBbWAbZzbxVbMObWCbWEbWDbWGbWFbWHbWGbWGbWKbWNbWLbWPbWObCjbARbLSbChbVwaafbVrbWQbWQbWSbWUbWTbWXbWWbWZbWYbMVbVHbZUbOObOObOObOObOOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbQrbQrbQrbQrbQrbQrbXabMebQsbQrbMebMebMebMebMebKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXmbZVbUYcaabRSbHtbIsbFLbIIbNxaaKaaaaaaaaabNybNybNybNybNybNybNybNFbUrbXcbXdbNFbSUbWnbWJbXubXubWJbWRbSUbXgbXebXebXhcaqbIKbDtbDtbXlbXocpNbXpbXwbXtbXzbXybXCbXAbXEbXDbXGbXFbXJbXIbXLbXKbXNbXMbXPbXObXQbXPbXRbXPbXSbXPbXUbXTbYfbYgbIwbXVbXXbXWbYebYabYibYhbYmbYjbYobYnbAUbYpbYrbYqbYtbYsbYFaafbVrbYubYwbYvbFXbYybINbYzbYAbSSbMVbVHbJQbYBbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbMebMebMebMebMebMebTdbMebMebMebMebMebMebMebKtbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYDbVMbVMbVObJRbNxcxKbNxbKgbNxbYIbYKbYMbYIbYIbKCbLUbYLbYPbYObZnbYSbYVbYUbYXbYWbZCbWJbYQbYxbYRcbkbYTbYYbZbbYZbZebZdcaqbKibPxcbnbZjbZibZkbZkbZmbZlbZpbZobTJbTJbZqbZsbTJbTJbZtcbtcbAcaIbZvbZubZxbZybZBbZybZAbZabZEbZabZAbZGbYfbPObIwbZIbZKbZJbZMbZLbXbbZNbMObMObwwbwwbwwbwwbwwbZPbZRbZQbwwbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVcbLbZTbZSbUnaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRQbMebMebMebMebMebMebMebMebMebMebMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamcbOaamaamaamaamaamaaaaaaaaaaaaaaaaaaaafaafaaabZfbZgbZgbZgbZgbZgbZgbLubKnbYIbZYbZZbYIcaccabcaecadcagcafcamcahcaocancascapcaibWJbYQcajcakcbkcalbSUcaqcaqcaqcaqcaqbTFbPxbDtcaucatbZOcawcazcaycaCcaBbTJcaxcaLcaKcaMcaEcaFcaGcaHcaIcaNbZucaObZycaWcaPbZAcaXcbdcbbbZAcbfbYfbPObIwbXYcaJbXZbXYbXYbIwbIwbIwcaRcaScaTcaUchBbwwbwwcbibwwbwwccGcaYcblcaAcavbLvcaZcbacbcccQccMccYccSbLIbUnbUnbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbUjbUfbUfbMebMebMebMebMebMebMebMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcbmcbpcbobLObLMbMNbLPbMScbvbYIcbxcbybYIbYIcbzcbCcbBcbEcbDcbjcbFbYVbYUbYXcbGcbHbWJbWJcdYcdZbWJcebbSUbNpbNacaqbxlcaqbTFcbIcbIcbIcbIcbIcbIcbIbTJcbQcbNbTJcbRcbTcbScbUcaEcbPceicelcaIcaNbZucbVbZycbXcbWbZAcaDccbcbZbZAcccbYfbYbbYdbYccceccsccAbYccepbYkbYlcktbZDbZwbZFcktcerccfcchccgccncckccrccqcexcevceHceCcevceIceZceKcfeccwccyccxcAlbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabOPbKtbNjbKtbKtbMebMebMebMebMebMebMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafccuccucbobNSbNqcbuccBccDccCbYIccEccHccFccKccIccNcbYccPccOcdTccRccUccTccWccVccXcdycdQcdFcekceecemccZcdbcdacddcdccaqbTFcbIcdecdgccLcdicdhcdkcdjcdmcdlcdocdncdqcdpcdrcaEcdtcdscducaIcaNbZucdvbZycdxcdwbZAcdzcdBcdAbZAcdEbYfbYfcaQbYccdHcdGcdMbYcchBccacjfcdLcdLcdNcdPcdLcdOcdRcdVcdUcdOcdSceacdWceccdScdScdScdScedcdWceccdScdSbXjcdXcDEcfIcehcegcfUcenceoceoceoceoceoceoceoceoceoceoceoceoceoceoceoceocesceqceqcetbKtbKtbMebMeceubMebMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcejcejcejcejcejcejceycewbYIbYIbYIbYIbYIcgjcgocgmcgmcgmcgucezbYVbYUbYXceAbZCceBceEceDceGceFceJbSUceMceLcdfceLcaqbTFcbIceOcePcePcePceRceSbTJceUceTbTJcbRcbSceVcbUcaEceWcdsceXcaIcaNbZuceYbZyceNcfabZAbZAbZAbZAbZAcfccfgbYfcaQbYcccdcgRbYcbYcchBcgVcjfcdLbxucfhcfhbBlcdOcfdcfkcffcdOcflcfmcfmcfmbJZcfpcfobKycfqcftcfscfucdScfwbNTbOobUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaafaafcfzcfycfAbNkbKsbKtbKtbMebPCbMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcejbPebOSbLWcfDcfGcejcfJcfHcfFcfKcfMcfLcfNcfNcgAcfOcfOcfPcfQcbFbYVbYUbYXcfRcaibLVcfWcfVcfbcfXcgabSUceLceLcaqcgbcaqbTFcbIcgccgdcgdcgdcgecbIcfYcggcgfcfYcghcgkcgicglcaEcgncdscgpcaIcgrcgqcgtbZycgxcgwbZycgybYfcgzcgCcgBcgDbYfccjccicgGcgFcgHcclcclcclccmcdLcgJcgIcgIcgKcgScgLcgOcgMciicgQcgTcgTcgTcgWcgYcgXchacgZchachbchccdScgNbPycgPcgNaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafchdbKEbKEbKGbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcejcejcejcejcejcejceycewbYIbYIbYIbYIbYIcgjcgocgmcgmcgmcgucezbYVbYUbYXceAbZCceBceEceDceGceFceJbSUceMceLcdfceLcaqbTFcbIceOcePcePcePceRceSbTJceUceTbTJcbRcbSceVcbUcaEceWcdsceXcaIcaNbZuceYbZyceNcfabZAbZAbZAbZAbZAcfccfgbYfcaQbYcccdcgRbYcbYcchBcgVcjfcdLbxucfhcfhbBlcdOcfdcfkcffcdOcflcfmcfmcfmbJZcfpcfobKycfqcftcfscfucdScfwbNTbOobUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaafaafbKEcfycfAbNkbKsbKtbKtbMebKFbMebKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcejbPebOSbLWcfDcfGcejcfJcfHcfFcfKcfMcfLcfNcfNcgAcfOcfOcfPcfQcbFbYVbYUbYXcfRcaibLVcfWcfVcfbcfXcgabSUceLceLcaqcgbcaqbTFcbIcgccgdcgdcgdcgecbIcfYcggcgfcfYcghcgkcgicglcaEcgncdscgpcaIcgrcgqcgtbZycgxcgwbZycgybYfcgzcgCcgBcgDbYfccjccicgGcgFcgHcclcclcclccmcdLcgJcgIcgIcgKcgScgLcgOcgMciicgQcgTcgTcgTcgWcgYcgXchacgZchachbchccdScgNbPycgPcgNaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKEbKEbKEbKEbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaaaaacimcgUcgUcgUchfchgcejchichhchkchjchmchlchochnchqchpchschrchuchtchxchvchzchybSUbSUbSUbSUbSUbSUbSUbSUchCchAcaqchDcaqbTFcbIcbIctpctqctrcbIcbIchEchHchFcfYcaEcaEcaEcaEcaEcaIcfZchJcaIchwchKchwbZychMchLbZybYfbYfbVibVicgBchNbYfccobYfbYfccpcdCcdCcdCcdDbYfcdLchechOchOchQchSchRchUchTchXchVchYchYchYchYcidcicchYciechYcigcihcdSchZbPWchGcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEcijcikcijcgEcilcincilcgEciocipciocgEaaaaaacjlcgUcgUchfchfcircejbQecischWciuciwcivciycixciIciHciHciJciHcbFbYVciKbYXciLcjrciMciOciNciOciPciQciqciqciAciAciAciAbTFciGciRciSciSciVciTciXciWciZciYcjbcjacjdcjccjccjeciUcaIcaIcaIcjhcjgcjibZybZybZybZybQtbpvbVicjkcjjcjmbYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcjocjncjqcjpbSabPwcjvbVKcbMcjycjAcjycjycjBcjDcjCcjFcjEcjFcjGcjHcdScmpbQucjxcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEcijcjIcijcgEcilcjJcilcgEciocjKciocgEaaaaaacjlcgUchfchfchfcjLcmmcjNcjMchWchIcjQcjPcjScjRcmocjTcjVcjUcjWcbFbYVcjXchzcjYckacjZckbckbckbckcckeckdckfcmRckhckgciAbTFciGchPciSckjcklckkcubckmckockncngckpckrckqcjcciaciUbQDcnwcnuckvcfickwcnEcdIcdIcdJcdIcdKbVibVibVibVibYfccobYfaaaaaaaaaaaaaaaaaaaaacdLckyckxckAckzckEcdOckBcdOckGckCckFckDckDckFckIckHckDckJckDckLckNcdSckPckOckQcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEckRckTckScgEckUckWckVcgEckYclackZcgEaaaaafcjlbQHcgUchfchfchfcejckMckKchWchWclcchWchWchWchWcldciHcleclfcbFclhclgcljcliclmclkclnclnclnclpclrclrcluciAcllclvclwbQSciGclyciSclzclBclAclDclCclFclEclHclGclJclIcjcclKciUcnVcnXclNclPclOclQclNclRclSclTbYfceQcdIcdIcdIcdIcdIcfjbYfaaaaaaaaaaaaaaaaaaaaacdLclYclVcfncifcdOcitcmdcmccdScmecmfcmfcmfcizcmicmhcmlcmkcmfcmfcmncdScmzcobcmqcmraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafcgEclXcmDcmjcgEcmtcmDcEgcgEcmtcmDcEgcgEaaaaafcmQcgUcgUchfchfcmscejcmvcmucmxbRqcmAcmycmBcmBcmEcmCcmBcmFciCcbFcmIcmHcmKcmJcjrcmLcmLcjsclrcmNcmPcmOcmOciAcibcmScoybRRciGcmUciScmVcmXcmWciGcmYcnacmZciUcnbcndcnccjccneciUclLclMclNcnlcnfcnlclNaaaaaaaaabYfbYfbYfcnnclSclSclTbYfbYfaaaaaaaaaaaacdOcdOcdOcdOcdOcdOcdOcdOcdOcnhcnjcnicdScdScnHcntcnNcdScdScdScdScoucntcnNcdScdScnvcnocnvaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbOaafaafaafaaaaafcnxaafcnxaafcKAaafcpfaafcKAaafcpfaafaafaaacejcnqcnpchfchfcnrcnDcowcovcnycnmcnscnGbMabLYcnGcnGbMHcoxcnGcnJcnFcnCcnIcnMcnOcnOcnOcnOcnLcnKcnRcnRcnRcgscgscgscgsbSgciGcnQcnScmVcnUcnTciGcmYcnacnWciUcnYcnZcnccoccoaciUclLclMclNcjtcodcofclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacdOcogcojcohcwlcokconcolcomcoocoqcopcdOaapaafaafaafaafaaaaaaaaabSYaaaaaaaaaaafcoscqscosaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcptcpBcpAcpGcpCcpIcpHcpGcpScpZcpHcqtcqdcqxcqwcnycnycnycnycnycnycnycnycozcotcoBcoAcoCbNPbQabOvbRfcoGbOvcoGbRvcnGcoKcoJcoLcnOcoNcoMcoPcoOcoRcoQcpjcpbcpbcpkcpncpncpjcrvciGciGcpccoSciGciGciGcjzcnacoUciUciUciUcoVcphciUciUclLcpiclNcoXcoWcoXclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafcdOcoYcoZcoYcpdcpacpgcpecomcomcplcomcdOcdOaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacpmaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcqDcppcpocprcpqcpucpscpwcpvcpycpxcpDcpzcpEcpucpJcjOcpLcpKcfEcpMcpPcpOcpRcpQcpUcpTcpVbRWbRvbStbYHbVYbYNcqacfTcqOcoKcqecqfcnOcoRcoRcoRcoRcoRcqgcpjcqPcqPcqPcpncpncpjbTFbPxciGcqicqhcqkcqjciGcqlcnacqmciUcqncqpcqocqqciUclMclLcpiclNcqucqrcqzclNaaaaaaaaaaaaaaaaaacqvcqRcrkcrgcqvaafaaaaaaaaaaaacdOcoYcoYcoYcoicqAcqCcqBcqFcqEcqHcqGcqIcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacqJaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcrUcqMcqKcqScqQcpucqTcpucqUcqMcqTcpucqUcqMcpucpucpucpucpucqVcpucpucpucqXcqWcqZcqYcrabRWcjwcjucnAcnzcrfcrecfTcsgcoKcqecricnOcrjcoRcoRcrlcoRcrmcpjcrIcrKcrJcrKcrLcpjbTFcrqciGcrocrncrrcrpcrtcrscrwcrucrycrxcrAcrzcrBciUcrEcrFcrGcrHcqvcrCcqvcrHaaaaaaaafaaaaaaaaacqvcrDcrNckicqvaafaafaaaaaaaaacdOcomcomcomcomcrOcpgcrQcrQcrQcnjcrQckscdOaaaaaaaaaaaaaaacrPcrPcrPcbOaafaafaafaafcrSaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcqDcpucqYcpucqYcpucqTcpucrTcrXcrWcrXcrZcrXcrXcsbcsacpucpucsdcsccsccsccsfcsecshcshcsibRWcnBbOvcoEcoDcoHcsncoIcnGcsscsrcstcsqcsvcsucszcswcoRcsAcpjcsxcrKcsycrKckucpjbTFcfxciGcsDcsCcsFcsEciGcfYcufcfYciUcsGcsJcsHcsKbTkcsIcrGcrGcqvclbcsLcsNcqvcqvcqvcqvcqvcqvcqvcqvcsOcsQcsPcqvcqvcqvcrHaaaaaacdOcogcojcohcslcsRcqCcrQcrQcrQcnjcrQcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaacsTaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacqDcpucqYcpucsUcsWcsVcsZcsYctacrWcrXctbcrXcrXctdctcctfctecticthctkctjctjctlcqYcqYctmcoTcpXcpWcnGcnGcpYcnGcnGcnGctucttcstcvnctxcvtctBctycoRctCcpjcvOcrKcsycrKcvRcpjctvctwciGciGctDciGciGciGciBclMbTlciUciUciUctEciUciUcsIcrGaaacqvctHctGctIctFctKctJctMctLctOctNcqvcuVctPcuVcqvctQctRcqvaafaafcdOcoYcoYcoYctScpactUctTctWctVctXcrQctZcdOcdOcdOcdOaaaaaacrPaaacuacuacuacuacuaaafcsTaafcuacuacuacuacuaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbOaafaafaafaaaaafcnxaafcnxaafcKAaafcpfaafcKAaafcpfaafaafaaacejcnqcnpchfchfcnrcnDcowcovcnycnmcnscnGbKGbKGcnGcnGbMHbKGcnGcnJcnFcnCcnIcnMcnOcnOcnOcnOcnLcnKcnRcnRcnRcgscgscgscgsbSgciGcnQcnScmVcnUcnTciGcmYcnacnWciUcnYcnZcnccoccoaciUclLclMclNcjtcodcofclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacdOcogcojcohcwlcokconcolcomcoocoqcopcdOaapaafaafaafaafaaaaaaaaabSYaaaaaaaaaaafcoscqscosaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcptcpBcpAcpGcpCcpIcpHcpGcpScpZcpHcqtcqdcqxcqwcnycnycnycnycnycnycnycnycozcotcoBcoAcoCbKGbQabOvbRfcoGbOvcoGbRvcnGcoKcoJcoLcnOcoNcoMcoPcoOcoRcoQcpjcpbcpbcpkcpncpncpjcrvciGciGcpccoSciGciGciGcjzcnacoUciUciUciUcoVcphciUciUclLcpiclNcoXcoWcoXclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafcdOcoYcoZcoYcpdcpacpgcpecomcomcplcomcdOcdOaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacpmaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcqDcppcpocprcpqcpucpscpwcpvcpycpxcpDcpzcpEcpucpJcjOcpLcpKcfEcpMcpPcpOcpRcpQcpUcpTcpVbKGbRvbStbYHbVYbYNcqacfTbLncoKcqecqfcnOcoRcoRcoRcoRcoRcqgcpjcqPcqPcqPcpncpncpjbTFbPxciGcqicqhcqkcqjciGcqlcnacqmciUcqncqpcqocqqciUclMclLcpiclNcqucqrcqzclNaaaaaaaaaaaaaaaaaacqvcqRcrkcrgcqvaafaaaaaaaaaaaacdOcoYcoYcoYcoicqAcqCcqBcqFcqEcqHcqGcqIcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacqJaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcrUcqMcqKcqScqQcpucqTcpucqUcqMcqTcpucqUcqMcpucpucpucpucpucqVcpucpucpucqXcqWcqZcqYcrabKGcjwcjucnAcnzcrfcrecfTbLncoKcqecricnOcrjcoRcoRcrlcoRcrmcpjcrIcrKcrJcrKcrLcpjbTFcrqciGcrocrncrrcrpcrtcrscrwcrucrycrxcrAcrzcrBciUcrEcrFcrGcrHcqvcrCcqvcrHaaaaaaaafaaaaaaaaacqvcrDcrNckicqvaafaafaaaaaaaaacdOcomcomcomcomcrOcpgcrQcrQcrQcnjcrQckscdOaaaaaaaaaaaaaaacrPcrPcrPcbOaafaafaafaafcrSaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcqDcpucqYcpucqYcpucqTcpucrTcrXcrWcrXcrZcrXcrXcsbcsacpucpucsdcsccsccsccsfcsecshcshcsibKGcnBbOvcoEcoDcoHcsncoIcnGcsscsrcstcsqcsvcsucszcswcoRcsAcpjcsxcrKcsycrKckucpjbTFcfxciGcsDcsCcsFcsEciGcfYcufcfYciUcsGcsJcsHcsKbTkcsIcrGcrGcqvclbcsLcsNcqvcqvcqvcqvcqvcqvcqvcqvcsOcsQcsPcqvcqvcqvcrHaaaaaacdOcogcojcohcslcsRcqCcrQcrQcrQcnjcrQcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaacsTaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacqDcpucqYcpucsUcsWcsVcsZcsYctacrWcrXctbcrXcrXctdctcctfctecticthctkctjctjctlcqYcqYctmbKGbKGcpWcnGcnGcpYcnGcnGcnGctucttcstcvnctxcvtctBctycoRctCcpjcvOcrKcsycrKcvRcpjctvctwciGciGctDciGciGciGciBclMbTlciUciUciUctEciUciUcsIcrGaaacqvctHctGctIctFctKctJctMctLctOctNcqvcuVctPcuVcqvctQctRcqvaafaafcdOcoYcoYcoYctScpactUctTctWctVctXcrQctZcdOcdOcdOcdOaaaaaacrPaaacuacuacuacuacuaaafcsTaafcuacuacuacuacuaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacqDcpucsUcsWcsWcsWcsVcsWcsWcsWcsVcsWcsWcsWcsWcsWcuccudcsWcuebTmcugcsWcsWcsWcuicuhcukcujcpucpucqccqbcqycuocurcuqcuocuscuucutcuwcuvcuvcuxcuvcuycwObTocuAcuzcuBcuBcpjcuCcuDcwXcuFcuFcuGcuEcuHcuJcuJcuJcuJcwPcuJcuJcuJcuKcrFcrGaaactFcuLcuIcuMctFcuOcuNcuPcuPcuRcuQcltcuPcuXcuPcuVcuYcuPcqvaaaaaacdOcoYcoYcoYcslcuZcvbcvacvdcvccvecrQcrQcvfcvhcvgcdOaafaafcrPaafcvicvjcvjcvjcvjcvkcsTcvmcvlcvlcvlcvlcvoaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacqDcpucpucpucpucpucqTcpucpucpucqTcpucpucpucpucpucqUcpucpucrabTBcvpcpucvrcMicvucvscvwcvvcvxcvvcvzcvyclxcvAcvCcvycvycvDcvEcnLcvFcoRcvHcvGcoRcoRcwWcrKcrKbUdcuBcuBcpjbPxcAscvNcvNcvNcvNcxFcvNcvNcvNcvNclMbVxcrGcrGcrGcrGcrGcrGaaactFctFcvIctFctFcvKcvJcvPcvLcvScvQcvUcvTcvWcvVcvYcvXcvZcqvaaaaaacdOcomcomcomcomcwacpgcvacwccwbcwdcrQcrQcrQcrQcwecdOaaaaaacrPaafcwfcwfcwfcwfcwfaaacsTaaacwfcwfcwfcwfcwfaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaacbOaaaaaaaaaaaacqDcpucpucpucpucpucqTcpucpucpucqTcpucpucpucpucpucqUcpucpucracysbVBcpucpucwhcwhcwicpucpucwkcwjcwgcwgcwgcwgcygcwmcoKcwncwocsqcwpcoRcoRcvGcoRcwrcpjbXfcrKbXrcwxcwwcpjbPxcvMcvNbXvbXscwvcwucwzcwybXBcvNclMcxvcrGaaaaaaaaaaaaaaaaaacqvcwCcwBcwEcwDcwGcwFcwIcwHcwKcwJcwLcwScwNcwMcuWcuPcwQcqvaaaaaacdOcogcojcohckXcsRcvbcwRcwTcwTcwYcwVcxabYCcxccxbcdOaaaaaacrPaaaaafaaaaafaafaafaaacsTaaaaafaaaaafaaaaafaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm index 00382212b60..9b887b2ce7f 100644 --- a/maps/exodus-2.dmm +++ b/maps/exodus-2.dmm @@ -37,7 +37,7 @@ "aK" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east/shuttlespace_ew4,/area/space) "aL" = (/turf/space{icon_state = "black"},/area/space) "aM" = (/turf/space,/area/space) -"aN" = (/obj/structure/window/reinforced,/turf/unsimulated/wall,/area/space) +"aN" = (/obj/structure/window/reinforced/crescent,/turf/unsimulated/wall,/area/space) "aO" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/prison/solitary) "aP" = (/obj/structure/bed,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/prison/solitary) "aQ" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/prison/solitary) @@ -66,8 +66,8 @@ "bn" = (/turf/space/transit/east/shuttlespace_ew9,/area/space) "bo" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/prison/solitary) "bp" = (/turf/simulated/floor/holofloor/desert,/area/holodeck/source_desert) -"bq" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/wall,/area/space) -"br" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/wall,/area/space) +"bq" = (/obj/structure/window/reinforced/crescent{dir = 4},/turf/unsimulated/wall,/area/space) +"br" = (/obj/structure/window/reinforced/crescent{dir = 4},/obj/structure/window/reinforced/crescent{dir = 8},/turf/unsimulated/wall,/area/space) "bs" = (/obj/structure/flora/ausbushes/fullgrass,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) "bt" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) "bu" = (/obj/structure/table/rack/holorack,/obj/item/clothing/under/dress/dress_saloon,/obj/item/clothing/head/hairflower,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre) @@ -88,7 +88,7 @@ "bJ" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) "bK" = (/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) "bL" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/med,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/med,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"bM" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/wall,/area/space) +"bM" = (/obj/structure/window/reinforced/crescent{dir = 8},/turf/unsimulated/wall,/area/space) "bN" = (/obj/effect/floor_decal/corner/red/full{dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) "bO" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/green,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/green,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "bP" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/engie,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/engie,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) @@ -222,8 +222,8 @@ "en" = (/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) "eo" = (/obj/effect/floor_decal/corner/green/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) "ep" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) -"eq" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall,/area/space) -"er" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/wall,/area/space) +"eq" = (/obj/structure/window/reinforced/crescent,/obj/structure/window/reinforced/crescent{dir = 1},/turf/unsimulated/wall,/area/space) +"er" = (/obj/structure/window/reinforced/crescent{dir = 1},/obj/structure/window/reinforced/crescent,/turf/unsimulated/wall,/area/space) "es" = (/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) "et" = (/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall) "eu" = (/obj/structure/flora/pottedplant{tag = "icon-plant-06"; icon_state = "plant-06"},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall) @@ -358,7 +358,7 @@ "gT" = (/turf/space/transit/north/shuttlespace_ns4,/area/skipjack_station/transit) "gU" = (/turf/space/transit/north/shuttlespace_ns8,/area/skipjack_station/transit) "gV" = (/obj/machinery/door/airlock/external{name = "Shuttle Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "syndicate_elite"; name = "Side Hull Door"; opacity = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) -"gW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/syndicate_mothership{name = "\improper Ninja Base"}) +"gW" = (/obj/structure/window/reinforced/crescent{dir = 1},/turf/unsimulated/wall,/area/space) "gX" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) "gY" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) "gZ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns2,/area/space) @@ -466,7 +466,7 @@ "iX" = (/turf/space/transit/north/shuttlespace_ns12,/area/shuttle/escape_pod2/transit) "iY" = (/turf/space/transit/north/shuttlespace_ns9,/area/shuttle/escape_pod2/transit) "iZ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area/space) -"ja" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_mothership{name = "\improper Ninja Base"}) +"ja" = (/obj/structure/window/reinforced/crescent,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/turf/simulated/floor/airless,/area/shuttle/syndicate_elite/mothership) "jb" = (/obj/machinery/door/airlock/maintenance_hatch{req_access = list(101)},/turf/simulated/shuttle/plating,/area/centcom/evac) "jc" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "jd" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) @@ -485,9 +485,9 @@ "jq" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock"; req_access = list(13)},/turf/unsimulated/floor,/area/centcom/evac) "jr" = (/obj/structure/bed/chair{dir = 1},/obj/effect/landmark{name = "ninjastart"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership{name = "\improper Ninja Base"}) "js" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) -"jt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_mothership{name = "\improper Ninja Base"}) +"jt" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership/elite_squad) "ju" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_3_recovery"; pixel_x = 25; pixel_y = -25; req_one_access = list(13); tag_door = "escape_pod_3_recovery_hatch"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) -"jv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_mothership{name = "\improper Ninja Base"}) +"jv" = (/obj/structure/window/reinforced/crescent,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/turf/simulated/floor/airless,/area/centcom/evac) "jw" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/syndicate_mothership{name = "\improper Ninja Base"}) "jx" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/syndicate_mothership{name = "\improper Ninja Base"}) "jy" = (/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) @@ -520,7 +520,7 @@ "jZ" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0},/obj/machinery/light/small/readylight{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "ka" = (/obj/machinery/door/window/holowindoor{dir = 1; name = "Green Corner"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) "kb" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) -"kc" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership) +"kc" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/simulated/shuttle/plating,/area/syndicate_mothership{name = "\improper Ninja Base"}) "kd" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) "ke" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) "kf" = (/turf/simulated/floor/holofloor/beach/water,/area/holodeck/source_beach) @@ -545,15 +545,15 @@ "ky" = (/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "kz" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "kA" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove{icon_state = "boxinggreen"; item_state = "boxinggreen"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) -"kB" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall,/area/space) +"kB" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced/crescent{dir = 1},/turf/simulated/floor/airless,/area/syndicate_mothership{name = "\improper Ninja Base"}) "kC" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/transport1/centcom) -"kD" = (/turf/unsimulated/wall/fakeglass,/area/syndicate_mothership) +"kD" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/wall/fakeglass{dir = 1; icon_state = "fakewindows"},/area/syndicate_mothership) "kE" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "kF" = (/obj/machinery/door/window/northright{base_state = "right"; dir = 4; icon_state = "right"; name = "Security Desk"; req_access = list(103)},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "kG" = (/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "kH" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "kI" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/handcuffs,/obj/item/device/flash,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) -"kJ" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/turf/simulated/floor/airless,/area/shuttle/syndicate_elite/mothership) +"kJ" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership) "kK" = (/obj/item/device/radio/intercom/syndicate{dir = 8; pixel_x = 22},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "kL" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "kM" = (/obj/machinery/door/airlock/hatch{name = "Cockpit"; req_access = list(109)},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) @@ -575,7 +575,7 @@ "lc" = (/obj/item/device/radio/off,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "ld" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area/space) "le" = (/obj/machinery/mech_recharger,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) -"lf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership/elite_squad) +"lf" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/wall/fakeglass,/area/syndicate_mothership) "lg" = (/obj/item/device/multitool,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "lh" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "li" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) @@ -600,10 +600,10 @@ "lB" = (/obj/structure/window/shuttle{icon_state = "window8"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/centcom/evac) "lC" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_closed"; id_tag = "vox_northwest_lock"; locked = 0; req_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "lD" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_west_control"; req_one_access = list(150)},/turf/simulated/wall/voxshuttle,/area/skipjack_station/start) -"lE" = (/turf/unsimulated/wall/fakeglass{dir = 1; icon_state = "fakewindows"},/area/syndicate_mothership) -"lF" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"lG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"lH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"lE" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) +"lF" = (/obj/effect/wingrille_spawn/reinforced,/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"lG" = (/obj/structure/window/reinforced/crescent,/turf/space,/area/space) +"lH" = (/obj/structure/window/reinforced/crescent{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "lI" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_closed"; id_tag = "vox_northeast_lock"; locked = 0; req_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "lJ" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_east_control"; req_access = list(150)},/turf/simulated/wall/voxshuttle,/area/skipjack_station/start) "lK" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_west_sensor"; pixel_x = 25},/turf/simulated/shuttle/plating,/area/skipjack_station/start) @@ -630,7 +630,7 @@ "mf" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/item/weapon/material/harpoon,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/head/helmet/space/void/merc,/obj/item/clothing/head/helmet/space/void/engineering,/obj/item/clothing/suit/space/void/engineering,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/weapon/rig/light/stealth,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "mg" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "vox_west_control"; pixel_x = -22; req_one_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "mh" = (/obj/item/seeds/potatoseed,/obj/item/seeds/potatoseed,/obj/item/seeds/ambrosiavulgarisseed,/obj/item/weapon/material/minihoe,/obj/item/weapon/beartrap,/obj/structure/table/steel,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"mi" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "syndieshutters_workshop"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"mi" = (/obj/structure/window/reinforced/crescent,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "mj" = (/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/obj/structure/table/steel,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "mk" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/orange,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/orange,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "ml" = (/obj/machinery/vending/hydroseeds,/turf/simulated/shuttle/plating,/area/skipjack_station/start) @@ -651,7 +651,7 @@ "mA" = (/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space) "mB" = (/obj/structure/lattice,/turf/space,/area/space) "mC" = (/turf/simulated/shuttle/wall{icon_state = "swall_s"; dir = 2},/area/centcom/evac) -"mD" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/turf/simulated/floor/airless,/area/centcom/evac) +"mD" = (/obj/structure/window/reinforced/crescent{dir = 1},/turf/space,/area/space) "mE" = (/turf/simulated/shuttle/wall{icon_state = "swall_straight"; dir = 1},/area/centcom/evac) "mF" = (/turf/simulated/shuttle/wall{icon_state = "swall_straight"; dir = 4},/area/centcom/evac) "mG" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 8},/area/centcom/evac) @@ -670,7 +670,7 @@ "mT" = (/turf/simulated/shuttle/wall{icon_state = "swall"; dir = 10},/area/centcom/evac) "mU" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 1},/area/centcom/evac) "mV" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 2},/area/centcom/evac) -"mW" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/syndicate_mothership{name = "\improper Ninja Base"}) +"mW" = (/obj/structure/window/reinforced/crescent{dir = 1},/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "mX" = (/turf/unsimulated/wall,/area/alien) "mY" = (/turf/unsimulated/floor{icon_state = "dark"},/area/alien) "mZ" = (/obj/item/weapon/paper{info = "Some stuff is missing..."; name = "Insert alien artifacts here."},/turf/unsimulated/floor{icon_state = "dark"},/area/alien) @@ -681,7 +681,7 @@ "ne" = (/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "nf" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "ng" = (/obj/structure/sign/double/map/right{pixel_y = 32},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) -"nh" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"nh" = (/obj/structure/window/reinforced/crescent{dir = 1},/obj/machinery/iv_drip,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "ni" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_soft/full{pixel_x = 2; pixel_y = 6},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nj" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/drinkingglasses{pixel_x = 1; pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nk" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) @@ -696,12 +696,12 @@ "nt" = (/obj/structure/bed/chair/comfy/black{dir = 8},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "nu" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nv" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_station/start) -"nw" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "syndieshutters_workshop"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"nx" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"ny" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"nw" = (/obj/structure/table/standard,/obj/structure/window/reinforced/crescent{dir = 8},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"nx" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced/crescent{dir = 1},/turf/simulated/floor/airless,/area/syndicate_station/start) +"ny" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced/crescent{dir = 1},/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "nz" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/syndicate_station/start) "nA" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) -"nB" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "syndieshutters_workshop"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"nB" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced/crescent{dir = 8},/obj/structure/window/reinforced/crescent{dir = 1},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "nC" = (/obj/machinery/door/airlock/centcom{name = "Kitchen"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nD" = (/obj/structure/table/reinforced,/obj/item/weapon/tray{pixel_y = 5},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nE" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka{pixel_x = 3; pixel_y = 12},/obj/item/weapon/reagent_containers/food/drinks/bottle/wine{pixel_x = -1; pixel_y = 8},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) @@ -736,7 +736,7 @@ "oh" = (/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_mothership) "oi" = (/obj/item/device/pda/syndicate,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_mothership) "oj" = (/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"ok" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) +"ok" = (/obj/machinery/door/window/northleft,/obj/structure/bed/chair,/obj/structure/window/reinforced/crescent{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "ol" = (/obj/machinery/door/airlock/centcom{name = "Suit Storage"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "om" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_station/start) "on" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -744,8 +744,8 @@ "op" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "oq" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "or" = (/obj/structure/closet,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"os" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) -"ot" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/space) +"os" = (/obj/machinery/door/window/northleft,/obj/structure/bed/chair,/obj/structure/window/reinforced/crescent{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) +"ot" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced/crescent{dir = 8},/obj/effect/floor_decal/carpet{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "ou" = (/obj/structure/closet/hydrant{pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "ov" = (/obj/structure/table/rack,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "ow" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/handcuffs{pixel_x = 4; pixel_y = 2},/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) @@ -759,8 +759,8 @@ "oE" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/mask/gas/syndicate,/obj/item/clothing/head/helmet/space/void/merc,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "oF" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space) "oG" = (/obj/structure/closet/secure_closet/medical_wall{pixel_x = -32; pixel_y = 0; req_access = list(150)},/obj/item/stack/medical/splint,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"oH" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) -"oI" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/space) +"oH" = (/obj/structure/window/reinforced/crescent{dir = 1},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) +"oI" = (/obj/machinery/camera/network/thunder{c_tag = "Court"; pixel_x = 10; pixel_y = -6},/obj/structure/window/reinforced/crescent{dir = 1},/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "oJ" = (/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oK" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/device/multitool,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oL" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -769,11 +769,11 @@ "oO" = (/obj/machinery/recharger/wallcharger{pixel_x = -25},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oP" = (/obj/machinery/door/airlock/centcom{name = "Barracks"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_mothership) "oQ" = (/obj/structure/closet,/obj/item/weapon/reagent_containers/food/snacks/liquidfood,/obj/item/weapon/reagent_containers/food/snacks/liquidfood,/obj/item/weapon/reagent_containers/food/snacks/liquidfood,/obj/item/weapon/reagent_containers/food/snacks/liquidfood,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"oR" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) +"oR" = (/obj/structure/window/reinforced/crescent{dir = 1},/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "oS" = (/obj/machinery/flasher{id = "syndieflash"; pixel_x = 0; pixel_y = 28},/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) "oT" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "vox_east_control"; pixel_x = 22; req_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "oU" = (/obj/machinery/light,/obj/item/device/radio/intercom/syndicate{dir = 1; pixel_y = -22},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"oV" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) +"oV" = (/obj/structure/window/reinforced/crescent{dir = 1},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "oW" = (/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) "oX" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "merc_shuttle_sensor"; pixel_x = 8; pixel_y = 25},/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oY" = (/obj/item/device/radio/electropack,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) @@ -781,17 +781,17 @@ "pa" = (/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "pb" = (/obj/machinery/door/airlock/external{density = 1; frequency = 1331; id_tag = "merc_shuttle_outer"; name = "Ship External Access"; req_access = list(150)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "smindicate"; name = "Outer Airlock"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) "pc" = (/obj/machinery/door/airlock/centcom{name = "Hardsuit Storage"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"pd" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) +"pd" = (/obj/structure/window/reinforced/crescent{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "pe" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/administration/centcom) "pf" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "merc_shuttle_pump"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "merc_shuttle"; pixel_x = -8; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pg" = (/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/syndicate_mothership) -"ph" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) +"ph" = (/obj/structure/window/reinforced/crescent{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "pi" = (/obj/structure/toilet{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) "pj" = (/obj/item/weapon/cigbutt,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) "pk" = (/obj/machinery/door/airlock/external{frequency = 1331; id_tag = "merc_base_hatch"; req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "pl" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pm" = (/obj/machinery/door/airlock/vault{name = "Armory"; req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"pn" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"pn" = (/obj/structure/window/reinforced/crescent{dir = 8},/obj/structure/window/reinforced/crescent,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "po" = (/obj/machinery/door/window{dir = 2; name = "Seating"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pp" = (/obj/machinery/vending/boozeomat,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/administration/centcom) "pq" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) @@ -802,24 +802,24 @@ "pv" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "pw" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "px" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "merc_shuttle_pump"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"py" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) -"pz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"py" = (/obj/structure/window/reinforced/crescent{dir = 4},/obj/structure/window/reinforced/crescent,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"pz" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced/crescent{dir = 8},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "pA" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pB" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "pC" = (/obj/machinery/vending/assist{contraband = null; name = "AntagCorpVend"; products = list(/obj/item/device/assembly/prox_sensor = 5, /obj/item/device/assembly/signaler = 4, /obj/item/device/assembly/infra = 4, /obj/item/device/assembly/prox_sensor = 4, /obj/item/weapon/handcuffs = 8, /obj/item/device/flash = 4, /obj/item/weapon/cartridge/signal = 4, /obj/item/clothing/glasses/sunglasses = 4)},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pD" = (/obj/machinery/door/airlock/external{frequency = 1331; id_tag = "merc_shuttle_inner"; name = "Ship External Access"; req_access = list(0)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"pE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) +"pE" = (/obj/structure/window/reinforced/crescent{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "pF" = (/turf/unsimulated/wall,/area/centcom/living) -"pG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) +"pG" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/obj/structure/window/reinforced/crescent{dir = 8},/obj/structure/window/reinforced/crescent,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "pH" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/button/flasher{id = "syndieflash"; name = "Flasher"; pixel_x = 27; pixel_y = 0; tag = "permflash"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pI" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pJ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "merc_shuttle"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pK" = (/obj/structure/table/rack,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/weapon/gun/projectile/automatic/sts35,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"pL" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"pL" = (/obj/structure/grille,/obj/structure/window/reinforced/crescent,/obj/structure/window/reinforced/crescent{dir = 1},/obj/structure/window/reinforced/crescent{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "pM" = (/obj/machinery/door/window/northright,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) -"pN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) +"pN" = (/obj/structure/grille,/obj/structure/window/reinforced/crescent,/obj/structure/window/reinforced/crescent{dir = 1},/obj/structure/window/reinforced/crescent{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "pO" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) -"pP" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) +"pP" = (/obj/structure/grille,/obj/structure/window/reinforced/crescent,/obj/structure/window/reinforced/crescent{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "pQ" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "pR" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) "pS" = (/obj/item/weapon/material/kitchen/utensil/knife{pixel_x = -6},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = -1},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = 4},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = 9},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/table/glass,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -834,7 +834,7 @@ "qb" = (/obj/structure/closet/syndicate/suit{name = "suit closet"},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "qc" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "admin_shuttle"; pixel_x = -25; pixel_y = 0; req_one_access = list(101); tag_door = "admin_shuttle_hatch"},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) "qd" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Brig"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"qe" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"qe" = (/obj/structure/lattice,/obj/structure/window/reinforced/crescent{dir = 4},/turf/space,/area/syndicate_mothership{name = "\improper Raider Base"}) "qf" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/administration/centcom) "qg" = (/obj/machinery/vending/snack,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "qh" = (/obj/item/weapon/stool,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) @@ -847,7 +847,7 @@ "qo" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) "qp" = (/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "Preparation"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "qq" = (/obj/machinery/door/window{dir = 1; name = "Cell"; req_access = list(150)},/obj/item/device/radio/intercom/syndicate{dir = 8; pixel_x = 22},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"qr" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) +"qr" = (/obj/structure/lattice,/obj/structure/window/reinforced/crescent{dir = 8},/turf/space,/area/syndicate_mothership{name = "\improper Raider Base"}) "qs" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom) "qt" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -1; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "qu" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) @@ -909,21 +909,21 @@ "ry" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living) "rz" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/shuttle/floor,/area/supply/dock) "rA" = (/obj/item/clothing/gloves/yellow,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/clothing/glasses/night,/obj/structure/table/steel,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"rB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"rB" = (/obj/structure/window/reinforced/crescent{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "rC" = (/obj/machinery/bodyscanner,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "rD" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "rE" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/administration/centcom) "rF" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/simulated/shuttle/plating,/area/shuttle/administration/centcom) "rG" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_bay_door"; locked = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/living) "rH" = (/obj/item/weapon/screwdriver,/obj/effect/spawner/newbomb/timer/syndicate,/obj/structure/table/steel,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"rI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"rI" = (/obj/structure/window/reinforced/crescent{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "rJ" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "rK" = (/turf/simulated/shuttle/wall{icon_state = "swall_straight"; dir = 1},/area/supply/dock) "rL" = (/obj/machinery/light{dir = 4},/obj/item/device/radio/intercom/syndicate{dir = 8; pixel_x = 22},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "rM" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living) "rN" = (/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -5},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living) "rO" = (/obj/item/weapon/stool{pixel_y = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) -"rP" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) +"rP" = (/obj/effect/wingrille_spawn/reinforced,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "rQ" = (/obj/structure/device/piano{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) "rR" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "rS" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -953,10 +953,10 @@ "sq" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Administration"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "sr" = (/obj/structure/table/standard,/turf/unsimulated/floor{dir = 2; icon_state = "white"},/area/centcom/living) "ss" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/supply/dock) -"st" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"st" = (/obj/structure/window/reinforced/crescent{dir = 1},/turf/unsimulated/beach/sand{tag = "icon-seashallow"; icon_state = "seashallow"},/area/centcom/holding) "su" = (/obj/machinery/door/window{dir = 1; name = "Surgery"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "sv" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/fire{pixel_x = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"sw" = (/obj/structure/table/standard,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"sw" = (/obj/structure/window/reinforced/crescent{dir = 1},/turf/unsimulated/beach/sand{tag = "icon-beach (SOUTHEAST)"; icon_state = "beach"; dir = 6},/area/centcom/holding) "sx" = (/obj/item/weapon/weldingtool,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "sy" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/unsimulated/floor{dir = 2; icon_state = "white"},/area/centcom/living) "sz" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/obj/item/device/radio/intercom/syndicate{dir = 8; pixel_x = 22},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) @@ -966,8 +966,7 @@ "sD" = (/obj/structure/sign/securearea{name = "\improper CAUTION"; pixel_x = 32},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "sE" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/shuttle/floor,/area/supply/dock) "sF" = (/obj/machinery/telecomms/allinone{intercept = 1},/obj/machinery/door/window/northright{name = "Telecoms Mainframe"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"sG" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/syndicate_station/start) -"sH" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/iv_drip,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"sG" = (/obj/effect/wingrille_spawn/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "sI" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/supply/dock) "sJ" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "sK" = (/obj/item/weapon/crowbar,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -980,7 +979,6 @@ "sR" = (/obj/machinery/sleeper{dir = 8},/turf/unsimulated/floor{dir = 2; icon_state = "white"},/area/centcom/living) "sS" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/syringe,/obj/item/clothing/mask/surgical,/obj/item/clothing/gloves/latex,/obj/item/weapon/surgicaldrill,/obj/structure/closet/secure_closet/medical_wall{pixel_x = 32; pixel_y = 0; req_access = list(150)},/obj/item/weapon/reagent_containers/syringe/antiviral,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "sT" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/material/kitchen/rollingpin,/turf/unsimulated/floor{dir = 2; icon_state = "white"},/area/centcom/living) -"sU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "sV" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "sW" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{dir = 2; icon_state = "white"},/area/centcom/living) "sX" = (/obj/machinery/optable,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) @@ -1081,16 +1079,11 @@ "uO" = (/obj/machinery/door/airlock/centcom{name = "Courthouse"; opacity = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "uP" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "uQ" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"uR" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) -"uS" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "uT" = (/obj/machinery/door/window/northleft,/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "uU" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "uV" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "uW" = (/obj/machinery/door/blast/regular{id = "ert_synth_equipment"; name = "Synthetics Modification Equipment"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "uX" = (/obj/machinery/door/airlock/centcom{name = "Teleporter Bay"; opacity = 1; req_access = list(107)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) -"uY" = (/obj/machinery/door/window/northleft,/obj/structure/bed/chair,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"uZ" = (/obj/machinery/door/window/northleft,/obj/structure/bed/chair,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"va" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/effect/floor_decal/carpet{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "vb" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vc" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion,/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,/obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster,/obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vd" = (/obj/structure/table/rack,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) @@ -1115,10 +1108,6 @@ "vw" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "vx" = (/obj/structure/table/reinforced,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/taperoll/police,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vy" = (/obj/machinery/shieldwallgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"vz" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 9},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) -"vA" = (/obj/machinery/camera/network/thunder{c_tag = "Court"; pixel_x = 10; pixel_y = -6},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) -"vB" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/effect/floor_decal/carpet{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) -"vC" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "vD" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT2"; name = "Launch Bay #2"; p_open = 0},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) "vE" = (/obj/machinery/door/airlock/centcom{name = "Creed's Office"; opacity = 1; req_access = list(108)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/creed) "vF" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT2"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) @@ -1129,7 +1118,6 @@ "vK" = (/obj/machinery/vending/tool,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vL" = (/obj/structure/sign/poster{poster_type = "/datum/poster/bay_50"; pixel_x = -32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "vM" = (/obj/item/weapon/aiModule/nanotrasen,/obj/item/weapon/aiModule/reset,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/quarantine,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/obj/item/weapon/aiModule/safeguard,/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"vN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "vO" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "vP" = (/obj/structure/table/woodentable,/obj/effect/floor_decal/carpet{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "vQ" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT"; name = "Assault Armor Storage"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) @@ -1139,8 +1127,6 @@ "vU" = (/obj/structure/sign/nosmoking_2,/turf/unsimulated/wall,/area/centcom/living) "vV" = (/obj/mecha/working/ripley/firefighter,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) "vW" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) -"vX" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) -"vY" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "vZ" = (/obj/structure/closet/secure_closet/medical3{pixel_x = -5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) "wa" = (/obj/structure/closet/secure_closet/medical1{pixel_x = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) "wb" = (/obj/structure/closet/secure_closet/medical2{pixel_x = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) @@ -1163,11 +1149,9 @@ "ws" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "wt" = (/obj/effect/floor_decal/corner/green{dir = 4},/obj/effect/floor_decal/industrial/warning/corner,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "wu" = (/obj/machinery/computer/ordercomp,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) -"wv" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "ww" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "wx" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "wy" = (/obj/machinery/portable_atmospherics/canister/air,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"wz" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "wA" = (/obj/structure/sign/securearea,/turf/unsimulated/wall,/area/centcom/control) "wB" = (/obj/machinery/door/window{dir = 2; name = "AI Core Door"; req_access = list(109)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "wC" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) @@ -1196,7 +1180,6 @@ "wZ" = (/obj/machinery/porta_turret/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xa" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xb" = (/obj/structure/table/reinforced,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"xc" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 10},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "xd" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xe" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xf" = (/obj/structure/bed/chair{dir = 8},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) @@ -1387,7 +1370,6 @@ "AI" = (/obj/structure/bed/chair/office/dark,/obj/machinery/button/remote/blast_door{desc = "A remote control switch for port-side blast doors."; id = "CentComPort"; name = "Security Doors"; pixel_x = -12; pixel_y = -25; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "AJ" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/holding) "AK" = (/obj/item/weapon/stool/padded,/obj/item/weapon/stool/padded,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/holding) -"AL" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "AM" = (/obj/machinery/computer/secure_data,/obj/machinery/camera/network/crescent{c_tag = "Crescent Arrivals North"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "AN" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/light{dir = 4},/obj/item/device/radio/intercom{dir = 8; pixel_x = 22},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "AO" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/space,/area/shuttle/specops/centcom) @@ -1396,7 +1378,6 @@ "AR" = (/obj/structure/table/reinforced,/obj/effect/floor_decal/corner/red{dir = 6},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "AS" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "CentComPort"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "AT" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/door/window/southright{name = "Arrivals Processing"; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) -"AU" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "AV" = (/obj/structure/table/rack,/obj/item/weapon/grenade/empgrenade,/obj/item/weapon/grenade/flashbang,/obj/item/weapon/grenade/spawnergrenade/manhacks,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "AW" = (/turf/simulated/shuttle/wall{icon_state = "swall_straight"; dir = 1},/area/shuttle/escape/centcom) "AX" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall"; dir = 2},/area/shuttle/escape/centcom) @@ -1419,7 +1400,6 @@ "Bo" = (/obj/structure/table/steel,/obj/machinery/recharger,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "Bp" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "Bq" = (/obj/item/robot_parts/robot_suit,/obj/item/robot_parts/r_leg,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Br" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "Bs" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "Bt" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Centcom"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/ferry) "Bu" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) @@ -1532,7 +1512,6 @@ "Dx" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "Dy" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_dock"; name = "docking port controller"; pixel_x = 25; pixel_y = 0; req_one_access = list(13); tag_door = "centcom_dock_airlock"},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "Dz" = (/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) -"DA" = (/obj/structure/window/shuttle{icon_state = "window2"},/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) "DB" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/corner/green{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "DC" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "DD" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 0},/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/holding) @@ -1588,8 +1567,6 @@ "EC" = (/obj/structure/urinal{pixel_y = 32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) "ED" = (/obj/item/device/radio/intercom/syndicate{dir = 8; pixel_x = 22},/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station) "EE" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/skipjack_station/start) -"EF" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/unsimulated/beach/sand{tag = "icon-seashallow"; icon_state = "seashallow"},/area/centcom/holding) -"EG" = (/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/unsimulated/beach/sand{tag = "icon-beach (SOUTHEAST)"; icon_state = "beach"; dir = 6},/area/centcom/holding) "EH" = (/turf/unsimulated/wall,/area/tdome) "EI" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/tdome) "EJ" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome"; opacity = 1; req_access = list(101)},/obj/machinery/door/blast/regular{id = "crescent_thunderdome"; name = "Thunderdome"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) @@ -1855,9 +1832,6 @@ "JJ" = (/obj/structure/table/rack,/obj/item/stack/material/sandstone{amount = 50},/obj/item/stack/material/sandstone{amount = 50},/obj/item/stack/material/sandstone{amount = 50},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/acting/backstage) "JK" = (/obj/structure/table/rack,/obj/item/stack/material/wood{amount = 50},/obj/item/stack/material/wood{amount = 50},/obj/item/stack/material/wood{amount = 50},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/acting/backstage) "JL" = (/obj/structure/table/rack,/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/acting/backstage) -"JM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"JN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"JO" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "JP" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chawanmushi,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "JQ" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash/c1,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "JR" = (/obj/machinery/computer/shuttle_control/multi/vox,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) @@ -1877,7 +1851,6 @@ "Kf" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/wizard_station) "Kg" = (/turf/unsimulated/wall/fakeglass{dir = 1; icon_state = "fakewindows"},/area/wizard_station) "Kh" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/wizard_station) -"Ki" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/syndicate_mothership{name = "\improper Raider Base"}) "Kj" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Kk" = (/obj/effect/decal/remains/human,/turf/unsimulated/floor{tag = "icon-lava"; name = "plating"; icon_state = "lava"},/area/wizard_station) "Kl" = (/turf/unsimulated/floor{tag = "icon-lava"; name = "plating"; icon_state = "lava"},/area/wizard_station) @@ -1887,14 +1860,11 @@ "Kp" = (/obj/machinery/reagentgrinder,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/acting/backstage) "Kq" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/acting/backstage) "Kr" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) -"Ks" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/syndicate_mothership{name = "\improper Raider Base"}) "Kt" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "Ku" = (/obj/item/weapon/inflatable_duck,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) "Kv" = (/obj/structure/sign/redcross,/turf/unsimulated/wall,/area/centcom/holding) "Kw" = (/obj/structure/reagent_dispensers/fueltank,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/acting/backstage) "Kx" = (/obj/machinery/door/airlock/glass_medical{name = "Escape Shuttle Infirmary"; req_access = list(5)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"Ky" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Kz" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "KA" = (/turf/unsimulated/beach/sand{tag = "icon-desert1"; icon_state = "desert1"},/area/centcom/holding) "KB" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/obj/effect/overlay/palmtree_r,/turf/unsimulated/beach/sand{tag = "icon-coconuts"; icon_state = "coconuts"},/area/centcom/holding) "KC" = (/obj/item/weapon/paper{info = "\[center]\[b]READ INSTRUCTIONS CAREFULLY\[/b]\[/center]\[br]\[br]Hello! Welcome and congratulations on being hired for NanoTrasen's new Television initiative. You are now tasked with the creation and production of NanoTrasen brand television that is to be broadcasted to all of our stations!\[br]\[br] We've outfitted these facilities with all the materials and objects you will need.\[br]On the port side you'll find various venders and machines, namely the Wardrobe Dispenser, which will dispense holoclothing and items for you to use, and a Quickee brand plastic surgery machine (which I would remind you you are contractually obligated to \[b]not\[/b] report to the authorities.) which can change your appearance into anything you want, even other races. Stern and aft you'll find all the materials we could muster up on short notice. Use it to decorate the stage to your liking. Starboard you'll find gases, microwaves, hydroponic trays and the like. Go silly! This is already paid for (as are you) so do what you want and entertain!"; name = "Actor's Guild Instruction Pamphlet"},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/acting/backstage) @@ -2043,7 +2013,7 @@ adaXaVbfaWbbaZaScqbSbSbSbSbSbSbSbSbSbSbSbSbSbUaWbcbeaUaUaZbcagarasatauavbgbhaybj alaWbeaRaSaYaVaZczbSbSbSbSbSbSbSbSbSbSbSbSbSdYaSbfbbaXaXaVbfacbibjbnbkblbmapaFarasatauavbgbhbibjbnbkblbmapaqarasatauavbgbhbiazaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbWbWbWbWbWbWbWbWbWbriEesesesesiEesesesesbrfvgXgPgPgPgPgPiGfvfwbrewewiQhKfejyjyjyfehNbrjBjBjBjBjBjBjBjBjBjBbreSeSjNhOfififififihVbreYeYeYjRjRjRkaeYeYeYbM aoaSbbaUaZbabeaVcTbSbSbSbSbSbSbSbSbSbSbSbSbSidaZaRaYaWaWbeaRaiatauavbgbhbibjaAbkblbmapaqarasatauavbgbhbibjbnbkblbmapaqarasataJaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbXbWbWbWbWbXbWbWbWbresfDesfuesesfDesfuesbrfvkdkbkbkbkbkbkefvfwbreweveJhKfehKfehNfehNbrkfkfkfkfkfkfkfkfkfkfbreSeReUhOfififififihVbreYeYeYfkfkfkeYeYeYeYbM abaZaYaXaVbdbbbefsbSbSbSbSbSbSbSbSbSbSbSbSbSiuaVaUbaaSaSbbaUafbmapaqarasatauaKbgbhbibjbnbkblbmapaqarasatauavbgbhbibjbnbkblbmaEaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbWbWbWbWbWbWbWbWbWbresesesesiEesesesesiEbrfvfvfvfvfvfvfvfvfvfwbreweveJkjjykjkrkqjykqbrkfkfkfkfkfkfkfkfkfkfbreSeReUktkvkvkvkvkvkwbreYeYeYeYeYeYeYeYkAkAbM -aeaVbaaWbeaTaYbbccbSbSbSbSbSbSbSbSbSbSbSbSbSiLbeaXbdaZaZaYaXanbkblbmapaqarasaIauavbgbhbibjbnbkblbmapaqarasatauavbgbhbibjbnbkaCaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMdCkBkBkBkBkBkBkBkBkBkBdCkBkBkBkBkBkBkBkBkBkBdCkBkBkBkBkBkBkBkBkBkBdCkBkBkBkBkBkBkBkBkBkBdCkBkBkBkBkBkBkBkBkBkBdCkBkBkBkBkBkBkBkBkBkBdCkBkBkBkBkBkBkBkBkBkBdC +aeaVbaaWbeaTaYbbccbSbSbSbSbSbSbSbSbSbSbSbSbSiLbeaXbdaZaZaYaXanbkblbmapaqarasaIauavbgbhbibjbnbkblbmapaqarasatauavbgbhbibjbnbkaCaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMdCgWgWgWgWgWgWgWgWgWgWdCgWgWgWgWgWgWgWgWgWgWdCgWgWgWgWgWgWgWgWgWgWdCgWgWgWgWgWgWgWgWgWgWdCgWgWgWgWgWgWgWgWgWgWdCgWgWgWgWgWgWgWgWgWgWdCgWgWgWgWgWgWgWgWgWgWdC ahbebdaSbbbcbaaYfFbSbSbSbSbSbSbSbSbSbSbSbSbSipbbaWaTaVaTaUaYeEauavbgbhbibjbnaBblbmapaqarasatauavbgbhbibjbnbkblbmapaqarasatauaKaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM agbbaTaZaYbfbdbafKbSbSbSbSbSbSbSbSbSbSbSbSbSiyaYaSbcbeaTaUaYaobhbibjbnbkblbmaEaqarasatauavbgbhbibjbnbkblbmapaqarasatauavbgbhayaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM acaYbcaVbaaRaTbdcObSbSbSbSbSbSbSbSbSbSbSbSbSiPbaaZbfbbbcaXbaabasatauavbgbhbiazaAaBaCaDaEaFaGaHaIaJaKawaxayazaAaBaCaDaEaFaGaHaIaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM @@ -2054,17 +2024,17 @@ akbcaXbabfaSaUaRbeaWbbiedYeIeMeOeNEmhZiPbaaRaVbfaYaWaTaXaVbfacaXamaUaZbcaXbeaSaW aabfaWbdaRaZaXaUbbaSaYbeidbUieiuiPiKigaWbdaUbeaRbaaSbcaWbeaRaiaWadaXaVbfaWbbaZaSbdbeaTbaaRbcaYaUaZbbaTaVbfaSbaaWbcbeahaWbdaLfLbeaXbdbebeaXbdbeaXbdbeaXbdbeaXbdbebeaXbdbeaXbdbeaXbdbeaXbdbeaXbdbebeaXaMfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM ajaRaSaTaUaVaWaXaYaZbabbbcbdbebfaWaVbaaSaTaXbbaUbdaZbfaSbbaUafaSalaWbeaRaSaYaVaZaTbbbcbdaUbfbaaXaVaYbcbeaRaZbdaSbfbbagaSaTaLfLbeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbebeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfMfNfNfNfNfNfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM amaUaZbcaXbeaSaWbaaVbdaYbfaTbbaRaSbebdaZbcaWaYaXaTaVaRaZaYaXanaZaoaSbbaUaZbabeaVbcaYbfaTaXaRbdaWbebabfbbaUaVaTaZaRaYacaZbcaLfLbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfPfQfRfSfTfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -adaXaVbfaWbbaZaSbdbeaTbaaRbcaYaUaZbbaTaVbfaSbaaWbcbeaUaVbaaWakaVabaZaYaXaVbdbbbebfbaaRbcaWaUaTaSbbbdaRaYaXbebcaVaUbaaiaVbfaLfLbfbabaaZbfbaaZbfbaaZbfbaaZbfbaaZbfbfbabaaZbfbaaZbfbaaZbfbaaZbfbaaZbfaTbafLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUkJkJkJfUfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +adaXaVbfaWbbaZaSbdbeaTbaaRbcaYaUaZbbaTaVbfaSbaaWbcbeaUaVbaaWakaVabaZaYaXaVbdbbbebfbaaRbcaWaUaTaSbbbdaRaYaXbebcaVaUbaaiaVbfaLfLbfbabaaZbfbaaZbfbaaZbfbaaZbfbaaZbfbfbabaaZbfbaaZbfbaaZbfbaaZbfbaaZbfaTbafLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUjajajafUfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM alaWbeaRaSaYaVaZaTbbbcbdaUbfbaaXaVaYbcbeaRaZbdaSbfbbaXbebdaSaabeaeaVbaaWbeaTaYbbaRfWcfdbfXfYfZcwdtcgaUbaaWbbbfbeaXbdafbeaRaLfLaRbdbdaVaRbdaVaRbdaVaRbdaVaRbdaVaRaRbdbdaVaRbdaVaRbdaVaRbdaVaRbdaVaRbdbdfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgagagafUfOkNkKfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aoaSbbaUaZbabeaVbcaYbfaTaXaRbdaWbebabfbbaUaVaTaZaRaYaWbbaTaZajbbahbebdaSbbbcbaaYgdLVgfggghgigjgkglfZgmbdaSaYaRbbaWaTanbbaUaLfLaUaTaTbeaUaTbeaUaTbeaUaTbeaUaTbeaUaUaTaTbeaUaTbeaUaTbeaUaTbeaUaTbeaUaTaTfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgngogpfUfOfOfOfOfOfOfOfOfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM abaZaYaXaVbdbbbebfbaaRbcaWaUaTaSbbbdaRaYaXbebcaVaUbaaSaYbcaVamaYagbbaTaZaYbfbdbagmgigqghglgrgsgtgugvgwaTaZbaaUaYaSbcakaYaXaLfLaXbcbcbbaXaZgQgQgQgQgQgQaZgQgQgQaZaZaZgQgQgQaZgQgQgxgygmgxbbaXbcbbaXbcbcfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUkOgogpfUgzgAkPkYkRkZgAlelbkQkQfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aeanamacakalajaaaeadahabaiagaoafajalahamacaaabakagadafamabakMAbaacaYbcaVbaaRaTbdgwgtgugkgIgfglghgjgJgKbcaVbdaXbaaZbfaabaaWaLfLaWbfbfaYaWaZgQhdgQgQhdgQaZgQhdgQgQgQgQgQhdgQaZgQhdjQjQjPjQaYaWbfaYaWbfbffLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgngogpfUlfgAkZkZkRkZgAkZkQkQkQfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aeanamacakalajaaaeadahabaiagaoafajalahamacaaabakagadafamabakMAbaacaYbcaVbaaRaTbdgwgtgugkgIgfglghgjgJgKbcaVbdaXbaaZbfaabaaWaLfLaWbfbfaYaWaZgQhdgQgQhdgQaZgQhdgQgQgQgQgQhdgQaZgQhdjQjQjPjQaYaWbfaYaWbfbffLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgngogpfUjtgAkZkZkRkZgAkZkQkQkQfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM ahbdaSaYaRbbaWaTbbbdaSaYaRbbaWaTbbaWaTbdaSaYaRbbaWaTanaMaMaMaMbdaibabfbebdaUbcaTgKghgjgvgqgigIgkgggsgQbfbeaTaWbdaVaRajbdaSaLfLaSaRaRbaaSaZgQhdhdhdhdgQgQgQhdhdhdhphkhkhjgQgQgQhphkhkhjjQbaaSaRbaaSaRaRfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgogogogVmrmvkZkZkRkZgAlelbkQkQfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM agaTaZbaaUaYaSbcaYaTaZbaaUaYaSbcaYaSbcaTaZbaaUaYaSbcakaMaMaMaMaTafbdaRbbaTaXbfbcgQgkgggJgugtgqgvgrglgZaRbbbcaSaTbeaUamaTaZaLfLaZaUaUbdaZaZgQhdhdhdhdgQgQhdhdhdhdhthrhrhqhdgQgQhthrhrhqjQbdaZaUbdaZaUaUfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgogogogVmrmvkZkZkZkZmwkZkQkQmxfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -acbcaVbdaXbaaZbfbabcaVbdaXbaaZbfbaaZbfbcaVbdaXbaaZbfaaaMaMaMaMbcanaTaUaYbcaWaRbfgZgvgrgsgjghgugJgfgIhhaUaYbfaZbcbbaXadbcbeaLfLaVaXaXaTaVaZgQhdhdhdhdgQgQhdhdhdhdhIgTgTgMhdgQgQhIgTgTgMjQaTaVaXaTaVaXaXfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUhmgohnfUlfgAkZkZkRkZgAlelbkQkQfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +acbcaVbdaXbaaZbfbabcaVbdaXbaaZbfbaaZbfbcaVbdaXbaaZbfaaaMaMaMaMbcanaTaUaYbcaWaRbfgZgvgrgsgjghgugJgfgIhhaUaYbfaZbcbbaXadbcbeaLfLaVaXaXaTaVaZgQhdhdhdhdgQgQhdhdhdhdhIgTgTgMhdgQgQhIgTgTgMjQaTaVaXaTaVaXaXfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUhmgohnfUjtgAkZkZkRkZgAlelbkQkQfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aibfbeaTaWbdaVaRbdbfbeaTaWbdaVaRbdaVaRbfbeaTaWbdaVaRajaMaMaMaMbfakbcaXbabfaSaUaRhhhogfglgggkgjgsgicggyaXbaaRaVbfaYaWalbfbbaLfLbeaWaWbcbeaZgQhdhdhphkhkhjhdhdhdhdhdgUcZhdhdhdhdhdgUcZhdjQbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNhsfUhvfUhugzgAkZkZkRkZgAkZkQkQkQfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM afaRbbbcaSaTbeaUaTaRbbbcaSaTbeaUaTbeaUaRbbbcaSaTbeaUamaMaMaMaMaRaabfaWbdaRaZaXaUhodtgrgvgrgvgggrgvfZgOaWbdaUbeaRbaaSaoaRaYaLfLbbaSaSbfbbaZgQhdhdhthrhrhqhdhdhdhdhphcgNhphdhdhdhphcgNhpjQbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNbDhsmyhubDgzgAkZkZkRkZgAlelbkQkQfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmzhyhzhAmChfhfhfaMhghghgmzhyhzhAmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -anaUaYbfaZbcbbaXbcaUaYbfaZbcbbaXbcbbaXaUaYbfaZbcbbaXadaMaMaMaMaUajaRaSaTaXicfXhChDgrgigsgigsgfgigsgkfZfZgxhCaYaUbdaZabaUbaaLfLaZaRaYaZaYaZgQhdhdhIgTgTgMhdhdhdhdhthkhahthdhdhphthkhahtjQaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmEmDmDmDmGmFhJmFmFmFhQmFmHmDmDmDmEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +anaUaYbfaZbcbbaXbcaUaYbfaZbcbbaXbcbbaXaUaYbfaZbcbbaXadaMaMaMaMaUajaRaSaTaXicfXhChDgrgigsgigsgfgigsgkfZfZgxhCaYaUbdaZabaUbaaLfLaZaRaYaZaYaZgQhdhdhIgTgTgMhdhdhdhdhthkhahthdhdhphthkhahtjQaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmEjvjvjvmGmFhJmFmFmFhQmFmHjvjvjvmEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM akaXbaaRaVbfaYaWbfaXbaaRaVbfaYaWbfaYaWaXbaaRaVbfaYaWalaMaMaMaMaXamaUaZbcaWgygkgtgIgigsgjgrgvgigugvgrgqgkgkfXbaaXaTaVaeaXbdaLfLaVaUbaaVbaaZgQhphkhkhjcZhdhdhdhdhdhdhdhdhdhdhdhthrhrhqjPjQaUbaaVaUbaaMaVfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmEhLhMmImJhPhShRhUhTikhPmNmMhXhYmEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aaaWbdaUbbaSaYbeaTaUhZiaibicidbaiecdifcwigaUbeaRbaaSaoaMaMaMaMaWadaXaVbfaSgOgkghgqgugvgggigsgtgjgkgfgugvggcwbdaWbcbeahaWaTaLfLbeaXbdbebdaZgQhthrhrhqgNhphphkhkhjhkhkhjhdhdhdhIgTgTgMjPjQaXbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmEiiiimOioilimilinilimiliFmOiiiimEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM ajbaaTaXaRbdaUbfaSaXipiqirisitaXiuiviwixiyaXbbaUbdaZabaMaMaMaMaSalaWbeaRaZgSgvgkgugjgJgrgkgqghgggsgigjgJgrizaTaSbfbbagaSbcaLfLbeaXbdbebdgQgQhIgTgTgMhahththrhrhqhrhrhqhdhdhdhdgUcZhdjPjQgmbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmQmMiijbimimimimimimimimimjbiimRmSaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM @@ -2086,14 +2056,14 @@ aYaSaTaXbbaUaXbbaUaSaTaXbbaUaSaTaXbbaUaSaTaXbbaUbdaZbfaMaMaMaMaSalaWbeaRcwglgvgk baaZbcaWaYaXaWaYaXaZbcaWaYaXaZbcaWaYaXaZbcaWaYaXaTaVaRaMaMaMaMaZaoaSbbaUizfWhoicdbhDldbcaWaUaTaShofWlddtfYicfZaZaRaYacaZaRaLfLbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmQlzlAlAlAlBmSaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM bdaVbfaSbaaWaSbaaWaVbfaSbaaWaVbfaSbaaWaVbfaSbaaWbcbeaUaMaMaMaMaVaeaVbaaWbeaTaYbbaRbdaUbfaSaXbcaZaYaTaUbaaWbbbfbeaXbdafaVaXaLfLaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aTbeaRaZbdaSaZbdaSbeaRaZbdaSbeaRaZbdaSbeaRaZbdaSbfbbaXaMaMaMaMbeahakadaiaaaoamajahalagaeafacabanamaoagadacaiaeaaacalanbeaWaLfLaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaMaVfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -bcbbaUaVaTaZaVaTaZbbaUaVaTaZbbaUaVaTaZbbaUaVaTaZaRaYaWaMaMaMaMaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMdjhegWheiAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +bcbbaUaVaTaZaVaTaZbbaUaVaTaZbbaUaVaTaZbbaUaVaTaZaRaYaWaMaMaMaMaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMdjhekcheiAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaMaMaMaMaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMheiCiBiDheaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjaiBjriBjaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjtyGiByGjtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjtiBiBiBjtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjviBiBiBjvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMkciBjriBkcaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMkcyGiByGkcaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMkciBiBiBkcaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMkciBiBiBkcaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhejxjwjAheaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhemWmWmWheaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhekBkBkBheaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjCjEjDjGjFaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmsmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmt aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM @@ -2112,38 +2082,38 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmXnbnbnbmXmYmYmXaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumuaMaMaMaMaMaMmKmBmumumumumumumumumumumumumumumumumumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmLmLmLmLmXmXmXmXmXmXmYmYmXaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumuaMaMaMaMaMaMmPaMmBmumuihihihihihmumumumumumumumumumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmLmLmLmLnamYnamYmYmYmYmYmXaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMihihncnPndihihmumumumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmLmLmLmLmXmXmXmXmYmYmYnTmXaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMlEobnUohnUobihmumumumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmXnbmYmYnTmXaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMkcobnUohnUobihmumumumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmXnbmYmYnTmXaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMkDobnUohnUobihmumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmLmLmLmLmXmXmXmXmYmYmYnTmXaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMkDobnUohnUobihmumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmXnbmYmYnTmXaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMkJobnUohnUobihmumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmXnbmYmYnTmXaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMlfobnUohnUobihmumumumumumumumumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmXmXmXmXmXmXaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMihihohohoiihihmumumumumumumumumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihohohohihmumumumumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMosokokoHihihoPihihihihihihihmumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMnvrPrIrIrIrBnzaMaMoRnenfngnenenerlihninjnknlihmumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMnvnHnnnJnrnLnsnHnzaMoRnenmnmnenenenenCnonononpihihihihihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMnHnInRnRnSnRnRnLnHaMoRnqnMnKntneneneihnonononuihbOkQbTihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMnHnQnRnRnRnRoanZnHaMoRnenAnAnenenepaihofnonDnEihbLkQmkihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHognRnRoUnRnRonnHaMoRneneneneneneriihihihihihihbPkQnGihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMomnHoCnHnHnHnHnHooaMoVokokpdihpgpgpgihkTkTnVnWihcikQrcihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoGoyoLounFnHaMaMaMaMaMaMphpgpgpgoclalaododihcikQrcihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoBoAoanRornHaMaMaMaMaMaMpypgpgpgihojlaihihihpGolpGihihihihmumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlElElElEihihoPihihihihihihihmumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMnvlFlFlFlFlFnzaMaMlEnenfngnenenerlihninjnknlihmumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMnvnHnnnJnrnLnsnHnzaMlEnenmnmnenenenenCnonononpihihihihihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMnHnInRnRnSnRnRnLnHaMlEnqnMnKntneneneihnonononuihbOkQbTihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMnHnQnRnRnRnRoanZnHaMlEnenAnAnenenepaihofnonDnEihbLkQmkihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHognRnRoUnRnRonnHaMlEneneneneneneriihihihihihihbPkQnGihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMomnHoCnHnHnHnHnHooaMlElElElEihpgpgpgihkTkTnVnWihcikQrcihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoGoyoLounFnHaMaMaMaMaMaMlEpgpgpgoclalaododihcikQrcihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoBoAoanRornHaMaMaMaMaMaMlEpgpgpgihojlaihihihlEollEihihihihmumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnvnHoOoyoanRoQnHnzaMaMmPmKoFihpgpgpgihihihihnOnOkQkQkQpWpWpKihihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnvnHnHnHnHvLoyoanRLZnHnHnHnHnzototihpXpgpgpgihnYnXkQkQkQkQkQkQkQkQqKihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHpioSoYnHnRpYnRoJnHnHoZoXpfpbpkpnpkpgpgpgpgpmkQkQkQkQkQoDkQkQkQkQoxihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMqeoWpjoWnHnHnHponHnHptoZplpxpbpkpLpkpgpgpgpgihoqopkQkQkQkQkQkQkQkQoMihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMnHnHqeqqnHnHpAnRpCnHnHpzpDpznHoIoIihqrokpdihihihihowovkQkQkQozozoeihihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqsqsqsqsqsqsqsqsqsqsqsqsqsqsqsqsqsqsqsoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHManRnRpHnHnRnRnRnHrbsopJpInHmBaMmBaMaMaMaMmumuihihihpGpcpGihihihihmumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnvnHnHnHnHvLoyoanRLZnHnHnHnHnzlGlGihpXpgpgpgihnYnXkQkQkQkQkQkQkQkQqKihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHpioSoYnHnRpYnRoJnHnHoZoXpfpbpklHpkpgpgpgpgpmkQkQkQkQkQoDkQkQkQkQoxihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMlFoWpjoWnHnHnHponHnHptoZplpxpbpkmipkpgpgpgpgihoqopkQkQkQkQkQkQkQkQoMihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMnHnHlFqqnHnHpAnRpCnHnHlFpDlFnHmDmDihlElElEihihihihowovkQkQkQozozoeihihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqsqsqsqsqsqsqsqsqsqsqsqsqsqsqsqsqsqsqsoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHManRnRpHnHnRnRnRnHrbsopJpInHmBaMmBaMaMaMaMmumuihihihlEpclEihihihihmumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqsqsqsqvpepepepepRpRpepepepeqwqsqsqsqsoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHpSnRnRnRpTnRnRnRqanRnRnRqbnHmKmKmKmKaMaMaMaMmumumuihoEkQoEihmumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqsqsqvpppqprkspeqcpupelgkLpepepeqwqsqsoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMnHqCnRnRnRqdnRnRnRqpnRnRnRqtnHaMaMaMaMaMaMaMaMaMmumuihoEkQoEihmumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqsqvpepBpBpBpBpeququpepBpBqDlhpepeqwqspFpFpFpFpFaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnvnHnHnHnHnHnHnRnRnRnHnHnHnHnHnHnzaMaMaMaMaMmAaMmBmumuihoEkQoEihmumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqvpepepMlilkljpepBpBpQpBpBpBpBqFqEpeqspFqIpUpVpFpFpFpFpFjSjSjSjSpFpFaMaMaMaMaMaMaMaMpZpZpZpZpZpZpZpZpZpZpZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHqJrjserdqZnHqxnRrgnHrkrqrqrArtnHaMaMaMaMaMmAmBmumumuihoEkQoEihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqyqfqgpBqhqhqhpepBpBpeqiqjqkqlqmqnpeqspFqopUpUqAqzqHqGqMqLqGqOqQqPpFpFpFpFpFpFpFpFpFpFqRqRqRqRqRqRqRqRqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMnxrjrjrjrjrjnHnRnRnRnHqUnRnRnRrHnwaMaMaMaMaMmPaMmumumuihihyxihihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqVqfpBpBpBpBpBpQpBpBpepepepepepepeqXqWpFpFpFpFpFqzqOqGreraqGqOqOqOrrrfrfrfrfrfrfrfrfrrqRrsrurururururvqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMnhrCrDrjrjrjrRnRnRnRrSnRnRnRrXrTmiaMaMaMaMaMmAmBmBmumumuihihihmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsrEpeqSpBqSpBqSpepBpBpBqTrFqsqsqsqsqsqsrGrfrfrfrrqOqOqOqOqOqOqOqOqOrrrfrfrfrfrfrfrfrfrrqRrKqYqYqYqYqYrKqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnyrjrjrjrjrjrYnRnRnRrZnRnRnRnRsanBaMaMaMaMaMmAaMaMmBmumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqspepepepepepepepBpBrhpBrFqsqsqsqsqsqsrGrfrfrfrrqOqOqOqOqOqOqOqzqzpFpFpFpFpFpFpFpFpFpZqRrKsbqYqYqYscrKqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsdrjrjrjrLnHpzshpznHsioKslnRspnHaMaMaMaMaMaMaMaMaMmumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqvpermrnrormrppepBpBpBsqrFqsqsqsqsqsqspFpFpFpFpFqOqOqGreqLqGqOrQrOpFrVrWrWsfpFrwrxrypZqRrKqYqYqYqYrzssqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHstsusHswsvnHsxnRsDnHsFnHnHnNnHnHaMaMaMaMaMaMaMmAaMmBmumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqyqfqgpBqhqhqhpepBpBpeqiqjqkqlqmqnpeqspFqopUpUqAqzqHqGqMqLqGqOqQqPpFpFpFpFpFpFpFpFpFpFqRqRqRqRqRqRqRqRqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMlFrjrjrjrjrjnHnRnRnRnHqUnRnRnRrHlFaMaMaMaMaMmPaMmumumuihihyxihihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqVqfpBpBpBpBpBpQpBpBpepepepepepepeqXqWpFpFpFpFpFqzqOqGreraqGqOqOqOrrrfrfrfrfrfrfrfrfrrqRrsrurururururvqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMlFrCrDrjrjrjrRnRnRnRrSnRnRnRrXrTlFaMaMaMaMaMmAmBmBmumumuihihihmumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsrEpeqSpBqSpBqSpepBpBpBqTrFqsqsqsqsqsqsrGrfrfrfrrqOqOqOqOqOqOqOqOqOrrrfrfrfrfrfrfrfrfrrqRrKqYqYqYqYqYrKqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMlFrjrjrjrjrjrYnRnRnRrZnRnRnRnRsalFaMaMaMaMaMmAaMaMmBmumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqspepepepepepepepBpBrhpBrFqsqsqsqsqsqsrGrfrfrfrrqOqOqOqOqOqOqOqzqzpFpFpFpFpFpFpFpFpFpZqRrKsbqYqYqYscrKqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsdrjrjrjrLnHlFshlFnHsioKslnRspnHaMaMaMaMaMaMaMaMaMmumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqvpermrnrormrppepBpBpBsqrFqsqsqsqsqsqspFpFpFpFpFqOqOqGreqLqGqOrQrOpFrVrWrWsfpFrwrxrypZqRrKqYqYqYqYrzssqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHmWsunhnwsvnHsxnRsDnHsFnHnHnNnHnHaMaMaMaMaMaMaMmAaMmBmumumumumumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqyqfrJrJrJrJrJpQpBpBpepepepepepepeqwqspFqIpUpVpFqOqOqGresjqGqOqzqzpFskskskskpFrMrxrNpZqRrKqYqYqYqYqYsIqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsNrjsSnHnHnHnRsJsKnHnHnHsVnRLxnHaMaMaMaMaMaMaMmAmBmBmumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqVqfrUrJrJrJrJpepBpBpBpBpBpepBsnsmpeqspFqopUpUqAqOqOqOqOqOqOqOqOqOpFsksysrsrpFpFtqpFpZqRrKqYqYqYqYtDrKqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHlvsXsznHaMnHsGsGsGnHaMnHnLtatbnHaMaMaMaMaMaMaMmAaMmBaMmumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsrEpepesgtGtGtGpepBtHtHtHpBpQpBpBpBpeqspFpFpFpFpFpFpFsOpFpFpFqOqOqOsPsksQsQsksksksksrpZqRrKqYqYqYqYqYsIqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsGsGsGnHaMomtmtntoooaMnHsGsGsGnHaMaMaMaMaMaMaMmAmBmBmBmBmBmumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqVqfrUrJrJrJrJpepBpBpBpBpBpepBsnsmpeqspFqopUpUqAqOqOqOqOqOqOqOqOqOpFsksysrsrpFpFtqpFpZqRrKqYqYqYqYtDrKqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHlvsXsznHaMnHnxnxnxnHaMnHnLtatbnHaMaMaMaMaMaMaMmAaMmBaMmumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsrEpepesgtGtGtGpepBtHtHtHpBpQpBpBpBpeqspFpFpFpFpFpFpFsOpFpFpFqOqOqOsPsksQsQsksksksksrpZqRrKqYqYqYqYqYsIqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHnxnxnxnHaMomtmtntoooaMnHnxnxnxnHaMaMaMaMaMaMaMmAmBmBmBmBmBmumumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqsrEperJrJrJrJpepBtHtHtHpBpeqSpepeqXqspFsrsksRpFsAsBsBsBsCpFqOqOqOqOsksksksksTsksksrpZqRrKqYqYqYqYsEtZqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMomtmtntoooaMaMaMaMaMaMaMomtmtntoooaMaMaMaMaMaMaMmAaMmBaMmBaMaMmumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqsqsrEpesLsMuapepBpBpBpBpBpepepeqXqsqspFsWsksksksBsBsBsBuipFqOqOqOsPsYsksksksZsksktcpZqRrKsbqYqYqYscrKqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqsqsqsqsrEpepepepepepepepepepeqXqsqsqsqspFpFsPsPpFpFpFsPsPsPpFqOqOqOpFsPsPsPsPsPsPsPpFpZqRtdteqYqYqYtgtfqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu @@ -2152,13 +2122,13 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuntvupuxuuuzuyuAtvvMuWuhwyvkvgvfvfvyvyyhtrtttttttttztututututFtJtItLtKpFtytptypFtMtOtNtPtPtxaMaMpZqRqRqRqRqRqRqRqRqRjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvAgtvuhuhuhuhuhuhtvLsuWuhuhuhuhuhuhuhuhyhtQtttRtttSvEurururvOtTtPtPtPtPpFtytptypFtPtPtPtPtPtxaMaMugugugugugugugugugugugtxtxtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtUtVvbtWuwvQuhuhuhuhuhuhuhvRtvtvtvuhuhuhuhuhuhuhuhyhtXubtYtttttztututututTtPtPtPtPpFvUtiwhpFtPtPtPtPtPtxugugugugugugucueudtxurururtxururururururururtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMujufufufufufufufufufufufufufulufufufufufulumufvbvbvctvwluhuhuhuhuhuhuhtvveuhuhuhvpvpwownwpwpyhuoutuqttttyhwqwqwqtvuvuCuBuEuDtxuFuFuFtxtPtPtPtPtPtxuJuKuJuLuMuguGuIuHuOurururuOuruPuQuPuruSuRuTtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvQtvtvtvuhuhuhuhuhuhuhuhtvvKuhuhuhLwtvtvtvtvtvyhyhyhyhyhyhyhxQxQxQtvuUwAtutututxtPuVtPtxtututuwAuXtxvqvrvqvrvqugtxtxtxtxurururtxuYuPuPuPuZvavwvitxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtUvjvbvbwEtvvxwPukxowVwXuhuhtvvSuhuhuhwYtvxawZwZxavlxbxexdxQxQxQxQxQxgtvtPtPvmvnvnvnvnvnvnvnvnvnvotPtPvsvqvqvqvqvqugvtvvvutxurururtxvzvBvAvBvCvavwvitxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMujufufufufufufufufufufufufufvDufufufufufvDvFufvbvbxltvvlvlvlvlvltvuhuhtvwmuhuhuhxmtvuhxQxQxQvlxQxQxQxQxQxQxQxQxptvtPuVvGtutututututututututTuVtPugvZwawbvHvqugvIuNvJtxurururtxvPwfuNwfvTvavwvitxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtUvVvbvbxqvlxrxtxsxvxuvluhuhvluhuhuhuhxwvluhxQxQuwxxxQxQxQxexetvtvtvtvtvtPtPvGtuvWtPvXwcvYtPvWtutTtPtPugugugugugugugwduIwetxurururtxwiwwuNwwwjvavwvitxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMujufufufufufufufufufufufufufwkufufufufufwkwrufvbvbxAvlxHuhuhuhxIvluhuhvluhuhxKxJxLvlxMxQxQxQtvvlvlwsvlvltvxQxQxQxNtPtPwttuwuwxwvwBwzwGwFtuwHtPtPxRwIwIwIwIwItxtxuOtxtxtxuOtxtxwJuNuNuNwKvavwvitxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtUwLvbvbxYtvyauhuhuhuhtvybybtvycyctvtvtvtvxMxQxQuwwNwMwMwMwMwMwOwMwMwMwOtPtPwQwRtPtPwSuFwTtPtPwRwUtPtPxjurururururxjurururururururxjwiwwwwwwwjxcwWxftxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMujufufufufufufufufufufufufufulufufufufufulumufvbvbvctvwluhuhuhuhuhuhuhtvveuhuhuhvpvpwownwpwpyhuoutuqttttyhwqwqwqtvuvuCuBuEuDtxuFuFuFtxtPtPtPtPtPtxuJuKuJuLuMuguGuIuHuOurururuOuruPuQuPurnBnyuTtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvQtvtvtvuhuhuhuhuhuhuhuhtvvKuhuhuhLwtvtvtvtvtvyhyhyhyhyhyhyhxQxQxQtvuUwAtutututxtPuVtPtxtututuwAuXtxvqvrvqvrvqugtxtxtxtxurururtxokuPuPuPosotvwvitxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtUvjvbvbwEtvvxwPukxowVwXuhuhtvvSuhuhuhwYtvxawZwZxavlxbxexdxQxQxQxQxQxgtvtPtPvmvnvnvnvnvnvnvnvnvnvotPtPvsvqvqvqvqvqugvtvvvutxurururtxoHoRoIoRoVotvwvitxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMujufufufufufufufufufufufufufvDufufufufufvDvFufvbvbxltvvlvlvlvlvltvuhuhtvwmuhuhuhxmtvuhxQxQxQvlxQxQxQxQxQxQxQxQxptvtPuVvGtutututututututututTuVtPugvZwawbvHvqugvIuNvJtxurururtxvPwfuNwfvTotvwvitxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtUvVvbvbxqvlxrxtxsxvxuvluhuhvluhuhuhuhxwvluhxQxQuwxxxQxQxQxexetvtvtvtvtvtPtPvGtuvWtPpdwcphtPvWtutTtPtPugugugugugugugwduIwetxurururtxwiwwuNwwwjotvwvitxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMujufufufufufufufufufufufufufwkufufufufufwkwrufvbvbxAvlxHuhuhuhxIvluhuhvluhuhxKxJxLvlxMxQxQxQtvvlvlwsvlvltvxQxQxQxNtPtPwttuwuwxpnwBpywGwFtuwHtPtPxRwIwIwIwIwItxtxuOtxtxtxuOtxtxwJuNuNuNwKotvwvitxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtUwLvbvbxYtvyauhuhuhuhtvybybtvycyctvtvtvtvxMxQxQuwwNwMwMwMwMwMwOwMwMwMwOtPtPwQwRtPtPwSuFwTtPtPwRwUtPtPxjurururururxjurururururururxjwiwwwwwwwjpzwWxftxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMujufufufufufufufufufufufufufxhufufufufufxhxixkvbvbuwyjuhuhuhuhuhyjuhuhykuhuhymxnyzyzuhxQxQvdtvvlvlwsvlvltvxQxQxQyAtPtPxytuxzwxxBtPxCwGxDtuxEtPtPxjurururururxjurururururururxjxFxGxGxGxOtxxjxjtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvbvbuwyjuhuhuhuhuhyjuhuhyCuhuhxQyDyDyDxQxQxQzcvlBWyMxQySyQtvtvtvtvtvtPtPvGtuxPtPwItPwIxTxStutTtPtPwAxUxUxUxUxUtxtxxVtxtxtxuOtxtxtxxWxWxWtxtxurururyYurxZtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvvbvbyZtvvlvlvlvlvltvzezetvzfuhxQzgzizhxQxQxQyRzkyMxQxQxQxQxxxQxKzltvtPtPvGtxtxydxXtPyexPtxtxtTtPtPtxaMaMaMaMaMtxyrystxygyfylyitxynysysysxWtxururuQuQururyqaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM @@ -2170,8 +2140,8 @@ dCdCdCdCdCdCdCdCdCdCdCAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZdCdCdCdCdCdCdCmt dCmumumumumumumumumudCBvBvBvBvBvAZBFBzBGAZBvBvBvBvBvBvBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzBzNzNzNzNzEzEzNzNzPaMtvBNxQxQzFzDtvAGAJAJAGyTzmyXzbCNzHyXyXyXzKCNaMaMaMaMaMaMaMaMaMaMaMaMzQzSNaNaNazTzRaMaMaMaMaMtxzVururururzWtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumumumumumudCBvBvBvBvBvAZBRBzBzAZBvBvBvBvBvBvBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzUzMzZAaBSAcAcAdjZzNzPtvtvyWyWtvtvtvlqAGAGAGzYzmyXzbCNAjAiAjAkAjCNaMaMaMaMaMaMaMaMaMaMaMzQAlNilNNkNlNmAtzRaMaMaMaMtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumumuBvBvBvAZAZAZAZBvAZAZAZAZCgAZAZAZAZAZAZAZBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzUzMAmAcAcAcAcAcAcCiChvlxQxQxQxQxQxNAGCjAGCjyTzmyXAwzYyXyXAxyXABCNaMaMaMaMaMaMaMaMaMaMzQAlCoAvADAvADAvCpAtzRaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuBvBvBvBvCuCvBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzAZBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzUzMypAyAzMfAzAzAzzNAAvlxQxQxQxQxQyWAGCjAGCjyTzmyXAwzYyXyXALAIAMCNaMaMaMaMaMaMaMaMaMaMACADADADCANcyuADADADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuBvBvBzCFCuCFBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzAZCHCGBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAOzNzNzNzNzNzNzNzNAAaMvlxQxQxQxQxQtvAGCjAGCjyTAQAPARCNAjASAUATAjCNaMaMaMaMaMaMaMaMaMaMAWCRBuNhAXNgAXNfCrCSAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuBvBvBvBvCuCvBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzAZBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzUzMypAyAzMfAzAzAzzNAAvlxQxQxQxQxQyWAGCjAGCjyTzmyXAwzYyXyXpEAIAMCNaMaMaMaMaMaMaMaMaMaMACADADADCANcyuADADADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuBvBvBzCFCuCFBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzAZCHCGBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAOzNzNzNzNzNzNzNzNAAaMvlxQxQxQxQxQtvAGCjAGCjyTAQAPARCNAjASpGATAjCNaMaMaMaMaMaMaMaMaMaMAWCRBuNhAXNgAXNfCrCSAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumuBvBvCuCFCuBvBvBvAZAZAZAZCgAZAZAZAZCgAZBzBzBzCgCVAYBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHCNCNBcyXyXBdzKCNCNCNaMaMaMaMaMaMaMaMAWCYACBeBgBfBgBeACCYAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumuBvCuCuBvBvBvBvBvBvBvBvAZBzBzBRAZDbBzAZBzBzBzCgCVDcBvBvAZmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhBhBhBhBhBhBhBhBhBhBhBhBhBiBkBjBtBlBmBmBmBmBmAHBxAjBHyXyXBMzKAjBxCNaMaMaMaMaMaMaMaMAWADCrAWDFBOyvAWBuADAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumuBvCuBvBvBvmumuBvAZAZAZAZDWBzBFAZDWBFAZBzBzBzAZCVCVCVBQAZmumudCmumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhBhBVBUBYBVBUBUkkkgkpBUCeCdBkBmBmBBBmBmBmBmBmAHBxAjBHyXyXyXzKAjBxCNCNCNCNCNCNaMaMaMACADCrCCMQMRMPCCBuADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM @@ -2179,27 +2149,27 @@ dCmumumuBvErErBvmumumuBvEsECECAZAZAZAZAZAZAZAZBzBzBzAZCVCVCVCfAZmumudCmumumuaMmt dCmuBvCuCuCuCuBvBvmumuBvEXEYEXCgBzBzBzBzBzBzBzBzBzBzAZFlFaFpAZAZmumudCmumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhkCkGkEkGkHkGkGkGkGkGkGkGCxBmBmBmAHAHAHAHCcFsAHBxAjBHyXyXyXCyAjAjAjAjAjAjAjAjAjAjAWFNADCrAtACFRACAlBuADFNAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmuFVCuCuCuCuFWBvmumuAZFXEXEXCgBzBzBzBzBzBzBzBzBzBzAZBvBvBvBvBvmumudCmumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhCzCBltCDClkUlukUkUkUluAuCEBkBmBmAHCJCICKCPCPCNAjAjCLyXyXyXyXCOyXyXCQyXyXCTGTDpGTHfADADADHjHkADADHjADADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmuHmHAHzCuHBCuCumumuAZHCHIAZAZAZAZAZAZAZAZAZAZCgAZAZAZAZAZAZAZAZAZAZmumuaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhBhCzBUCUCzBUBUkkkgkpBUCXCWBkBmBmAHDaCZDdCPCPDgyXCOyXyXyXyXyXCOyXyXyXyXyXCTAjAjAjAWAEADCrCCBuADCrCCBuADHQAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmuIhCuImCuHzCuCumumuBvBvBvAZBzBzBzBzBzBzAZIqIGIGIGIIAZBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhBhBhBhBhBhBhBhBhBhBhBhBhBiBkBmBmAHDqDiDrCPCPDgyXCOyXyXyXyXDsAjAjAjyXDxDzDyCNaMaMCCBuADCrCMBuADCrCMBuADCrDAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmuIhCuImCuHzCuCumumuBvBvBvAZBzBzBzBzBzBzAZIqIGIGIGIIAZBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhBhBhBhBhBhBhBhBhBhBhBhBhBiBkBmBmAHDqDiDrCPCPDgyXCOyXyXyXyXDsAjAjAjyXDxDzDyCNaMaMCCBuADCrCMBuADCrCMBuADCrCCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmuBvCuIXCuIYCuCumumuaMaMmuAZBzBFBzBzBzBzAZIGIGJaIGIGAZBzBzBzBzBFBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHJcJbJbCPCPCNAjAjDByXDCyXCwAjBxDDyXCTuVJrCNaMaMCMBuADCrCMBuNcCrCMBuADCrCMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmuBvJAJzCuCuJBCumumuaMaMmuAZBzBzBzBzBzBzCgIGIGJCIGIGCgBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJEJDJDJDJFJFCPCPCPCPJHCPCPCPCPCPCPCPCPCPCPNyCPCNBxAjDEyXyXyXCyAjAjAjyXDGzrDHCNaMaMDfBuADCrCMBuADCrCMBuADCrDfaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmuBvBvCuCuCuCuBvmumumAaMaMAZBzBzAZJMJOJNAZIGItJRIGIGAZJMJOJNAZBzBzAZaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJUJUJUJUDmDjDkDlCPDmDnDoDlCPCPCPCPCPCPCPCPCNBxAjDIyXyXyXyXCOyXyXyXyXyXCTAjAjAjAWJWADCrDfBuADCrDfBuADANAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmuBvBvBvBvJYJZBvmumBmAaMaMAZBzBzAZaMaMaMAZAZJMJOJNAZAZaMaMaMAZBzBzAZaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUKaJUJUJUJUDmDtDuDlCPDmDvDwDlCPCPDKDKDKDKDKDKCNBxAjDSDRyXyXyXCOyXyXyXyXyXCTGTDpGTKcADADKdADADADADADKdADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmuBvBvBvBvBvBvmuaMaMaMaMaMKiKjKjKsaMaMaMaMaMaMaMaMaMaMaMaMaMKiKjKjKsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUKuJUJUJUJUCPCPCPCPNyCPCPCPCPCPCPDTDTDTDTDTDTCNCNCNCNKvDXDXCNCNCNCNAjAjAjAjAjAjAjDYACNNBezSzTKxzSzTBeNNACDZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumumumumumuaMaMaMaMKiKzKyKsaMaMaMaMaMaMaMaMaMaMaMaMaMKiKzKyKsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUKAJUKBJUDmDNDODlCPDmDPDQDlCPCPEcEiEiEiEiEiCNEkEkEkEoDVDVEqEpEpCNBxBxBxBxCNaMaMAWNENFAWNHNIEaKDNJAWNLNGAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumumumumuaMaMaMaMaMKiKzKyKsaMaMaMaMaMaMaMaMaMaMaMaMaMKiKzKyKsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNKKJUJUKLJUJUDmEeEfDlCPDmEgEhDlCPCPEiEiEiEiEiEiCNEtEjEjElDVDVDVEpEpCNCNCNCNCNCNaMaMAWKNKMAWKONVEaEaKPAWKQKRAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmuBvBvCuCuCuCuBvmumumAaMaMAZBzBzAZpLpPpNAZIGItJRIGIGAZpLpPpNAZBzBzAZaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJUJUJUJUDmDjDkDlCPDmDnDoDlCPCPCPCPCPCPCPCPCNBxAjDIyXyXyXyXCOyXyXyXyXyXCTAjAjAjAWJWADCrDfBuADCrDfBuADANAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmuBvBvBvBvJYJZBvmumBmAaMaMAZBzBzAZaMaMaMAZAZpLpPpNAZAZaMaMaMAZBzBzAZaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUKaJUJUJUJUDmDtDuDlCPDmDvDwDlCPCPDKDKDKDKDKDKCNBxAjDSDRyXyXyXCOyXyXyXyXyXCTGTDpGTKcADADKdADADADADADKdADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmuBvBvBvBvBvBvmuaMaMaMaMaMqeKjKjqraMaMaMaMaMaMaMaMaMaMaMaMaMqeKjKjqraMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUKuJUJUJUJUCPCPCPCPNyCPCPCPCPCPCPDTDTDTDTDTDTCNCNCNCNKvDXDXCNCNCNCNAjAjAjAjAjAjAjDYACNNBezSzTKxzSzTBeNNACDZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumumumumumuaMaMaMaMqerIrBqraMaMaMaMaMaMaMaMaMaMaMaMaMqerIrBqraMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUKAJUKBJUDmDNDODlCPDmDPDQDlCPCPEcEiEiEiEiEiCNEkEkEkEoDVDVEqEpEpCNBxBxBxBxCNaMaMAWNENFAWNHNIEaKDNJAWNLNGAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumumumumuaMaMaMaMaMqerIrBqraMaMaMaMaMaMaMaMaMaMaMaMaMqerIrBqraMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNKKJUJUKLJUJUDmEeEfDlCPDmEgEhDlCPCPEiEiEiEiEiEiCNEtEjEjElDVDVDVEpEpCNCNCNCNCNCNaMaMAWKNKMAWKONVEaEaKPAWKQKRAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumumumumuaMaMaMaMaMlwKjKjlxaMaMaMlwaMaMaMaMaMlxaMaMaMlwKjKjlxaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNKUJUJUJUJUKuCPCPCPCPCPCPCPCPCPCPCPEiEiEuEwEvExCNDVDVDVDVEzEyDVDVEACNaMaMaMaMaMaMaMDYCqCqAWKYEaNREbBPAWCqCqDZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuaMaMaMaMaMaMaMaMlylDlClyaMaMaMlylFlGlGlGlHlyaMaMaMlylIlJlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJULiLjKaLlLkEGEFEFEFEHEHEHEIEIEJEIEIEHEHEHCNCNCNEKDVDVEzEMELEyDVENCNaMaMaMaMaMaMaMEOEVEVDZEPEaEaEaEQDYEVEVERaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuaMaMaMaMaMaMaMaMlylDlClyaMaMaMlyrPrPrPrPrPlyaMaMaMlylIlJlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJULiLjKaLlLkswstststEHEHEHEIEIEJEIEIEHEHEHCNCNCNEKDVDVEzEMELEyDVENCNaMaMaMaMaMaMaMEOEVEVDZEPEaEaEaEQDYEVEVERaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumuaMaMaMaMaMaMaMaMlylLlKlyaMaMlwlylyIClMlPlOlylxaMaMlylQlRlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJULlLWEZEZEZEZEZEHESFeEIFeFeFeEIFeESEHCNCNCNCNCNCNETEWEUFbDVENCNaMaMaMaMaMaMaMaMaMaMEOBeCqCqCqBeERaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumuaMaMaMaMaMaMaMaMlylTlSlyaMaMlylylUlWlVlWlXlylyaMaMlylYlZlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMjJULlLWEZEZEZEZEZEZEHFeFdFcFeFeFeFcFfFeEHFgFiFhFkFjCNDVETFbFmDVDVFnaMaMaMaMaMaMaMaMaMaMaMEOEVEVEVERaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumuaMaMaMaMaMaMaMaMlymalylylylylymcmbmbmbmbmbmdlylylylylymelyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJULlLWEZEZEZEZEZEZEZEHEIFeEIFeFeFeEIFeEIEHDVDVDVDVDVMuDVDVDVDVDVDVFnaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumuaMaMaMaMaMaMaMaMlymgmfmjmhmllymmmbmbmbmbmbmmlymomnmqmpoTlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNLlLWEZEZEZEZEZEZEZEZEHFoFeFeFeFeFeFeFeFtEHFuDVFEDVFvCNDVDVDVDVDVFwFnaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumuaMaMaMaMaMaMaMaMaMaMaMlypvpspspspwlypNpEpPpOpNpEpPlyqBpspsqNpvlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNCNCNCNCNCNCNCNCNCNCNCNEHFxFyFyFyFeFzFzFzFAEHFBDVFCFFFDCNFGFHEpFJFIFKCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumuaMaMaMaMaMaMaMaMaMaMaMsUpvpspspspspOmbmbmbmbmbmbmbpOpspstEpspvsUaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeFeFeFeFeFeFeFeFeFeFeEHEHFLEHEHFeEHEHFLEHEHEHEHEHEHEHCNCNCNCNCNCNCNCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuaMaMaMaMaMaMaMaMaMaMvNzApsAepspslyBnAVmbmbmbmbBolypsBppsBqpvvNaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHEHEHEHNwEHEHEHFeFeFeFeFeFeEHFeEHFeFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuaMaMaMaMaMaMaMaMaMaMBrzApspslyBslylylyBAByBClylylyBslyBEBDBIBraMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHEHEHEHEHEHEHEHFMEHEHEHEHEHEHEHEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuaMaMaMaMaMaMaMaMaMlwlyBKBJBJlyBTBLBTsUBXFrBZsUCbCaCslyDeCtDLlylxaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHFPFOFQFOFTFSFSFSFSFSFTFSFTFSFUEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuaMaMaMaMmumuaMaMaMDMlyDUDUlylyBTBTBTvNBXByBZvNCsCsEdlylyDUDUlyEEaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGkGbGbGbGbGlEHFSGdGdGdGdGdFSFSFSGdGdGdGdGeGfEHFeEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuaMaMaMaMmumuaMaMaMaMDMFqFqEElyFYIQBTBrFZmbFZBrCsCsHHlyDMFqFqEEaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZEHFeEHGkOpOoOoGbGbGrFSFSGhGgGhFSFSFSFSFSGhGgGhGiFSEHFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumuaMaMaMaMaMaMaMaMaMaMaMlypvpspspspwlysGsGsGpOsGsGsGlyqBpspsqNpvlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNCNCNCNCNCNCNCNCNCNCNCNEHFxFyFyFyFeFzFzFzFAEHFBDVFCFFFDCNFGFHEpFJFIFKCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumuaMaMaMaMaMaMaMaMaMaMaMrPpvpspspspspOmbmbmbmbmbmbmbpOpspstEpspvrPaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeFeFeFeFeFeFeFeFeFeFeEHEHFLEHEHFeEHEHFLEHEHEHEHEHEHEHCNCNCNCNCNCNCNCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuaMaMaMaMaMaMaMaMaMaMrPzApsAepspslyBnAVmbmbmbmbBolypsBppsBqpvrPaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHEHEHEHNwEHEHEHFeFeFeFeFeFeEHFeEHFeFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuaMaMaMaMaMaMaMaMaMaMrPzApspslyBslylylyBAByBClylylyBslyBEBDBIrPaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHEHEHEHEHEHEHEHFMEHEHEHEHEHEHEHEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuaMaMaMaMaMaMaMaMaMlwlyBKBJBJlyBTBLBTrPBXFrBZrPCbCaCslyDeCtDLlylxaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHFPFOFQFOFTFSFSFSFSFSFTFSFTFSFUEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuaMaMaMaMmumuaMaMaMDMlyDUDUlylyBTBTBTrPBXByBZrPCsCsEdlylyDUDUlyEEaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGkGbGbGbGbGlEHFSGdGdGdGdGdFSFSFSGdGdGdGdGeGfEHFeEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuaMaMaMaMmumuaMaMaMaMDMFqFqEElyFYIQBTrPFZmbFZrPCsCsHHlyDMFqFqEEaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZIZEHFeEHGkOpOoOoGbGbGrFSFSGhGgGhFSFSFSFSFSGhGgGhGiFSEHFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumuaMaMaMaMmumuaMaMaMaMaMaMaMaMlyBTBTBTlylypOlylyKSCsKTlyaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIZJlJlJmJoJnJqJpJxJwJIJyJKJJJSJLJVJTKbJXKnKmKpKoKwKqKqEHEHFeEHEHEHEHEHEHEHEHFSGdGdGdGdGdFSFSFSGdGdGdGdGjFSEHEHEHEHEHEHEHFeEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMlyBTBTLalyLbmbLclyCsCsLdlyaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIZJlKCKqKqKqKqKGKqKqKqKqKqKqKqKqKqKqKqKqKGKqKqKqKqKqKqEHFoFeEHEHGmGmGmGmGmEHGnGnGnGnGnGnGnGnGnGnGnGnGnGoGnEHGpGpGpGpGpEHFeFeFtEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMlylyLeBTlyLfmbLglyLoLhlylyaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMIZKHKqIZIZIZIZIZIZIZIZIZIZKIIZIZIZIZIZIZIZIZIZIZIZKqKVEHFoEHEHEHGqGqGqGqGqEHGtGsGsGsGsGsGsGsGsGsGsGsGsGuGtEHGqGqGqGqGqEHEHEHFtEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM From b08533b5000a062ba32de62763d4cbaf849a04c9 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Mon, 4 Jan 2016 09:38:31 +0100 Subject: [PATCH 24/55] Species economy modifier now defaults to human if missing. Fixes #11891. --- code/game/jobs/job/job.dm | 6 +++++- code/modules/economy/economy_misc.dm | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 2f6ab796446..67873874a27 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -53,7 +53,11 @@ if(COMPANY_OPPOSED) loyalty = 0.70 //give them an account in the station database - var/money_amount = (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * (H.species ? economic_species_modifier[H.species.type] : 2) + var/species_modifier = (H.species ? economic_species_modifier[H.species.type] : 2) + if(species_modifier == 0) + species_modifier = economic_species_modifier[/datum/species/human] + + var/money_amount = (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * species_modifier var/datum/money_account/M = create_account(H.real_name, money_amount, null) if(H.mind) var/remembered_info = "" diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm index fbb2e043fd6..094800c9ccb 100644 --- a/code/modules/economy/economy_misc.dm +++ b/code/modules/economy/economy_misc.dm @@ -52,6 +52,7 @@ /datum/species/skrell = 12, /datum/species/tajaran = 7, /datum/species/unathi = 7, + /datum/species/diona = 5, /datum/species/vox = 1 ) From a04c0019ef20e8482ebc58985b907f19f450c107 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 5 Jan 2016 12:19:26 +0100 Subject: [PATCH 25/55] Space helmets now block hair. Fixes #11895. --- code/modules/clothing/spacesuits/spacesuits.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 6039ff4dae3..9d942d05b22 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -14,7 +14,7 @@ ) permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50) - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR body_parts_covered = HEAD|FACE|EYES cold_protection = HEAD min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE From a8cea3862ddcf6affbfd18663818b4a0b9ed6b02 Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Tue, 5 Jan 2016 22:04:33 +0800 Subject: [PATCH 26/55] Backpack and box storage capacity set to 16 and 8 respectively. Maximum w-class set to 4 and 3 respectively. Storage box sprite made lighter to improve visibility against dark backgrounds. --- baystation12.int | 7 +------ .../objects/items/weapons/storage/backpack.dm | 4 ++-- .../objects/items/weapons/storage/storage.dm | 14 +++++++------- icons/mob/screen1.dmi | Bin 169008 -> 169010 bytes 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/baystation12.int b/baystation12.int index d1078d03e5e..b82874fded5 100644 --- a/baystation12.int +++ b/baystation12.int @@ -1,11 +1,6 @@ // BEGIN_INTERNALS /* -LAST_COMPILE_TIME: 1447913478 -DIR: code code\game code\game\objects code\game\objects\items code\game\objects\items\weapons code\game\objects\items\weapons\storage code\modules code\modules\mob -AUTO_FILE_DIR: OFF MAP_ICON_TYPE: 0 -LAST_COMPILE_VERSION: 507.1286 -WINDOW: code\game\objects\items\weapons\storage\storage.dm;code\game\objects\items\weapons\tape.dm;code\modules\mob\inventory.dm -FILE: code\game\objects\items\weapons\storage\storage.dm +AUTO_FILE_DIR: OFF */ // END_INTERNALS diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 5aeec96eb8a..29a62117f35 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -22,8 +22,8 @@ ) w_class = 4 slot_flags = SLOT_BACK - max_w_class = 3 - max_storage_space = 28 + max_w_class = 4 + max_storage_space = 16 /obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob) if (src.use_sound) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 6290f698844..c6ee578dcee 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -12,8 +12,8 @@ var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else) var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set) var/list/is_seeing = new/list() //List of mobs which are currently seeing the contents of this item's storage - var/max_w_class = null //Max size of objects that this object can store (in effect only if can_hold isn't set) - var/max_storage_space = 14 //The sum of the storage costs of all the items in this storage item. + var/max_w_class = 3 //Max size of objects that this object can store (in effect only if can_hold isn't set) + var/max_storage_space = 8 //The sum of the storage costs of all the items in this storage item. var/storage_slots = null //The number of storage slots in this container. var/obj/screen/storage/boxes = null var/obj/screen/storage/storage_start = null //storage UI @@ -206,10 +206,10 @@ /obj/item/weapon/storage/proc/space_orient_objs(var/list/obj/item/display_contents) - var/baseline_max_storage_space = 28 //should be equal to backpack capacity - var/storage_cap_width = 2 //length of sprite for storage box start and end - var/stored_cap_width = 4 - var/storage_width = min( round( 224 * max_storage_space/baseline_max_storage_space ,1) ,284) + var/baseline_max_storage_space = 16 //should be equal to default backpack capacity + var/storage_cap_width = 2 //length of sprite for start and end of the box representing total storage space + var/stored_cap_width = 4 //length of sprite for start and end of the box representing the stored item + var/storage_width = min( round( 224 * max_storage_space/baseline_max_storage_space ,1) ,284) //length of sprite for the box representing total storage space storage_start.overlays.Cut() @@ -295,7 +295,7 @@ /obj/item/weapon/storage/proc/can_be_inserted(obj/item/W as obj, stop_messages = 0) if(!istype(W)) return //Not an item - if(usr.isEquipped(W) && !usr.canUnEquip(W)) + if(usr && usr.isEquipped(W) && !usr.canUnEquip(W)) return 0 if(src.loc == W) diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi index 960bcfc32b2ecca9d5c5850d189136a6a6040a21..d2220fffd14a651ed175b7b78f80948138bec6c3 100644 GIT binary patch delta 8771 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 delta 8769 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 From 111fe2e54b3cfe4f962a2adacc270c34c8649709 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Tue, 5 Jan 2016 17:30:29 +0100 Subject: [PATCH 27/55] Ghosts may now interact with modular computers - Ghosts can interact with modular computers by clicking them now. This carries normal restrictions as other NanoUIs operated by ghosts - they may not click any buttons, etc. - Admin-ghosts can now fully use modular computers when ghosted. When the computer is turned off, they get a prompt on click whether they want to admin-enable it or not. - Fixes #11874 --- .../computers/item/modular_computer.dm | 25 ++++++++++++++++--- .../computers/machinery/modular_computer.dm | 4 +++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/code/modules/modular_computers/computers/item/modular_computer.dm b/code/modules/modular_computers/computers/item/modular_computer.dm index 0b64dbb5f42..dd53adcdc80 100644 --- a/code/modules/modular_computers/computers/item/modular_computer.dm +++ b/code/modules/modular_computers/computers/item/modular_computer.dm @@ -69,6 +69,14 @@ card_slot.stored_card = null user << "You remove the card from \the [src]" +/obj/item/modular_computer/attack_ghost(var/mob/dead/observer/user) + if(enabled) + ui_interact(user) + else if(check_rights(R_ADMIN, 0, user)) + var/response = alert(user, "This computer is turned off. Would you like to turn it on?", "Admin Override", "Yes", "No") + if(response == "Yes") + turn_on(user) + /obj/item/modular_computer/emag_act(var/remaining_charges, var/mob/user) if(computer_emagged) user << "\The [src] was already emagged." @@ -151,13 +159,24 @@ /obj/item/modular_computer/attack_self(mob/user) if(enabled) ui_interact(user) - else if((battery_module && battery_module.battery.charge) || check_power_override()) // Battery-run and charged or non-battery but powered by APC. - user << "You press the power button and start up \the [src]" + else + turn_on(user) + +/obj/item/modular_computer/proc/turn_on(var/mob/user) + var/issynth = issilicon(user) // Robots and AIs get different activation messages. + if((battery_module && battery_module.battery.charge) || check_power_override()) // Battery-run and charged or non-battery but powered by APC. + if(issynth) + user << "You send an activation signal to \the [src], turning it on" + else + user << "You press the power button and start up \the [src]" enabled = 1 update_icon() ui_interact(user) else // Unpowered - user << "You press the power button but \the [src] does not respond." + if(issynth) + user << "You send an activation signal to \the [src] but it does not respond" + else + user << "You press the power button but \the [src] does not respond" // Process currently calls handle_power(), may be expanded in future if more things are added. /obj/item/modular_computer/process() diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index f51b8fe91ef..a4f2cdfa6f5 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -27,6 +27,10 @@ var/obj/item/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things. +/obj/machinery/modular_computer/attack_ghost(var/mob/dead/observer/user) + if(cpu) + cpu.attack_ghost(user) + /obj/machinery/modular_computer/emag_act(var/remaining_charges, var/mob/user) return cpu ? cpu.emag_act(remaining_charges, user) : NO_EMAG_ACT From e1f58161ac3e69a9c2157560380b64a005cf0dcd Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Thu, 10 Dec 2015 20:46:22 +0100 Subject: [PATCH 28/55] Diverse Police Tape fixes/tweaks --- code/game/objects/items/weapons/policetape.dm | 38 +++++++++++++----- icons/policetape.dmi | Bin 2914 -> 1845 bytes 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index f204a971feb..98e5c172c33 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -22,6 +22,19 @@ var/list/tape_roll_applications = list() var/tape_dir = 0 var/icon_base = "tape" +/obj/item/tape/update_icon() + //Possible directional bitflags: 0 (AIRLOCK), 1 (NORTH), 2 (SOUTH), 4 (EAST), 8 (WEST), 3 (VERTICAL), 12 (HORIZONTAL) + switch (tape_dir) + if(0) // AIRLOCK + icon_state = "[icon_base]_door_[crumpled]" + if(3) // VERTICAL + icon_state = "[icon_base]_v_[crumpled]" + if(12) // HORIZONTAL + icon_state = "[icon_base]_h_[crumpled]" + else // END POINT (1|2|4|8) + icon_state = "[icon_base]_dir_[crumpled]" + dir = tape_dir + /obj/item/tape/New() ..() if(!hazard_overlays) @@ -93,19 +106,26 @@ var/list/tape_roll_applications = list() /obj/item/taperoll/update_icon() overlays.Cut() + var/image/overlay = image(icon = src.icon) + overlay.appearance_flags = RESET_COLOR if(ismob(loc)) if(!start) - overlays += "start" + overlay.icon_state = "start" else - overlays += "stop" + overlay.icon_state = "stop" + overlays += overlay /obj/item/taperoll/dropped(mob/user) - ..() update_icon() + return ..() /obj/item/taperoll/pickup(mob/user) - ..() update_icon() + return ..() + +/obj/item/taperoll/attack_hand() + update_icon() + return ..() /obj/item/taperoll/attack_self(mob/user as mob) if(!start) @@ -142,13 +162,13 @@ var/list/tape_roll_applications = list() for(var/dir in list(NORTH, SOUTH)) if (possible_dirs & dir) TP.tape_dir += dir - TP.icon_state = "[TP.icon_base]_[TP.tape_dir]" + TP.update_icon() if(possible_dirs & (EAST|WEST)) var/obj/item/tape/TP = new tape_type(start) for(var/dir in list(EAST, WEST)) if (possible_dirs & dir) TP.tape_dir += dir - TP.icon_state = "[TP.icon_base]_[TP.tape_dir]" + TP.update_icon() start = null update_icon() usr << "You finish placing \the [src]." @@ -207,8 +227,8 @@ var/list/tape_roll_applications = list() break if(!tapetest) var/obj/item/tape/T = new tape_type(cur) - T.icon_state = "[T.icon_base]_[tape_dir]" T.tape_dir = tape_dir + T.update_icon() if(tape_dir & SOUTH) T.layer += 0.1 // Must always show above other tapes if(cur == end) @@ -227,7 +247,7 @@ var/list/tape_roll_applications = list() var/turf/T = get_turf(A) var/obj/item/tape/P = new tape_type(T.x,T.y,T.z) P.loc = locate(T.x,T.y,T.z) - P.icon_state = "[src.icon_base]_door" + P.update_icon() P.layer = 3.2 user << "You finish placing \the [src]." @@ -251,7 +271,7 @@ var/list/tape_roll_applications = list() /obj/item/tape/proc/crumple() if(!crumpled) crumpled = 1 - icon_state = "[icon_state]_c" + update_icon() name = "crumpled [name]" /obj/item/tape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) diff --git a/icons/policetape.dmi b/icons/policetape.dmi index 0422ecb22f332da05650afeed6e940b12ffa7b1b..42095beef70ce74625454eb3791be58b3e764e76 100644 GIT binary patch delta 1844 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 Date: Wed, 6 Jan 2016 05:30:41 +0100 Subject: [PATCH 29/55] Cleanbot cleans closest dirt first --- code/modules/mob/living/bot/cleanbot.dm | 134 ++++++++++++++---------- 1 file changed, 78 insertions(+), 56 deletions(-) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index 73310108523..57f907ec25d 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -26,6 +26,8 @@ var/blood = 1 var/list/target_types = list() + var/maximum_search_range = 7 + /mob/living/bot/cleanbot/New() ..() get_targets() @@ -36,6 +38,25 @@ if(radio_controller) radio_controller.add_object(listener, beacon_freq, filter = RADIO_NAVBEACONS) +/mob/living/bot/cleanbot/proc/handle_target() + if(loc == target.loc) + if(!cleaning) + UnarmedAttack(target) + return 1 + if(!path.len) +// spawn(0) + path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) + if(!path) + custom_emote(2, "[src] can't reach the target and is giving up.") + target = null + path = list() + return + if(path.len) + step_to(src, path[1]) + path -= path[1] + return 1 + return + /mob/living/bot/cleanbot/Life() ..() @@ -46,7 +67,7 @@ return if(cleaning) return - + if(!screwloose && !oddbutton && prob(5)) custom_emote(2, "makes an excited beeping booping sound!") @@ -74,65 +95,64 @@ spawn(600) ignorelist -= gib - if(!target) // Find a target - for(var/obj/effect/decal/cleanable/D in view(7, src)) - if(D in ignorelist) - continue - for(var/T in target_types) - if(istype(D, T)) - target = D - patrol_path = list() + // Find a target + + if(pulledby) // Don't wiggle if someone pulls you + patrol_path = list() + return - if(!target) // No targets in range - if(!should_patrol) - return + var/found_spot + search_loop: + for(var/i=0, i <= maximum_search_range, i++) + for(var/obj/effect/decal/cleanable/D in view(i, src)) + if(D in ignorelist) + continue + for(var/T in target_types) + if(istype(D, T)) + patrol_path = list() + target = D + found_spot = handle_target() + if (found_spot) + break search_loop + else + target = null + continue // no need to check the other types - if(!patrol_path || !patrol_path.len) - if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet - var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq) - if(!frequency) - return - closest_dist = 9999 - next_dest = null - next_dest_loc = null - - var/datum/signal/signal = new() - signal.source = src - signal.transmission_method = 1 - signal.data = list("findbeakon" = "patrol") - frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) - signal_sent = world.time - else - if(next_dest) - next_dest_loc = listener.memorized[next_dest] - if(next_dest_loc) - patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null) - signal_sent = 0 - else - if(pulledby) // Don't wiggle if someone pulls you - patrol_path = list() + if(!found_spot && !target) // No targets in range + if(!patrol_path || !patrol_path.len) + if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet + var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq) + if(!frequency) return - if(patrol_path[1] == loc) - patrol_path -= patrol_path[1] - var/moved = step_towards(src, patrol_path[1]) - if(moved) - patrol_path -= patrol_path[1] - if(target) - if(loc == target.loc) - if(!cleaning) - UnarmedAttack(target) + + closest_dist = 9999 + next_dest = null + next_dest_loc = null + + var/datum/signal/signal = new() + signal.source = src + signal.transmission_method = 1 + signal.data = list("findbeakon" = "patrol") + frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) + signal_sent = world.time + else + if(next_dest) + next_dest_loc = listener.memorized[next_dest] + if(next_dest_loc) + patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null) + signal_sent = 0 + else + if(pulledby) // Don't wiggle if someone pulls you + patrol_path = list() return - if(!path.len) - spawn(0) - path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) - if(!path) - path = list() - return - if(path.len) - step_to(src, path[1]) - path -= path[1] - return + if(patrol_path[1] == loc) + patrol_path -= patrol_path[1] + var/moved = step_towards(src, patrol_path[1]) + if(moved) + patrol_path -= patrol_path[1] + + /mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity) if(!..()) @@ -145,7 +165,7 @@ return cleaning = 1 - custom_emote(2, "begins to clean up the [D]") + custom_emote(2, "begins to clean up \the [D]") update_icons() var/cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50 if(do_after(src, cleantime)) @@ -155,6 +175,8 @@ if(!D) return qdel(D) + if(D == target) + target = null cleaning = 0 update_icons() From 6f68a26f79413241c492590d51bba1634eb16695 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 6 Jan 2016 17:37:01 +0100 Subject: [PATCH 30/55] Changes the version BYOND use. Do not merge until server is confirmed updated. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 405ccc07db6..09eac5ef527 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,8 @@ language: c sudo: false env: - BYOND_MAJOR="508" - BYOND_MINOR="1293" + BYOND_MAJOR="509" + BYOND_MINOR="1318" cache: directories: From 39bbca416ab7c0523cf260405982cbd86360e369 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 6 Jan 2016 17:42:56 +0100 Subject: [PATCH 31/55] Adds missing istype() check before the secure brief case emag check. Fixes #11900. --- code/game/objects/items/weapons/storage/secure.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 8b11055d40f..51c53bc64c6 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -33,7 +33,7 @@ attackby(obj/item/weapon/W as obj, mob/user as mob) if(locked) - if (emag_act(INFINITY, user, "You slice through the lock of \the [src]")) + if (istype(W, /obj/item/weapon/melee/energy/blade) && emag_act(INFINITY, user, "You slice through the lock of \the [src]")) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() From d5d4a4d4c79049969cf818caa4ad1980942d4cbe Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 6 Jan 2016 18:45:10 +0100 Subject: [PATCH 32/55] Updates Travis' macro count. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ba0d3af7f71..ddaba510a0e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ sudo: false env: BYOND_MAJOR="509" BYOND_MINOR="1318" - MACRO_COUNT=1050 + MACRO_COUNT=1048 cache: directories: From 4f2a984b092f6b1501b7f9a96b0772eed917f392 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 6 Jan 2016 22:00:14 +0100 Subject: [PATCH 33/55] DME fixes. DreamMaker automatically cleaned up the dme. Made it possible to compile on Windows again. --- .travis.yml | 2 +- baystation12.dme | 6 +++--- code/_unit_testing.dm | 10 ++++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 code/_unit_testing.dm diff --git a/.travis.yml b/.travis.yml index ddaba510a0e..81cc561e4f3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ script: - python tools/TagMatcher/tag-matcher.py ../.. - python tools/GenerateChangelog/ss13_genchangelog.py html/changelog.html html/changelogs - source $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin/byondsetup - - echo "#define UNIT_TEST 1" > code/__defines/unit_testing.dm + - echo "#define UNIT_TEST 1" > code/_unit_testing.dm - cp config/example/* config/ - DreamMaker baystation12.dme - DreamDaemon baystation12.dmb -invisible -trusted -core 2>&1 | tee log.txt diff --git a/baystation12.dme b/baystation12.dme index 975ed2abc15..4e7954e59e3 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -10,8 +10,8 @@ #define DEBUG // END_PREFERENCES // BEGIN_INCLUDE -#include "code\__defines\unit_testing.dm" #include "code\_macros.dm" +#include "code\_unit_testing.dm" #include "code\global.dm" #include "code\hub.dm" #include "code\names.dm" @@ -1867,9 +1867,9 @@ #include "code\modules\wireless\interfaces.dm" #include "code\modules\xgm\xgm_gas_data.dm" #include "code\modules\xgm\xgm_gas_mixture.dm" -#include "code\unit_tests\unit_test.dm" #include "code\unit_tests\mob_tests.dm" -#include "code/unit_tests\zas_tests.dm" +#include "code\unit_tests\unit_test.dm" +#include "code\unit_tests\zas_tests.dm" #include "code\ZAS\_docs.dm" #include "code\ZAS\Airflow.dm" #include "code\ZAS\Atom.dm" diff --git a/code/_unit_testing.dm b/code/_unit_testing.dm new file mode 100644 index 00000000000..c75ffa6651a --- /dev/null +++ b/code/_unit_testing.dm @@ -0,0 +1,10 @@ +/* + * + * This file is used by Travis to indicate that Unit Tests are to be ran. + * Do not add anything but the UNIT_TEST definition here as it will be overwritten by Travis when running tests. + * + * + * Should you wish to edit set UNIT_TEST to 1 like so: + * #define UNIT_TEST 1 + */ +#define UNIT_TEST 0 From 9134827dd6eb4552e4ecc570de6b572d7c2deb10 Mon Sep 17 00:00:00 2001 From: Kearel Date: Wed, 6 Jan 2016 15:04:04 -0600 Subject: [PATCH 34/55] Can now set things directly onto the board There are now checks in place for adjacency and consciousness so unconscious/dead people can't play checkers. --- code/modules/games/boardgame.dm | 116 +++++++++++++++++++++----------- 1 file changed, 78 insertions(+), 38 deletions(-) diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index 56f8c968a53..62abc1daa49 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -30,28 +30,49 @@ src.examine(M) obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob) + if(!addPiece(I,user)) + ..() + +/obj/item/weapon/board/proc/addPiece(obj/item/I as obj, mob/user as mob, var/tile = 0) if(I.w_class != 1) //only small stuff user.show_message("\The [I] is too big to be used as a board piece.") - return + return 0 if(num == 64) user.show_message("\The [src] is already full!") - return + return 0 + if(tile > 0 && board["[tile]"]) + user.show_message("That space is already filled!") + return 0 + if(!user.Adjacent(src)) + return 0 + user.drop_from_inventory(I) I.forceMove(src) num++ + if(!board_icons["[I.icon] [I.icon_state]"]) board_icons["[I.icon] [I.icon_state]"] = new /icon(I.icon,I.icon_state) - var i; - for(i=0;i<64;i++) - if(!board["[i]"]) - board["[i]"] = I - break + if(tile == 0) + var i; + for(i=0;i<64;i++) + if(!board["[i]"]) + board["[i]"] = I + break + else + board["[tile]"] = I src.updateDialog() + return 1 + + /obj/item/weapon/board/interact(mob/user as mob) + if(user.incapacitated(INCAPACITATION_DISABLED) || (!isAI(user) && !user.Adjacent(src))) //can't see if you arent conscious. If you are not an AI you can't see it unless you are next to it, either. + user << browse(null, "window=boardgame") + user.unset_machine() + return var/dat = "" dat += "" @@ -68,7 +89,7 @@ obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob) dat += "'#66CCFF'>" else dat += "'#252536'>" - dat += "= 0) - if(I) //cant put items on other items. - return + if(!usr.Adjacent(src)) + usr.unset_machine() + usr << browse(null, "window=boardgame") + return + + if(!usr.incapacitated()) //you can't move pieces if you can't move + if(href_list["select"]) + var/s = href_list["select"] + var/obj/item/I = board["[s]"] + if(selected >= 0) + //check to see if clicked on tile is currently selected one + if(text2num(s) == selected) + selected = 0 //deselect it + return + + if(I) //cant put items on other items. + return //put item in new spot. - I = board["[selected]"] + I = board["[selected]"] + board["[selected]"] = null + board -= "[selected]" + board -= null + board["[s]"] = I + selected = -1 + else + if(I) + selected = text2num(s) + else + var/mob/living/carbon/human/H = locate(href_list["person"]) + if(!istype(H)) + return + var/obj/item/O = H.get_active_hand() + if(!O) + return + addPiece(O,H,text2num(s)) + if(href_list["remove"]) + var/obj/item/I = board["[selected]"] board["[selected]"] = null board -= "[selected]" board -= null - board["[s]"] = I + I.forceMove(src.loc) + num-- selected = -1 - else - if(I) - selected = text2num(s) - if(href_list["remove"]) - var/obj/item/I = board["[selected]"] - board["[selected]"] = null - board -= "[selected]" - board -= null - I.forceMove(src.loc) - num-- - selected = -1 - var j - for(j=0;j<64;j++) - if(board["[j]"]) - var/obj/item/K = board["[j]"] - if(K.icon == I.icon && cmptext(K.icon_state,I.icon_state)) - src.updateDialog() - return - //Didn't find it in use, remove it and allow GC to delete it. - board_icons["[I.icon] [I.icon_state]"] = null - board_icons -= "[I.icon] [I.icon_state]" - board_icons -= null + var j + for(j=0;j<64;j++) + if(board["[j]"]) + var/obj/item/K = board["[j]"] + if(K.icon == I.icon && cmptext(K.icon_state,I.icon_state)) + src.updateDialog() + return + //Didn't find it in use, remove it and allow GC to delete it. + board_icons["[I.icon] [I.icon_state]"] = null + board_icons -= "[I.icon] [I.icon_state]" + board_icons -= null src.updateDialog() /obj/item/weapon/checker/ From a4d9220bfa1db090b4d03f500d1ca5060d564e6b Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 6 Jan 2016 22:07:09 +0100 Subject: [PATCH 35/55] Converts unit testing checks into #ifdef and #ifndef. As per Mloc's comment in #11917. --- baystation12.dme | 1 - code/_unit_testing.dm | 10 ---------- code/world.dm | 10 +++++----- 3 files changed, 5 insertions(+), 16 deletions(-) delete mode 100644 code/_unit_testing.dm diff --git a/baystation12.dme b/baystation12.dme index 4e7954e59e3..8afada0ac4c 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -11,7 +11,6 @@ // END_PREFERENCES // BEGIN_INCLUDE #include "code\_macros.dm" -#include "code\_unit_testing.dm" #include "code\global.dm" #include "code\hub.dm" #include "code\names.dm" diff --git a/code/_unit_testing.dm b/code/_unit_testing.dm deleted file mode 100644 index c75ffa6651a..00000000000 --- a/code/_unit_testing.dm +++ /dev/null @@ -1,10 +0,0 @@ -/* - * - * This file is used by Travis to indicate that Unit Tests are to be ran. - * Do not add anything but the UNIT_TEST definition here as it will be overwritten by Travis when running tests. - * - * - * Should you wish to edit set UNIT_TEST to 1 like so: - * #define UNIT_TEST 1 - */ -#define UNIT_TEST 0 diff --git a/code/world.dm b/code/world.dm index f9601f78971..0f4ac11f631 100644 --- a/code/world.dm +++ b/code/world.dm @@ -39,7 +39,7 @@ var/global/datum/global_init/init = new () -#define RECOMMENDED_VERSION 508 +#define RECOMMENDED_VERSION 509 /world/New() //logs var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day") @@ -69,11 +69,11 @@ var/global/datum/global_init/init = new () . = ..() -#if !UNIT_TEST +#ifndef UNIT_TEST sleep_offline = 1 -#elseif +#else log_unit_test("Unit Tests Enabled. This will destroy the world when testing is complete.") log_unit_test("If you did not intend to enable this please check code/__defines/unit_testing.dm") @@ -115,10 +115,10 @@ var/global/datum/global_init/init = new () processScheduler.deferSetupFor(/datum/controller/process/ticker) processScheduler.setup() master_controller.setup() -#if UNIT_TEST +#ifdef UNIT_TEST initialize_unit_tests() #endif - + spawn(3000) //so we aren't adding to the round-start lag From 6ec929c14dbdc33cc6ef4366f1141091e745ff1e Mon Sep 17 00:00:00 2001 From: Kearel Date: Wed, 6 Jan 2016 15:12:05 -0600 Subject: [PATCH 36/55] should realistically fix merge conflicts I don't know actually if it will. --- code/modules/games/boardgame.dm | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index 62abc1daa49..54a9866ea4d 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -89,19 +89,22 @@ obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob) dat += "'#66CCFF'>" else dat += "'#252536'>" - dat += "= 0) + if(selected >= 0 && !isobserver(user)) dat += "
Remove Selected Piece" user << browse(dat,"window=boardgame;size=500x500") onclose(usr, "boardgame") From a8b2edc0a40477306d0ac39df2cb69122acfbebb Mon Sep 17 00:00:00 2001 From: Mloc Date: Wed, 6 Jan 2016 21:37:53 +0000 Subject: [PATCH 37/55] add dm.sh, a simple wrapper around DreamMaker Signed-off-by: Mloc --- scripts/dm.sh | 55 +++++++++++++++++++++++++++++++++++++++++++++ scripts/sourcedm.sh | 35 +++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100755 scripts/dm.sh create mode 100755 scripts/sourcedm.sh diff --git a/scripts/dm.sh b/scripts/dm.sh new file mode 100755 index 00000000000..e8985cdfc8c --- /dev/null +++ b/scripts/dm.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +dmepath="" +retval=1 + +for var; do + if [[ $var != -* && $var == *.dme ]]; then + dmepath=$(echo $var | sed -r 's/.{4}$//') + break + fi +done + +if [[ $dmepath == "" ]]; then + echo "No .dme file specified, aborting." + exit 1 +fi + +if [[ -a $dmepath.mdme ]]; then + rm $dmepath.mdme +fi + +cp $dmepath.dme $dmepath.mdme +if [[ $? != 0 ]]; then + echo "Failed to make modified dme, aborting." + exit 2 +fi + +for var; do + arg=$(echo $var | sed -r 's/^.{2}//') + if [[ $var == -D* ]]; then + sed -i '1s!^!#define '$arg'\n!' $dmepath.mdme + elif [[ $var == -I* ]]; then + sed -i 's!// BEGIN_INCLUDE!// BEGIN_INCLUDE\n#include "'$arg'"!' $dmepath.mdme + elif [[ $var == -M* ]]; then + sed -i '1s/^/#define MAP_OVERRIDE\n/' $dmepath.mdme + sed -i 's!// BEGIN_INCLUDE!// BEGIN_INCLUDE\n#include "_maps\\'$arg'.dm"!' $dmepath.mdme + fi +done + +source "$( dirname "${BASH_SOURCE[0]}" )/sourcedm.sh" + +if [[ $DM == "" ]]; then + echo "Couldn't find the DreamMaker executable, aborting." + exit 3 +fi + +"$DM" $dmepath.mdme +retval=$? + +mv $dmepath.mdme.dmb $dmepath.dmb +mv $dmepath.mdme.rsc $dmepath.rsc + +rm $dmepath.mdme + +exit $retval diff --git a/scripts/sourcedm.sh b/scripts/sourcedm.sh new file mode 100755 index 00000000000..5737d4e6b4a --- /dev/null +++ b/scripts/sourcedm.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +if [[ $(uname) == MINGW* ]] +then + if hash dm.exe 2>/dev/null + then + export DM='dm.exe' + return 0 + elif [[ -a '/c/Program Files (x86)/BYOND/bin/dm.exe' ]] + then + export DM='/c/Program Files (x86)/BYOND/bin/dm.exe' + return 0 + elif [[ -a '/c/Program Files/BYOND/bin/dm.exe' ]] + then + export DM='/c/Program Files/BYOND/bin/dm.exe' + return 0 + fi +else + if hash DreamMaker 2>/dev/null + then + export DM='DreamMaker' + return 0 + elif [[ -a '/usr/bin/DreamMaker' ]] + then + export DM='/usr/bin/DreamMaker' + return 0 + elif [[ -a '/usr/share/byond/bin/DreamMaker' ]] + then + export DM='/usr/share/byond/bin/DreamMaker' + return 0 + fi +fi + +export DM='' +return 1 From ddc6af694e030a6e19802323dda344e861a90247 Mon Sep 17 00:00:00 2001 From: Mloc Date: Wed, 6 Jan 2016 21:38:10 +0000 Subject: [PATCH 38/55] make travis use dm.sh for UNIT_TEST Signed-off-by: Mloc --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 81cc561e4f3..19ce554f136 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,8 +40,7 @@ script: - python tools/TagMatcher/tag-matcher.py ../.. - python tools/GenerateChangelog/ss13_genchangelog.py html/changelog.html html/changelogs - source $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin/byondsetup - - echo "#define UNIT_TEST 1" > code/_unit_testing.dm - cp config/example/* config/ - - DreamMaker baystation12.dme + - scripts/dm.sh -DUNIT_TEST baystation12.dme - DreamDaemon baystation12.dmb -invisible -trusted -core 2>&1 | tee log.txt - grep "All Unit Tests Passed" log.txt From 6a33d4ae4a53350d588b53e3ea445926fee813e6 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 6 Jan 2016 23:55:05 +0100 Subject: [PATCH 39/55] Builds with startup runtimes now fail. Prevents annoyances. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 19ce554f136..8bd7d2795ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,3 +44,4 @@ script: - scripts/dm.sh -DUNIT_TEST baystation12.dme - DreamDaemon baystation12.dmb -invisible -trusted -core 2>&1 | tee log.txt - grep "All Unit Tests Passed" log.txt + - (! grep "runtime error:" log.txt) From 7af61b9a6bde6d82b7f61926b2bb8cc5f7a8c278 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 05:43:40 +0300 Subject: [PATCH 40/55] Fixes #11924 --- code/modules/surgery/other.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index ba9334d933a..7006d4ce069 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -88,7 +88,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("\blue [user] has cut away necrotic tissue in [target]'s [affected.name] with \the [tool].", \ "\blue You have cut away necrotic tissue in [target]'s [affected.name] with \the [tool].") - affected.open = 3 + affected.status &= ~ORGAN_DEAD fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) From e9991c99aefa372b50903b9a8f97d72dd5419f30 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 05:45:23 +0300 Subject: [PATCH 41/55] Fixes #11916 --- code/modules/surgery/limb_reattach.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index aee13ede832..ed4c7f3b061 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -28,7 +28,7 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/E = tool - user.visible_message("[user] has attached [target]'s [E.name] to the [E.amputation_point].>", \ + user.visible_message("[user] has attached [target]'s [E.name] to the [E.amputation_point].", \ "You have attached [target]'s [E.name] to the [E.amputation_point].") user.drop_from_inventory(E) E.replaced(target) From bc390c560314316f6f56db12c95ef5326a557667 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 05:49:16 +0300 Subject: [PATCH 42/55] Fixes #11914 --- code/game/objects/items/devices/flashlight.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index a2707fd01f0..019bc2dece1 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -64,7 +64,7 @@ return if(XRAY in M.mutations) user << "\The [M] pupils give an eerie glow!" - if(vision.is_bruised()) + if(vision.damage) user << "There's visible damage to [M]'s [vision.name]!" else if(M.eye_blurry) user << "\The [M]'s pupils react slower than normally." @@ -79,7 +79,7 @@ user << "\The [M]'s pupils narrow slightly, but are still very dilated." else user << "\The [M]'s pupils narrow." - + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //can be used offensively flick("flash", M.flash) else From f0678854ecbb49c8437ae7695624ff2a0f47e1a4 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 07:06:20 +0300 Subject: [PATCH 43/55] Fixed monkey scooping. Again. --- code/modules/mob/living/carbon/human/species/station/monkey.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm index d9d8347550c..c4ccc620649 100644 --- a/code/modules/mob/living/carbon/human/species/station/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm @@ -39,7 +39,7 @@ push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN pass_flags = PASSTABLE - + holder_type = /obj/item/weapon/holder /datum/species/monkey/handle_npc(var/mob/living/carbon/human/H) if(H.stat != CONSCIOUS) return From 0d7c52b869016e7f96f17f7460b66d6aea482f0f Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 07:07:45 +0300 Subject: [PATCH 44/55] Fixes #11884 --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9e929fb88ff..ea64a798aa7 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1385,7 +1385,7 @@ /mob/living/carbon/human/MouseDrop(var/atom/over_object) var/mob/living/carbon/human/H = over_object - if(holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H)) + if(H.a_intent == "help" && holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H)) get_scooped(H, (usr == src)) return return ..() From 33f3056f1b2dfa13140a08498d3c2c8a7f8b1196 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 07:13:40 +0300 Subject: [PATCH 45/55] Changelog --- html/changelogs/chinsky - stuff.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/chinsky - stuff.yml diff --git a/html/changelogs/chinsky - stuff.yml b/html/changelogs/chinsky - stuff.yml new file mode 100644 index 00000000000..c9fa37ab16f --- /dev/null +++ b/html/changelogs/chinsky - stuff.yml @@ -0,0 +1,5 @@ +author: Chinsky + +delete-after: True +changes: + - bugfix: "Can pick up monkeys / undress resomi now properly. HELP intent for scooping, NON-HELP for undressing." From 1b564bb179b2ea20aa1eeb66be41068aad4fb0e7 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 7 Jan 2016 11:28:17 +0100 Subject: [PATCH 46/55] Map and icon tweaks. Re-adds medical examination wall and chapel mass driver button. Ensures that the chapel crematorium button does not lose its default icon on icon update. Fixes #11915. Fixes #11894. --- code/game/objects/structures/morgue.dm | 3 +++ maps/exodus-1.dmm | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 8a9e29a0da2..58f89dc3fff 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -413,6 +413,9 @@ req_access = list(access_crematorium) id = 1 +/obj/machinery/button/crematorium/update_icon() + return + /obj/machinery/button/crematorium/attack_hand(mob/user as mob) if(..()) return diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 94b3eee8057..a63e8658a69 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -1743,7 +1743,7 @@ "aHA" = (/turf/simulated/floor/tiled/dark,/area/chapel/main) "aHB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/hatch{name = "Command Substation"; req_one_access = list(11,24)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/substation/command) "aHC" = (/obj/structure/closet/coffin,/obj/machinery/door/window/eastleft{name = "Coffin Storage"; req_access = list(22)},/turf/simulated/floor/tiled/dark,/area/chapel/main) -"aHD" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main) +"aHD" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/button/remote/driver{id = "chapelgun"; pixel_x = 24; pixel_y = -24},/turf/simulated/floor/tiled/dark,/area/chapel/main) "aHE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled/dark,/area/chapel/main) "aHF" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/chapel/main) "aHG" = (/obj/machinery/door/window{dir = 8; name = "Mass Driver"; req_access = list(22)},/obj/machinery/mass_driver{dir = 4; id = "chapelgun"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/airlock_sensor{pixel_y = 25},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/chapel/main) @@ -7434,7 +7434,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaT aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaaaboJbnubntbnvbgrbnxboWbpmbnTaWMaVrbjpbpsblabnYbnZbmWbbZbbZbbZbbZbbZbbZboabobbocaXebdObdPbdPbdPbdPbdPbdPbdPbnybdPbdPbdPbogbdPbfmbnzblCbgabgabgabnAblpbkEaRYbnBbmGbombnCbncbnDbvGbotbnEbotaafbebbylbtAbowboxboybzibFKbebaafbedbkLboCbFMbpGbiCbiGboFaJibnHbnGaLYbXHbnLbnKbnObnNbnQaYebnSbnRbnUbnUbnWbnVbnXbnXbojbofboXbokbonbolboobnnboqbopbosbmPbnabovbmPbnabYfaVJbpjbozboGboBbplboEbppboHboKboIboMboLboOboNblOaZzboPbpxblOboQboSboRboUboTboVbnIbqUbpLbpJbnMaaaaaaaaaaacaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaabgnbgobgpbgqbdWbpObpObpObrsbpObrCboZboYbpabgrbpbbjpbauaYPbnFbpRbqHbqGbqKbqKbqKbqMbkWbpUbkWbkWbkWbkWbpVbpWbpWbpWbbxbdPbpebpdbpcbpfbpibphbpnbpkbqhbpqbptbqkbqkcKDbpubgabgabpwbfmaMbbpzbpybpAaJubqqbpBbpDbpCborbrobpIbotaafbebbebbpKbebbrubebbpMbebbebaafbedbqzboCbqAbrvbqCbqDbpNaJibpPaQSaLYaJibpSbpQbpZbpTbpgbqLbnSbqbbnXbnXbnXbnXbnXbnXbqdbqcbqebokbqgbqfbqibnnbqmbqjbqobqnbnabovbmPbqpbYfaVJbpjbqrboEbqtbqZbqsbqvbqubqubqubqEbqxbqIbqFbrhbqJbqObqNbnIbqPbqRbqQbqSboTbqTbnIbqXbqVbrrbnMaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaabsybsibrqbeMbdybgwbgwbhtbhobrcbgrbtkbsqcrMbhvbjpbjpbjpbajbrEbrFbrGbrHbrGbrGbrGbrHbrGbajbajbdPbdPbdPbsxbdPbgNbrdbrdbrdbrdbrdbpnbrfbrLbribrkbqabrmbrlbrpbrnbrtbrtbrxbrwbrzbrybrAaHBbsbbrBbsabrDbsAbotbrIbotaafbtDbsEbsBbrjbsmbsHbsBbsIbtDaafbedbspbhFbspbedbedbedbtbaJibrKaQSaLYbXHbnLbnKbrNbrMbrObqLbrJbqbbrRbrQbrTbrSbrPbrUbqdbrVbnibrXbrZbrYbscbnnbsdbqjbosbmPbnabovbmPbnabYfaVJbpjboEboEboEbseboEbsNbsgbsjbshbslbskbsobsnbrhbssbsubstbnIbswbsCbszbsFbsDbrWbnIbsMbhwbtebnMaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabsybtFbtEbuvbsLbsPbsPbsQbsPbsPbgrbsSbsRboAaYPbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtJbhIbsTbsWbiYbsYbsXbsXbsXbsXbsXbtabsZbtdbtcbtgbtfbtzbupbfmbfmbhxbfmbfmbtCbtibthbtjbmGbtHbmGbmGbmGbmGbmGbtlbmGaafbvbbuGbtLbtmbtNbtmbtLbuNbvcaafbspbtQbtRbtSbtobtpbspbhyaJlbtqbbabtraJibtsblUbtubttbtvbucbtxbtwbFNbtybtIbtBbtMbtKbtPbtObnibokbtUbtTbsGbnnbovbtXbtZbtWbuabuabubbnabYfaXqbpjbsfboEbqtbsebuebuzbufbuhbugbujbuibulbudbrhbumbuqbunbnIburbutbusbsFboTbuubnIbuwbpFbvFbnMaaaaaaaaaaaacHOaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabsybtFbtEbuvbsLbsPbsPbsQbsPbsPbgrbsSbsRboAaYPbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtJbhIbsTbsWbiYbsYbsXbsXbsXbsXbsXbtabsZbtdbtcbtgbtfbtzbupbfmbfmbhxbfmbfmbtCbtibthbtjbmGbtHbmGbmGbmGbmGbmGbtlbmGaafbvbbuGbtLbtmbtNbtmbtLbuNbvcaafbspbtQbtRbtSbtobtpbspbhyaJlbtqbbabtraJibtsblUbtubttbtvbucbtxbtwbFNbtybtIbtBbtMbtKbtPbtObnibnnbtUbtTbsGbnnbovbtXbtZbtWbuabuabubbnabYfaXqbpjbsfboEbqtbsebuebuzbufbuhbugbujbuibulbudbrhbumbuqbunbnIburbutbusbsFboTbuubnIbuwbpFbvFbnMaaaaaaaaaaaacHOaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeObyebvYbvZbpObwEbgnbgobwMbwEbgrbuybjpbwObwNbjpaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaabxIbkwbrdbuCbuBbuEbuDbuDbuDbuHbuFbuDbuIbuKbuJbuMbuLbuPbuObfmbuQbgabuSbuTbvsbuVbuUbukbmGbmGbmGbuYbuXbvabuZbvdbvwaafbydbwnbvHbvfbvebvgbvNbwxbydaafbspbwCbvQbxnbedbvhbspbhPaJlbuWbcvbvjaJibvVbvWbvXbwDbvkbucbvmbvlbvobvnbvpbvpbvrbvqbvubvtbvvbwkbvxbwmbwkbwkbwkbwkbvybwkbwkaXKaXKaXKaXKaVJbpjboEboEboEbtYbvzbwqbvBbsjbsjbsjbskbvDbvCbwvbwwbvEbwybnIbvIbvKbvJbvLboTbvMbnIbzDbwFbnMbnMaaaaaaaaaaaaaafbvObvRbuRbvRbuRbvRbvTaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbyAbyPbyFbvUbvUbwdbwcbwfbwebwebwebwgbrfbrdbrdbrLbwhbwjbwibwobwlbwrbwpbgabgabwsbxcbuVbuUbwzbwtbwBbwAbwGbxibxjbxkbwKbvwaafbxrbwPbtLbtmbwQbvibxobwSbxraafbspbqwbwRbwUbedbwVbspbhyaJlbwWbcvaLYaJibwYbwXbxabwZbxbbxCbxebxdbxCbxFbxGbxfbxFbwkbxhbxgbwkbwkbxmbkzbxqbxpbwTbxsbxvblubxwaXKbaybxxaXKbxybpjbvAboEbqtbxzbxAbppbxDbsjbsjbsjbskbvDbxEbrhbxHbxKbxJbnIbxLbxNbxMbxOboTbxPbnIbAVbykbnMaaaaaaaaaaaaaaaaafbxQbwHbrgbzNbwJbzObxQaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbzKbxRbzKbxSbxSbxTbwcbwfbrdbrdbxUbxWbrfbxXbdPbdPbxYbgabrkbwobxZbywbyabybbybbyfbycbyhbygbyibvsbyjbvPbHJbxkbyHbyIbymbvwaafbxrbxrbxrbxrbyobxrbxrbxrbxraafbyNbyNbyNbyNbyNbyNbyNbypaJibyqbeTbeVaJibxtbyrbyrbytbyubxCbyxbyvbyWbyybyBbyzbyCbwmbyEbyDbyJbyGbyLbyKbyKbyMbyObyKbyRbyQbySbaAbwubyTbAsbyUbyXbxBbyYbyVbyZbzabppbzcboIboIbzdbskbvDbzebppbzfbzhbzgbHmbHlbHobHnbHqbHpbnIbnIbBdbnMbnMbBobBpbBpbBpbBrbCJbzjbzkbrgbwJbrgbynbuRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 14f373983fb5da82247ddd273b6c051a6cb2cf44 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 7 Jan 2016 12:23:04 +0100 Subject: [PATCH 47/55] Also makes the economic species modifier more general. --- code/game/jobs/job/job.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 67873874a27..cf7b1bbd94a 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -54,7 +54,7 @@ //give them an account in the station database var/species_modifier = (H.species ? economic_species_modifier[H.species.type] : 2) - if(species_modifier == 0) + if(!species_modifier) species_modifier = economic_species_modifier[/datum/species/human] var/money_amount = (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * species_modifier From cbcd5ab03530c5e0c2674458213933874f2f4622 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Thu, 7 Jan 2016 12:24:00 +0100 Subject: [PATCH 48/55] Map fixes - Dev Edition - See #11658 - this is just edition for Dev - TLDR version: Fixes power alarm at construction site, fixes emitter button giving errors about not being connected to cable, unanchors emitters at mining outpost by default. - Added subtype for inactive APCs as per PsiOmegaDelta's request - Fixed gridcheck affecting telecommunications central compartment. --- code/modules/power/apc.dm | 10 ++++++++++ maps/exodus-3.dmm | 2 +- maps/exodus-4.dmm | 8 ++++---- maps/exodus-5.dmm | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 79cddcf10cb..f2c11b3704d 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -43,6 +43,16 @@ /obj/machinery/power/apc/high cell_type = /obj/item/weapon/cell/high +// Construction site APC, starts turned off +/obj/machinery/power/apc/high/inactive + cell_type = /obj/item/weapon/cell/high + lighting = 0 + equipment = 0 + environ = 0 + locked = 0 + coverlocked = 0 + start_charge = 100 + /obj/machinery/power/apc/super cell_type = /obj/item/weapon/cell/super diff --git a/maps/exodus-3.dmm b/maps/exodus-3.dmm index f041d5a290f..b3c38512501 100644 --- a/maps/exodus-3.dmm +++ b/maps/exodus-3.dmm @@ -212,7 +212,7 @@ "ed" = (/obj/machinery/door/airlock/hatch{name = "Telecoms Lounge"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/tcommsat/computer) "ee" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/space,/area/turret_protected/tcomsat) "ef" = (/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"eg" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"eg" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc/super/critical{name = "north bump"; pixel_y = 24},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 6},/turf/simulated/floor/plating,/area/tcommsat/chamber) "ei" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "ej" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/camera/network/telecom{c_tag = "Telecoms West Wing Central"; dir = 8},/turf/space,/area/turret_protected/tcomsat) diff --git a/maps/exodus-4.dmm b/maps/exodus-4.dmm index fbf2d3c7ce3..a16652b6190 100644 --- a/maps/exodus-4.dmm +++ b/maps/exodus-4.dmm @@ -70,7 +70,7 @@ "br" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/autolathe,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "bs" = (/obj/machinery/atmospherics/pipe/simple/hidden/blue{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "bt" = (/obj/structure/window/basic,/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/atmospherics/portables_connector{tag = "icon-map_connector (EAST)"; icon_state = "map_connector"; dir = 4},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) -"bu" = (/obj/structure/cable/blue,/obj/machinery/power/apc/high{dir = 2; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "south bump"; pixel_y = -24},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bu" = (/obj/structure/cable/blue,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/power/apc/high/inactive{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "bv" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "bw" = (/obj/machinery/pipedispenser,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "bx" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) @@ -87,7 +87,7 @@ "bI" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_closed"; locked = 0; name = "AI Upload"; req_access = list(16)},/turf/simulated/floor/bluegrid/airless,/area/constructionsite/ai) "bJ" = (/obj/machinery/drone_fabricator/derelict,/turf/simulated/floor/airless,/area/constructionsite/ai) "bK" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/airless,/area/constructionsite/ai) -"bL" = (/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/constructionsite/ai) +"bL" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc/high/inactive{name = "north bump"; pixel_y = 24},/turf/simulated/floor/airless,/area/constructionsite/ai) "bM" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/turf/simulated/floor/airless,/area/constructionsite/hallway/fore) "bN" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/turf/simulated/floor/airless,/area/constructionsite/ai) "bO" = (/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/turf/simulated/floor/bluegrid/airless,/area/constructionsite/ai) @@ -101,7 +101,7 @@ "bW" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/airless,/area/constructionsite/hallway/aft) "bX" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) "bY" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) -"bZ" = (/obj/machinery/power/apc/high{dir = 2; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "south bump"; pixel_y = -24},/obj/structure/cable/blue,/turf/simulated/floor/airless,/area/constructionsite/atmospherics) +"bZ" = (/obj/structure/cable/blue,/obj/machinery/power/apc/high/inactive{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) "ca" = (/turf/simulated/floor/tiled/white/airless,/area/constructionsite/medical) "cb" = (/obj/structure/grille,/turf/simulated/floor/airless,/area/constructionsite/medical) "cc" = (/obj/machinery/sleeper,/turf/simulated/floor/tiled/white/airless,/area/constructionsite/medical) @@ -146,7 +146,7 @@ "cP" = (/obj/structure/cable/blue,/turf/simulated/floor/airless,/area/constructionsite/engineering) "cQ" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/turf/simulated/floor/airless,/area/space) "cR" = (/obj/machinery/field_generator,/turf/simulated/floor/airless,/area/space) -"cS" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; id = "EngineEmitter"; state = 2},/turf/simulated/floor/airless,/area/space) +"cS" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; state = 2},/turf/simulated/floor/airless,/area/space) "cV" = (/turf/simulated/wall,/area/constructionsite/hallway/aft) "cW" = (/turf/simulated/floor/airless,/area/constructionsite/hallway/aft) "dm" = (/obj/structure/lattice,/turf/space,/area/constructionsite/hallway/aft) diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm index aadec2bad53..6bc897bab06 100644 --- a/maps/exodus-5.dmm +++ b/maps/exodus-5.dmm @@ -1053,7 +1053,7 @@ "um" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) "un" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor,/area/outpost/engineering/hallway) "uo" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "edock_sensor"; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "edock_pump"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"up" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/turf/simulated/floor/airless{icon_state = "asteroidplating"},/area/mine/explored) +"up" = (/obj/machinery/power/emitter{anchored = 0; dir = 4; state = 0},/turf/simulated/floor/airless{icon_state = "asteroidplating"},/area/mine/explored) "uq" = (/turf/simulated/wall,/area/outpost/engineering/hallway) "ur" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) "us" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_inner"; locked = 1; name = "Engineering Outpost"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/outpost/engineering/hallway) From fcc83892035d187465dce4cec1a6a650a7d20bc9 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 7 Jan 2016 16:00:24 +0100 Subject: [PATCH 49/55] Floor construction now checks stack subtypes. Fixes #11930. Also makes the robot fabricator use proper paths because I found it while searching for build type. --- code/game/machinery/robot_fabricator.dm | 18 +++++++++--------- code/game/turfs/simulated/floor_attackby.dm | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index 4c44bcd4eeb..0ae1d2ceea1 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -71,47 +71,47 @@ Please wait until completion...
if (!src.operating) var/part_type = text2num(href_list["make"]) - var/build_type = "" + var/build_type = null var/build_time = 200 var/build_cost = 25000 switch (part_type) if (1) - build_type = "/obj/item/robot_parts/l_arm" + build_type = /obj/item/robot_parts/l_arm build_time = 200 build_cost = 25000 if (2) - build_type = "/obj/item/robot_parts/r_arm" + build_type = /obj/item/robot_parts/r_arm build_time = 200 build_cost = 25000 if (3) - build_type = "/obj/item/robot_parts/l_leg" + build_type = /obj/item/robot_parts/l_leg build_time = 200 build_cost = 25000 if (4) - build_type = "/obj/item/robot_parts/r_leg" + build_type = /obj/item/robot_parts/r_leg build_time = 200 build_cost = 25000 if (5) - build_type = "/obj/item/robot_parts/chest" + build_type = /obj/item/robot_parts/chest build_time = 350 build_cost = 50000 if (6) - build_type = "/obj/item/robot_parts/head" + build_type = /obj/item/robot_parts/head build_time = 350 build_cost = 50000 if (7) - build_type = "/obj/item/robot_parts/robot_suit" + build_type = /obj/item/robot_parts/robot_suit build_time = 600 build_cost = 75000 - var/building = text2path(build_type) + var/building = build_type if (!isnull(building)) if (src.metal_amount >= build_cost) src.operating = 1 diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index c8cc2660c97..118f2277695 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -57,13 +57,13 @@ var/decl/flooring/F = flooring_types[flooring_type] if(!F.build_type) continue - if((S.type == F.build_type) || (S.build_type == F.build_type)) + if(ispath(S.type, F.build_type) || ispath(S.build_type, F.build_type)) use_flooring = F break if(!use_flooring) return // Do we have enough? - if(use_flooring.build_cost && S.amount < use_flooring.build_cost) + if(use_flooring.build_cost && S.get_amount() < use_flooring.build_cost) user << "You require at least [use_flooring.build_cost] [S.name] to complete the [use_flooring.descriptor]." return // Stay still and focus... From 7b4289e07234883125bb1fd21cd4bfbe23f5bd01 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 19:40:50 +0300 Subject: [PATCH 50/55] Macro for intent --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ea64a798aa7..58dd22d2223 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1385,7 +1385,7 @@ /mob/living/carbon/human/MouseDrop(var/atom/over_object) var/mob/living/carbon/human/H = over_object - if(H.a_intent == "help" && holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H)) + if(H.a_intent == I_HELP && holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H)) get_scooped(H, (usr == src)) return return ..() From 77ecaac36b83a464736dc7daf4c0a7138cea5d6f Mon Sep 17 00:00:00 2001 From: Techhead0 Date: Thu, 7 Jan 2016 15:54:51 -0500 Subject: [PATCH 51/55] Quick fix for #11772 Changes character setup to use species' bodytypes to determine hairstyle availability. --- .../modules/client/preference_setup/general/03_body.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index e236c523890..680e6221523 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -180,7 +180,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O return mob_species && (mob_species.appearance_flags & flag) /datum/category_item/player_setup_item/general/body/OnTopic(var/href,var/list/href_list, var/mob/user) - var/mob_species = all_species[pref.species] + var/datum/species/mob_species = all_species[pref.species] if(href_list["random"]) pref.randomize_appearance_for() @@ -217,7 +217,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(pref.gender == FEMALE && S.gender == MALE) continue - if(!(pref.species in S.species_allowed)) + if(!(mob_species.get_bodytype() in S.species_allowed)) continue valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] @@ -235,7 +235,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(pref.gender == FEMALE && S.gender == MALE) continue - if(!(pref.species in S.species_allowed)) + if(!(mob_species.get_bodytype() in S.species_allowed)) continue valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] @@ -268,7 +268,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/list/valid_hairstyles = list() for(var/hairstyle in hair_styles_list) var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(!(pref.species in S.species_allowed)) + if(!(mob_species.get_bodytype() in S.species_allowed)) continue valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] @@ -324,7 +324,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(pref.gender == FEMALE && S.gender == MALE) continue - if(!(pref.species in S.species_allowed)) + if(!(mob_species.get_bodytype() in S.species_allowed)) continue valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] From 265c0d25678542bb9d223f548be318df547f9407 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Fri, 8 Jan 2016 01:34:30 +0100 Subject: [PATCH 52/55] Modular Computer Multitasking + Fixes - Modular computers now support multitasking. - New hardware type added. Basic CPUs may be obtained when purchasing a laptop or tablet, Photonic CPUs can be printed at research at imprinter. This hardware piece determines how many programs can be on background. - Programs can now have an icon that is rendered in main UI's header (along with the power icons, etc.) when the program is on background. As an example, these icons have been added to NTNRC client (Dark icon when no messages have been received, blinking when new message is waiting), Alarm monitor (Blinking red when an alarm is active, green otherwise) and downloader program (Animated arrow when downloading, stationary when finished.) - Adds missing crew monitor icon to tablets. Fixes #11937 --- baystation12.dme | 1 + code/modules/alarm/alarm_handler.dm | 5 + .../computers/item/modular_computer.dm | 87 +++++++++++++++--- .../computers/item/processor.dm | 4 +- .../computers/machinery/console_presets.dm | 1 + .../computers/machinery/modular_computer.dm | 3 +- .../modular_computers/file_system/program.dm | 7 ++ .../file_system/programs/_engineering.dm | 25 ++++- .../file_system/programs/ntdownloader.dm | 5 + .../file_system/programs/ntnrc_client.dm | 17 ++++ .../hardware/processor_unit.dm | 36 ++++++++ .../modular_computers/laptop_vendor.dm | 22 ++++- code/modules/nano/modules/alarm_monitor.dm | 8 ++ code/modules/research/designs.dm | 39 ++++++++ icons/obj/modular_components.dmi | Bin 2639 -> 3291 bytes icons/obj/modular_console.dmi | Bin 25404 -> 26093 bytes icons/obj/modular_laptop.dmi | Bin 25642 -> 25753 bytes icons/obj/modular_tablet.dmi | Bin 1449 -> 1467 bytes nano/images/status_icons/alarm_green.gif | Bin 0 -> 107 bytes nano/images/status_icons/alarm_red.gif | Bin 0 -> 163 bytes .../status_icons/downloader_finished.gif | Bin 0 -> 130 bytes .../status_icons/downloader_running.gif | Bin 0 -> 574 bytes nano/images/status_icons/ntnrc_idle.gif | Bin 0 -> 113 bytes nano/images/status_icons/ntnrc_new.gif | Bin 0 -> 181 bytes nano/templates/computer_fabricator.tmpl | 5 + nano/templates/layout_default.tmpl | 4 + 26 files changed, 247 insertions(+), 22 deletions(-) create mode 100644 code/modules/modular_computers/hardware/processor_unit.dm create mode 100644 nano/images/status_icons/alarm_green.gif create mode 100644 nano/images/status_icons/alarm_red.gif create mode 100644 nano/images/status_icons/downloader_finished.gif create mode 100644 nano/images/status_icons/downloader_running.gif create mode 100644 nano/images/status_icons/ntnrc_idle.gif create mode 100644 nano/images/status_icons/ntnrc_new.gif diff --git a/baystation12.dme b/baystation12.dme index 8afada0ac4c..cda15ea108a 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1470,6 +1470,7 @@ #include "code\modules\modular_computers\hardware\nano_printer.dm" #include "code\modules\modular_computers\hardware\network_card.dm" #include "code\modules\modular_computers\hardware\portable_hard_drive.dm" +#include "code\modules\modular_computers\hardware\processor_unit.dm" #include "code\modules\modular_computers\hardware\tesla_link.dm" #include "code\modules\modular_computers\NTNet\NTNet.dm" #include "code\modules\modular_computers\NTNet\NTNet_relay.dm" diff --git a/code/modules/alarm/alarm_handler.dm b/code/modules/alarm/alarm_handler.dm index afa45d7649c..9cf52add77b 100644 --- a/code/modules/alarm/alarm_handler.dm +++ b/code/modules/alarm/alarm_handler.dm @@ -50,6 +50,11 @@ /datum/alarm_handler/proc/major_alarms() return alarms +/datum/alarm_handler/proc/has_major_alarms() + if(alarms && alarms.len) + return 1 + return 0 + /datum/alarm_handler/proc/minor_alarms() return alarms diff --git a/code/modules/modular_computers/computers/item/modular_computer.dm b/code/modules/modular_computers/computers/item/modular_computer.dm index dd53adcdc80..847fc99b52e 100644 --- a/code/modules/modular_computers/computers/item/modular_computer.dm +++ b/code/modules/modular_computers/computers/item/modular_computer.dm @@ -28,6 +28,7 @@ // Important hardware (must be installed for computer to work) + var/obj/item/weapon/computer_hardware/processor_unit/processor_unit // CPU. Without it the computer won't run. Better CPUs can run more programs at once. var/obj/item/weapon/computer_hardware/network_card/network_card // Network Card component of this computer. Allows connection to NTNet var/obj/item/weapon/computer_hardware/hard_drive/hard_drive // Hard Drive component of this computer. Stores programs and files. var/obj/item/weapon/computer_hardware/battery_module/battery_module // An internal power source for this computer. Can be recharged. @@ -36,6 +37,8 @@ var/obj/item/weapon/computer_hardware/nano_printer/nano_printer // Nano Printer component of this computer, for your everyday paperwork needs. var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive // Portable data storage + var/list/idle_threads = list() // Idle programs on background. They still receive process calls but can't be interacted with. + // Eject ID card from computer, if it has ID slot with card inside. /obj/item/modular_computer/verb/eject_id() @@ -164,7 +167,7 @@ /obj/item/modular_computer/proc/turn_on(var/mob/user) var/issynth = issilicon(user) // Robots and AIs get different activation messages. - if((battery_module && battery_module.battery.charge) || check_power_override()) // Battery-run and charged or non-battery but powered by APC. + if(processor_unit && ((battery_module && battery_module.battery.charge) || check_power_override())) // Battery-run and charged or non-battery but powered by APC. if(issynth) user << "You send an activation signal to \the [src], turning it on" else @@ -188,11 +191,22 @@ kill_program(1) visible_message("\The [src]'s screen briefly freezes and then shows \"NETWORK ERROR - NTNet connection lost. Please retry. If problem persists contact your system administrator.\" error.") + for(var/datum/computer_file/program/P in idle_threads) + if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) + P.kill_program(1) + idle_threads.Remove(P) + visible_message("\The [src] screen displays an \"Process [P.filename].[P.filetype] (PID [rand(100,999)]) terminated - Network Error\" error") + if(active_program) active_program.process_tick() active_program.ntnet_status = get_ntnet_status() active_program.computer_emagged = computer_emagged + for(var/datum/computer_file/program/P in idle_threads) + P.process_tick() + P.ntnet_status = get_ntnet_status() + P.computer_emagged = computer_emagged + handle_power() // Handles all computer power interaction // Function used by NanoUI's to obtain data for header. All relevant entries begin with "PC_" @@ -230,6 +244,17 @@ if(3) data["PC_ntneticon"] = "sig_lan.gif" + if(idle_threads.len) + var/list/program_headers = list() + for(var/datum/computer_file/program/P in idle_threads) + if(!P.ui_header) + continue + program_headers.Add(list(list( + "icon" = P.ui_header + ))) + + data["PC_programheaders"] = program_headers + data["PC_stationtime"] = worldtime2text() data["PC_hasheader"] = 1 data["PC_showexitprogram"] = active_program ? 1 : 0 // Hides "Exit Program" button on mainscreen @@ -257,9 +282,13 @@ return 0 return ntnet_global.add_log(text, network_card) -/obj/item/modular_computer/proc/shutdown_computer() +/obj/item/modular_computer/proc/shutdown_computer(var/loud = 1) kill_program(1) - visible_message("\The [src] shuts down.") + for(var/datum/computer_file/program/P in idle_threads) + P.kill_program(1) + idle_threads.Remove(P) + if(loud) + visible_message("\The [src] shuts down.") enabled = 0 update_icon() return @@ -284,6 +313,23 @@ if( href_list["PC_shutdown"] ) shutdown_computer() return + if( href_list["PC_minimize"] ) + var/mob/user = usr + if(!active_program || !processor_unit) + return + + if(idle_threads.len >= processor_unit.max_idle_programs) + user << "\The [src] displays a \"Maximal CPU load reached. Unable to minimize another program.\" error" + return + + idle_threads.Add(active_program) + active_program.running = 0 // Should close any existing UIs + nanomanager.close_uis(active_program.NM ? active_program.NM : active_program) + active_program = null + update_icon() + if(user && istype(user)) + ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. + if( href_list["PC_runprogram"] ) var/prog = href_list["PC_runprogram"] var/datum/computer_file/program/P = null @@ -299,6 +345,14 @@ if(!P.is_supported_by_hardware(hardware_flag, 1, user)) return + // The program is already running. Resume it. + if(P in idle_threads) + P.running = 1 + active_program = P + idle_threads.Remove(P) + update_icon() + return + if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet. user << "\The [src]'s screen shows \"NETWORK ERROR - Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\" warning." return @@ -311,9 +365,7 @@ /obj/item/modular_computer/proc/power_failure() if(enabled) // Shut down the computer visible_message("\The [src]'s screen flickers \"BATTERY CRITICAL\" warning as it shuts down unexpectedly.") - kill_program(1) - enabled = 0 - update_icon() + shutdown_computer(0) // Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged /obj/item/modular_computer/proc/handle_power() @@ -322,11 +374,10 @@ return 0 var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage - if(network_card && network_card.enabled) - power_usage += network_card.power_usage - if(hard_drive && hard_drive.enabled) - power_usage += hard_drive.power_usage + for(var/obj/item/weapon/computer_hardware/H in get_all_components()) + if(H.enabled) + power_usage += H.power_usage if(battery_module) battery_module.battery.use(power_usage * CELLRATE) @@ -440,6 +491,12 @@ return found = 1 battery_module = H + else if(istype(H, /obj/item/weapon/computer_hardware/processor_unit)) + if(processor_unit) + user << "This computer's processor slot is already occupied by \the [processor_unit]." + return + found = 1 + processor_unit = H if(found) user << "You install \the [H] into \the [src]" H.holder2 = src @@ -467,11 +524,15 @@ if(battery_module == H) battery_module = null found = 1 + if(processor_unit == H) + processor_unit = null + found = 1 + critical = 1 if(found) user << "You remove \the [H] from \the [src]." H.forceMove(get_turf(src)) H.holder2 = null - if(critical) + if(critical && enabled) user << "\The [src]'s screen freezes for few seconds and then displays an \"HARDWARE ERROR: Critical component disconnected. Please verify component connection and reboot the device. If the problem persists contact technical support for assistance.\" warning." kill_program(1) enabled = 0 @@ -492,6 +553,8 @@ return card_slot if(battery_module && (battery_module.name == name)) return battery_module + if(processor_unit && (processor_unit.name == name)) + return processor_unit return null // Returns list of all components @@ -509,4 +572,6 @@ all_components.Add(card_slot) if(battery_module) all_components.Add(battery_module) + if(processor_unit) + all_components.Add(processor_unit) return all_components \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index 0e44e6ac99c..21818d06b15 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -78,9 +78,7 @@ /obj/item/modular_computer/processor/shutdown_computer() if(!machinery_computer) return - kill_program(1) - visible_message("\The [machinery_computer] shuts down.") - enabled = 0 + ..() machinery_computer.update_icon() return diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index a423fba92e7..9dafd2405c9 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -8,6 +8,7 @@ . = ..() if(!cpu) return + cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit(cpu) if(_has_id_slot) cpu.card_slot = new/obj/item/weapon/computer_hardware/card_slot(cpu) if(_has_printer) diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index a4f2cdfa6f5..7377c32182e 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -81,8 +81,7 @@ if(cpu && cpu.enabled) // Shut down the computer visible_message("\The [src]'s screen flickers [cpu.battery_module ? "\"BATTERY CRITICAL\"" : "\"EXTERNAL POWER LOSS\""] warning as it shuts down unexpectedly.") if(cpu) - cpu.kill_program(1) - cpu.enabled = 0 + cpu.shutdown_computer(0) battery_powered = 0 update_icon() stat |= NOPOWER diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index b21a136b4e8..805f4258852 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -18,6 +18,8 @@ var/available_on_ntnet = 1 // Whether the program can be downloaded from NTNet. Set to 0 to disable. var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable. var/computer_emagged = 0 // Set to 1 if computer that's running us was emagged. Computer updates this every Process() tick + var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images! + /datum/computer_file/program/New(var/obj/item/modular_computer/comp = null) ..() @@ -35,6 +37,11 @@ temp.usage_flags = usage_flags return temp +// Relays icon update to the computer. +/datum/computer_file/program/proc/update_computer_icon() + if(computer) + computer.update_icon() + // Attempts to create a log in global ntnet datum. Returns 1 on success, 0 on fail. /datum/computer_file/program/proc/generate_network_log(var/text) if(computer) diff --git a/code/modules/modular_computers/file_system/programs/_engineering.dm b/code/modules/modular_computers/file_system/programs/_engineering.dm index c038efdbb0b..db00a52d90f 100644 --- a/code/modules/modular_computers/file_system/programs/_engineering.dm +++ b/code/modules/modular_computers/file_system/programs/_engineering.dm @@ -15,18 +15,37 @@ filename = "alarmmonitor" filedesc = "Alarm Monitoring" nanomodule_path = /datum/nano_module/alarm_monitor/engineering - program_icon_state = "alarm_monitor" + ui_header = "alarm_green.gif" + program_icon_state = "alert-green" extended_desc = "This program provides visual interface for station's alarm system." requires_ntnet = 1 network_destination = "alarm monitoring network" size = 5 + var/has_alert = 0 + +/datum/computer_file/program/alarm_monitor/process_tick() + ..() + var/datum/nano_module/alarm_monitor/NMA = NM + if(istype(NMA) && NMA.has_major_alarms()) + if(!has_alert) + program_icon_state = "alert-red" + ui_header = "alarm_red.gif" + update_computer_icon() + has_alert = 1 + else + if(has_alert) + program_icon_state = "alert-green" + ui_header = "alarm_green.gif" + update_computer_icon() + has_alert = 0 + return 1 /datum/computer_file/program/atmos_control filename = "atmoscontrol" filedesc = "Atmosphere Control" nanomodule_path = /datum/nano_module/atmos_control program_icon_state = "atmos_control" - extended_desc = "This program allows remote control of air alarms around the station" + extended_desc = "This program allows remote control of air alarms around the station. This program can not be run on tablet computers." required_access = access_atmospherics requires_ntnet = 1 network_destination = "atmospheric control system" @@ -39,7 +58,7 @@ filedesc = "RCON Remote Control" nanomodule_path = /datum/nano_module/rcon program_icon_state = "generic" - extended_desc = "This program allows remote control of power distribution systems around the station." + extended_desc = "This program allows remote control of power distribution systems around the station. This program can not be run on tablet computers." required_access = access_engine requires_ntnet = 1 network_destination = "RCON remote control system" diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index 1e22a703344..a6339cb637f 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -10,6 +10,7 @@ requires_ntnet_feature = NTNET_SOFTWAREDOWNLOAD available_on_ntnet = 0 nanomodule_path = /datum/nano_module/computer_ntnetdownload/ + ui_header = "downloader_finished.gif" var/datum/computer_file/program/downloaded_file = null var/hacked_download = 0 var/download_completion = 0 //GQ of downloaded data. @@ -32,6 +33,8 @@ if(!computer || !computer.hard_drive || !computer.hard_drive.try_store_file(PRG)) return 0 + ui_header = "downloader_running.gif" + if(PRG in ntnet_global.available_station_software) generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from NTNet Software Repository.") hacked_download = 0 @@ -50,6 +53,7 @@ generate_network_log("Aborted download of file [hacked_download ? "**ENCRYPTED**" : downloaded_file.filename].[downloaded_file.filetype].") downloaded_file = null download_completion = 0 + ui_header = "downloader_finished.gif" /datum/computer_file/program/ntnetdownload/proc/complete_file_download() if(!downloaded_file) @@ -60,6 +64,7 @@ downloaderror = "I/O ERROR - Unable to save file. Check whether you have enough free space on your hard drive and whether your hard drive is properly connected. If the issue persists contact your system administrator for assistance." downloaded_file = null download_completion = 0 + ui_header = "downloader_finished.gif" /datum/computer_file/program/ntnetdownload/process_tick() if(!downloaded_file) diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index ab9a95aac55..9f7efb5449f 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -7,8 +7,10 @@ requires_ntnet = 1 requires_ntnet_feature = NTNET_COMMUNICATION network_destination = "NTNRC server" + ui_header = "ntnrc_idle.gif" available_on_ntnet = 1 nanomodule_path = /datum/nano_module/computer_chatclient/ + var/last_message = null // Used to generate the toolbar icon var/username var/datum/ntnet_conversation/channel = null var/operator_mode = 0 // Channel operator mode @@ -30,6 +32,7 @@ if(href_list["PRG_joinchannel"]) var/datum/ntnet_conversation/C for(var/datum/ntnet_conversation/chan in ntnet_global.chat_channels) + world << "DEBUG L35/NTNRC_CLIENT.DM: \"[href_list["PRG_joinchannel"]]\" / \"[chan.title]\"" if(chan.title == href_list["PRG_joinchannel"]) C = chan break @@ -143,6 +146,20 @@ ..(href, href_list) +/datum/computer_file/program/chatclient/process_tick() + ..() + if(running) + ui_header = "ntnrc_idle.gif" + if(channel) + // Remember the last message. If there is no message in the channel remember null. + last_message = channel.messages.len ? channel.messages[channel.messages.len - 1] : null + else + last_message = null + return 1 + if(channel && channel.messages && channel.messages.len) + ui_header = last_message == channel.messages[channel.messages.len - 1] ? "ntnrc_idle.gif" : "ntnrc_new.gif" + else + ui_header = "ntnrc_idle.gif" /datum/computer_file/program/chatclient/kill_program(var/forced = 0) if(channel) diff --git a/code/modules/modular_computers/hardware/processor_unit.dm b/code/modules/modular_computers/hardware/processor_unit.dm new file mode 100644 index 00000000000..b013a39cd9d --- /dev/null +++ b/code/modules/modular_computers/hardware/processor_unit.dm @@ -0,0 +1,36 @@ +// CPU that allows the computer to run programs. +// Better CPUs are obtainable via research and can run more programs on background. + +/obj/item/weapon/computer_hardware/processor_unit + name = "standard processor" + desc = "A standard CPU used in most computers. It can run up to three programs simultaneously." + icon_state = "cpu_normal" + hardware_size = 2 + power_usage = 50 + critical = 1 + + var/max_idle_programs = 2 // 2 idle, + 1 active = 3 as said in description. + +/obj/item/weapon/computer_hardware/processor_unit/small + name = "standard microprocessor" + desc = "A standard miniaturised CPU used in portable devices. It can run up to two programs simultaneously." + icon_state = "cpu_small" + hardware_size = 1 + power_usage = 25 + max_idle_programs = 1 + +/obj/item/weapon/computer_hardware/processor_unit/photonic + name = "photonic processor" + desc = "An advanced experimental CPU that uses photonic core instead of regular circuitry. It can run up to five programs simultaneously, but uses a lot of power." + icon_state = "cpu_normal_photonic" + hardware_size = 2 + power_usage = 250 + max_idle_programs = 4 + +/obj/item/weapon/computer_hardware/processor_unit/photonic/small + name = "photonic microprocessor" + desc = "An advanced miniaturised CPU for use in portable devices. It uses photonic core instead of regular circuitry. It can run up to three programs simultaneously." + icon_state = "cpu_small_photonic" + hardware_size = 1 + power_usage = 75 + max_idle_programs = 2 \ No newline at end of file diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index dce72afcb77..31e7fc8381d 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -19,6 +19,7 @@ var/total_price = 0 // Price of currently vended device. // Device loadout + var/dev_cpu = 1 // 1: Default, 2: Upgraded var/dev_battery = 1 // 1: Default, 2: Upgraded, 3: Advanced var/dev_disk = 1 // 1: Default, 2: Upgraded, 3: Advanced var/dev_netcard = 0 // 0: None, 1: Basic, 2: Long-Range @@ -36,6 +37,7 @@ if(fabricated_tablet) qdel(fabricated_tablet) fabricated_tablet = null + dev_cpu = 1 dev_battery = 1 dev_disk = 1 dev_netcard = 0 @@ -50,17 +52,25 @@ if(fabricate) fabricated_laptop = new(src) total_price = 99 + switch(dev_cpu) + if(1) + if(fabricate) + fabricated_laptop.cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(fabricated_laptop.cpu) + if(2) + if(fabricate) + fabricated_laptop.cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit(fabricated_laptop.cpu) + total_price += 299 switch(dev_battery) if(1) // Basic(750C) if(fabricate) - fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module(fabricated_tablet) + fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module(fabricated_laptop.cpu) if(2) // Upgraded(1100C) if(fabricate) - fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/advanced(fabricated_tablet) + fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/advanced(fabricated_laptop.cpu) total_price += 199 if(3) // Advanced(1500C) if(fabricate) - fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(fabricated_tablet) + fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(fabricated_laptop.cpu) total_price += 499 switch(dev_disk) if(1) // Basic(128GQ) @@ -100,6 +110,7 @@ else if(devtype == 2) // Tablet, more expensive, not everyone could probably afford this. if(fabricate) fabricated_tablet = new(src) + fabricated_tablet.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(fabricated_tablet) total_price = 199 switch(dev_battery) if(1) // Basic(300C) @@ -169,6 +180,10 @@ state = 2 // Wait for ID swipe for payment processing fabricate_and_recalc_price(0) return 1 + if(href_list["hw_cpu"]) + dev_cpu = text2num(href_list["hw_cpu"]) + fabricate_and_recalc_price(0) + return 1 if(href_list["hw_battery"]) dev_battery = text2num(href_list["hw_battery"]) fabricate_and_recalc_price(0) @@ -213,6 +228,7 @@ data["hw_tesla"] = dev_tesla data["hw_nanoprint"] = dev_nanoprint data["hw_card"] = dev_card + data["hw_cpu"] = dev_cpu data["totalprice"] = "[total_price]$" ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm index 839b099d76f..41435c05342 100644 --- a/code/modules/nano/modules/alarm_monitor.dm +++ b/code/modules/nano/modules/alarm_monitor.dm @@ -41,6 +41,14 @@ return all_alarms +// Modified version of above proc that uses slightly less resources, returns 1 if there is a major alarm, 0 otherwise. +/datum/nano_module/alarm_monitor/proc/has_major_alarms() + for(var/datum/alarm_handler/AH in alarm_handlers) + if(AH.has_major_alarms()) + return 1 + + return 0 + /datum/nano_module/alarm_monitor/proc/minor_alarms() var/list/all_alarms = new() for(var/datum/alarm_handler/AH in alarm_handlers) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index ffb8fc310f4..a9a264ec48d 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -916,6 +916,45 @@ other types of metals and chemistry for reagents). build_path = /obj/item/weapon/computer_hardware/battery_module/micro sort_string = "VBAAU" +/datum/design/item/modularcomponent/cpu/ + name = "processor unit" + id = "cpu_normal" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 8000) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/processor_unit + sort_string = "VBAAV" + +/datum/design/item/modularcomponent/cpu/small + name = "microprocessor unit" + id = "cpu_small" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 4000) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/processor_unit/small + sort_string = "VBAAW" + +/datum/design/item/modularcomponent/cpu/photonic + name = "photonic processor unit" + id = "pcpu_normal" + req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 4) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 32000, glass = 8000) + chemicals = list("sacid" = 40) + build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic + sort_string = "VBAAX" + +/datum/design/item/modularcomponent/cpu/photonic/small + name = "photonic processor unit" + id = "pcpu_normal" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 16000, glass = 4000) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic/small + sort_string = "VBAAY" /* CIRCUITS BELOW */ diff --git a/icons/obj/modular_components.dmi b/icons/obj/modular_components.dmi index e2aca17340a1bd2b0610b6f3eeea9010ff4e97bf..3594a12c17f70f3b71af1027e7671db465c53934 100644 GIT binary patch literal 3291 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 literal 2639 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 diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi index 583def71e5082122985ce3284f217bfe5de58d8c..8ee252055cf41c852d8c6595c2b9c8bb6101395e 100644 GIT binary patch literal 25753 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

Y+f{K;v8>)uanRb`nDqQKx|T?XW#RQj?nx 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

{9?v|6O~o6!aJLqv@QoC);2M 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 YX+An$r|X>scBWFWllCXdk6(ZA4_k6KHvj+t diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi index fb0e1fd9c921bafde058733a6e910893e9f4a569..1872315f49f0acc11771ebb495858e7bcb741e6b 100644 GIT binary patch delta 1352 zcmV-O1-JUC3%d)DBtD-|OjJd{z`$f=WPyQ!C@3iZ0001#`!h5DARr+B%mDxY00000 z0RI3p|1+5Y003$L0GR;HGXTuY%rpOHkzW-L0FU>msHgyt`CngO0G9oci9!{7j+m$b z0004WQchCC`6lS@v+Fc5~<@hPl!8&DgE1q&9SR;WVlh67k8nI@L} zK;wak+hetYv{8(a7oHjY-@Gg@`P24!ci@}-j(q|K?HzyM_3erkgKnvhj;L7CgYJ4d zJAo8IG#8}a4A6oVt;P@oYgQalSvcFjGAZ|uuP;(&g$=@x7kO)yYv*-;_c01aeMPe> ze~wt4u1OAQd>7`kRAUxViV0@D)8uiU6eD?8#xt_L52Oub3tmATI6&QGYsD@v`&49o zkd1eQ-eec53?SWf2;lyyMM$haHOIRj0RP@xJ(=cmo-14q3KNZ{-pzvh$P#r~kAzMP zxMoYfJ#0?DGXMY>3CRnF_R@u9@`4BxB$Jm7M3}&M zRt@_Dqz(HYV%o4@&l>vBj}gE=_B7AQ07~%&jjr7Hu)69oz)WXpai_Z2|- z`S*N;Vs0S%i#YlK=JZdqBGu6bIDrP{Xdom&?7s_5;{J7X8z4y#U?^h$KokE*N&o-= z0000$0R3(a`qzd1`}p<2CwPnolncr4=SQm#KEb101MCBA&mc3QLG{5W7~X*N0BTne zqw^E&RUdqU{WlPQswau4yR{mnYi+&^C))r30000000000BBg8?r@m;Q0xXwH_6a2Y z+)-wNt~=@rrIc~6=m2pvzyw%2*aleLj?cg~aEQ(|U^uc2%2s{9Tb2&Vv5rX?QS9O1N{Dd`}ACZAiYT4 zjc;ILE1&|5|5b=@0000000000005C9ed?F=S;H{8H&|7CfFz*<*o_Hiz^f_@dRo&B0?{B6?Oc7c|i{kFoFicj*y>^;wH%IzMoR~ zc~TF*h#g9pprn_bb#ebL=`%YZH>CjGwLs`rV)P@u4-DM^vwxTL#vf-u(z#bDL685P z7ytkO00000005B^x)pf-UlqIQm#?m_SF6>{^>usi-k{y=ash<>yeeun(<)7=0D^v* zZ+YE+-n%y#+CW_>JyQ!ZfS_OH>tb!lSM9xfgVKIJ-Bm;w3_L<_a^wH@cAej~_wEgb zHgLX$3LxmyeC^2Jw)gH0`uR%x{j{$Jrn_t4roDG>@SyE+DjlIr2texZ?mh26wD;}} zO8a|TkZXxFm0002Mf5|^7PKDwj?++*d0000< KMNUMnLSTZqD{V6X delta 1393 zcmV-%1&;c=3#ki`B!8k%OjJd{z`$f=WPyQ!C@3iZ001*H|1?Y zH!;XFku+fHhA%;2f6Wlx8S76AJQGP}D8$54BnQ$CF8&`(som?xyHbiFhO1;6_W(l9gcm``c6j@w{hV_~x44XFkXWXj22 zamwpCH9HKdM9+kFa-rG+@k31j{!Z)(ti|?DFu};J#zY^ne+Bw~%|%c8wfGylYBi0h z8auKB|24@d(xPLS5rIoFm+SrN{A+#ySC;B;>Do-;000A-NklSyS6U5QLFe zlGjMcrU)3t;Rp#iAt(9&e=U2+f(K^C(pn`g^k@62G47t0WIRQ|!2tjOOoZeKV|(dC zGJ8UV36j~sQi2d-Q1@d zAo>R6h9VCTeFF%900Rez{b!+B+&_*s0g?m(#v=9)H1U6=1ONa400004Fz!}C*7FuB zK+t}Ecs-xb=X`({&;YZ4A78f(_!6i9FQ9>D2-DPGf5$n%zJS_ZCdSe8`L+ToK=ciS z8b}gRcWX0B*V^0-qXihd0RR9100000002aa^r?SnebLfS7k7{Op(D=(UH8-%N-5(` zkpTpKDh<#91YO*}+X>p2=Ni~W=Nd3GW*gx2sWdS3IY3V^R1ZIdUP1%&+_pgIJ6?tQ z>WgBbf6aU~8NjN_eARRtX#9~4*o2yCKr*0po@MsV>Y6+UyhuLZcqg+P$0jdB4h8?T}REbTA$E+^c;e_jI66K+&SS3-cyJd$LvL&zIo4w0P# z(1(x>kPUkh4;vtJH@bn@Y<6^HAN_P|aF+nwA*MLJ)b2Lq`v7ksR4-F^;~SXS5%<%l za1{z`0000000000005B^x)oTpjH7#lMZpJ15;}n0sBi}C>Uu!k87$JY-~uGa$H|l% ze<ftA`LkSa< z^t`toyq{m$0l6s!=&l7qw-Tf8>3v}A1_Ji;tv}9yq;pp(L685P7ytkO00000005B^ zx)pf*uZsQjlQ*Yl>-GBl?5w+YZ_sXbf4Km{eqNQ8T4|N0Q~*IgsTZmn zovk+p{d}eUemYbGSKD*oyt{XAaHs8YDjh^Q?ai%yeCqDq8w_tCb2lykqo05F4Sf09-TR|KX@AdMg)$+4pno&t|9*FQcX!|2 z`=h}T--&qpoc@)k-|{b>v&F38^N~f|I*jw!Tav@w9?f)meZx*h^0Z{e(_iPl?+amI Gum%9P&mj8% literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/alarm_red.gif b/nano/images/status_icons/alarm_red.gif new file mode 100644 index 0000000000000000000000000000000000000000..327d58e4db8acf03e219e09ace17c6f1f990f499 GIT binary patch literal 163 zcmZ?wbhEHb6k`x$SjfO&!NBl?f#JY`0}KodivPL&TtkAL9RpmA^bD98K|()SIE@&X z8FYYbpawAp1}4op{VPwu z9gsXo3j>qGoc@)k-|laiBP6A;iLESQZs9fdE`gn;8fkWGK5X@y)0gnV&)mlFMPK)y dJkk3GD#0FQM`JW^Mtrhj=MufRCyI-~8UX$-DMkPQ literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/downloader_running.gif b/nano/images/status_icons/downloader_running.gif new file mode 100644 index 0000000000000000000000000000000000000000..68fb977c86dda6273d7fbd853b86ca38375891b2 GIT binary patch literal 574 zcmZ?wbhEHb6k`x$SjfP@V8L+UzyXFIKo*1Ie{Mh5kYH!W09PYD17=2$&`%alE(T@> z9gsXo3j>qvoc@)k-|laiBP6A;iLET)R_h~=Y0o;By*jn+owOJ>9m=RW66O|OWA74h zEd}Y|KK{w)`nOoDHmPCNx3e^3MNlw1SYPk+U;jj~S*eXvYtx$-T+f^X?*g@+`~Hvr ziYQjA_3-Q8d}^(=waC@4|M+>h+K(hMVsnBCAtSzs1pCZ=|HsTbplx#B#||H@=_i@6 z8DvScK^{p97bLw{HAiD|-)GKVD{io9Ul>uM&z5A<0#03AzH(Mc%dwY>85pbqqOR3W literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/ntnrc_idle.gif b/nano/images/status_icons/ntnrc_idle.gif new file mode 100644 index 0000000000000000000000000000000000000000..d47c01d580080e8e614de62448815b87705a122f GIT binary patch literal 113 zcmZ?wbhEHb6k`x$n8?7uV8L+UzyTl)1d9K;{aizWogD*Qjr0td89_onSvZXtm>6_G z@*ph?O!`y$SDt>$zc^;Wt!~{*{n8&Ar)bngYlhsO6~oo#^kK@TOEwR;%O1S>ei3K; KkwqIB7_0$IQY1tG literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/ntnrc_new.gif b/nano/images/status_icons/ntnrc_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..af72a8b332fc4983088ccafc64593bb04294e551 GIT binary patch literal 181 zcmZ?wbhEHb6k`x$SjfP@V8L+UzyXFIKo*1Ie{Mh5kYH!W09PYD17=2$&`%alBL-#$ z9gsXo3j>q>oc@)k-|{bxS#+yg_fo&~$HpldbQvgwk|!|k#MZ@yo| T*?wfvM*L{{:helper.link('Standard', null, { "hw_netcard" : 1 }, data.hw_netcard == 1 ? 'selected' : null)}}

+
{{:helper.link('Advanced', null, { "hw_netcard" : 2 }, data.hw_netcard == 2 ? 'selected' : null)}} {{if data.devtype != 2}} +
Processor Unit: + {{:helper.link('Standard', null, { "hw_cpu" : 1 }, data.hw_cpu == 1 ? 'selected' : null)}} + {{:helper.link('Advanced', null, { "hw_cpu" : 2 }, data.hw_cpu == 2 ? 'selected' : null)}}
Tesla Relay: {{:helper.link('None', null, { "hw_tesla" : 0 }, data.hw_tesla == 0 ? 'selected' : null)}} @@ -50,6 +54,7 @@ Battery allows your device to operate without external utility power source. Advanced batteries increase battery life.
Hard Drive stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.
Network Card allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.
+ Processor Unit is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.
Tesla Relay is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.
Nano Printer is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.
Card Reader adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards. diff --git a/nano/templates/layout_default.tmpl b/nano/templates/layout_default.tmpl index a5fd6f5804b..53701e30307 100644 --- a/nano/templates/layout_default.tmpl +++ b/nano/templates/layout_default.tmpl @@ -17,6 +17,9 @@ {{if data.PC_stationtime}}
{{:data.PC_stationtime}} {{/if}} + {{for data.PC_programheaders}} + + {{/for}}
@@ -25,6 +28,7 @@ {{:helper.link('Shutdown', null, {'PC_shutdown' : 1})}} {{if data.PC_showexitprogram}} {{:helper.link('Exit Program', null, {'PC_exit' : 1})}} + {{:helper.link('Minimize Program', null, {'PC_minimize' : 1})}} {{/if}} From 409a832646d23b975079c67e43f9c4736b3e71e0 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Fri, 8 Jan 2016 01:55:56 +0100 Subject: [PATCH 53/55] Fixes #11931 + Design bug - NTNRC conversations are now rather matched by Unique ID that's assigned on New(), rather than name. This has a nice side effect of being able to have conversations that share names. - Tweaks design datums a bit. Renames "processor unit" to "computer processor unit", etc. since i noticed telecomms machine already uses "processor unit" name. Also corrects duplicated ID. --- .../modular_computers/NTNet/NTNRC/conversation.dm | 5 +++++ .../file_system/programs/ntnrc_client.dm | 6 +++--- code/modules/research/designs.dm | 10 +++++----- nano/templates/ntnet_chat.tmpl | 2 +- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm index 3162c94221a..81f2025aea2 100644 --- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -1,4 +1,7 @@ +var/global/ntnrc_uid = 0 + /datum/ntnet_conversation/ + var/id = null var/title = "Untitled Conversation" var/datum/computer_file/program/chatclient/operator // "Administrator" of this channel. Creator starts as channel's operator, var/list/messages = list() @@ -6,6 +9,8 @@ var/password /datum/ntnet_conversation/New() + id = ntnrc_uid + ntnrc_uid++ if(ntnet_global) ntnet_global.chat_channels.Add(src) ..() diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index 9f7efb5449f..431b08c10b5 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -32,8 +32,7 @@ if(href_list["PRG_joinchannel"]) var/datum/ntnet_conversation/C for(var/datum/ntnet_conversation/chan in ntnet_global.chat_channels) - world << "DEBUG L35/NTNRC_CLIENT.DM: \"[href_list["PRG_joinchannel"]]\" / \"[chan.title]\"" - if(chan.title == href_list["PRG_joinchannel"]) + if(chan.id == text2num(href_list["PRG_joinchannel"])) C = chan break @@ -205,7 +204,8 @@ for(var/datum/ntnet_conversation/conv in ntnet_global.chat_channels) if(conv && conv.title) all_channels.Add(list(list( - "chan" = conv.title + "chan" = conv.title, + "id" = conv.id ))) data["all_channels"] = all_channels diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index a9a264ec48d..cf55081eaa9 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -917,7 +917,7 @@ other types of metals and chemistry for reagents). sort_string = "VBAAU" /datum/design/item/modularcomponent/cpu/ - name = "processor unit" + name = "computer processor unit" id = "cpu_normal" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) build_type = IMPRINTER @@ -927,7 +927,7 @@ other types of metals and chemistry for reagents). sort_string = "VBAAV" /datum/design/item/modularcomponent/cpu/small - name = "microprocessor unit" + name = "computer microprocessor unit" id = "cpu_small" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) build_type = IMPRINTER @@ -937,7 +937,7 @@ other types of metals and chemistry for reagents). sort_string = "VBAAW" /datum/design/item/modularcomponent/cpu/photonic - name = "photonic processor unit" + name = "computer photonic processor unit" id = "pcpu_normal" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 4) build_type = IMPRINTER @@ -947,8 +947,8 @@ other types of metals and chemistry for reagents). sort_string = "VBAAX" /datum/design/item/modularcomponent/cpu/photonic/small - name = "photonic processor unit" - id = "pcpu_normal" + name = "computer photonic microprocessor unit" + id = "pcpu_small" req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 16000, glass = 4000) diff --git a/nano/templates/ntnet_chat.tmpl b/nano/templates/ntnet_chat.tmpl index 6424e073e25..592b6481770 100644 --- a/nano/templates/ntnet_chat.tmpl +++ b/nano/templates/ntnet_chat.tmpl @@ -60,7 +60,7 @@ Available channels: {{for data.all_channels}} -
{{:helper.link(value.chan, null, {'PRG_joinchannel' : value.chan})}}
+
{{:helper.link(value.chan, null, {'PRG_joinchannel' : value.id})}}
{{/for}}
{{/if}} \ No newline at end of file From 4de4cac9be2b8fd4fc5ea13b6281c53357b36cce Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 8 Jan 2016 09:08:44 +0300 Subject: [PATCH 54/55] Makes inventory slots forward clicks to items in them. In effect that means you don't have to pixelhunt item in the slot, just click the slot. Smoking cigs is easy mode now. --- code/modules/mob/inventory.dm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index e1061b09958..1cf2f4319ee 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -1,7 +1,13 @@ //This proc is called whenever someone clicks an inventory ui slot. /mob/proc/attack_ui(slot) var/obj/item/W = get_active_hand() - if(istype(W)) + var/obj/item/E = get_equipped_item(slot) + if (istype(E)) + if(istype(W)) + E.attackby(W,src) + else + E.attack_hand(src) + else equip_to_slot_if_possible(W, slot) /mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, del_on_fail = 0, disable_warning = 1, redraw_mob = 1) @@ -186,7 +192,7 @@ var/list/slot_equipment_priority = list( \ wear_mask = null update_inv_wear_mask(0) return - + /mob/proc/isEquipped(obj/item/I) if(!I) return 0 From 5e1629768dbf9074f8f6d842ae148c33ef702673 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Fri, 8 Jan 2016 01:27:47 -0500 Subject: [PATCH 55/55] Unit Tests: Disables asteroid generation. Speeds the startup by 60 seconds. Unable to test the asteroid for a vacuum though. --- code/unit_tests/unit_test.dm | 4 +++- code/unit_tests/zas_tests.dm | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index e8a413f07f9..dac62a552eb 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -67,10 +67,12 @@ datum/unit_test/proc/check_result() proc/load_unit_test_changes() - +/* + //This takes about 60 seconds to run on Travis and is only used for the ZAS vacume check on The Asteroid. if(config.generate_asteroid != 1) log_unit_test("Overiding Configuration option for Asteroid Generation to ENABLED") config.generate_asteroid = 1 // The default map requires it, the example config doesn't have this enabled. + */ diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm index e39ead59a0e..8d1d04f64ee 100644 --- a/code/unit_tests/zas_tests.dm +++ b/code/unit_tests/zas_tests.dm @@ -133,7 +133,7 @@ datum/unit_test/zas_area_test/incinerator name = "ZAS: Incinerator" area_path = /area/maintenance/incinerator disabled = 1 - why_disabled = "Failing currently for existing bug: #11846" + why_disabled = "Incernator blast doors not blocking air flow. See bug #11846" datum/unit_test/zas_area_test/virology name = "ZAS: Virology" @@ -151,11 +151,14 @@ datum/unit_test/zas_area_test/west_hall_mining_outpost name = "ZAS: Mining outpost West Hallway" area_path = /area/outpost/mining_main/west_hall +/* datum/unit_test/zas_area_test/mining_area name = "ZAS: Mining Area (Vacuum)" area_path = /area/mine/explored expectation = UT_VACUUM - + disabled = 1 + why_disabled = "Asteroid Generation disabled" + */ datum/unit_test/zas_area_test/ name = "ZAS: Cargo Bay" area_path = /area/quartermaster/storage