diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index c0dc87b1c0d..ca8b9bc8795 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -523,13 +523,11 @@ I = U.hastie if(I.icon_action_button) var/obj/screen/item_action/A = new(hud_used) - + //A.icon = 'icons/mob/screen1_action.dmi' //A.icon_state = I.icon_action_button - A.icon = ui_style2icon(client.prefs.UI_style) A.icon_state = "template" - var/image/img = image(I.icon, A, I.icon_state) img.pixel_x = 0 img.pixel_y = 0 @@ -540,9 +538,7 @@ else A.name = "Use [I.name]" A.owner = I - hud_used.item_action_list += A - switch(num) if(1) A.screen_loc = ui_action_slot1 @@ -554,16 +550,6 @@ A.screen_loc = ui_action_slot4 if(5) A.screen_loc = ui_action_slot5 - if(6) - A.screen_loc = ui_action_slot6 - if(7) - A.screen_loc = ui_action_slot7 - if(8) - A.screen_loc = ui_action_slot8 - if(9) - A.screen_loc = ui_action_slot9 - if(10) - A.screen_loc = ui_action_slot10 break //5 slots available, so no more can be added. num++ - src.client.screen += src.hud_used.item_action_list + src.client.screen += src.hud_used.item_action_list \ No newline at end of file diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm index 2d4796309e4..9766d356232 100644 --- a/code/datums/spells/horsemask.dm +++ b/code/datums/spells/horsemask.dm @@ -22,6 +22,9 @@ return var/mob/living/carbon/target = targets[1] + + if(!target) + return if(!(target.type in compatible_mobs)) user << "It'd be stupid to curse [target] with a horse's head!" diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm index c19cb43be7b..c905bf88a97 100644 --- a/code/datums/spells/mind_transfer.dm +++ b/code/datums/spells/mind_transfer.dm @@ -10,14 +10,12 @@ range = 1 cooldown_min = 200 //100 deciseconds reduction per rank var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell - var/list/compatible_mobs = list(/mob/living/carbon/human,/mob/living/carbon/monkey) //which types of mobs are affected by the spell. NOTE: change at your own risk var/base_spell_loss_chance = 20 //base probability of the wizard losing a spell in the process var/spell_loss_chance_modifier = 7 //amount of probability of losing a spell added per spell (mind_transfer included) var/spell_loss_amount = 1 //the maximum amount of spells possible to lose during a single transfer var/msg_wait = 500 //how long in deciseconds it waits before telling that body doesn't feel right or mind swap robbed of a spell var/paralysis_amount_caster = 20 //how much the caster is paralysed for after the spell var/paralysis_amount_victim = 20 //how much the victim is paralysed for after the spell - icon_power_button = "spell_mind" /* @@ -40,12 +38,8 @@ Also, you never added distance checking after target is selected. I've went ahea user << "They are too far away!" return - if(!(target.type in compatible_mobs)) - user << "Their mind isn't compatible with yours." - return - if(target.stat == DEAD) - user << "You didn't study necromancy back at the Space Wizard Federation academy." + user << "You don't particularly want to be dead." return if(!target.key || !target.mind) diff --git a/code/datums/wires/autolathe.dm b/code/datums/wires/autolathe.dm index e382ce620f1..77a8ce6c03c 100644 --- a/code/datums/wires/autolathe.dm +++ b/code/datums/wires/autolathe.dm @@ -27,7 +27,7 @@ var/const/AUTOLATHE_DISABLE_WIRE = 4 var/obj/machinery/autolathe/A = holder switch(index) if(AUTOLATHE_HACK_WIRE) - A.hacked = !mended + A.adjust_hacked(!mended) if(AUTOLATHE_SHOCK_WIRE) A.shocked = !mended if(AUTOLATHE_DISABLE_WIRE) @@ -39,10 +39,10 @@ var/const/AUTOLATHE_DISABLE_WIRE = 4 var/obj/machinery/autolathe/A = holder switch(index) if(AUTOLATHE_HACK_WIRE) - A.hacked = !A.hacked + A.adjust_hacked(!A.hacked) spawn(50) if(A && !IsIndexCut(index)) - A.hacked = 0 + A.adjust_hacked(0) Interact(usr) if(AUTOLATHE_SHOCK_WIRE) A.shocked = !A.shocked diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 2cf5b94c1df..f79374021d3 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -685,7 +685,7 @@ var/list/datum/dna/hivemind_bank = list() /mob/proc/changeling_hivedownload() set category = "Changeling" set name = "Hive Absorb (20)" - set desc = "Allows you to absorb DNA that is being channeled in the airwaves." + set desc = "Allows you to absorb DNA that is being channelled in the airwaves." var/datum/changeling/changeling = changeling_power(20,1) if(!changeling) return diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 0d361ca233c..efb7538cdb0 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -406,6 +406,7 @@ spellname = "mindswap" icon_state ="bookmindswap" desc = "This book's cover is pristine, though its pages look ragged and torn." + var/mob/stored_swap = null //Used in used book recoils to store an identity for mindswaps /obj/item/weapon/spellbook/oneuse/mindswap/onlearned() spellname = pick("fireball","smoke","blind","forcewall","knock","horses","charge") @@ -415,8 +416,45 @@ /obj/item/weapon/spellbook/oneuse/mindswap/recoil(mob/user as mob) ..() - user <<"You suddenly don't feel like yourself!" - wabbajack(user) + if(stored_swap in dead_mob_list) + stored_swap = null + if(!stored_swap) + stored_swap = user + user <<"For a moment you feel like you don't even know who you are anymore." + return + if(stored_swap == user) + user <<"You stare at the book some more, but there doesn't seem to be anything else to learn..." + return + + if(user.mind.special_verbs.len) + for(var/V in user.mind.special_verbs) + user.verbs -= V + + if(stored_swap.mind.special_verbs.len) + for(var/V in stored_swap.mind.special_verbs) + stored_swap.verbs -= V + + var/mob/dead/observer/ghost = stored_swap.ghostize(0) + ghost.spell_list = stored_swap.spell_list + + user.mind.transfer_to(stored_swap) + stored_swap.spell_list = user.spell_list + + if(stored_swap.mind.special_verbs.len) + for(var/V in user.mind.special_verbs) + user.verbs += V + + ghost.mind.transfer_to(user) + user.key = ghost.key + user.spell_list = ghost.spell_list + + if(user.mind.special_verbs.len) + for(var/V in user.mind.special_verbs) + user.verbs += V + + stored_swap <<"You're suddenly somewhere else... and someone else?!" + user <<"Suddenly you're staring at [src] again... where are you, who are you?!" + stored_swap = null /obj/item/weapon/spellbook/oneuse/forcewall spell = /obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/forcewall diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index ace660697bf..7afabaa849d 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -36,7 +36,7 @@ _color = "blue" can_label = 0 /obj/machinery/portable_atmospherics/canister/toxins - name = "Canister \[Toxin (Bio)\]" + name = "Canister \[Toxin (Plasma)\]" icon_state = "orange" _color = "orange" can_label = 0 @@ -336,7 +336,7 @@ update_flag "\[N2O\]" = "redws", \ "\[N2\]" = "red", \ "\[O2\]" = "blue", \ - "\[Toxin (Bio)\]" = "orange", \ + "\[Toxin (Plasma)\]" = "orange", \ "\[CO2\]" = "black", \ "\[Air\]" = "grey", \ "\[CAUTION\]" = "yellow", \ diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 94e3e75a1ea..f834719c9e0 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -10,6 +10,7 @@ var/processing = 0 var/obj/item/weapon/reagent_containers/glass/beaker = null var/points = 0 + var/in_beaker = 1 var/menustat = "menu" var/efficiency = 0 var/productivity = 0 @@ -137,11 +138,12 @@ menustat = "menu" if(beaker) dat += "
Biomass: [points] units.

" - dat += "ActivateDetach Container" + dat += "ActivateDetach Container
" + dat += "Put fertilizer in: [in_beaker ? "Beaker" : "Bottle"]" dat += "

Food:

" dat += "
" dat += "10 milk: Make ([20/efficiency])
" - /*dat += "10 cream: Make ([30/efficiency])
"*/ + dat += "10 cream: Make ([30/efficiency])
" dat += "Monkey cube: Make ([250/efficiency])" dat += "
" dat += "

Nutrients:

" @@ -153,14 +155,14 @@ dat += "

Leather:

" dat += "
" dat += "Wallet: Make ([100/efficiency])
" - /*dat += "Book bag: Make ([200/efficiency])
" + dat += "Book bag: Make ([200/efficiency])
" dat += "Plant bag: Make ([200/efficiency])
" - dat += "Mining satchel: Make ([200/efficiency])
"*/ + dat += "Mining satchel: Make ([200/efficiency])
" dat += "Botanical gloves: Make ([250/efficiency])
" dat += "Utility belt: Make ([300/efficiency])
" dat += "Leather Satchel: Make ([400/efficiency])
" dat += "Cash Bag: Make ([400/efficiency])
" - /*dat += "Leather Jacket: Make ([500/efficiency])
"*/ + dat += "Leather Jacket: Make ([500/efficiency])
" //dat += "

Other:

" //dat += "Monkey: Make ([400/efficiency])
" dat += "
" @@ -225,26 +227,38 @@ if(check_container_volume(10)) return 0 else if (check_cost(20/efficiency)) return 0 else beaker.reagents.add_reagent("milk",10) - /*if("cream") + if("cream") if(check_container_volume(10)) return 0 else if (check_cost(30/efficiency)) return 0 - else beaker.reagents.add_reagent("cream",10)*/ + else beaker.reagents.add_reagent("cream",10) if("meat") if (check_cost(250/efficiency)) return 0 else new/obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc) if("ez") if (check_cost(10/efficiency)) return 0 - else new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc) + if(in_beaker) + if(check_container_volume(10)) return 0 + else beaker.reagents.add_reagent("eznutrient",10) + else + new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc) if("l4z") if (check_cost(20/efficiency)) return 0 - else new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc) + if(in_beaker) + if(check_container_volume(10)) return 0 + else beaker.reagents.add_reagent("left4zed",10) + else + new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc) if("rh") if (check_cost(25/efficiency)) return 0 - else new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc) + if(in_beaker) + if(check_container_volume(10)) return 0 + else beaker.reagents.add_reagent("robustharvest",10) + else + new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc) if("wallet") if (check_cost(100/efficiency)) return 0 else new/obj/item/weapon/storage/wallet(src.loc) - /*if("bkbag") + if("bkbag") if (check_cost(200/efficiency)) return 0 else new/obj/item/weapon/storage/bag/books(src.loc) if("ptbag") @@ -252,7 +266,7 @@ else new/obj/item/weapon/storage/bag/plants(src.loc) if("mnbag") if (check_cost(200/efficiency)) return 0 - else new/obj/item/weapon/storage/bag/ore(src.loc)*/ + else new/obj/item/weapon/storage/bag/ore(src.loc) if("gloves") if (check_cost(250/efficiency)) return 0 else new/obj/item/clothing/gloves/botanic_leather(src.loc) @@ -265,9 +279,9 @@ if("cashbag") if (check_cost(400/efficiency)) return 0 else new/obj/item/weapon/storage/bag/cash(src.loc) - /*if("jacket") + if("jacket") if (check_cost(500/efficiency)) return 0 - else new/obj/item/clothing/suit/jacket/leather(src.loc)*/ + else new/obj/item/clothing/suit/jacket/leather(src.loc) //if("monkey") // if (check_cost(500)) return 0 // else new/mob/living/carbon/monkey(src.loc) @@ -309,4 +323,8 @@ else if(href_list["menu"]) menustat = "menu" + updateUsrDialog() + + else if(href_list["inbeaker"]) + in_beaker = !in_beaker updateUsrDialog() \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 90b0b268a22..3fa71922efd 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -9,6 +9,7 @@ * Mining Satchel * Plant Bag * Sheet Snatcher + * Book Bag * * -Sayu */ @@ -307,3 +308,19 @@ w_class = 1 can_hold = list("/obj/item/weapon/coin","/obj/item/weapon/spacecash") + +// ----------------------------- +// Book bag +// ----------------------------- + +/obj/item/weapon/storage/bag/books + name = "book bag" + desc = "A bag for books." + icon = 'icons/obj/library.dmi' + icon_state = "bookbag" + display_contents_with_number = 0 //This would look really stupid otherwise + storage_slots = 7 + max_combined_w_class = 21 + max_w_class = 3 + w_class = 4 //Bigger than a book because physics + can_hold = list(/obj/item/weapon/book, /obj/item/weapon/spellbook) //No bibles, consistent with bookcase diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 76aa2126475..bf36677777a 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -56,8 +56,8 @@ return /obj/item/weapon/storage/firstaid/toxin - name = "toxin first aid" - desc = "Used to treat when you have a high amoutn of toxins in your body." + name = "toxin first aid kit" + desc = "Used to treat when you have a high amounts of toxins in your body." icon_state = "antitoxin" item_state = "firstaid-toxin" @@ -77,7 +77,7 @@ return /obj/item/weapon/storage/firstaid/o2 - name = "oxygen deprivation first aid" + name = "oxygen deprivation first aid kit" desc = "A box full of oxygen goodies." icon_state = "o2" item_state = "firstaid-o2" diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index cdf0cbc0156..5294334d070 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -68,6 +68,8 @@ new /obj/item/clothing/under/color/black(src) new /obj/item/clothing/under/color/black(src) new /obj/item/clothing/under/color/black(src) + if(prob(25)) + new /obj/item/clothing/suit/jacket/leather(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index fbfb77cdc9d..0b9570bbb5c 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -414,6 +414,11 @@ item_state = "bomber" flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|ARMS + +/obj/item/clothing/suit/jacket/leather + name = "leather jacket" + desc = "Pompadour not included." + icon_state = "leatherjacket" /obj/item/clothing/suit/officercoat name = "Clown Officer's Coat" diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index bffc9143707..54361ed3d36 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -17,119 +17,122 @@ mecha = null//This does not appear to be used outside of reference in mecha.dm. - attack_self(mob/user as mob) - if(brainmob && !brainmob.key && searching == 0) - //Start the process of searching for a new user. - user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process." - icon_state = "posibrain-searching" - ghost_volunteers.Cut() - src.searching = 1 - src.request_player() - spawn(600) - if(ghost_volunteers.len) - var/mob/dead/observer/O = pick(ghost_volunteers) - if(istype(O) && O.client && O.key) - transfer_personality(O) - reset_search() +/obj/item/device/mmi/posibrain/attack_self(mob/user as mob) + if(brainmob && !brainmob.key && searching == 0) + //Start the process of searching for a new user. + user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process." + icon_state = "posibrain-searching" + ghost_volunteers.Cut() + src.searching = 1 + src.request_player() + spawn(600) + if(ghost_volunteers.len) + var/mob/dead/observer/O = pick(ghost_volunteers) + if(istype(O) && O.client && O.key) + transfer_personality(O) + reset_search() - proc/request_player() - for(var/mob/dead/observer/O in player_list) - if(O.client && O.client.prefs.be_special & BE_PAI) - if(check_observer(O)) - O << "\blue \A [src] has been activated. (Teleport | Sign Up)" - //question(O.client) +/obj/item/device/mmi/posibrain/proc/request_player() + for(var/mob/dead/observer/O in player_list) + if(O.client && O.client.prefs.be_special & BE_PAI) + if(check_observer(O)) + O << "\blue \A [src] has been activated. (Teleport | Sign Up)" + //question(O.client) - proc/check_observer(var/mob/dead/observer/O) - if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) - return 0 - if(jobban_isbanned(O, "pAI")) - return 0 - if(O.client) - return 1 +/obj/item/device/mmi/posibrain/proc/check_observer(var/mob/dead/observer/O) + if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) return 0 + if(jobban_isbanned(O, "pAI")) + return 0 + if(O.client) + return 1 + return 0 - proc/question(var/client/C) - spawn(0) - if(!C) return - var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round") - if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located. - if(response == "Yes") - transfer_personality(C.mob) - else if (response == "Never for this round") - C.prefs.be_special ^= BE_PAI +/obj/item/device/mmi/posibrain/proc/question(var/client/C) + spawn(0) + if(!C) return + var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round") + if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located. + if(response == "Yes") + transfer_personality(C.mob) + else if (response == "Never for this round") + C.prefs.be_special ^= BE_PAI - transfer_identity(var/mob/living/carbon/H) - name = "positronic brain ([H])" - brainmob.name = H.real_name - brainmob.real_name = H.real_name - brainmob.dna = H.dna - brainmob.timeofhostdeath = H.timeofdeath - brainmob.stat = 0 - if(brainmob.mind) - brainmob.mind.assigned_role = "Positronic Brain" - if(H.mind) - H.mind.transfer_to(brainmob) - brainmob << "\blue You feel slightly disoriented. That's normal when you're just a metal cube." - icon_state = "posibrain-occupied" +/obj/item/device/mmi/posibrain/transfer_identity(var/mob/living/carbon/H) + name = "positronic brain ([H])" + brainmob.name = H.real_name + brainmob.real_name = H.real_name + brainmob.dna = H.dna + brainmob.timeofhostdeath = H.timeofdeath + brainmob.stat = 0 + if(brainmob.mind) + brainmob.mind.assigned_role = "Positronic Brain" + if(H.mind) + H.mind.transfer_to(brainmob) + brainmob << "\blue You feel slightly disoriented. That's normal when you're just a metal cube." + icon_state = "posibrain-occupied" + return + +/obj/item/device/mmi/posibrain/proc/transfer_personality(var/mob/candidate) + src.searching = 0 + src.brainmob.mind = candidate.mind + //src.brainmob.key = candidate.key + src.brainmob.ckey = candidate.ckey + src.name = "positronic brain ([src.brainmob.name])" + + src.brainmob << "You are a positronic brain, brought into existence on [station_name()]." + src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI." + src.brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." + src.brainmob << "Use say :b to speak to other artificial intelligences." + src.brainmob.mind.assigned_role = "Positronic Brain" + + var/turf/T = get_turf_or_move(src.loc) + for (var/mob/M in viewers(T)) + M.show_message("\blue The positronic brain chimes quietly.") + icon_state = "posibrain-occupied" + +/obj/item/device/mmi/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. + if(src.brainmob && src.brainmob.key) return + + src.searching = 0 + icon_state = "posibrain" + + var/turf/T = get_turf_or_move(src.loc) + for (var/mob/M in viewers(T)) + M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + +/obj/item/device/mmi/posibrain/Topic(href,href_list) + if("signup" in href_list) + var/mob/dead/observer/O = locate(href_list["signup"]) + if(!O) return + volunteer(O) + +/obj/item/device/mmi/posibrain/proc/volunteer(var/mob/dead/observer/O) + if(!searching) + O << "Not looking for a ghost, yet." return - - proc/transfer_personality(var/mob/candidate) - - src.searching = 0 - src.brainmob.mind = candidate.mind - //src.brainmob.key = candidate.key - src.brainmob.ckey = candidate.ckey - src.name = "positronic brain ([src.brainmob.name])" - - src.brainmob << "You are a positronic brain, brought into existence on [station_name()]." - src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI." - src.brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." - src.brainmob << "Use say :b to speak to other artificial intelligences." - src.brainmob.mind.assigned_role = "Positronic Brain" - - var/turf/T = get_turf_or_move(src.loc) - for (var/mob/M in viewers(T)) - M.show_message("\blue The positronic brain chimes quietly.") - icon_state = "posibrain-occupied" - - proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. - - if(src.brainmob && src.brainmob.key) return - - src.searching = 0 - icon_state = "posibrain" - - var/turf/T = get_turf_or_move(src.loc) - for (var/mob/M in viewers(T)) - M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") - - Topic(href,href_list) - if("signup" in href_list) - var/mob/dead/observer/O = locate(href_list["signup"]) - if(!O) return - volunteer(O) - - proc/volunteer(var/mob/dead/observer/O) - if(!searching) - O << "Not looking for a ghost, yet." - return - if(!istype(O)) - O << "\red NO." - return - if(O in ghost_volunteers) - O << "\blue Removed from registration list." - ghost_volunteers.Remove(O) - return - if(!check_observer(O)) - O << "\red You cannot be \a [src]." - return - O.<< "\blue You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer." - ghost_volunteers.Add(O) + if(!istype(O)) + O << "\red Error." + return + if(O in ghost_volunteers) + O << "\blue Removed from registration list." + ghost_volunteers.Remove(O) + return + if(!check_observer(O)) + O << "\red You cannot be \a [src]." + return + if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + O << "\red Upon using the antagHUD you forfeited the ability to join the round." + return + if(jobban_isbanned(O, "pAI")) + O << "\red You are job banned from this role." + return + O.<< "\blue You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer." + ghost_volunteers.Add(O) /obj/item/device/mmi/posibrain/examine() - set src in oview() if(!usr || !src) return diff --git a/code/modules/mob/living/carbon/human/hud.dm b/code/modules/mob/living/carbon/human/hud.dm index c81f38fd1c2..fb462846e8e 100644 --- a/code/modules/mob/living/carbon/human/hud.dm +++ b/code/modules/mob/living/carbon/human/hud.dm @@ -525,43 +525,4 @@ src.hud_used.hotkey_ui_hidden = 0 else client.screen -= src.hud_used.hotkeybuttons - src.hud_used.hotkey_ui_hidden = 1 - - -/mob/living/carbon/human/update_action_buttons() - var/num = 1 - if(!src.hud_used) return - if(!src.client) return - - if(!hud_used.hud_shown) //Hud toggled to minimal - return - - src.client.screen -= src.hud_used.item_action_list - hud_used.item_action_list = list() - - for(var/obj/item/I in src) - if(I.icon_action_button) - var/obj/screen/item_action/A = new(src.hud_used) - A.icon = 'icons/mob/screen1_action.dmi' - A.icon_state = I.icon_action_button - if(I.action_button_name) - A.name = I.action_button_name - else - A.name = "Use [I.name]" - A.owner = I - hud_used.item_action_list += A - switch(num) - if(1) - A.screen_loc = ui_action_slot1 - if(2) - A.screen_loc = ui_action_slot2 - if(3) - A.screen_loc = ui_action_slot3 - if(4) - A.screen_loc = ui_action_slot4 - if(5) - A.screen_loc = ui_action_slot5 - break //5 slots available, so no more can be added. - num++ - - src.client.screen += src.hud_used.item_action_list \ No newline at end of file + src.hud_used.hotkey_ui_hidden = 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index b03f75a168e..e5dc9f519a4 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -17,13 +17,17 @@ var/datum/organ/external/H = organs_by_name["head"] if (!H.amputated) if ((health >= (config.health_threshold_dead/100*75)) && stat == DEAD) //need to get them 25% away from death point before reviving them + mob_list -= src dead_mob_list -= src living_mob_list += src + mob_list += src stat = CONSCIOUS ear_deaf = 0 if (stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix + mob_list -= src dead_mob_list -= src - living_mob_list += src + living_mob_list += src + mob_list += src ear_deaf = 0 return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 5c63753a382..68a5546e4da 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -103,7 +103,7 @@ if(istype(src,/mob/dead/observer)) var/mob/dead/observer/G = src if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted) - usr << "\blue Upon using the antagHUD you forfeighted the ability to join the round." + usr << "\blue Upon using the antagHUD you forfeited the ability to join the round." return var/deathtimeminutes = round(deathtime / 600) diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index f3dc453accc..99890d48df0 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index fc5eec635a0..734f32f1752 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 6a505eb8523..77dde9413fc 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 606deaeefea..1c405908b43 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm index 859e9d188b4..5a4eb7d743a 100644 --- a/maps/cyberiad.dmm +++ b/maps/cyberiad.dmm @@ -2616,7 +2616,7 @@ "aYp" = (/obj/machinery/seed_extractor,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aYq" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aYr" = (/obj/machinery/vending/hydroseeds,/obj/machinery/camera{c_tag = "Hydroponics North"; network = list("SS13")},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) -"aYs" = (/obj/machinery/biogenerator,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"aYs" = (/obj/machinery/biogenerator,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aYt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/requests_console{department = "Hydroponics"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aYu" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aYv" = (/obj/structure/bookcase{name = "bookcase (Religious)"},/obj/machinery/atmospherics/pipe/simple{_color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/turf/simulated/floor/wood,/area/library) @@ -3571,7 +3571,7 @@ "bqI" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{dir = 2; id = "mechbay"; name = "Mech Bay"},/turf/simulated/floor{icon_state = "delivery"},/area/assembly/chargebay) "bqJ" = (/obj/machinery/computer/rdconsole/robotics,/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bqK" = (/obj/structure/table,/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics Requests Console"; pixel_y = 30},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"bqL" = (/obj/machinery/r_n_d/circuit_imprinter,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) +"bqL" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bqM" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "rdlab2"; name = "Research and Development Lab Shutters"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Research and Development Desk"; req_access_txt = "47"},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab) "bqN" = (/obj/machinery/door_control{id = "rdlab2"; name = "Research and Development Lab Shutters Control"; pixel_x = -24; pixel_y = -24; req_access_txt = "47"},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab) "bqO" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 10; icon_state = "purple"},/area/hallway/primary/starboard/east) @@ -3646,7 +3646,7 @@ "bsf" = (/turf/simulated/floor,/area/assembly/chargebay) "bsg" = (/obj/machinery/door_control{dir = 2; id = "mechbay"; name = "Mech Bay Door Control"; pixel_x = 6; pixel_y = 24; req_access_txt = "29"},/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/assembly/chargebay) "bsh" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/chargebay) -"bsi" = (/obj/machinery/power/apc{dir = 1; name = "Robotics Lab APC"; pixel_x = -25; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) +"bsi" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 8; name = "Robotics Lab APC"; pixel_x = -25},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bsj" = (/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bsk" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bsl" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk,/obj/item/weapon/disk/tech_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/reagent_containers/dropper,/obj/machinery/door_control{id = "rdlab"; name = "Research and Development Lab Shutters Control"; pixel_x = 24; pixel_y = 24; req_access_txt = "47"},/turf/simulated/floor{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab) @@ -7622,11 +7622,11 @@ "cQD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) "cQE" = (/obj/machinery/atmospherics/pipe/manifold{_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "AI Satellite Antechamber APC"; pixel_x = 25},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) "cQF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple{_color = "blue"; icon_state = "intact-b"; level = 2},/obj/machinery/light/small{dir = 4},/obj/machinery/camera/motion{c_tag = "Mini Satellite Exterior North-West"; dir = 8; network = list("SS13","MiniSat")},/turf/simulated/floor/plating,/area/aisat) -"cQG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/bot/floorbot,/turf/simulated/floor{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/turret_protected/aisat_interior) +"cQG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/bot/cleanbot{on = 0},/turf/simulated/floor{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/turret_protected/aisat_interior) "cQH" = (/obj/machinery/turret{dir = 1},/obj/machinery/ai_status_display{pixel_y = -32},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) "cQI" = (/obj/machinery/camera/motion{c_tag = "Mini Satellite Antechamber"; dir = 1; network = list("SS13","MiniSat")},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) "cQJ" = (/obj/machinery/turret{dir = 1},/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior) -"cQK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/bot/cleanbot,/turf/simulated/floor{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/turret_protected/aisat_interior) +"cQK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/bot/floorbot{on = 0},/turf/simulated/floor{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/turret_protected/aisat_interior) "cQL" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple{_color = "red"; icon_state = "intact-r"; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 8},/obj/machinery/camera/motion{c_tag = "Mini Satellite Exterior North-East"; dir = 4; network = list("SS13","MiniSat")},/turf/simulated/floor/plating,/area/aisat) "cQM" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/highsecurity{icon_state = "door_locked"; locked = 1; name = "AI Chamber"; req_access_txt = "16"},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai) "cQN" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai) @@ -8887,7 +8887,7 @@ "doU" = (/obj/structure/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "doV" = (/obj/structure/table/reinforced,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/device/multitool,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "doW" = (/obj/structure/rack,/obj/item/clothing/mask/gas/swat,/obj/item/clothing/mask/gas/swat,/obj/item/clothing/mask/gas/swat,/obj/item/clothing/mask/gas/swat,/obj/item/clothing/mask/gas/swat,/obj/item/clothing/mask/gas/swat,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"doX" = (/obj/structure/rack,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/gloves/purple,/obj/item/clothing/gloves/purple,/obj/item/clothing/gloves/purple,/obj/item/clothing/gloves/purple,/obj/item/clothing/gloves/purple,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"doX" = (/obj/structure/rack,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/gloves/purple,/obj/item/clothing/gloves/purple,/obj/item/clothing/gloves/purple,/obj/item/clothing/gloves/purple,/obj/item/clothing/gloves/purple,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "doY" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "CREED"; name = "Spec Ops Ready Room"; pixel_y = 16; req_access_txt = "108"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "ASSAULT"; name = "Mech Storage"; pixel_y = -4; req_access_txt = "108"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "WEAPONS"; name = "Armory Door"; pixel_y = 6; req_access_txt = "108"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops) "doZ" = (/obj/structure/stool/bed/chair/comfy/black{tag = "icon-comfychair_black (NORTH)"; icon_state = "comfychair_black"; dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/specops) "dpa" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1441; name = "Spec Ops Intercom"; pixel_y = 28},/obj/machinery/computer/shuttle_control{name = "gamma operations control console"; req_one_access_txt = "32"; shuttle_tag = "Gamma"},/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops) @@ -8896,7 +8896,7 @@ "dpd" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/teargas,/obj/item/weapon/melee/baton/loaded,/obj/item/device/flash,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "dpe" = (/obj/structure/rack,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "dpf" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{id_tag = "specops_centcom_dock"; pixel_y = -25; tag_door = "specops_centcom_dock_inner"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"dpg" = (/obj/structure/rack,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/shoes/galoshes,/obj/item/weapon/storage/belt/janitor,/obj/item/weapon/storage/belt/janitor,/obj/item/weapon/storage/belt/janitor,/obj/item/weapon/storage/belt/janitor,/obj/item/weapon/storage/belt/janitor,/obj/item/weapon/storage/belt/janitor,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/head/bio_hood/janitor,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"dpg" = (/obj/structure/rack,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/shoes/galoshes,/obj/item/weapon/storage/belt/janitor,/obj/item/weapon/storage/belt/janitor,/obj/item/weapon/storage/belt/janitor,/obj/item/weapon/storage/belt/janitor,/obj/item/weapon/storage/belt/janitor,/obj/item/weapon/storage/belt/janitor,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "dph" = (/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/centcom/specops) "dpi" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/centcom/specops) "dpj" = (/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/centcom/specops) @@ -12910,7 +12910,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOicOicOicOicOiaaacOicOicOicOicOiaaacOicOicOicOicOiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPWcPWcPWcPWcPWcPWcPWcPWcPWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafrcPJcQccQdcQecQecQfcQgcQhcQicQjcQjcQkcQlcQmcQncQncQocQpcPVafraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOpcOpcOpcOpcOpaaacOpcOpcOpcOpcOpaaacOpcOpcOpcOpcOpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOicOicOicOicOiaaaaaaaaaaaaaaaaaaaaacOicOicOicOicOiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPWcPWcPWcPWcPWcPWcPWcPWcPWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafrcPJcQqcQrckrckraaqcQscQtcQtcQucQtcQtcQvaaqckrckrcQwcQxcPVafraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOpcOpcOpcOpcOpaaaaaaaaaaaaaaaaaaaaacOpcOpcOpcOpcOpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPWcPWcPWcPWcPWcPWcPWcPWcPWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafrcPJcQqcPVaaaaaaaaqcQycQzcQAcQBcQCcQDcQEaaqaaaaaacPJcQxcPVafraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPWcPWcPWcPWcPWcPWcPWcPWcPWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafrcPJcQFaaqaaqaaqaaqcQGcQHcQtcQtcQIcQJcQKaaqaaqaaqaaqcQLcPVafraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPWcPWcPWcPWcPWcPWcPWcPWcPWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafrcPJcQFaaqaaqaaqaaqcQKcQHcQtcQtcQIcQJcQGaaqaaqaaqaaqcQLcPVafraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPWcPWcPWcPWcPWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafrcPJcQqcPVaaaaaaaaiafmaaiafecQMaaiaaiabnaaiaaaaaacPJcQxcPVafraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPWcPWcPWcPWcPWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafrcPJcQqcPVaaaaaaaaicQNcQOcQPcQQcQRcQScQTaaiaaaaaacPJcQxcPVafraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPWcPWcPWcPWcPWcPWcPWcPWcPWcPWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafrcPJcQqcPVaaaaaiaaicQUcQSbkxbkxbkxcQScQVaaiaaiaaacPJcQxcPVafraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa