From 91839f5f70ca9fb46441c5390a6a5391affca715 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 22 Feb 2016 00:34:59 +0100 Subject: [PATCH 1/4] Action buttons will now only update when needed instead of every Life(). The action buttons now update their icon instantly. Fixes versions of pickup(),equipped() and dropped not calling the parent. Fixes drone not being able to remove a defib from their storage. You can now cycle the mime mask by clicking it in your hand. The action buttons for hardsuit and hooded suits now only appears when you're wearing the suit. Created two mob helper procs getBeltSlot() and getBackSlot(). Created /datum/species/proc/on_species_loss() to handle stuff when our race change, currently only used by jelly and slime race to remove their exotic blood from our reagents and to remove slime people's action buttons. --- code/_onclick/hud/action.dm | 79 +++++------- code/_onclick/hud/hud.dm | 6 +- code/_onclick/hud/movable_screen_objects.dm | 2 +- code/game/dna.dm | 4 +- code/game/gamemodes/blob/powers.dm | 8 -- code/game/gamemodes/cult/cult_items.dm | 1 + code/game/gamemodes/handofgod/actions.dm | 6 +- code/game/gamemodes/handofgod/god.dm | 6 +- code/game/gamemodes/handofgod/items.dm | 5 + .../miniantags/abduction/abduction_gear.dm | 19 ++- code/game/gamemodes/miniantags/morph/morph.dm | 3 - .../miniantags/revenant/revenant_abilities.dm | 3 +- .../gamemodes/shadowling/shadowling_items.dm | 2 +- code/game/gamemodes/wizard/soulstone.dm | 1 + code/game/mecha/mecha.dm | 5 +- code/game/objects/items.dm | 22 +++- code/game/objects/items/candle.dm | 2 + code/game/objects/items/devices/PDA/PDA.dm | 2 + .../objects/items/devices/chameleonproj.dm | 1 + code/game/objects/items/devices/flashlight.dm | 4 + .../objects/items/devices/traitordevices.dm | 5 + .../objects/items/robot/robot_upgrades.dm | 8 +- .../objects/items/weapons/chrono_eraser.dm | 6 +- .../objects/items/weapons/cigs_lighters.dm | 2 + code/game/objects/items/weapons/defib.dm | 58 +++++---- .../objects/items/weapons/implants/implant.dm | 17 ++- .../items/weapons/implants/implant_freedom.dm | 7 +- .../items/weapons/implants/implant_misc.dm | 10 +- .../objects/items/weapons/melee/energy.dm | 1 + .../objects/items/weapons/storage/storage.dm | 4 - .../objects/items/weapons/tanks/jetpack.dm | 15 +-- .../game/objects/items/weapons/tanks/tanks.dm | 63 ++++------ .../objects/items/weapons/tanks/watertank.dm | 39 +++--- code/game/objects/items/weapons/twohanded.dm | 3 + code/game/objects/items/weapons/weaponry.dm | 1 + code/modules/assembly/proximity.dm | 1 + code/modules/awaymissions/capture_the_flag.dm | 1 + code/modules/clothing/clothing.dm | 2 + .../clothing/glasses/engine_goggles.dm | 24 ++-- code/modules/clothing/glasses/hud.dm | 1 + code/modules/clothing/head/hardhat.dm | 4 + code/modules/clothing/head/helmet.dm | 20 ++- code/modules/clothing/masks/gasmask.dm | 5 +- code/modules/clothing/shoes/bananashoes.dm | 2 + .../modules/clothing/spacesuits/chronosuit.dm | 7 +- code/modules/clothing/spacesuits/hardsuit.dm | 18 ++- code/modules/clothing/suits/toggles.dm | 12 ++ code/modules/hydroponics/grown.dm | 4 + code/modules/hydroponics/growninedible.dm | 2 + code/modules/mob/inventory.dm | 9 +- .../carbon/alien/humanoid/alien_powers.dm | 19 +-- code/modules/mob/living/carbon/carbon.dm | 1 + .../mob/living/carbon/human/inventory.dm | 4 + .../mob/living/carbon/human/species.dm | 6 + .../mob/living/carbon/human/species_types.dm | 45 +++---- code/modules/mob/living/carbon/life.dm | 6 - code/modules/mob/living/death.dm | 1 + code/modules/mob/living/life.dm | 114 ++++++------------ code/modules/mob/living/silicon/ai/life.dm | 2 - code/modules/mob/living/silicon/robot/life.dm | 8 +- .../simple_animal/friendly/drone/inventory.dm | 6 + .../living/simple_animal/guardian/guardian.dm | 1 + .../mob/living/simple_animal/simple_animal.dm | 1 + .../mob/living/simple_animal/slime/death.dm | 2 - .../mob/living/simple_animal/slime/life.dm | 1 + .../mob/living/simple_animal/slime/powers.dm | 18 +-- code/modules/mob/mob.dm | 1 + code/modules/mob/mob_grab.dm | 1 + code/modules/projectiles/gun.dm | 21 +++- code/modules/projectiles/guns/mounted.dm | 2 + .../projectiles/guns/projectile/automatic.dm | 3 +- .../projectiles/guns/projectile/shotgun.dm | 1 + code/modules/spells/spell.dm | 4 + code/modules/surgery/dental_implant.dm | 3 +- code/modules/surgery/organs/organ_internal.dm | 11 +- 75 files changed, 428 insertions(+), 386 deletions(-) diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index 84a49083a9d..f7408e3ff8f 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -1,8 +1,7 @@ #define AB_CHECK_RESTRAINED 1 #define AB_CHECK_STUNNED 2 #define AB_CHECK_LYING 4 -#define AB_CHECK_ALIVE 8 -#define AB_CHECK_INSIDE 16 +#define AB_CHECK_CONSCIOUS 8 /datum/action @@ -31,6 +30,13 @@ Remove(owner) owner = T T.actions += src + + if(!button) + button = new + button.linked_action = src + button.name = UpdateName() + if(T.client) + T.client.screen += button T.update_action_buttons() /datum/action/proc/Remove(mob/living/T) @@ -44,37 +50,28 @@ owner = null /datum/action/proc/Trigger() - if(!Checks()) + if(!IsAvailable()) return 0 return 1 /datum/action/proc/Process() return -/datum/action/proc/CheckRemoval(mob/living/user) // 1 if action is no longer valid for this mob and should be removed - return 0 - /datum/action/proc/IsAvailable() - return Checks() - -/datum/action/proc/Checks()// returns 1 if all checks pass if(!owner) return 0 if(check_flags & AB_CHECK_RESTRAINED) if(owner.restrained()) return 0 if(check_flags & AB_CHECK_STUNNED) - if(owner.stunned) + if(owner.stunned || owner.weakened) return 0 if(check_flags & AB_CHECK_LYING) if(owner.lying) return 0 - if(check_flags & AB_CHECK_ALIVE) + if(check_flags & AB_CHECK_CONSCIOUS) if(owner.stat) return 0 - if(check_flags & AB_CHECK_INSIDE) - if(!(target in owner) && !(target.action_button_internal)) - return 0 return 1 /datum/action/proc/UpdateName() @@ -90,8 +87,8 @@ current_button.overlays += img /obj/screen/movable/action_button - var/datum/action/owner - screen_loc = "WEST,NORTH" + var/datum/action/linked_action + screen_loc = null /obj/screen/movable/action_button/Click(location,control,params) var/list/modifiers = params2list(params) @@ -100,18 +97,18 @@ return 1 if(usr.next_move >= world.time) // Is this needed ? return - owner.Trigger() + linked_action.Trigger() return 1 /obj/screen/movable/action_button/proc/UpdateIcon() - if(!owner) + if(!linked_action) return - icon = owner.button_icon - icon_state = owner.background_icon_state + icon = linked_action.button_icon + icon_state = linked_action.background_icon_state - owner.ApplyIcon(src) + linked_action.ApplyIcon(src) - if(!owner.IsAvailable()) + if(!linked_action.IsAvailable()) color = rgb(128,0,0,128) else color = rgb(255,255,255,255) @@ -163,7 +160,11 @@ //This is the proc used to update all the action buttons. Properly defined in /mob/living/ -/mob/proc/update_action_buttons() +/mob/proc/update_action_buttons(reload_screen) + return + +//used to update the buttons icon. +/mob/proc/update_action_buttons_icon() return #define AB_MAX_COLUMNS 10 @@ -191,7 +192,7 @@ //Presets for item actions /datum/action/item_action - check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE|AB_CHECK_INSIDE + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS /datum/action/item_action/Trigger() if(!..()) @@ -201,9 +202,6 @@ item.ui_action_click() return 1 -/datum/action/item_action/CheckRemoval(mob/living/user) - return !(target in user) - /datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button) current_button.overlays.Cut() if(target) @@ -214,17 +212,10 @@ I.layer = old /datum/action/item_action/hands_free - check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE + check_flags = AB_CHECK_CONSCIOUS /datum/action/item_action/organ_action - check_flags = AB_CHECK_ALIVE - -/datum/action/item_action/organ_action/CheckRemoval(mob/living/carbon/user) - if(!iscarbon(user)) - return 1 - if(target in user.internal_organs) - return 0 - return 1 + check_flags = AB_CHECK_CONSCIOUS /datum/action/item_action/organ_action/IsAvailable() var/obj/item/organ/internal/I = target @@ -246,8 +237,7 @@ return 1 /datum/action/spell_action/UpdateName() - var/obj/effect/proc_holder/spell/spell = target - return spell.name + return target.name /datum/action/spell_action/IsAvailable() if(!target) @@ -261,12 +251,6 @@ return spell.can_cast(owner) return 1 -/datum/action/spell_action/CheckRemoval() - if(owner.mind) - if(target in owner.mind.spell_list) - return 0 - return !(target in owner.mob_spell_list) - //Preset for general and toggled actions /datum/action/innate check_flags = 0 @@ -304,7 +288,7 @@ /datum/action/innate/scan_mode name = "Toggle Research Scanner" button_icon_state = "scan_mode" - check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_ALIVE + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS var/devices = 0 //How may enabled scanners the mob has /datum/action/innate/scan_mode/Activate() @@ -320,11 +304,6 @@ /datum/action/innate/scan_mode/Grant(mob/living/T) ..(T) -/datum/action/innate/scan_mode/CheckRemoval(mob/living/user) - if(devices) - return 0 - return 1 - /datum/action/innate/scan_mode/Remove(mob/living/T) owner.research_scanner = 0 active = 0 diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index ca18c3c387e..d794ff09c7c 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -47,6 +47,8 @@ /datum/hud/New(mob/owner) mymob = owner + hide_actions_toggle = new + hide_actions_toggle.InitialiseIcon(mymob) /datum/hud/Destroy() if(mymob.hud_used == src) @@ -135,6 +137,8 @@ if(infodisplay.len) mymob.client.screen += infodisplay + mymob.client.screen += hide_actions_toggle + if(action_intent) action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position @@ -171,7 +175,7 @@ hud_version = display_hud_version persistant_inventory_update() - mymob.update_action_buttons() + mymob.update_action_buttons(1) reorganize_alerts() mymob.reload_fullscreen() diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index e8d4e4b3d73..315fce5bf65 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -43,7 +43,7 @@ var/pix_Y = text2num(screen_loc_Y[2]) - 16 screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]" - moved = TRUE + moved = screen_loc //Debug procs diff --git a/code/game/dna.dm b/code/game/dna.dm index 24b464d41ab..01ff138e1aa 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -174,9 +174,7 @@ /mob/living/carbon/set_species(datum/species/mrace = null, icon_update = 1) if(mrace && has_dna()) - if(dna.species.exotic_blood) - var/datum/reagent/EB = dna.species.exotic_blood - reagents.del_reagent(initial(EB.id)) + dna.species.on_species_loss(src) dna.species = new mrace() /mob/living/carbon/human/set_species(datum/species/mrace, icon_update = 1) diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index ef732b7f93b..62c9c72a3c6 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -248,14 +248,6 @@ /datum/action/innate/blob background_icon_state = "bg_alien" -/datum/action/innate/blob/CheckRemoval() - if(ticker.mode.name != "blob" || !ishuman(owner)) - return 1 - var/datum/game_mode/blob/B = ticker.mode - if(!owner.mind || !(owner.mind in B.infected_crew)) - return 1 - return 0 - /datum/action/innate/blob/earlyhelp name = "Blob Help" button_icon_state = "blob" diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 6c0883e0976..1824d7a2280 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -27,6 +27,7 @@ ..() /obj/item/weapon/melee/cultblade/pickup(mob/living/user) + ..() if(!iscultist(user)) user << "\"I wouldn't advise that.\"" user << "An overwhelming sense of nausea overpowers you!" diff --git a/code/game/gamemodes/handofgod/actions.dm b/code/game/gamemodes/handofgod/actions.dm index 76949a66487..762a8b4d683 100644 --- a/code/game/gamemodes/handofgod/actions.dm +++ b/code/game/gamemodes/handofgod/actions.dm @@ -4,7 +4,7 @@ /datum/action/innate/godspeak name = "Godspeak" button_icon_state = "godspeak" - check_flags = AB_CHECK_ALIVE + check_flags = AB_CHECK_CONSCIOUS var/mob/camera/god/god = null /datum/action/innate/godspeak/IsAvailable() @@ -19,3 +19,7 @@ return god << "[owner]: [msg]" owner << "You say: [msg]" + +/datum/action/innate/godspeak/Destroy() + god = null + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/handofgod/god.dm b/code/game/gamemodes/handofgod/god.dm index 771141213f4..55f5a16738f 100644 --- a/code/game/gamemodes/handofgod/god.dm +++ b/code/game/gamemodes/handofgod/god.dm @@ -22,7 +22,7 @@ var/list/conduits = list() var/prophets_sacrificed_in_name = 0 var/image/ghostimage = null //For observer with darkness off visiblity - + var/list/prophet_hats = list() /mob/camera/god/New() ..() @@ -51,6 +51,10 @@ for(var/datum/mind/F in followers) if(F.current) F.current << "Your god is DEAD!" + for(var/X in prophet_hats) + var/obj/item/clothing/head/helmet/plate/crusader/prophet/P = X + if(P.speak2god && P.speak2god.god == src) + qdel(P.speak2god) ghost_darkness_images -= ghostimage updateallghostimages() return ..() diff --git a/code/game/gamemodes/handofgod/items.dm b/code/game/gamemodes/handofgod/items.dm index 71137852025..010afd2c091 100644 --- a/code/game/gamemodes/handofgod/items.dm +++ b/code/game/gamemodes/handofgod/items.dm @@ -147,7 +147,12 @@ else speak2god = new() speak2god.god = G + G.prophet_hats += src +/obj/item/clothing/head/helmet/plate/crusader/prophet/Destroy() + if(speak2god) + qdel(speak2god) + return ..() /obj/item/clothing/head/helmet/plate/crusader/prophet/equipped(mob/user, slot) if(slot == slot_head) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 74d1cbf3a32..707df3c16f0 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -14,7 +14,7 @@ origin_tech = "materials=5;biotech=4;powerstorage=5" armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15) action_button_name = "Activate" - action_button_is_hands_free = 1 + action_button_type = /datum/action/item_action/hands_free var/mode = VEST_STEALTH var/stealth_active = 0 var/combat_cooldown = 10 @@ -29,20 +29,19 @@ DeactivateStealth() armor = combat_armor icon_state = "vest_combat" - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - H.update_inv_wear_suit() - return if(VEST_COMBAT)// TO STEALTH mode = VEST_STEALTH armor = stealth_armor icon_state = "vest_stealth" - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - H.update_inv_wear_suit() - return - + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc + H.update_inv_wear_suit() + if(action && action.button) + action.button.UpdateIcon() +/obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user) + if(slot == slot_wear_suit) //we only give the mob the ability to activate the vest if he's actually wearing it. + return 1 /obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry) disguise = entry diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index f90b2b78bba..00b42efbc4d 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -169,9 +169,6 @@ return target.attack_animal(src) -/mob/living/simple_animal/hostile/morph/update_action_buttons() //So all eaten objects are not counted every life - return - //Spawn Event /datum/round_event_control/morph diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index 65ac50afd8b..f61cf1c8a6e 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -79,7 +79,8 @@ name = "[initial(name)] ([cast_amount]E)" user.reveal(reveal) user.stun(stun) - user.update_action_buttons() + if(action && action.button) + action.button.UpdateIcon() return 1 //Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people. diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm index 8239ecc7724..7be25cd4722 100644 --- a/code/game/gamemodes/shadowling/shadowling_items.dm +++ b/code/game/gamemodes/shadowling/shadowling_items.dm @@ -84,7 +84,7 @@ flash_protect = -1 unacidable = 1 action_button_name = "Shift Nerves" - action_button_is_hands_free = 1 + action_button_type = /datum/action/item_action/hands_free var/max_darkness_view = 8 var/min_darkness_view = 0 flags = ABSTRACT | NODROP diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index f0248c3076e..cdef3cbe85a 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -14,6 +14,7 @@ usability = 1 /obj/item/device/soulstone/pickup(mob/living/user) + ..() if(!iscultist(user) && !iswizard(user) && !usability) user << "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly." user.Dizzy(120) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 3aef2883536..3cba2799aef 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1036,9 +1036,12 @@ var/year_integer = text2num(year) // = 2013??? /datum/action/innate/mecha - check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_ALIVE + check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_CONSCIOUS var/obj/mecha/chassis +/datum/action/innate/mecha/Destroy() + chassis = null + return ..() /datum/action/innate/mecha/mech_eject name = "Eject From Mech" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index fc24fb14bad..c520f594834 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -35,8 +35,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s //If this is set, The item will make an action button on the player's HUD when picked up. var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button. - var/action_button_is_hands_free = 0 //If 1, bypass the restrained, lying, and stunned checks action buttons normally test for - var/action_button_internal = 0 //If 1, bypass the inside check action buttons test for + var/action_button_type = null //if we want a special type of item action, not the standard one. var/datum/action/item_action/action = null //Since any item can now be a piece of clothing, this has to be put here so all items share it. @@ -363,12 +362,14 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s return /obj/item/proc/dropped(mob/user) - return + if(action) + action.Remove(user) // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) return + // called when this item is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. /obj/item/proc/on_exit_storage(obj/item/weapon/storage/S) return @@ -387,7 +388,20 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s // for items that can be placed in multiple slots // note this isn't called during the initial dressing of a player /obj/item/proc/equipped(mob/user, slot) - return + if(action_button_name) + if(!action) + if(action_button_type) + action = new action_button_type + else + action = new/datum/action/item_action + action.name = action_button_name + action.target = src + if(item_action_slot_check(slot, user)) //some items only give their action button when in a specific slot. + action.Grant(user) + +//sometimes we only want to grant the item's action if it's equipped in a specific slot. +obj/item/proc/item_action_slot_check(slot, mob/user) + return 1 //the mob M is attempting to equip this item into the slot passed through as 'slot'. Return 1 if it can do this and 0 if it can't. //If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen. diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 0d26ff0d940..dde1c59f567 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -91,12 +91,14 @@ /obj/item/candle/pickup(mob/user) + ..() if(lit) SetLuminosity(0) user.AddLuminosity(CANDLE_LUMINOSITY) /obj/item/candle/dropped(mob/user) + ..() if(lit) user.AddLuminosity(-CANDLE_LUMINOSITY) SetLuminosity(CANDLE_LUMINOSITY) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 3f284a0481a..7a0f85626ef 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -210,11 +210,13 @@ var/global/list/obj/item/device/pda/PDAs = list() * The Actual PDA */ /obj/item/device/pda/pickup(mob/user) + ..() if(fon) SetLuminosity(0) user.AddLuminosity(f_lum) /obj/item/device/pda/dropped(mob/user) + ..() if(fon) user.AddLuminosity(-f_lum) SetLuminosity(f_lum) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 92dbf4d6d27..3b14c41e5a5 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -19,6 +19,7 @@ saved_appearance = initial(butt.appearance) /obj/item/device/chameleon/dropped() + ..() disrupt() /obj/item/device/chameleon/equipped() diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 954bf101e38..8e136bbb682 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -41,6 +41,8 @@ return 0 on = !on update_brightness(user) + if(action && action.button) + action.button.UpdateIcon() return 1 @@ -84,12 +86,14 @@ /obj/item/device/flashlight/pickup(mob/user) + ..() if(on) user.AddLuminosity(brightness_on) SetLuminosity(0) /obj/item/device/flashlight/dropped(mob/user) + ..() if(on) user.AddLuminosity(-brightness_on) SetLuminosity(brightness_on) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 7f77a68f41a..5ef14db2bdc 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -168,6 +168,10 @@ effective or pretty fucking useless. Deactivate() return +/obj/item/device/shadowcloak/item_action_slot_check(slot, mob/user) + if(slot == slot_belt) + return 1 + /obj/item/device/shadowcloak/proc/Activate(mob/living/carbon/human/user) if(!user) return @@ -186,6 +190,7 @@ effective or pretty fucking useless. user = null /obj/item/device/shadowcloak/dropped(mob/user) + ..() if(user && user.get_item_by_slot(slot_belt) != src) Deactivate() diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 0739c9a8b6d..278156bb3ce 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -236,7 +236,11 @@ cyborg = R icon_state = "selfrepair_off" action_button_name = "Toggle Self-Repair" - + if(!action) + action = new + action.name = action_button_name + action.target = src + action.Grant(R) return 1 /obj/item/borg/upgrade/selfrepair/ui_action_click() @@ -252,6 +256,8 @@ /obj/item/borg/upgrade/selfrepair/update_icon() if(cyborg) icon_state = "selfrepair_[on ? "on" : "off"]" + if(action && action.button) + action.button.UpdateIcon() else icon_state = "cyborg_upgrade5" diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index 2695041736a..f89da1dcc97 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -17,6 +17,7 @@ erased_minds += M /obj/item/weapon/chrono_eraser/dropped() + ..() if(PA) qdel(PA) @@ -33,7 +34,9 @@ PA = new(src) user.put_in_hands(PA) - +/obj/item/weapon/chrono_eraser/item_action_slot_check(slot, mob/user) + if(slot == slot_back) + return 1 /obj/item/weapon/gun/energy/chrono_gun name = "T.E.D. Projection Apparatus" @@ -59,6 +62,7 @@ qdel(src) /obj/item/weapon/gun/energy/chrono_gun/dropped() + ..() qdel(src) /obj/item/weapon/gun/energy/chrono_gun/update_icon() diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index c18f344a717..644bc612139 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -541,6 +541,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM return /obj/item/weapon/lighter/pickup(mob/user) + ..() if(lit) SetLuminosity(0) user.AddLuminosity(1) @@ -548,6 +549,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/weapon/lighter/dropped(mob/user) + ..() if(lit) if(user) user.AddLuminosity(-1) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index dce70f51d29..6a7476b4c94 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -70,35 +70,40 @@ update_icon() /obj/item/weapon/defibrillator/ui_action_click() - if(usr.get_item_by_slot(slot_back) == src) - toggle_paddles() - else - usr << "Put the defibrillator on your back first!" - return + toggle_paddles() /obj/item/weapon/defibrillator/attack_hand(mob/user) - if(src.loc == user) - ui_action_click() + if(loc == user) + if(slot_flags == SLOT_BACK) + if(user.get_item_by_slot(slot_back) == src) + ui_action_click() + else + user << "Put the defibrillator on your back first!" + + else if(slot_flags == SLOT_BELT) + if(user.get_item_by_slot(slot_belt) == src) + ui_action_click() + else + user << "Strap the defibrillator's belt on first!" return ..() /obj/item/weapon/defibrillator/MouseDrop(obj/over_object) - if(ishuman(src.loc)) - var/mob/living/carbon/human/H = src.loc + if(ismob(src.loc)) + var/mob/M = src.loc switch(over_object.name) if("r_hand") - if(H.r_hand) + if(M.r_hand) return - if(!H.unEquip(src)) + if(!M.unEquip(src)) return - H.put_in_r_hand(src) + M.put_in_r_hand(src) if("l_hand") - if(H.l_hand) + if(M.l_hand) return - if(!H.unEquip(src)) + if(!M.unEquip(src)) return - H.put_in_l_hand(src) - return + M.put_in_l_hand(src) /obj/item/weapon/defibrillator/attackby(obj/item/weapon/W, mob/user, params) if(W == paddles) @@ -172,16 +177,22 @@ remove_paddles(user) update_icon() - return + if(action && action.button) + action.button.UpdateIcon() /obj/item/weapon/defibrillator/proc/make_paddles() return new /obj/item/weapon/twohanded/shockpaddles(src) /obj/item/weapon/defibrillator/equipped(mob/user, slot) - if(slot != slot_back) + ..() + if((slot_flags == SLOT_BACK && slot != slot_back) || (slot_flags == SLOT_BELT && slot != slot_belt)) remove_paddles(user) update_icon() +/obj/item/weapon/defibrillator/item_action_slot_check(slot, mob/user) + if(slot == user.getBackSlot()) + return 1 + /obj/item/weapon/defibrillator/proc/remove_paddles(mob/user) var/mob/living/carbon/human/M = user if(paddles in get_both_hands(M)) @@ -230,12 +241,9 @@ slot_flags = SLOT_BELT origin_tech = "biotech=4" -/obj/item/weapon/defibrillator/compact/ui_action_click() - if(usr.get_item_by_slot(slot_belt) == src) - toggle_paddles() - else - usr << "Strap the defibrillator's belt on first!" - return +/obj/item/weapon/defibrillator/compact/item_action_slot_check(slot, mob/user) + if(slot == user.getBeltSlot()) + return 1 /obj/item/weapon/defibrillator/compact/loaded/New() ..() @@ -322,7 +330,7 @@ if(!req_defib) return ..() if(user) - var/obj/item/weapon/twohanded/O = user.get_inactive_hand() + var/obj/item/weapon/twohanded/offhand/O = user.get_inactive_hand() if(istype(O)) O.unwield() user << "The paddles snap back into the main unit." diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index c8c2c07365b..13a9a9f4c73 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -2,7 +2,6 @@ name = "implant" icon = 'icons/obj/implants.dmi' icon_state = "generic" //Shows up as the action button icon - action_button_is_hands_free = 1 origin_tech = "materials=2;biotech=3;programming=2" var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like loyalty implants @@ -40,12 +39,16 @@ else return 0 - - if(activated) - action_button_name = "Activate [src.name]" src.loc = source imp_in = source implanted = 1 + if(activated) + action_button_name = "Activate [src.name]" + if(!action) + action = new /datum/action/item_action/hands_free + action.name = action_button_name + action.target = src + action.Grant(source) if(istype(source, /mob/living/carbon/human)) var/mob/living/carbon/human/H = source H.sec_hud_set_implants() @@ -59,7 +62,8 @@ src.loc = null imp_in = null implanted = 0 - + if(action) + action.Remove(source) if(istype(source, /mob/living/carbon/human)) var/mob/living/carbon/human/H = source H.sec_hud_set_implants() @@ -76,6 +80,7 @@ return "No information available" /obj/item/weapon/implant/dropped(mob/user) + ..() . = 1 qdel(src) - return . + diff --git a/code/game/objects/items/weapons/implants/implant_freedom.dm b/code/game/objects/items/weapons/implants/implant_freedom.dm index 106615e78e2..43d496081b0 100644 --- a/code/game/objects/items/weapons/implants/implant_freedom.dm +++ b/code/game/objects/items/weapons/implants/implant_freedom.dm @@ -8,14 +8,13 @@ /obj/item/weapon/implant/freedom/activate() - if(uses == 0) - return 0 - if(uses != -1) - uses-- + uses-- imp_in << "You feel a faint click." if(iscarbon(imp_in)) var/mob/living/carbon/C_imp_in = imp_in C_imp_in.uncuff() + if(!uses) + qdel(src) /obj/item/weapon/implant/freedom/get_data() diff --git a/code/game/objects/items/weapons/implants/implant_misc.dm b/code/game/objects/items/weapons/implants/implant_misc.dm index e32c94b128f..d23101cdc8f 100644 --- a/code/game/objects/items/weapons/implants/implant_misc.dm +++ b/code/game/objects/items/weapons/implants/implant_misc.dm @@ -33,8 +33,6 @@ return dat /obj/item/weapon/implant/adrenalin/activate() - if(uses < 1) - return 0 uses-- imp_in << "You feel a sudden surge of energy!" imp_in.SetStunned(0) @@ -47,6 +45,8 @@ imp_in.reagents.add_reagent("synaptizine", 10) imp_in.reagents.add_reagent("omnizine", 10) imp_in.reagents.add_reagent("stimulants", 10) + if(!uses) + qdel(src) /obj/item/weapon/implant/emp @@ -57,7 +57,7 @@ uses = 2 /obj/item/weapon/implant/emp/activate() - if (src.uses < 1) - return 0 - src.uses-- + uses-- empulse(imp_in, 3, 5) + if(!uses) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 4cbd991c98c..770adc191ed 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -220,6 +220,7 @@ spark_system.attach(src) /obj/item/weapon/melee/energy/blade/dropped() + ..() qdel(src) /obj/item/weapon/melee/energy/blade/attack_self(mob/user) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index cac36746465..48afb1f4bcc 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -374,10 +374,6 @@ handle_item_insertion(W, 0 , user) return 1 - -/obj/item/weapon/storage/dropped(mob/user) - return - /obj/item/weapon/storage/attack_hand(mob/user) playsound(loc, "rustle", 50, 1, -5) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 9fde058f0e9..fad276107cf 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -2,7 +2,7 @@ name = "Jetpack Mode" /datum/action/item_action/jetpack/cycle/Trigger() - if(!Checks()) + if(!IsAvailable()) return var/obj/item/weapon/tank/jetpack/J = target @@ -12,19 +12,6 @@ /datum/action/item_action/jetpack/cycle/suit name = "Internal Jetpack Mode" -/datum/action/item_action/jetpack/cycle/suit/New() - ..() - check_flags &= ~AB_CHECK_INSIDE // The jetpack is inside the suit. - -/datum/action/item_action/jetpack/cycle/suit/CheckRemoval(mob/living/user) - return !(target.loc in user) // Check that the suit is on the user. - -/datum/action/item_action/jetpack/cycle/suit/IsAvailable() - var/mob/living/carbon/human/H = owner - if(!H.wear_suit) - return - return ..() - /obj/item/weapon/tank/jetpack name = "jetpack (empty)" desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution." diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 2eb9fbb2904..9130d3c75f8 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -1,50 +1,41 @@ -/datum/action/item_action/tank/internals - name = "Set Internals" - -/datum/action/item_action/tank/internals/Trigger() - if(!Checks()) - return - - var/mob/living/carbon/human/C = owner - if(!istype(C)) - return - - if(C.internal == target) - C.internal = null - C << "You close \the [target] valve." - C.update_internals_hud_icon(0) - else if(C.wear_mask && (C.wear_mask.flags & MASKINTERNALS)) - C.internal = target - C << "You open \the [target] valve." - C.update_internals_hud_icon(1) - return 1 - -/datum/action/item_action/tank/internals/IsAvailable() - var/mob/living/carbon/C = owner - if(!C.wear_mask || !(C.wear_mask.flags & MASKINTERNALS)) - return - return ..() - /obj/item/weapon/tank name = "tank" icon = 'icons/obj/tank.dmi' flags = CONDUCT slot_flags = SLOT_BACK hitsound = 'sound/weapons/smash.ogg' - pressure_resistance = ONE_ATMOSPHERE * 5 - force = 5 throwforce = 10 throw_speed = 1 throw_range = 4 - + action_button_name = "Set Internals" var/datum/gas_mixture/air_contents = null var/distribute_pressure = ONE_ATMOSPHERE var/integrity = 3 var/volume = 70 - var/datum/action/item_action/tank/internals/internals_action +/obj/item/weapon/tank/ui_action_click() + var/mob/living/carbon/human/H = action.owner + if(!istype(H)) + return + + if(!H.wear_mask) + H << "You need a mask!" + return + if(H.wear_mask.mask_adjusted) + H.wear_mask.adjustmask(H) + if(!(H.wear_mask.flags & MASKINTERNALS)) + H << "[H.wear_mask] can't use [src]!" + return + if(H.internal == src) + H.internal = null + H << "You close \the [src] valve." + H.update_internals_hud_icon(0) + else if(H.wear_mask && (H.wear_mask.flags & MASKINTERNALS)) + H.internal = src + H << "You open \the [src] valve." + H.update_internals_hud_icon(1) /obj/item/weapon/tank/New() ..() @@ -52,8 +43,6 @@ air_contents = new(volume) //liters air_contents.temperature = T20C - internals_action = new(src) - SSobj.processing |= src /obj/item/weapon/tank/Destroy() @@ -63,14 +52,6 @@ SSobj.processing -= src return ..() -/obj/item/weapon/tank/pickup(mob/user) - ..() - internals_action.Grant(user) - -/obj/item/weapon/tank/dropped(mob/user) - ..() - internals_action.Remove(user) - /obj/item/weapon/tank/examine(mob/user) var/obj/icon = src ..() diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index eea4519a819..33a83cbd03e 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -22,10 +22,14 @@ /obj/item/weapon/watertank/ui_action_click() toggle_mister() +/obj/item/weapon/watertank/item_action_slot_check(slot, mob/user) + if(slot == user.getBackSlot()) + return 1 + /obj/item/weapon/watertank/verb/toggle_mister() set name = "Toggle Mister" set category = "Object" - if (usr.get_item_by_slot(usr.getWatertankSlot()) != src) + if (usr.get_item_by_slot(usr.getBackSlot()) != src) usr << "The watertank must be worn properly to use!" return if(usr.incapacitated()) @@ -52,7 +56,8 @@ return new /obj/item/weapon/reagent_containers/spray/mister(src) /obj/item/weapon/watertank/equipped(mob/user, slot) - if (slot != slot_back) + ..() + if(slot != slot_back) remove_noz() /obj/item/weapon/watertank/proc/remove_noz() @@ -75,22 +80,21 @@ ..() /obj/item/weapon/watertank/MouseDrop(obj/over_object) - var/mob/H = src.loc - if(istype(H)) + var/mob/M = src.loc + if(istype(M)) switch(over_object.name) if("r_hand") - if(H.r_hand) + if(M.r_hand) return - if(!H.unEquip(src)) + if(!M.unEquip(src)) return - H.put_in_r_hand(src) + M.put_in_r_hand(src) if("l_hand") - if(H.l_hand) + if(M.l_hand) return - if(!H.unEquip(src)) + if(!M.unEquip(src)) return - H.put_in_l_hand(src) - return + M.put_in_l_hand(src) /obj/item/weapon/watertank/attackby(obj/item/W, mob/user, params) if(W == noz) @@ -98,12 +102,6 @@ return ..() -/mob/proc/getWatertankSlot() - return slot_back - -/mob/living/simple_animal/drone/getWatertankSlot() - return slot_drone_storage - // This mister item is intended as an extension of the watertank and always attached to it. // Therefore, it's designed to be "locked" to the player's hands or extended back onto // the watertank backpack. Allowing it to be placed elsewhere or created without a parent @@ -131,6 +129,7 @@ return /obj/item/weapon/reagent_containers/spray/mister/dropped(mob/user) + ..() user << "The mister snaps back onto the watertank." tank.on = 0 loc = tank @@ -204,6 +203,7 @@ return new /obj/item/weapon/extinguisher/mini/nozzle(src) /obj/item/weapon/watertank/atmos/dropped(mob/user) + ..() icon_state = "waterbackpackatmos" if(istype(noz, /obj/item/weapon/extinguisher/mini/nozzle)) var/obj/item/weapon/extinguisher/mini/nozzle/N = noz @@ -261,6 +261,7 @@ return /obj/item/weapon/extinguisher/mini/nozzle/dropped(mob/user) + ..() user << "The nozzle snaps back onto the tank!" tank.on = 0 loc = tank @@ -354,6 +355,10 @@ /obj/item/weapon/reagent_containers/chemtank/ui_action_click() toggle_injection() +/obj/item/weapon/reagent_containers/chemtank/item_action_slot_check(slot, mob/user) + if(slot == slot_back) + return 1 + /obj/item/weapon/reagent_containers/chemtank/proc/toggle_injection() var/mob/living/carbon/human/user = usr if(!istype(user)) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index ce535fbd7e6..03556edae0e 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -87,6 +87,7 @@ return ..() /obj/item/weapon/twohanded/dropped(mob/user) + ..() //handles unwielding a twohanded weapon when dropped as well as clearing up the offhand if(user) var/obj/item/weapon/twohanded/O = user.get_inactive_hand() @@ -411,6 +412,8 @@ if(src == user.get_active_hand()) //update inhands user.update_inv_l_hand() user.update_inv_r_hand() + if(action && action.button) + action.button.UpdateIcon() //GREY TIDE diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 382d28f2af2..ea174df13f2 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -273,6 +273,7 @@ hitsound = "sound/weapons/chainsawhit.ogg" /obj/item/weapon/mounted_chainsaw/dropped() + ..() new /obj/item/weapon/twohanded/required/chainsaw(get_turf(src)) qdel(src) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index ce2f468e0d6..32352855eb2 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -78,6 +78,7 @@ handle_move(get_turf(loc)) /obj/item/device/assembly/prox_sensor/dropped() + ..() if(scanning) spawn(0) sense() diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 625a12c01be..7108940c287 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -62,6 +62,7 @@ SSobj.processing.Remove(src) /obj/item/weapon/twohanded/required/ctf/dropped(mob/user) + ..() reset_cooldown = world.time + 200 //20 seconds SSobj.processing |= src for(var/mob/M in player_list) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index d8f576c911c..f1ce059d3ae 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -516,6 +516,8 @@ BLIND // can't see anything if(istype(usr, /mob/living/carbon)) var/mob/living/carbon/C = usr C.head_update(src, forced = 1) + if(action && action.button) + action.button.UpdateIcon() /obj/item/clothing/proc/can_use(mob/user) if(user && ismob(user)) diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index ec8c5750012..4194f474fc0 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -10,10 +10,7 @@ var/invis_objects = list() var/range = 1 -/obj/item/clothing/glasses/meson/engine/attack_self() - ui_action_click() - -/obj/item/clothing/glasses/meson/engine/ui_action_click() +/obj/item/clothing/glasses/meson/engine/attack_self(mob/user) mode = !mode if(mode) @@ -21,7 +18,7 @@ vision_flags = 0 darkness_view = 2 invis_view = SEE_INVISIBLE_LIVING - loc << "You toggle the goggles' scanning mode to \[T-Ray]." + user << "You toggle the goggles' scanning mode to \[T-Ray]." else SSobj.processing.Remove(src) vision_flags = SEE_TURFS @@ -30,11 +27,14 @@ loc << "You toggle the goggles' scanning mode to \[Meson]." invis_update() - if(istype(loc,/mob/living/carbon)) - var/mob/living/carbon/C = loc - C.update_sight() + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.glasses == src) + H.update_sight() update_icon() + if(action && action.button) + action.button.UpdateIcon() /obj/item/clothing/glasses/meson/engine/process() if(!mode) @@ -115,18 +115,20 @@ if(user.glasses == src) user.update_inv_glasses() -/obj/item/clothing/glasses/meson/engine/tray/ui_action_click() +/obj/item/clothing/glasses/meson/engine/tray/attack_self(mob/user) on = !on if(on) SSobj.processing |= src - loc << "You turn the goggles on." + user << "You turn the goggles on." else SSobj.processing.Remove(src) - loc << "You turn the goggles off." + user << "You turn the goggles off." invis_update() update_icon() + if(action && action.button) + action.button.UpdateIcon() /obj/item/clothing/glasses/meson/engine/tray/t_ray_on() return on && ..() \ No newline at end of file diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 133e55cc1f0..55b4786b813 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -11,6 +11,7 @@ H.add_hud_to(user) /obj/item/clothing/glasses/hud/dropped(mob/living/carbon/human/user) + ..() if(hud_type && istype(user) && user.glasses == src) var/datum/atom_hud/H = huds[hud_type] H.remove_hud_from(user) diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 43349c6a541..756732dbabe 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -24,13 +24,17 @@ turn_on(user) else turn_off(user) + if(action && action.button) + action.button.UpdateIcon() /obj/item/clothing/head/hardhat/pickup(mob/user) + ..() if(on) user.AddLuminosity(brightness_on) SetLuminosity(0) /obj/item/clothing/head/hardhat/dropped(mob/user) + ..() if(on) user.AddLuminosity(-brightness_on) SetLuminosity(brightness_on) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 1bf81645127..5592732ca14 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -229,6 +229,13 @@ update_icon() update_helmlight(user) verbs += /obj/item/clothing/head/helmet/proc/toggle_helmlight + action_button_name = "Toggle Helmetlight" + if(loc == user) + if(!action) + action = new + action.name = action_button_name + action.target = src + action.Grant(user) return if(istype(A, /obj/item/weapon/screwdriver)) @@ -242,10 +249,12 @@ update_icon() usr.update_inv_head() verbs -= /obj/item/clothing/head/helmet/proc/toggle_helmlight + action_button_name = null + if(action && loc == user) + action.Remove(user) return ..() - return /obj/item/clothing/head/helmet/proc/toggle_helmlight() set name = "Toggle Helmetlight" @@ -269,7 +278,6 @@ /obj/item/clothing/head/helmet/proc/update_helmlight(mob/user = null) if(F) - action_button_name = "Toggle Helmetlight" if(F.on) if(loc == user) user.AddLuminosity(F.brightness_on) @@ -281,15 +289,18 @@ else if(isturf(loc)) SetLuminosity(0) update_icon() + else - action_button_name = null if(loc == user) user.AddLuminosity(-5) else if(isturf(loc)) SetLuminosity(0) - return + action_button_name = null + if(action && action.button) + action.button.UpdateIcon() /obj/item/clothing/head/helmet/pickup(mob/user) + ..() if(F) if(F.on) user.AddLuminosity(F.brightness_on) @@ -297,6 +308,7 @@ /obj/item/clothing/head/helmet/dropped(mob/user) + ..() if(F) if(F.on) user.AddLuminosity(-F.brightness_on) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 6055104b49f..07a038729a2 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -111,12 +111,9 @@ burn_state = FLAMMABLE action_button_name = "Adjust Mask" -/obj/item/clothing/mask/gas/mime/ui_action_click() +/obj/item/clothing/mask/gas/mime/attack_self(mob/user) cycle_mask(usr) -/obj/item/clothing/mask/gas/mime/AltClick(mob/user) - cycle_mask(user) - /obj/item/clothing/mask/gas/mime/proc/cycle_mask(mob/user) switch(icon_state) if("mime") diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index a51af2db1b4..dea88acaef8 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -72,3 +72,5 @@ else icon_state = "clown_prototype_off" usr.update_inv_shoes() + if(action && action.button) + action.button.UpdateIcon() diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 2e95c4c9f0a..ec6fdaa65fd 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -331,16 +331,13 @@ /datum/action/innate/chrono_teleport name = "Teleport Now" button_icon_state = "chrono_phase" - check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE + check_flags = AB_CHECK_CONSCIOUS //|AB_CHECK_INSIDE var/obj/item/clothing/suit/space/chronos/chronosuit = null /datum/action/innate/chrono_teleport/IsAvailable() - return (!CheckRemoval(owner) && !chronosuit.teleporting) + return (chronosuit && chronosuit.activated && chronosuit.camera && !chronosuit.teleporting) /datum/action/innate/chrono_teleport/Activate() if(IsAvailable()) if(chronosuit.camera) chronosuit.chronowalk(chronosuit.camera) - -/datum/action/innate/chrono_teleport/CheckRemoval() - return (..() && !(chronosuit && chronosuit.activated && chronosuit.camera)) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 4c410c014c2..7e586e890c5 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -25,21 +25,30 @@ user.AddLuminosity(brightness_on) else user.AddLuminosity(-brightness_on) + if(action && action.button) + action.button.UpdateIcon() /obj/item/clothing/head/helmet/space/hardsuit/pickup(mob/user) + ..() if(on) user.AddLuminosity(brightness_on) SetLuminosity(0) /obj/item/clothing/head/helmet/space/hardsuit/dropped(mob/user) + ..() if(on) user.AddLuminosity(-brightness_on) SetLuminosity(brightness_on) if(suit) suit.RemoveHelmet() +/obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot) + if(slot == slot_head) + return 1 + /obj/item/clothing/head/helmet/space/hardsuit/equipped(mob/user, slot) + ..() if(slot != slot_head) if(suit) suit.RemoveHelmet() @@ -75,14 +84,19 @@ /obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot) ..() - if(slot == slot_wear_suit && jetpack) - jetpack.cycle_action.Grant(user) + if(jetpack) + if(slot == slot_wear_suit) + jetpack.cycle_action.Grant(user) /obj/item/clothing/suit/space/hardsuit/dropped(mob/user) ..() if(jetpack) jetpack.cycle_action.Remove(user) +/obj/item/clothing/suit/space/hardsuit/item_action_slot_check(slot) + if(slot == slot_wear_suit) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. + return 1 + //Engineering /obj/item/clothing/head/helmet/space/hardsuit/engine name = "engineering hardsuit helmet" diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 5283af92d42..dbbfc5dbb00 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -20,6 +20,10 @@ /obj/item/clothing/suit/hooded/ui_action_click() ToggleHood() +/obj/item/clothing/suit/hooded/item_action_slot_check(slot, mob/user) + if(slot == slot_wear_suit) + return 1 + /obj/item/clothing/suit/hooded/equipped(mob/user, slot) if(slot != slot_wear_suit) RemoveHood() @@ -33,8 +37,11 @@ H.unEquip(hood, 1) H.update_inv_wear_suit() hood.loc = src + if(action && action.button) + action.button.UpdateIcon() /obj/item/clothing/suit/hooded/dropped() + ..() RemoveHood() /obj/item/clothing/suit/hooded/proc/ToggleHood() @@ -52,6 +59,8 @@ suittoggled = 1 src.icon_state = "[initial(icon_state)]_t" H.update_inv_wear_suit() + if(action && action.button) + action.button.UpdateIcon() else RemoveHood() @@ -84,6 +93,8 @@ src.icon_state = "[initial(icon_state)]_t" src.suittoggled = 1 usr.update_inv_wear_suit() + if(action && action.button) + action.button.UpdateIcon() /obj/item/clothing/suit/toggle/examine(mob/user) ..() @@ -140,6 +151,7 @@ helmet.loc = src /obj/item/clothing/suit/space/hardsuit/dropped() + ..() RemoveHelmet() /obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index fc30cec85e5..d9e24ecd69c 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -308,10 +308,12 @@ return ..() /obj/item/weapon/reagent_containers/food/snacks/grown/berries/glow/pickup(mob/user) + ..() src.SetLuminosity(0) user.AddLuminosity(round(potency / 5,1)) /obj/item/weapon/reagent_containers/food/snacks/grown/berries/glow/dropped(mob/user) + ..() user.AddLuminosity(round(-potency / 5,1)) src.SetLuminosity(round(potency / 5,1)) @@ -1222,10 +1224,12 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice() return ..() /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/pickup(mob/user) + ..() SetLuminosity(0) user.AddLuminosity(round(potency / 10,1)) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/dropped(mob/user) + ..() user.AddLuminosity(round(-potency / 10,1)) SetLuminosity(round(potency / 10,1)) diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index bbb49c96cae..dc4bdd7a2f7 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -158,6 +158,7 @@ qdel(src) /obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user) + ..() if(!user.gloves) user << "The [name] burns your bare hand!" user.adjustFireLoss(rand(1, 5)) @@ -184,6 +185,7 @@ return (BRUTELOSS|TOXLOSS) /obj/item/weapon/grown/nettle/pickup(mob/living/user) + ..() if(!iscarbon(user)) return 0 var/mob/living/carbon/C = user diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 073eb5be33c..3a8e0dcaaa6 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -263,4 +263,11 @@ var/obj/item/I = get_active_hand() if (I) - I.equip_to_best_slot(src) \ No newline at end of file + I.equip_to_best_slot(src) + +//used in code for items usable by both carbon and drones, this gives the proper back slot for each mob.(defibrillator, backpack watertank, ...) +/mob/proc/getBackSlot() + return slot_back + +/mob/proc/getBeltSlot() + return slot_belt \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 6f3d4b26df3..de750a6d833 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -7,10 +7,6 @@ Doesn't work on other aliens/AI.*/ /datum/action/spell_action/alien -/datum/action/spell_action/alien/UpdateName() - var/obj/effect/proc_holder/alien/ab = target - return ab.name - /datum/action/spell_action/alien/IsAvailable() if(!target) return 0 @@ -23,16 +19,6 @@ Doesn't work on other aliens/AI.*/ return ab.cost_check(ab.check_turf,owner,1) return 1 -/datum/action/spell_action/alien/CheckRemoval() - if(!iscarbon(owner)) - return 1 - - var/mob/living/carbon/C = owner - if(target.loc && !(target.loc in C.internal_organs)) - return 1 - - return 0 - /obj/effect/proc_holder/alien name = "Alien Power" @@ -319,6 +305,11 @@ Doesn't work on other aliens/AI.*/ if(!vessel) return 0 vessel.storedPlasma = max(vessel.storedPlasma + amount,0) vessel.storedPlasma = min(vessel.storedPlasma, vessel.max_plasma) //upper limit of max_plasma, lower limit of 0 + for(var/X in abilities) + var/obj/effect/proc_holder/alien/APH = X + if(APH.action && APH.action.button) + var/obj/screen/movable/action_button/AB = APH.action.button + AB.UpdateIcon() return 1 /mob/living/carbon/alien/adjustPlasma(amount) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 90a165abc9a..cb6a42efb16 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -789,6 +789,7 @@ var/const/GALOSHES_DONT_HELP = 4 throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed) else clear_alert("handcuffed") + update_action_buttons_icon() //some of our action buttons might be unusable when we're handcuffed. update_inv_handcuffed() update_hud_handcuffed() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 20a1005d213..6bde0e6fc25 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -88,6 +88,8 @@ wear_suit = I if(I.flags_inv & HIDEJUMPSUIT) update_inv_w_uniform() + if(wear_suit.breakouttime) //when equipping a straightjacket + update_action_buttons_icon() //certain action buttons will no longer be usable. update_inv_wear_suit() if(slot_w_uniform) w_uniform = I @@ -113,6 +115,8 @@ if(I == wear_suit) if(s_store) unEquip(s_store, 1) //It makes no sense for your suit storage to stay on you if you drop your suit. + if(wear_suit.breakouttime) //when unequipping a straightjacket + update_action_buttons_icon() //certain action buttons may be usable again. wear_suit = null if(I.flags_inv & HIDEJUMPSUIT) update_inv_w_uniform() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index d789d65410a..856669964b4 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -119,6 +119,12 @@ return 0 return 1 +/datum/species/proc/on_species_loss(mob/living/carbon/C) + if(C.dna.species) + if(C.dna.species.exotic_blood) + var/datum/reagent/EB = C.dna.species.exotic_blood + C.reagents.del_reagent(initial(EB.id)) + /datum/species/proc/update_base_icon_state(mob/living/carbon/human/H) if(H.disabilities & HUSK) H.remove_overlay(SPECIES_LAYER) // races lose their color diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index d76cdfa4384..e12098c125c 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -240,11 +240,23 @@ var/regex/lizard_hiSS = new("S+", "g") burnmod = 0.5 coldmod = 2 heatmod = 0.5 + var/datum/action/innate/split_body/slime_split + var/datum/action/innate/swap_body/callforward + var/datum/action/innate/swap_body/callback + +/datum/species/jelly/slime/on_species_loss(mob/living/carbon/C) + if(slime_split) + slime_split.Remove(C) + if(callforward) + callforward.Remove(C) + if(callback) + callback.Remove(C) + ..() /datum/species/jelly/slime/spec_life(mob/living/carbon/human/H) if(recently_changed) - var/datum/action/innate/split_body/S = new - S.Grant(H) + slime_split = new + slime_split.Grant(H) for(var/datum/reagent/toxin/slimejelly/S in H.reagents.reagent_list) if(S.volume >= 200) @@ -259,16 +271,10 @@ var/regex/lizard_hiSS = new("S+", "g") /datum/action/innate/split_body name = "Split Body" - check_flags = AB_CHECK_ALIVE + check_flags = AB_CHECK_CONSCIOUS button_icon_state = "slimesplit" background_icon_state = "bg_alien" -/datum/action/innate/split_body/CheckRemoval() - var/mob/living/carbon/human/H = owner - if(!ishuman(H) || !H.dna || !H.dna.species || H.dna.species.id != "slime") - return 1 - return 0 - /datum/action/innate/split_body/Activate() var/mob/living/carbon/human/H = owner H << "You focus intently on moving your body while standing perfectly still..." @@ -286,12 +292,13 @@ var/regex/lizard_hiSS = new("S+", "g") spare.Move(get_step(H.loc, pick(NORTH,SOUTH,EAST,WEST))) S.volume = 80 H.notransform = 0 - var/datum/action/innate/swap_body/callforward = new /datum/action/innate/swap_body() - var/datum/action/innate/swap_body/callback = new /datum/action/innate/swap_body() - callforward.body = spare - callforward.Grant(H) - callback.body = H - callback.Grant(spare) + var/datum/species/jelly/slime/SS = H.dna.species + SS.callforward = new + SS.callforward.body = spare + SS.callforward.Grant(H) + SS.callback = new + SS.callback.body = H + SS.callback.Grant(spare) H.mind.transfer_to(spare) spare << "...and after a moment of disorentation, you're besides yourself!" return @@ -301,17 +308,11 @@ var/regex/lizard_hiSS = new("S+", "g") /datum/action/innate/swap_body name = "Swap Body" - check_flags = AB_CHECK_ALIVE + check_flags = AB_CHECK_CONSCIOUS button_icon_state = "slimeswap" background_icon_state = "bg_alien" var/mob/living/carbon/human/body -/datum/action/innate/swap_body/CheckRemoval() - var/mob/living/carbon/human/H = owner - if(!ishuman(H) || !H.dna || !H.dna.species || H.dna.species.id != "slime") - return 1 - return 0 - /datum/action/innate/swap_body/Activate() if(!body || !istype(body) || !body.dna || !body.dna.species || body.dna.species.id != "slime" || body.stat == DEAD || qdeleted(body)) owner << "Something is wrong, you cannot sense your other body!" diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index a4a68b8ac66..6b90a274f3d 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -387,9 +387,3 @@ if(360.15 to INFINITY) //360.15 is 310.15 + 50, the temperature where you start to feel effects. //We totally need a sweat system cause it totally makes sense...~ bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers - - -/mob/living/carbon/handle_actions() - ..() - for(var/obj/item/I in internal_organs) - give_action_button(I, 1) \ No newline at end of file diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index b78d0fae14e..8490523610e 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -52,6 +52,7 @@ blind_eyes(1) reset_perspective(null) hide_fullscreens() + update_action_buttons_icon() update_damage_hud() update_health_hud() update_canmove() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index e3ef16ce291..190ad0dfc10 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -49,10 +49,6 @@ handle_disabilities() // eye, ear, brain damages handle_status_effects() //all special effects, stunned, weakened, jitteryness, hallucination, sleeping, etc - handle_actions() - - handle_regular_hud_updates() - /mob/living/proc/handle_breathing() @@ -117,92 +113,50 @@ if(ear_damage < 100) adjustEarDamage(-0.05,-1) -/mob/living/proc/handle_actions() - //Pretty bad, i'd use picked/dropped instead but the parent calls in these are nonexistent - for(var/datum/action/A in actions) - if(A.CheckRemoval(src)) - A.Remove(src) - for(var/obj/item/I in src) - give_action_button(I, 1) - return - -/mob/living/proc/give_action_button(var/obj/item/I, recursive = 0) - if(I.action_button_name) - if(!I.action) - if(istype(I, /obj/item/organ/internal)) - I.action = new/datum/action/item_action/organ_action - else if(I.action_button_is_hands_free) - I.action = new/datum/action/item_action/hands_free - else - I.action = new/datum/action/item_action - I.action.name = I.action_button_name - I.action.target = I - I.action.Grant(src) - - if(recursive) - for(var/obj/item/T in I) - give_action_button(T, recursive - 1) - - /mob/living/proc/update_damage_hud() return -//this handles hud updates. -/mob/living/proc/handle_regular_hud_updates() - if(!client) - return 0 - update_action_buttons() - return 1 +/mob/living/update_action_buttons_icon() + for(var/X in actions) + var/datum/action/A = X + if(A.button) + A.button.UpdateIcon() -/mob/living/update_action_buttons() - if(!hud_used) return - if(!client) return - - if(hud_used.hud_shown != 1) //Hud toggled to minimal +/mob/living/update_action_buttons(reload_screen) + if(!hud_used || !client) return - client.screen -= hud_used.hide_actions_toggle - for(var/datum/action/A in actions) - if(A.button) - client.screen -= A.button - - if(hud_used.action_buttons_hidden) - if(!hud_used.hide_actions_toggle) - hud_used.hide_actions_toggle = new(hud_used) - hud_used.hide_actions_toggle.UpdateIcon() - - if(!hud_used.hide_actions_toggle.moved) - hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(1) - //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,1) - - client.screen += hud_used.hide_actions_toggle + if(hud_used.hud_shown != HUD_STYLE_STANDARD) return var/button_number = 0 - for(var/datum/action/A in actions) - button_number++ - if(A.button == null) - var/obj/screen/movable/action_button/N = new(hud_used) - N.owner = A - A.button = N - var/obj/screen/movable/action_button/B = A.button + if(hud_used.action_buttons_hidden) + for(var/datum/action/A in actions) + A.button.screen_loc = null + if(reload_screen) + client.screen += A.button + else + for(var/datum/action/A in actions) + button_number++ + var/obj/screen/movable/action_button/B = A.button + B.UpdateIcon() + if(!B.moved) + B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number) + else + B.screen_loc = B.moved + if(reload_screen) + client.screen += B - B.UpdateIcon() + if(!button_number) + hud_used.hide_actions_toggle.screen_loc = null + return - B.name = A.UpdateName() - - client.screen += B - - if(!B.moved) - B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number) - //hud_used.SetButtonCoords(B,button_number) - - if(button_number > 0) - if(!hud_used.hide_actions_toggle) - hud_used.hide_actions_toggle = new(hud_used) - hud_used.hide_actions_toggle.InitialiseIcon(src) - if(!hud_used.hide_actions_toggle.moved) - hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) - //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1) + if(!hud_used.hide_actions_toggle.moved) + hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) + else + hud_used.hide_actions_toggle.screen_loc = hud_used.hide_actions_toggle.moved + if(reload_screen) client.screen += hud_used.hide_actions_toggle + + diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 842842a37bf..c977343e8ef 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -6,8 +6,6 @@ update_gravity(mob_has_gravity()) - update_action_buttons() - if(malfhack) if(malfhack.aidisabled) src << "ERROR: APC access disabled, hack attempt canceled." diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 7ddc810833c..ea12c449a86 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -6,7 +6,7 @@ return ..() - + handle_robot_hud_updates() handle_robot_cell() /mob/living/silicon/robot/proc/handle_robot_cell() @@ -30,7 +30,7 @@ update_headlamp() diag_hud_set_borgcell() -/mob/living/silicon/robot/handle_regular_hud_updates() +/mob/living/silicon/robot/proc/handle_robot_hud_updates() if(!client) return @@ -49,8 +49,7 @@ if(!mind.special_role) mind.special_role = "traitor" ticker.mode.traitors += mind - ..() - return 1 + /mob/living/silicon/robot/update_health_hud() if(!client || !hud_used) @@ -117,4 +116,5 @@ else canmove = 1 update_transform() + update_action_buttons_icon() return canmove diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index 3efd4d48f15..a4368fd585a 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -115,3 +115,9 @@ /mob/living/simple_animal/drone/stripPanelEquip(obj/item/what, mob/who, where) ..(what, who, where, 1) + +/mob/living/simple_animal/drone/getBackSlot() + return slot_drone_storage + +/mob/living/simple_animal/drone/getBeltSlot() + return slot_drone_storage diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index d5bec802eb6..31218b5e5aa 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -586,6 +586,7 @@ return /obj/item/weapon/guardian_bomb/pickup(mob/living/user) + ..() detonate(user) return diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 8dbf0beae1b..7351dcdb064 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -535,6 +535,7 @@ else canmove = 1 update_transform() + update_action_buttons_icon() return canmove /mob/living/simple_animal/update_transform() diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm index dca7d56c4e3..cbb93197426 100644 --- a/code/modules/mob/living/simple_animal/slime/death.dm +++ b/code/modules/mob/living/simple_animal/slime/death.dm @@ -9,8 +9,6 @@ M.regenerate_icons() is_adult = 0 maxHealth = 150 - var/datum/action/innate/slime/evolve/E = new - E.Grant(src) revive(full_heal = 1) regenerate_icons() number = rand(1, 1000) diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index c0e0ead4f98..f5c892ab426 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -230,6 +230,7 @@ else if (nutrition >= get_grow_nutrition() && amount_grown < SLIME_EVOLUTION_THRESHOLD) nutrition -= 20 amount_grown++ + update_action_buttons_icon() if(amount_grown >= SLIME_EVOLUTION_THRESHOLD && !buckled && !Target && !ckey) if(is_adult) diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index 4f838717b87..74a32d22cd6 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -6,22 +6,10 @@ #define GROWTH_NEEDED 1 /datum/action/innate/slime - check_flags = AB_CHECK_ALIVE + check_flags = AB_CHECK_CONSCIOUS background_icon_state = "bg_alien" - var/adult_action = SIZE_DOESNT_MATTER var/needs_growth = NO_GROWTH_NEEDED -/datum/action/innate/slime/CheckRemoval() - if(!isslime(owner)) - return 1 - var/mob/living/simple_animal/slime/S = owner - if(adult_action != SIZE_DOESNT_MATTER) - if(adult_action == ADULTS_ONLY && !S.is_adult) - return 1 - else if(adult_action == BABIES_ONLY && S.is_adult) - return 1 - return 0 - /datum/action/innate/slime/IsAvailable() if(..()) var/mob/living/simple_animal/slime/S = owner @@ -120,6 +108,8 @@ is_adult = 1 maxHealth = 200 amount_grown = 0 + for(var/datum/action/innate/slime/evolve/E in actions) + E.Remove(src) regenerate_icons() name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])") else @@ -130,7 +120,6 @@ /datum/action/innate/slime/evolve name = "Evolve" button_icon_state = "slimegrow" - adult_action = BABIES_ONLY needs_growth = GROWTH_NEEDED /datum/action/innate/slime/evolve/Activate() @@ -191,7 +180,6 @@ /datum/action/innate/slime/reproduce name = "Reproduce" button_icon_state = "slimesplit" - adult_action = ADULTS_ONLY needs_growth = GROWTH_NEEDED /datum/action/innate/slime/reproduce/Activate() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index eaea18ded6a..7f908f28430 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -708,6 +708,7 @@ var/next_mob_id = 0 if(layer == MOB_LAYER - 0.2) layer = initial(layer) update_transform() + update_action_buttons_icon() lying_prev = lying return canmove diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index d8032f467bf..4517dea695e 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -211,6 +211,7 @@ add_logs(user, affecting, "attempted to put", src, "into [M]") /obj/item/weapon/grab/dropped() + ..() qdel(src) #undef UPGRADE_COOLDOWN diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index aa308644e11..85063e88e10 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -272,6 +272,13 @@ obj/item/weapon/gun/proc/newshot() update_icon() update_gunlight(user) verbs += /obj/item/weapon/gun/proc/toggle_gunlight + action_button_name = "Toggle Gunlight" + if(loc == user) + if(!action) + action = new + action.name = action_button_name + action.target = src + action.Grant(user) if(istype(A, /obj/item/weapon/screwdriver)) if(F) @@ -283,6 +290,9 @@ obj/item/weapon/gun/proc/newshot() S.update_brightness(user) update_icon() verbs -= /obj/item/weapon/gun/proc/toggle_gunlight + action_button_name = null + if(action && loc == user) + action.Remove(user) if(unique_rename) if(istype(A, /obj/item/weapon/pen)) @@ -311,7 +321,6 @@ obj/item/weapon/gun/proc/newshot() /obj/item/weapon/gun/proc/update_gunlight(mob/user = null) if(F) - action_button_name = "Toggle Gunlight" if(F.on) if(loc == user) user.AddLuminosity(F.brightness_on) @@ -324,14 +333,16 @@ obj/item/weapon/gun/proc/newshot() SetLuminosity(0) update_icon() else - action_button_name = null if(loc == user) user.AddLuminosity(-5) else if(isturf(loc)) SetLuminosity(0) - return + if(action && action.button) + action.button.UpdateIcon() + /obj/item/weapon/gun/pickup(mob/user) + ..() if(F) if(F.on) user.AddLuminosity(F.brightness_on) @@ -340,6 +351,7 @@ obj/item/weapon/gun/proc/newshot() azoom.Grant(user) /obj/item/weapon/gun/dropped(mob/user) + ..() if(F) if(F.on) user.AddLuminosity(-F.brightness_on) @@ -426,7 +438,7 @@ obj/item/weapon/gun/proc/newshot() /datum/action/toggle_scope_zoom name = "Toggle Scope" - check_flags = AB_CHECK_ALIVE|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING button_icon_state = "sniper_zoom" var/obj/item/weapon/gun/gun = null @@ -443,7 +455,6 @@ obj/item/weapon/gun/proc/newshot() ..() - /obj/item/weapon/gun/proc/zoom(mob/living/user, forced_zoom) if(!user || !user.client) return diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/mounted.dm index d6a54ffa0ea..84549c8e09f 100644 --- a/code/modules/projectiles/guns/mounted.dm +++ b/code/modules/projectiles/guns/mounted.dm @@ -10,6 +10,7 @@ can_flashlight = 0 /obj/item/weapon/gun/energy/gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... + ..() src.loc = null//send it to nullspace to get retrieved by the implant later on. gotta cover those edge cases. /obj/item/weapon/gun/energy/laser/mounted @@ -25,4 +26,5 @@ materials = null /obj/item/weapon/gun/energy/laser/mounted/dropped() + ..() src.loc = null diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 681db297fc3..4bd3852b935 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -67,7 +67,8 @@ playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() - return + if(action && action.button) + action.button.UpdateIcon() /obj/item/weapon/gun/projectile/automatic/can_shoot() return get_ammo() diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 58113e9ee7a..72a3631cb3f 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -134,6 +134,7 @@ pump() /obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/dropped() + ..() guns_left = 0 /obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1) diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index b38d951b5c9..5b26cc14c33 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -169,9 +169,13 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin return /obj/effect/proc_holder/spell/proc/start_recharge() + if(action && action.button) + action.button.UpdateIcon() while(charge_counter < charge_max && isnull(gc_destroyed)) sleep(1) charge_counter++ + if(action && action.button) + action.button.UpdateIcon() /obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells before_cast(targets) diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 189d37da341..44ead63927f 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -31,12 +31,13 @@ name = "Activate Pill" /datum/action/item_action/hands_free/activate_pill/Trigger() - if(!..() || CheckRemoval(owner)) + if(!..()) return 0 owner << "You grit your teeth and burst the implanted [target]!" add_logs(owner, null, "swallowed an implanted pill", target) if(target.reagents.total_volume) target.reagents.reaction(owner, INGEST) target.reagents.trans_to(owner, target.reagents.total_volume) + Remove(owner) qdel(target) return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index e1e4ac7a3d5..93ef30267ae 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -20,8 +20,11 @@ M.internal_organs |= src loc = null if(organ_action_name) - action_button_name = organ_action_name - + if(!action) + action = new/datum/action/item_action/organ_action + action.name = organ_action_name + action.target = src + action.Grant(src) /obj/item/organ/internal/proc/Remove(mob/living/carbon/M, special = 0) owner = null @@ -29,9 +32,9 @@ M.internal_organs -= src if(vital && !special) M.death() - if(organ_action_name) - action_button_name = null + if(action) + action.Remove(M) /obj/item/organ/internal/proc/on_find(mob/living/finder) return From 0ec876d9fece5c84f4dda7bf34b6d2930634a888 Mon Sep 17 00:00:00 2001 From: phil235 Date: Tue, 23 Feb 2016 19:37:42 +0100 Subject: [PATCH 2/4] Refactored the item's action system. Items can now hold multiple actions. The "set internals" button of tank items now turn green when it's used as internals. Removed research scanner from drones (since cyborgs don't have it, it's more consistent) Removed the ignore_madkadjust mask var. The sechailer mask now has an adjust mask action button, so I removed the adjust verb that it was using. The item's action are now created on item/New() instead of trying to create it every time someone picks the item up. I split hud/action.dm, the datum/action stuff is now in the datum folder (/datum/action.dm), whereas the code for action buttons is kept in the hud folder under action_button.dm. Also I moved some /datum/action code that was in some files back into datum/action.dm where it belongs. --- code/_onclick/hud/action.dm | 310 --------------- code/_onclick/hud/action_button.dm | 136 +++++++ code/_onclick/hud/screen_objects.dm | 97 ++--- code/datums/action.dm | 357 ++++++++++++++++++ code/datums/mind.dm | 30 +- .../miniantags/abduction/abduction_gear.dm | 10 +- .../miniantags/revenant/revenant_abilities.dm | 4 +- .../gamemodes/shadowling/shadowling_items.dm | 3 +- code/game/machinery/deployable.dm | 6 +- code/game/objects/items.dm | 38 +- code/game/objects/items/devices/flashlight.dm | 9 +- .../objects/items/devices/traitordevices.dm | 6 +- .../objects/items/robot/robot_upgrades.dm | 13 +- .../objects/items/weapons/chrono_eraser.dm | 19 +- code/game/objects/items/weapons/defib.dm | 7 +- .../objects/items/weapons/implants/implant.dm | 16 +- .../objects/items/weapons/tanks/jetpack.dm | 38 +- .../game/objects/items/weapons/tanks/tanks.dm | 37 +- .../objects/items/weapons/tanks/watertank.dm | 4 +- code/game/objects/items/weapons/twohanded.dm | 7 +- code/modules/clothing/clothing.dm | 57 +-- .../clothing/glasses/engine_goggles.dm | 13 +- code/modules/clothing/glasses/glasses.dm | 13 +- code/modules/clothing/glasses/hud.dm | 2 +- code/modules/clothing/head/hardhat.dm | 7 +- code/modules/clothing/head/helmet.dm | 44 +-- code/modules/clothing/head/misc_special.dm | 5 +- code/modules/clothing/masks/boxing.dm | 3 +- code/modules/clothing/masks/breath.dm | 3 +- code/modules/clothing/masks/gasmask.dm | 6 +- code/modules/clothing/masks/hailer.dm | 21 +- code/modules/clothing/masks/miscellaneous.dm | 6 +- code/modules/clothing/shoes/bananashoes.dm | 13 +- code/modules/clothing/shoes/magboots.dm | 2 +- .../modules/clothing/spacesuits/chronosuit.dm | 8 +- code/modules/clothing/spacesuits/hardsuit.dm | 31 +- .../clothing/spacesuits/miscellaneous.dm | 6 +- code/modules/clothing/suits/armor.dm | 2 +- code/modules/clothing/suits/jobs.dm | 1 - code/modules/clothing/suits/miscellaneous.dm | 7 +- code/modules/clothing/suits/toggles.dm | 15 +- code/modules/clothing/under/chameleon.dm | 2 +- .../carbon/alien/humanoid/alien_powers.dm | 23 +- code/modules/mob/living/carbon/carbon.dm | 7 - .../mob/living/carbon/human/inventory.dm | 4 +- code/modules/mob/living/carbon/inventory.dm | 8 +- code/modules/mob/living/carbon/life.dm | 10 +- code/modules/mob/living/life.dm | 43 --- .../simple_animal/friendly/drone/_drone.dm | 1 - .../mob/living/simple_animal/slime/death.dm | 4 + code/modules/mob/mob.dm | 15 +- code/modules/mob/mob_defines.dm | 1 - code/modules/projectiles/gun.dm | 34 +- .../projectiles/guns/projectile/automatic.dm | 9 +- .../projectiles/guns/projectile/launchers.dm | 4 +- .../projectiles/guns/projectile/pistol.dm | 4 +- .../guns/projectile/rechargable_magazine.dm | 2 +- .../projectiles/guns/projectile/shotgun.dm | 2 +- .../projectiles/guns/projectile/toy.dm | 2 +- code/modules/spells/spell.dm | 9 +- .../surgery/organs/augments_internal.dm | 8 +- code/modules/surgery/organs/organ_internal.dm | 19 +- icons/mob/actions.dmi | Bin 76460 -> 76712 bytes tgstation.dme | 3 +- 64 files changed, 850 insertions(+), 776 deletions(-) delete mode 100644 code/_onclick/hud/action.dm create mode 100644 code/_onclick/hud/action_button.dm create mode 100644 code/datums/action.dm diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm deleted file mode 100644 index f7408e3ff8f..00000000000 --- a/code/_onclick/hud/action.dm +++ /dev/null @@ -1,310 +0,0 @@ -#define AB_CHECK_RESTRAINED 1 -#define AB_CHECK_STUNNED 2 -#define AB_CHECK_LYING 4 -#define AB_CHECK_CONSCIOUS 8 - - -/datum/action - var/name = "Generic Action" - var/obj/item/target = null - var/check_flags = 0 - var/processing = 0 - var/obj/screen/movable/action_button/button = null - var/button_icon = 'icons/mob/actions.dmi' - var/button_icon_state = "default" - var/background_icon_state = "bg_default" - var/mob/living/owner - -/datum/action/New(var/Target) - target = Target - -/datum/action/Destroy() - if(owner) - Remove(owner) - return ..() - -/datum/action/proc/Grant(mob/living/T) - if(owner) - if(owner == T) - return - Remove(owner) - owner = T - T.actions += src - - if(!button) - button = new - button.linked_action = src - button.name = UpdateName() - if(T.client) - T.client.screen += button - T.update_action_buttons() - -/datum/action/proc/Remove(mob/living/T) - if(button) - if(T.client) - T.client.screen -= button - qdel(button) - button = null - T.actions -= src - T.update_action_buttons() - owner = null - -/datum/action/proc/Trigger() - if(!IsAvailable()) - return 0 - return 1 - -/datum/action/proc/Process() - return - -/datum/action/proc/IsAvailable() - if(!owner) - return 0 - if(check_flags & AB_CHECK_RESTRAINED) - if(owner.restrained()) - return 0 - if(check_flags & AB_CHECK_STUNNED) - if(owner.stunned || owner.weakened) - return 0 - if(check_flags & AB_CHECK_LYING) - if(owner.lying) - return 0 - if(check_flags & AB_CHECK_CONSCIOUS) - if(owner.stat) - return 0 - return 1 - -/datum/action/proc/UpdateName() - return name - -/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button) - current_button.overlays.Cut() - if(button_icon && button_icon_state) - var/image/img - img = image(button_icon, current_button, button_icon_state) - img.pixel_x = 0 - img.pixel_y = 0 - current_button.overlays += img - -/obj/screen/movable/action_button - var/datum/action/linked_action - screen_loc = null - -/obj/screen/movable/action_button/Click(location,control,params) - var/list/modifiers = params2list(params) - if(modifiers["shift"]) - moved = 0 - return 1 - if(usr.next_move >= world.time) // Is this needed ? - return - linked_action.Trigger() - return 1 - -/obj/screen/movable/action_button/proc/UpdateIcon() - if(!linked_action) - return - icon = linked_action.button_icon - icon_state = linked_action.background_icon_state - - linked_action.ApplyIcon(src) - - if(!linked_action.IsAvailable()) - color = rgb(128,0,0,128) - else - color = rgb(255,255,255,255) - -//Hide/Show Action Buttons ... Button -/obj/screen/movable/action_button/hide_toggle - name = "Hide Buttons" - icon = 'icons/mob/actions.dmi' - icon_state = "bg_default" - var/hidden = 0 - -/obj/screen/movable/action_button/hide_toggle/Click(location,control,params) - var/list/modifiers = params2list(params) - if(modifiers["shift"]) - moved = 0 - return 1 - usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden - - hidden = usr.hud_used.action_buttons_hidden - if(hidden) - name = "Show Buttons" - else - name = "Hide Buttons" - UpdateIcon() - usr.update_action_buttons() - - -/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(mob/living/user) - if(isalien(user)) - icon_state = "bg_alien" - else - icon_state = "bg_default" - UpdateIcon() - return - -/obj/screen/movable/action_button/hide_toggle/UpdateIcon() - overlays.Cut() - var/image/img = image(icon, src, hidden ? "show" : "hide") - overlays += img - return - - -/obj/screen/movable/action_button/MouseEntered(location,control,params) - openToolTip(usr,src,params,title = name,content = desc) - - -/obj/screen/movable/action_button/MouseExited() - closeToolTip(usr) - - -//This is the proc used to update all the action buttons. Properly defined in /mob/living/ -/mob/proc/update_action_buttons(reload_screen) - return - -//used to update the buttons icon. -/mob/proc/update_action_buttons_icon() - return - -#define AB_MAX_COLUMNS 10 - -/datum/hud/proc/ButtonNumberToScreenCoords(number) // TODO : Make this zero-indexed for readabilty - var/row = round((number - 1)/AB_MAX_COLUMNS) - var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 - - var/coord_col = "+[col-1]" - var/coord_col_offset = 4 + 2 * col - - var/coord_row = "[row ? -row : "+0"]" - - return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-6" - -/datum/hud/proc/SetButtonCoords(obj/screen/button,number) - var/row = round((number-1)/AB_MAX_COLUMNS) - var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 - var/x_offset = 32*(col-1) + 4 + 2*col - var/y_offset = -32*(row+1) + 26 - - var/matrix/M = matrix() - M.Translate(x_offset,y_offset) - button.transform = M - -//Presets for item actions -/datum/action/item_action - check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS - -/datum/action/item_action/Trigger() - if(!..()) - return 0 - if(target) - var/obj/item/item = target - item.ui_action_click() - return 1 - -/datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button) - current_button.overlays.Cut() - if(target) - var/obj/item/I = target - var/old = I.layer - I.layer = FLOAT_LAYER //AAAH - current_button.overlays += I - I.layer = old - -/datum/action/item_action/hands_free - check_flags = AB_CHECK_CONSCIOUS - -/datum/action/item_action/organ_action - check_flags = AB_CHECK_CONSCIOUS - -/datum/action/item_action/organ_action/IsAvailable() - var/obj/item/organ/internal/I = target - if(!I.owner) - return 0 - return ..() - -//Preset for spells -/datum/action/spell_action - check_flags = 0 - background_icon_state = "bg_spell" - -/datum/action/spell_action/Trigger() - if(!..()) - return 0 - if(target) - var/obj/effect/proc_holder/spell = target - spell.Click() - return 1 - -/datum/action/spell_action/UpdateName() - return target.name - -/datum/action/spell_action/IsAvailable() - if(!target) - return 0 - var/obj/effect/proc_holder/spell/spell = target - - if(usr) - return spell.can_cast(usr) - else - if(owner) - return spell.can_cast(owner) - return 1 - -//Preset for general and toggled actions -/datum/action/innate - check_flags = 0 - var/active = 0 - -/datum/action/innate/Trigger() - if(!..()) - return 0 - if(!active) - Activate() - else - Deactivate() - return 1 - -/datum/action/innate/proc/Activate() - return - -/datum/action/innate/proc/Deactivate() - return - -//Preset for action that call specific procs (consider innate). -/datum/action/generic - check_flags = 0 - var/procname - -/datum/action/generic/Trigger() - if(!..()) - return 0 - if(target && procname) - call(target, procname)(usr) - return 1 - - -//Action button controlling a mob's research examine ability. -/datum/action/innate/scan_mode - name = "Toggle Research Scanner" - button_icon_state = "scan_mode" - check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS - var/devices = 0 //How may enabled scanners the mob has - -/datum/action/innate/scan_mode/Activate() - active = 1 - owner.research_scanner = 1 - owner << "Research analyzer is now active." - -/datum/action/innate/scan_mode/Deactivate() - active = 0 - owner.research_scanner = 0 - owner << "Research analyzer deactivated." - -/datum/action/innate/scan_mode/Grant(mob/living/T) - ..(T) - -/datum/action/innate/scan_mode/Remove(mob/living/T) - owner.research_scanner = 0 - active = 0 - ..(T) \ No newline at end of file diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm new file mode 100644 index 00000000000..e24462f6493 --- /dev/null +++ b/code/_onclick/hud/action_button.dm @@ -0,0 +1,136 @@ + +/obj/screen/movable/action_button + var/datum/action/linked_action + screen_loc = null + +/obj/screen/movable/action_button/Click(location,control,params) + var/list/modifiers = params2list(params) + if(modifiers["shift"]) + moved = 0 + return 1 + if(usr.next_move >= world.time) // Is this needed ? + return + linked_action.Trigger() + return 1 + +//Hide/Show Action Buttons ... Button +/obj/screen/movable/action_button/hide_toggle + name = "Hide Buttons" + icon = 'icons/mob/actions.dmi' + icon_state = "bg_default" + var/hidden = 0 + +/obj/screen/movable/action_button/hide_toggle/Click(location,control,params) + var/list/modifiers = params2list(params) + if(modifiers["shift"]) + moved = 0 + return 1 + usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden + + hidden = usr.hud_used.action_buttons_hidden + if(hidden) + name = "Show Buttons" + else + name = "Hide Buttons" + UpdateIcon() + usr.update_action_buttons() + + +/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(mob/living/user) + if(isalien(user)) + icon_state = "bg_alien" + else + icon_state = "bg_default" + UpdateIcon() + return + +/obj/screen/movable/action_button/hide_toggle/proc/UpdateIcon() + overlays.Cut() + var/image/img = image(icon, src, hidden ? "show" : "hide") + overlays += img + return + + +/obj/screen/movable/action_button/MouseEntered(location,control,params) + openToolTip(usr,src,params,title = name,content = desc) + + +/obj/screen/movable/action_button/MouseExited() + closeToolTip(usr) + + + +//used to update the buttons icon. +/mob/proc/update_action_buttons_icon() + return + +/mob/living/update_action_buttons_icon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +//This is the proc used to update all the action buttons. +/mob/proc/update_action_buttons(reload_screen) + return + +/mob/living/update_action_buttons(reload_screen) + if(!hud_used || !client) + return + + if(hud_used.hud_shown != HUD_STYLE_STANDARD) + return + + var/button_number = 0 + + if(hud_used.action_buttons_hidden) + for(var/datum/action/A in actions) + A.button.screen_loc = null + if(reload_screen) + client.screen += A.button + else + for(var/datum/action/A in actions) + button_number++ + A.UpdateButtonIcon() + var/obj/screen/movable/action_button/B = A.button + if(!B.moved) + B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number) + else + B.screen_loc = B.moved + if(reload_screen) + client.screen += B + + if(!button_number) + hud_used.hide_actions_toggle.screen_loc = null + return + + if(!hud_used.hide_actions_toggle.moved) + hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) + else + hud_used.hide_actions_toggle.screen_loc = hud_used.hide_actions_toggle.moved + if(reload_screen) + client.screen += hud_used.hide_actions_toggle + + + +#define AB_MAX_COLUMNS 10 + +/datum/hud/proc/ButtonNumberToScreenCoords(number) // TODO : Make this zero-indexed for readabilty + var/row = round((number - 1)/AB_MAX_COLUMNS) + var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 + + var/coord_col = "+[col-1]" + var/coord_col_offset = 4 + 2 * col + + var/coord_row = "[row ? -row : "+0"]" + + return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-6" + +/datum/hud/proc/SetButtonCoords(obj/screen/button,number) + var/row = round((number-1)/AB_MAX_COLUMNS) + var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 + var/x_offset = 32*(col-1) + 4 + 2*col + var/y_offset = -32*(row+1) + 26 + + var/matrix/M = matrix() + M.Translate(x_offset,y_offset) + button.transform = M diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 33137e1954c..797f0d1ff67 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -106,54 +106,59 @@ screen_loc = ui_internal /obj/screen/internals/Click() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(!C.incapacitated()) + if(!iscarbon(usr)) + return + var/mob/living/carbon/C = usr + if(C.incapacitated()) + return + + if(C.internal) + C.internal = null + C << "You are no longer running on internals." + icon_state = "internal0" + else + if(!istype(C.wear_mask, /obj/item/clothing/mask)) + C << "You are not wearing an internals mask!" + return 1 + else + var/obj/item/clothing/mask/M = C.wear_mask + if(M.mask_adjusted) // if mask on face but pushed down + M.adjustmask(C) // adjust it back + if( !(M.flags & MASKINTERNALS) ) + C << "You are not wearing an internals mask!" + return + if(istype(C.l_hand, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.l_hand] on your left hand." + C.internal = C.l_hand + else if(istype(C.r_hand, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.r_hand] on your right hand." + C.internal = C.r_hand + else if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(istype(H.s_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]." + H.internal = H.s_store + else if(istype(H.belt, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.belt] on your belt." + H.internal = H.belt + else if(istype(H.l_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.l_store] in your left pocket." + H.internal = H.l_store + else if(istype(H.r_store, /obj/item/weapon/tank)) + H << "You are now running on internals from the [H.r_store] in your right pocket." + H.internal = H.r_store + + //Seperate so CO2 jetpacks are a little less cumbersome. + if(!C.internal && istype(C.back, /obj/item/weapon/tank)) + C << "You are now running on internals from the [C.back] on your back." + C.internal = C.back + if(C.internal) - C.internal = null - C << "You are no longer running on internals." - icon_state = "internal0" + icon_state = "internal1" else - if(!istype(C.wear_mask, /obj/item/clothing/mask)) - C << "You are not wearing an internals mask!" - return 1 - else - var/obj/item/clothing/mask/M = C.wear_mask - if(M.mask_adjusted) // if mask on face but pushed down - M.adjustmask(C) // adjust it back - if( !(M.flags & MASKINTERNALS) ) - C << "You are not wearing an internals mask!" - return - if(istype(C.l_hand, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.l_hand] on your left hand." - C.internal = C.l_hand - else if(istype(C.r_hand, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.r_hand] on your right hand." - C.internal = C.r_hand - else if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(istype(H.s_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]." - H.internal = H.s_store - else if(istype(H.belt, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.belt] on your belt." - H.internal = H.belt - else if(istype(H.l_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.l_store] in your left pocket." - H.internal = H.l_store - else if(istype(H.r_store, /obj/item/weapon/tank)) - H << "You are now running on internals from the [H.r_store] in your right pocket." - H.internal = H.r_store - - //Seperate so CO2 jetpacks are a little less cumbersome. - if(!C.internal && istype(C.back, /obj/item/weapon/tank)) - C << "You are now running on internals from the [C.back] on your back." - C.internal = C.back - - if(C.internal) - icon_state = "internal1" - else - C << "You don't have an oxygen tank!" + C << "You don't have an oxygen tank!" + return + C.update_action_buttons_icon() /obj/screen/mov_intent name = "run/walk toggle" diff --git a/code/datums/action.dm b/code/datums/action.dm new file mode 100644 index 00000000000..2743fd5f0fb --- /dev/null +++ b/code/datums/action.dm @@ -0,0 +1,357 @@ +#define AB_CHECK_RESTRAINED 1 +#define AB_CHECK_STUNNED 2 +#define AB_CHECK_LYING 4 +#define AB_CHECK_CONSCIOUS 8 + + +/datum/action + var/name = "Generic Action" + var/obj/target = null + var/check_flags = 0 + var/processing = 0 + var/obj/screen/movable/action_button/button = null + var/button_icon = 'icons/mob/actions.dmi' + var/button_icon_state = "default" + var/background_icon_state = "bg_default" + var/mob/living/owner + +/datum/action/New(Target) + target = Target + button = new + button.linked_action = src + button.name = name + +/datum/action/Destroy() + if(owner) + Remove(owner) + target = null + qdel(button) + button = null + return ..() + +/datum/action/proc/Grant(mob/living/L) + if(owner) + if(owner == L) + return + Remove(owner) + owner = L + L.actions += src + if(L.client) + L.client.screen += button + L.update_action_buttons() + +/datum/action/proc/Remove(mob/living/L) + if(L.client) + L.client.screen -= button + button.moved = FALSE //so the button appears in its normal position when given to another owner. + L.actions -= src + L.update_action_buttons() + owner = null + +/datum/action/proc/Trigger() + if(!IsAvailable()) + return 0 + return 1 + +/datum/action/proc/Process() + return + +/datum/action/proc/IsAvailable() + if(!owner) + return 0 + if(check_flags & AB_CHECK_RESTRAINED) + if(owner.restrained()) + return 0 + if(check_flags & AB_CHECK_STUNNED) + if(owner.stunned || owner.weakened) + return 0 + if(check_flags & AB_CHECK_LYING) + if(owner.lying) + return 0 + if(check_flags & AB_CHECK_CONSCIOUS) + if(owner.stat) + return 0 + return 1 + +/datum/action/proc/UpdateButtonIcon() + if(button) + button.icon = button_icon + button.icon_state = background_icon_state + + ApplyIcon(button) + + if(!IsAvailable()) + button.color = rgb(128,0,0,128) + else + button.color = rgb(255,255,255,255) + return 1 + +/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button) + current_button.overlays.Cut() + if(button_icon && button_icon_state) + var/image/img + img = image(button_icon, current_button, button_icon_state) + img.pixel_x = 0 + img.pixel_y = 0 + current_button.overlays += img + + + +//Presets for item actions +/datum/action/item_action + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS + +/datum/action/item_action/New(Target) + ..() + var/obj/item/I = target + I.actions += src + +/datum/action/item_action/Destroy() + var/obj/item/I = target + I.actions -= src + return ..() + +/datum/action/item_action/Trigger() + if(!..()) + return 0 + if(target) + var/obj/item/I = target + I.ui_action_click(owner, src.type) + return 1 + +/datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button) + current_button.overlays.Cut() + if(target) + var/obj/item/I = target + var/old = I.layer + I.layer = FLOAT_LAYER //AAAH + current_button.overlays += I + I.layer = old + +/datum/action/item_action/toggle_light + name = "Toggle Light" + +/datum/action/item_action/toggle_hood + name = "Toggle Hood" + +/datum/action/item_action/toggle_firemode + name = "Toggle Firemode" + +/datum/action/item_action/startchainsaw + name = "Pull The Starting Cord" + +/datum/action/item_action/toggle_gunlight + name = "Toggle Gunlight" + +/datum/action/item_action/toggle_mode + name = "Toggle Mode" + +/datum/action/item_action/toggle_barrier_spread + name = "Toggle Barrier Spread" + +/datum/action/item_action/equip_unequip_TED_Gun + name = "Equip/Unequip TED Gun" + +/datum/action/item_action/toggle_paddles + name = "Toggle Paddles" + +/datum/action/item_action/set_internals + name = "Set Internals" + +/datum/action/item_action/set_internals/UpdateButtonIcon() + if(..()) //button available + if(iscarbon(owner)) + var/mob/living/carbon/C = owner + if(target == C.internal) + button.icon_state = "bg_internals_on" + +/datum/action/item_action/toggle_mister + name = "Toggle Mister" + +/datum/action/item_action/activate_injector + name = "Activate Injector" + +/datum/action/item_action/toggle_helmet_light + name = "Toggle Helmet Light" + +/datum/action/item_action/toggle_helmet_flashlight + name = "Toggle Helmet Flashlight" + +/datum/action/item_action/toggle_helmet_mode + name = "Toggle Helmet Mode" + +/datum/action/item_action/toggle + +/datum/action/item_action/toggle/New(Target) + ..() + name = "Toggle [target.name]" + button.name = name + +/datum/action/item_action/halt + name = "HALT!" + +/datum/action/item_action/toggle_voice_box + name = "Toggle Voice Box" + +/datum/action/item_action/change + name = "Change" + +/datum/action/item_action/adjust + +/datum/action/item_action/adjust/New(Target) + ..() + name = "Adjust [target.name]" + button.name = name + +/datum/action/item_action/switch_hud + name = "Switch HUD" + +/datum/action/item_action/toggle_wings + name = "Toggle Wings" + +/datum/action/item_action/toggle_human_head + name = "Toggle Human Head" + +/datum/action/item_action/toggle_helmet + name = "Toggle Helmet" + +/datum/action/item_action/jetpack_mode + name = "Jetpack Mode" + +/datum/action/item_action/hands_free + check_flags = AB_CHECK_CONSCIOUS + +/datum/action/item_action/hands_free/activate + name = "Activate" + + +/datum/action/item_action/hands_free/shift_nerves + name = "Shift Nerves" + + +/datum/action/item_action/toggle_research_scanner + name = "Toggle Research Scanner" + button_icon_state = "scan_mode" + +/datum/action/item_action/toggle_research_scanner/Trigger() + if(IsAvailable()) + owner.research_scanner = !owner.research_scanner + owner << "Research analyzer is now [owner.research_scanner ? "active" : "deactivated"]." + return 1 + +/datum/action/item_action/toggle_research_scanner/Remove(mob/living/L) + if(owner) + owner.research_scanner = 0 + ..() + +/datum/action/item_action/toggle_research_scanner/ApplyIcon(obj/screen/movable/action_button/current_button) + if(button_icon && button_icon_state) + var/image/img = image(button_icon, current_button, "scan_mode") + current_button.overlays += img + +/datum/action/item_action/organ_action + check_flags = AB_CHECK_CONSCIOUS + +/datum/action/item_action/organ_action/New(Target) + ..() + name = "Toggle [target.name]" + button.name = name + +/datum/action/item_action/organ_action/IsAvailable() + var/obj/item/organ/internal/I = target + if(!I.owner) + return 0 + return ..() + + + +//Preset for spells +/datum/action/spell_action + check_flags = 0 + background_icon_state = "bg_spell" + +/datum/action/spell_action/New(Target) + ..() + var/obj/effect/proc_holder/spell/S = target + S.action = src + name = S.name + button_icon = S.action_icon + button_icon_state = S.action_icon_state + background_icon_state = S.action_background_icon_state + button.name = name + +/datum/action/spell_action/Destroy() + var/obj/effect/proc_holder/spell/S = target + S.action = null + return ..() + +/datum/action/spell_action/Trigger() + if(!..()) + return 0 + if(target) + var/obj/effect/proc_holder/spell = target + spell.Click() + return 1 + +/datum/action/spell_action/IsAvailable() + if(!target) + return 0 + var/obj/effect/proc_holder/spell/spell = target + + if(usr) + return spell.can_cast(usr) + else + if(owner) + return spell.can_cast(owner) + return 1 + + +/datum/action/spell_action/alien + +/datum/action/spell_action/alien/IsAvailable() + if(!target) + return 0 + var/obj/effect/proc_holder/alien/ab = target + + if(usr) + return ab.cost_check(ab.check_turf,usr,1) + else + if(owner) + return ab.cost_check(ab.check_turf,owner,1) + return 1 + + + +//Preset for general and toggled actions +/datum/action/innate + check_flags = 0 + var/active = 0 + +/datum/action/innate/Trigger() + if(!..()) + return 0 + if(!active) + Activate() + else + Deactivate() + return 1 + +/datum/action/innate/proc/Activate() + return + +/datum/action/innate/proc/Deactivate() + return + + + +//Preset for action that call specific procs (consider innate). +/datum/action/generic + check_flags = 0 + var/procname + +/datum/action/generic/Trigger() + if(!..()) + return 0 + if(target && procname) + call(target, procname)(usr) + return 1 diff --git a/code/datums/mind.dm b/code/datums/mind.dm index ab14f6575c9..7fc41c16e58 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1549,34 +1549,20 @@ return 1 -/datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/spell) - spell_list += spell - if(!spell.action) - spell.action = new/datum/action/spell_action - spell.action.target = spell - spell.action.name = spell.name - spell.action.button_icon = spell.action_icon - spell.action.button_icon_state = spell.action_icon_state - spell.action.background_icon_state = spell.action_background_icon_state - spell.action.Grant(current) - return +/datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) + spell_list += S + S.action.Grant(current) + /datum/mind/proc/transfer_actions(mob/living/new_character) if(current && current.actions) for(var/datum/action/A in current.actions) A.Grant(new_character) transfer_mindbound_actions(new_character) -/datum/mind/proc/transfer_mindbound_actions(var/mob/living/new_character) - for(var/obj/effect/proc_holder/spell/spell in spell_list) - if(!spell.action) // Unlikely but whatever - spell.action = new/datum/action/spell_action - spell.action.target = spell - spell.action.name = spell.name - spell.action.button_icon = spell.action_icon - spell.action.button_icon_state = spell.action_icon_state - spell.action.background_icon_state = spell.action_background_icon_state - spell.action.Grant(new_character) - return +/datum/mind/proc/transfer_mindbound_actions(mob/living/new_character) + for(var/X in spell_list) + var/obj/effect/proc_holder/spell/S = X + S.action.Grant(new_character) /mob/proc/sync_mind() mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 707df3c16f0..41b35e2f108 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -13,8 +13,7 @@ blood_overlay_type = "armor" origin_tech = "materials=5;biotech=4;powerstorage=5" armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15) - action_button_name = "Activate" - action_button_type = /datum/action/item_action/hands_free + actions_types = list(/datum/action/item_action/hands_free/activate) var/mode = VEST_STEALTH var/stealth_active = 0 var/combat_cooldown = 10 @@ -36,8 +35,9 @@ if(istype(loc, /mob/living/carbon/human)) var/mob/living/carbon/human/H = loc H.update_inv_wear_suit() - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user) if(slot == slot_wear_suit) //we only give the mob the ability to activate the vest if he's actually wearing it. @@ -365,7 +365,7 @@ Congratulations! You are now trained for xenobiology research!"} origin_tech = "materials=6;combat=5;biotech=7" force = 7 w_class = 3 - action_button_name = "Toggle Mode" + actions_types = list(/datum/action/item_action/toggle_mode) /obj/item/weapon/abductor_baton/proc/toggle(mob/living/user=usr) mode = (mode+1)%BATON_MODES diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index f61cf1c8a6e..b6d9281ab40 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -79,8 +79,8 @@ name = "[initial(name)] ([cast_amount]E)" user.reveal(reveal) user.stun(stun) - if(action && action.button) - action.button.UpdateIcon() + if(action) + action.UpdateButtonIcon() return 1 //Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people. diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm index 7be25cd4722..0284386cde5 100644 --- a/code/game/gamemodes/shadowling/shadowling_items.dm +++ b/code/game/gamemodes/shadowling/shadowling_items.dm @@ -83,8 +83,7 @@ invis_view = 2 flash_protect = -1 unacidable = 1 - action_button_name = "Shift Nerves" - action_button_type = /datum/action/item_action/hands_free + actions_types = list(/datum/action/item_action/hands_free/shift_nerves) var/max_darkness_view = 8 var/min_darkness_view = 0 flags = ABSTRACT | NODROP diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index d56706d2e09..40a9a5f4641 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -134,7 +134,7 @@ icon = 'icons/obj/grenade.dmi' icon_state = "flashbang" item_state = "flashbang" - action_button_name = "Toggle Barrier Spread" + actions_types = list(/datum/action/item_action/toggle_barrier_spread) var/mode = SINGLE /obj/item/weapon/grenade/barrier/AltClick(mob/user) @@ -172,8 +172,8 @@ new /obj/structure/barricade/security(target_turf2) qdel(src) -/obj/item/weapon/grenade/barrier/ui_action_click() - toggle_mode(usr) +/obj/item/weapon/grenade/barrier/ui_action_click(mob/user) + toggle_mode(user) #undef SINGLE diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c520f594834..7d9eddc24a4 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -33,10 +33,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags - //If this is set, The item will make an action button on the player's HUD when picked up. - var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button. - var/action_button_type = null //if we want a special type of item action, not the standard one. - var/datum/action/item_action/action = null + var/list/actions = list() //list of /datum/action's that this item has. + var/list/actions_types = list() //list of paths of action datums to give to the item on New(). //Since any item can now be a piece of clothing, this has to be put here so all items share it. var/flags_inv //This flag is used to determine when items in someone's inventory cover others. IE helmets making it so you can't see glasses, etc. @@ -130,10 +128,17 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s /obj/item/device icon = 'icons/obj/device.dmi' +/obj/item/New() + ..() + for(var/path in actions_types) + new path(src) + /obj/item/Destroy() if(ismob(loc)) var/mob/m = loc m.unEquip(src, 1) + for(var/X in actions) + qdel(X) return ..() /obj/item/blob_act() @@ -362,8 +367,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s return /obj/item/proc/dropped(mob/user) - if(action) - action.Remove(user) + for(var/X in actions) + var/datum/action/A = X + A.Remove(user) // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) @@ -388,16 +394,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s // for items that can be placed in multiple slots // note this isn't called during the initial dressing of a player /obj/item/proc/equipped(mob/user, slot) - if(action_button_name) - if(!action) - if(action_button_type) - action = new action_button_type - else - action = new/datum/action/item_action - action.name = action_button_name - action.target = src - if(item_action_slot_check(slot, user)) //some items only give their action button when in a specific slot. - action.Grant(user) + for(var/X in actions) + var/datum/action/A = X + if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot. + A.Grant(user) //sometimes we only want to grant the item's action if it's equipped in a specific slot. obj/item/proc/item_action_slot_check(slot, mob/user) @@ -423,11 +423,11 @@ obj/item/proc/item_action_slot_check(slot, mob/user) if(usr.get_active_hand() == null) // Let me know if this has any problems -Yota usr.UnarmedAttack(src) -//This proc is executed when someone clicks the on-screen UI button. To make the UI button show, set the 'action_button_name'. +//This proc is executed when someone clicks the on-screen UI button. //The default action is attack_self(). //Checks before we get to here are: mob is alive, mob is not restrained, paralyzed, asleep, resting, laying, item is on the mob. -/obj/item/proc/ui_action_click() - attack_self(usr) +/obj/item/proc/ui_action_click(mob/user, actiontype) + attack_self(user) /obj/item/proc/IsReflect(var/def_zone) //This proc determines if and at what% an object will reflect energy projectiles if it's in l_hand,r_hand or wear_suit return 0 diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 8e136bbb682..94a556d9b2e 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -8,7 +8,7 @@ flags = CONDUCT slot_flags = SLOT_BELT materials = list(MAT_METAL=50, MAT_GLASS=20) - action_button_name = "Toggle Light" + actions_types = list(/datum/action/item_action/toggle_light) var/on = 0 var/brightness_on = 4 //luminosity when on @@ -41,8 +41,9 @@ return 0 on = !on update_brightness(user) - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() return 1 @@ -195,7 +196,7 @@ obj/item/device/flashlight/lamp/bananalamp brightness_on = 7 // Pretty bright. icon_state = "flare" item_state = "flare" - action_button_name = null //just pull it manually, neckbeard. + actions_types = list() var/fuel = 0 var/on_damage = 7 var/produce_heat = 1500 diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 5ef14db2bdc..43864b56684 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -158,10 +158,10 @@ effective or pretty fucking useless. var/max_charge = 300 var/on = 0 var/old_alpha = 0 - action_button_name = "Toggle Cloaker" + actions_types = list(/datum/action/item_action/toggle) -/obj/item/device/shadowcloak/ui_action_click() - if(usr.get_item_by_slot(slot_belt) == src) +/obj/item/device/shadowcloak/ui_action_click(mob/user) + if(user.get_item_by_slot(slot_belt) == src) if(!on) Activate(usr) else diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 278156bb3ce..7cd44cecb81 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -235,12 +235,8 @@ cyborg = R icon_state = "selfrepair_off" - action_button_name = "Toggle Self-Repair" - if(!action) - action = new - action.name = action_button_name - action.target = src - action.Grant(R) + var/datum/action/A = new /datum/action/item_action/toggle(src) + A.Grant(R) return 1 /obj/item/borg/upgrade/selfrepair/ui_action_click() @@ -256,8 +252,9 @@ /obj/item/borg/upgrade/selfrepair/update_icon() if(cyborg) icon_state = "selfrepair_[on ? "on" : "off"]" - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() else icon_state = "cyborg_upgrade5" diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index f89da1dcc97..b325e95844f 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -9,7 +9,7 @@ w_class = 4 slot_flags = SLOT_BACK slowdown = 1 - action_button_name = "Equip/Unequip TED Gun" + actions_types = list(/datum/action/item_action/equip_unequip_TED_Gun) var/obj/item/weapon/gun/energy/chrono_gun/PA = null var/list/erased_minds = list() //a collection of minds from the dead @@ -25,14 +25,15 @@ dropped() return ..() -/obj/item/weapon/chrono_eraser/ui_action_click() - var/mob/living/carbon/user = src.loc - if(iscarbon(user) && (user.back == src)) - if(PA) - qdel(PA) - else - PA = new(src) - user.put_in_hands(PA) +/obj/item/weapon/chrono_eraser/ui_action_click(mob/user) + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(C.back == src) + if(PA) + qdel(PA) + else + PA = new(src) + user.put_in_hands(PA) /obj/item/weapon/chrono_eraser/item_action_slot_check(slot, mob/user) if(slot == slot_back) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 6a7476b4c94..78cd7163026 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -11,7 +11,7 @@ throwforce = 6 w_class = 4 origin_tech = "biotech=4" - action_button_name = "Toggle Paddles" + actions_types = list(/datum/action/item_action/toggle_paddles) var/on = 0 //if the paddles are equipped (1) or on the defib (0) var/safety = 1 //if you can zap people with the defibs on harm mode @@ -177,8 +177,9 @@ remove_paddles(user) update_icon() - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/weapon/defibrillator/proc/make_paddles() return new /obj/item/weapon/twohanded/shockpaddles(src) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 13a9a9f4c73..a19a828d64e 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/implants.dmi' icon_state = "generic" //Shows up as the action button icon origin_tech = "materials=2;biotech=3;programming=2" - + actions_types = list(/datum/action/item_action/hands_free/activate) var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like loyalty implants var/implanted = null var/mob/living/imp_in = null @@ -43,12 +43,9 @@ imp_in = source implanted = 1 if(activated) - action_button_name = "Activate [src.name]" - if(!action) - action = new /datum/action/item_action/hands_free - action.name = action_button_name - action.target = src - action.Grant(source) + for(var/X in actions) + var/datum/action/A = X + A.Grant(source) if(istype(source, /mob/living/carbon/human)) var/mob/living/carbon/human/H = source H.sec_hud_set_implants() @@ -62,8 +59,9 @@ src.loc = null imp_in = null implanted = 0 - if(action) - action.Remove(source) + for(var/X in actions) + var/datum/action/A = X + A.Grant(source) if(istype(source, /mob/living/carbon/human)) var/mob/living/carbon/human/H = source H.sec_hud_set_implants() diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index fad276107cf..02b89d5cd51 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -1,17 +1,3 @@ -/datum/action/item_action/jetpack/cycle - name = "Jetpack Mode" - -/datum/action/item_action/jetpack/cycle/Trigger() - if(!IsAvailable()) - return - - var/obj/item/weapon/tank/jetpack/J = target - J.cycle(owner) - return 1 - -/datum/action/item_action/jetpack/cycle/suit - name = "Internal Jetpack Mode" - /obj/item/weapon/tank/jetpack name = "jetpack (empty)" desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution." @@ -19,15 +5,12 @@ item_state = "jetpack" w_class = 4 distribute_pressure = ONE_ATMOSPHERE * O2STANDARD + actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/jetpack_mode) var/gas_type = "o2" var/on = FALSE var/turbo = FALSE - var/datum/effect_system/trail_follow/ion/ion_trail - var/datum/action/item_action/jetpack/cycle/cycle_action - var/cycle_action_type = /datum/action/item_action/jetpack/cycle - /obj/item/weapon/tank/jetpack/New() ..() air_contents.assert_gas(gas_type) @@ -36,15 +19,12 @@ ion_trail = new ion_trail.set_up(src) - cycle_action = new cycle_action_type(src) +/obj/item/weapon/tank/jetpack/ui_action_click(mob/user, actiontype) + if(actiontype == /datum/action/item_action/jetpack_mode) + cycle(user) + else + toggle_internals(user) -/obj/item/weapon/tank/jetpack/pickup(mob/user) - ..() - cycle_action.Grant(user) - -/obj/item/weapon/tank/jetpack/dropped(mob/user) - ..() - cycle_action.Remove(user) /obj/item/weapon/tank/jetpack/proc/cycle(mob/user) if(user.incapacitated()) @@ -60,6 +40,10 @@ turn_off() turbo = FALSE user << "You turn jetpack off." + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + /obj/item/weapon/tank/jetpack/proc/turn_on() on = TRUE @@ -130,8 +114,8 @@ desc = "A device that will use your internals tank as a gas source for propulsion." icon_state = "jetpack-void" item_state = "jetpack-void" + actions_types = list(/datum/action/item_action/jetpack_mode) var/obj/item/weapon/tank/internals/tank = null - cycle_action_type = /datum/action/item_action/jetpack/cycle/suit /obj/item/weapon/tank/jetpack/suit/New() ..() diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 9130d3c75f8..58b230917d2 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -9,33 +9,42 @@ throwforce = 10 throw_speed = 1 throw_range = 4 - action_button_name = "Set Internals" + actions_types = list(/datum/action/item_action/set_internals) var/datum/gas_mixture/air_contents = null var/distribute_pressure = ONE_ATMOSPHERE var/integrity = 3 var/volume = 70 -/obj/item/weapon/tank/ui_action_click() - var/mob/living/carbon/human/H = action.owner +/obj/item/weapon/tank/ui_action_click(mob/user) + toggle_internals(user) + +/obj/item/weapon/tank/proc/toggle_internals(mob/user) + var/mob/living/carbon/human/H = user if(!istype(H)) return - if(!H.wear_mask) - H << "You need a mask!" - return - if(H.wear_mask.mask_adjusted) - H.wear_mask.adjustmask(H) - if(!(H.wear_mask.flags & MASKINTERNALS)) - H << "[H.wear_mask] can't use [src]!" - return if(H.internal == src) + H << "You close [src] valve." H.internal = null - H << "You close \the [src] valve." H.update_internals_hud_icon(0) - else if(H.wear_mask && (H.wear_mask.flags & MASKINTERNALS)) + else + if(!H.wear_mask) + H << "You need a mask!" + return + if(H.wear_mask.mask_adjusted) + H.wear_mask.adjustmask(H) + if(!(H.wear_mask.flags & MASKINTERNALS)) + H << "[H.wear_mask] can't use [src]!" + return + + if(H.internal) + H << "You switch your internals to [src]." + else + H << "You open [src] valve." H.internal = src - H << "You open \the [src] valve." H.update_internals_hud_icon(1) + H.update_action_buttons_icon() + /obj/item/weapon/tank/New() ..() diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 33a83cbd03e..fdb0cdf157d 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -8,7 +8,7 @@ w_class = 4 slot_flags = SLOT_BACK slowdown = 1 - action_button_name = "Toggle Mister" + actions_types = list(/datum/action/item_action/toggle_mister) var/obj/item/weapon/noz var/on = 0 @@ -341,7 +341,7 @@ w_class = 4 slot_flags = SLOT_BACK slowdown = 1 - action_button_name = "Activate Injector" + actions_types = list(/datum/action/item_action/activate_injector) var/on = 0 volume = 300 diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 03556edae0e..1e4cc29fb10 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -394,7 +394,7 @@ attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = "swing_hit" sharpness = IS_SHARP - action_button_name = "Pull the starting cord" + actions_types = list(/datum/action/item_action/startchainsaw) var/on = 0 /obj/item/weapon/twohanded/required/chainsaw/attack_self(mob/user) @@ -412,8 +412,9 @@ if(src == user.get_active_hand()) //update inhands user.update_inv_l_hand() user.update_inv_r_hand() - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() //GREY TIDE diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index f1ce059d3ae..9cd995349a6 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -116,7 +116,6 @@ BLIND // can't see anything strip_delay = 40 put_on_delay = 40 var/mask_adjusted = 0 - var/ignore_maskadjust = 1 var/adjusted_flags = null @@ -132,31 +131,32 @@ BLIND // can't see anything //Proc that moves gas/breath masks out of the way, disabling them and allowing pill/food consumption /obj/item/clothing/mask/proc/adjustmask(mob/living/user) - if(!ignore_maskadjust) - if(user.incapacitated()) - return - if(mask_adjusted == 1) - src.icon_state = initial(icon_state) - gas_transfer_coefficient = initial(gas_transfer_coefficient) - permeability_coefficient = initial(permeability_coefficient) - flags |= visor_flags - flags_inv |= visor_flags_inv - flags_cover = initial(flags_cover) - user << "You push \the [src] back into place." - src.mask_adjusted = 0 - slot_flags = initial(slot_flags) - else - icon_state += "_up" - user << "You push \the [src] out of the way." - gas_transfer_coefficient = null - permeability_coefficient = null - flags &= ~visor_flags - flags_inv &= ~visor_flags_inv - flags_cover &= 0 - src.mask_adjusted = 1 - if(adjusted_flags) - slot_flags = adjusted_flags - user.wear_mask_update(src, unequip = 0) + if(user.incapacitated()) + return + mask_adjusted = !mask_adjusted + if(!mask_adjusted) + src.icon_state = initial(icon_state) + gas_transfer_coefficient = initial(gas_transfer_coefficient) + permeability_coefficient = initial(permeability_coefficient) + flags |= visor_flags + flags_inv |= visor_flags_inv + flags_cover = initial(flags_cover) + user << "You push \the [src] back into place." + slot_flags = initial(slot_flags) + else + icon_state += "_up" + user << "You push \the [src] out of the way." + gas_transfer_coefficient = null + permeability_coefficient = null + flags &= ~visor_flags + flags_inv &= ~visor_flags_inv + flags_cover &= 0 + if(adjusted_flags) + slot_flags = adjusted_flags + user.wear_mask_update(src, toggle_off = mask_adjusted) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() @@ -516,8 +516,9 @@ BLIND // can't see anything if(istype(usr, /mob/living/carbon)) var/mob/living/carbon/C = usr C.head_update(src, forced = 1) - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/proc/can_use(mob/user) if(user && ismob(user)) diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 4194f474fc0..c5e4954152c 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -4,7 +4,7 @@ name = "Engineering Scanner Goggles" desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes." icon_state = "trayson-meson" - action_button_name = "Change Scanning Mode" + actions_types = list(/datum/action/item_action/toggle_mode) var/mode = 0 //0 - regular mesons mode 1 - t-ray mode var/invis_objects = list() @@ -33,8 +33,9 @@ H.update_sight() update_icon() - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/glasses/meson/engine/process() if(!mode) @@ -94,7 +95,6 @@ name = "Optical T-Ray Scanner" desc = "Used by engineering staff to see underfloor objects such as cables and pipes." icon_state = "trayson-tray_off" - action_button_name = "Toggle Scanner Power" mode = 1 var/on = 0 @@ -127,8 +127,9 @@ invis_update() update_icon() - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/glasses/meson/engine/tray/t_ray_on() return on && ..() \ No newline at end of file diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 31f9e2aefae..df0f18f5405 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -50,16 +50,11 @@ item_state = "glasses" origin_tech = "magnets=2;engineering=2" scan_reagents = 1 //You can see reagents while wearing science goggles + actions_types = list(/datum/action/item_action/toggle_research_scanner) -/obj/item/clothing/glasses/science/equipped(mob/user, slot) +/obj/item/clothing/glasses/science/item_action_slot_check(slot) if(slot == slot_glasses) - user.scanner.devices += 1 - user.scanner.Grant(user) - ..(user, slot) - -/obj/item/clothing/glasses/science/dropped(mob/user) - user.scanner.devices = max(0, user.scanner.devices - 1) - ..() + return 1 /obj/item/clothing/glasses/night name = "Night Vision Goggles" @@ -170,7 +165,7 @@ desc = "Protects the eyes from welders; approved by the mad scientist association." icon_state = "welding-g" item_state = "welding-g" - action_button_name = "Toggle Welding Goggles" + actions_types = list(/datum/action/item_action/toggle) materials = list(MAT_METAL = 250) flash_protect = 2 tint = 2 diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 55b4786b813..7ab535c4d9d 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -114,7 +114,7 @@ /obj/item/clothing/glasses/hud/toggle name = "Toggle Hud" desc = "A hud with multiple functions." - action_button_name = "Switch HUD" + actions_types = list(/datum/action/item_action/switch_hud) /obj/item/clothing/glasses/hud/toggle/attack_self(mob/user) if(!ishuman(user)) diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 756732dbabe..1c0e4b04794 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -8,7 +8,7 @@ item_color = "yellow" //Determines used sprites: hardhat[on]_[item_color] and hardhat[on]_[item_color]2 (lying down sprite) armor = list(melee = 15, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20) flags_inv = 0 - action_button_name = "Toggle Helmet Light" + actions_types = list(/datum/action/item_action/toggle_helmet_light) burn_state = FIRE_PROOF /obj/item/clothing/head/hardhat/attack_self(mob/user) @@ -24,8 +24,9 @@ turn_on(user) else turn_off(user) - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/head/hardhat/pickup(mob/user) ..() diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 5592732ca14..543f765addb 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -43,7 +43,7 @@ armor = list(melee = 41, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0) flags_inv = HIDEMASK|HIDEEARS|HIDEFACE strip_delay = 80 - action_button_name = "Toggle Helmet Visor" + actions_types = list(/datum/action/item_action/toggle) visor_flags_inv = HIDEMASK|HIDEFACE toggle_cooldown = 0 flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH @@ -75,7 +75,7 @@ icon_state = "justice" toggle_message = "You turn off the lights on" alt_toggle_message = "You turn on the lights on" - action_button_name = "Toggle Justice Lights" + actions_types = list(/datum/action/item_action/toggle_helmet_light) can_toggle = 1 toggle_cooldown = 20 active_sound = 'sound/items/WEEOO1.ogg' @@ -86,7 +86,6 @@ icon_state = "justice2" toggle_message = "You turn off the light on" alt_toggle_message = "You turn on the light on" - action_button_name = "Toggle Alarm Lights" /obj/item/clothing/head/helmet/swat name = "\improper SWAT helmet" @@ -210,35 +209,33 @@ return -/obj/item/clothing/head/helmet/ui_action_click() - toggle_helmlight() - ..() +/obj/item/clothing/head/helmet/ui_action_click(mob/user, actiontype) + if(actiontype == /datum/action/item_action/toggle_helmet_flashlight) + toggle_helmlight() + else + ..() -/obj/item/clothing/head/helmet/attackby(obj/item/A, mob/user, params) - if(istype(A, /obj/item/device/flashlight/seclite)) - var/obj/item/device/flashlight/seclite/S = A +/obj/item/clothing/head/helmet/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/device/flashlight/seclite)) + var/obj/item/device/flashlight/seclite/S = I if(can_flashlight) if(!F) - if(!user.unEquip(A)) + if(!user.unEquip(S)) return user << "You click [S] into place on [src]." if(S.on) SetLuminosity(0) F = S - A.loc = src + S.loc = src update_icon() update_helmlight(user) verbs += /obj/item/clothing/head/helmet/proc/toggle_helmlight - action_button_name = "Toggle Helmetlight" + var/datum/action/A = new /datum/action/item_action/toggle_helmet_flashlight(src) if(loc == user) - if(!action) - action = new - action.name = action_button_name - action.target = src - action.Grant(user) + A.Grant(user) return - if(istype(A, /obj/item/weapon/screwdriver)) + if(istype(I, /obj/item/weapon/screwdriver)) if(F) for(var/obj/item/device/flashlight/seclite/S in src) user << "You unscrew the seclite from [src]." @@ -249,9 +246,8 @@ update_icon() usr.update_inv_head() verbs -= /obj/item/clothing/head/helmet/proc/toggle_helmlight - action_button_name = null - if(action && loc == user) - action.Remove(user) + for(var/datum/action/item_action/toggle_helmet_flashlight/THL in actions) + qdel(THL) return ..() @@ -295,9 +291,9 @@ user.AddLuminosity(-5) else if(isturf(loc)) SetLuminosity(0) - action_button_name = null - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/head/helmet/pickup(mob/user) ..() diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 91265c6cd01..9b660fb015c 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -23,7 +23,7 @@ tint = 2 armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - action_button_name = "Toggle Welding Helmet" + actions_types = list(/datum/action/item_action/toggle) visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE burn_state = FIRE_PROOF @@ -49,7 +49,6 @@ item_state = "hardhat0_cakehat" item_color = "cakehat" flags_inv = HIDEEARS|HIDEHAIR - action_button_name = "Toggle Candle" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) brightness_on = 2 //luminosity when on flags_cover = HEADCOVERSEYES @@ -116,7 +115,6 @@ item_state = "hardhat0_pumpkin" item_color = "pumpkin" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - action_button_name = "Toggle Pumpkin Light" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) brightness_on = 2 //luminosity when on flags_cover = HEADCOVERSEYES @@ -147,6 +145,5 @@ item_state = "hardhat0_reindeer" item_color = "reindeer" flags_inv = 0 - action_button_name = "Toggle Nose Light" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) brightness_on = 1 //luminosity when on diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 8b537b722f6..2c9fa24c27f 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -6,8 +6,7 @@ flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR visor_flags_inv = HIDEFACE|HIDEFACIALHAIR w_class = 2 - action_button_name = "Adjust Balaclava" - ignore_maskadjust = 0 + actions_types = list(/datum/action/item_action/adjust) /obj/item/clothing/mask/balaclava/attack_self(mob/user) adjustmask(user) diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index ef684dac5f7..2ac22361d26 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -9,8 +9,7 @@ w_class = 2 gas_transfer_coefficient = 0.10 permeability_coefficient = 0.50 - action_button_name = "Adjust Breath Mask" - ignore_maskadjust = 0 + actions_types = list(/datum/action/item_action/adjust) flags_cover = MASKCOVERSMOUTH burn_state = FIRE_PROOF diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 07a038729a2..99eb30afe61 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -22,7 +22,7 @@ tint = 2 armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) origin_tech = "materials=2;engineering=2" - action_button_name = "Toggle Welding Mask" + actions_types = list(/datum/action/item_action/toggle) flags_inv = HIDEEARS|HIDEEYES|HIDEFACE flags_cover = MASKCOVERSEYES visor_flags_inv = HIDEEYES @@ -60,7 +60,7 @@ var/voice = "Unknown" var/vchange = 0//This didn't do anything before. It now checks if the mask has special functions/N origin_tech = "syndicate=4" - action_button_name = "Toggle mask" + actions_types = list(/datum/action/item_action/toggle) /obj/item/clothing/mask/gas/voice/attack_self(mob/user) vchange = !vchange @@ -109,7 +109,7 @@ item_state = "mime" flags_cover = MASKCOVERSEYES burn_state = FLAMMABLE - action_button_name = "Adjust Mask" + actions_types = list(/datum/action/item_action/adjust) /obj/item/clothing/mask/gas/mime/attack_self(mob/user) cycle_mask(usr) diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index d35e67bde87..040ef0bab42 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -4,9 +4,8 @@ /obj/item/clothing/mask/gas/sechailer name = "security gas mask" desc = "A standard issue Security gas mask with integrated 'Compli-o-nator 3000' device. Plays over a dozen pre-recorded compliance phrases designed to get scumbags to stand still whilst you taze them. Do not tamper with the device." - action_button_name = "HALT!" + actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust) icon_state = "sechailer" - ignore_maskadjust = 0 flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS flags_inv = HIDEFACIALHAIR|HIDEFACE w_class = 2 @@ -21,10 +20,9 @@ /obj/item/clothing/mask/gas/sechailer/swat name = "\improper SWAT mask" desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000." - action_button_name = "HALT!" + actions_types = list(/datum/action/item_action/halt) icon_state = "swat" aggressiveness = 3 - ignore_maskadjust = 1 flags_inv = HIDEFACIALHAIR|HIDEFACE|HIDEEYES|HIDEEARS visor_flags_inv = 0 @@ -34,11 +32,7 @@ icon = 'icons/obj/device.dmi' icon_state = "taperecorder_idle" aggressiveness = 1 //Borgs are nicecurity! - ignore_maskadjust = 1 - -/obj/item/clothing/mask/gas/sechailer/cyborg/New() - ..() - verbs -= /obj/item/clothing/mask/gas/sechailer/verb/adjust + actions_types = list(/datum/action/item_action/halt) /obj/item/clothing/mask/gas/sechailer/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/screwdriver)) @@ -61,10 +55,11 @@ else ..() -/obj/item/clothing/mask/gas/sechailer/verb/adjust() - set category = "Object" - set name = "Adjust Mask" - adjustmask(usr) +/obj/item/clothing/mask/gas/sechailer/ui_action_click(mob/user, actiontype) + if(actiontype == /datum/action/item_action/halt) + halt() + else + adjustmask(user) /obj/item/clothing/mask/gas/sechailer/attack_self() halt() diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 1a6a0f006ea..669c5467606 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -28,8 +28,7 @@ gas_transfer_coefficient = 0.90 permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0) - action_button_name = "Adjust Sterile Mask" - ignore_maskadjust = 0 + actions_types = list(/datum/action/item_action/adjust) /obj/item/clothing/mask/surgical/attack_self(mob/user) adjustmask(user) @@ -47,7 +46,7 @@ item_state = "pig" flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR w_class = 2 - action_button_name = "Toggle Voice Box" + actions_types = list(/datum/action/item_action/toggle_voice_box) var/voicechange = 0 /obj/item/clothing/mask/pig/attack_self(mob/user) @@ -110,7 +109,6 @@ flags_inv = HIDEFACE|HIDEFACIALHAIR visor_flags_inv = HIDEFACE|HIDEFACIALHAIR slot_flags = SLOT_MASK - ignore_maskadjust = 0 adjusted_flags = SLOT_HEAD icon_state = "bandbotany" diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index dea88acaef8..0f7accc2e5d 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -6,7 +6,7 @@ icon_state = "clown_prototype_off" var/on = 0 var/datum/material_container/bananium - action_button_name = "Toggle Shoes" + actions_types = list(/datum/action/item_action/toggle) /obj/item/clothing/shoes/clown_shoes/banana_shoes/New() ..() @@ -58,13 +58,13 @@ var/ban_amt = bananium.amount(MAT_BANANIUM) user << "The shoes are [on ? "enabled" : "disabled"]. There is [ban_amt ? ban_amt : "no"] bananium left." -/obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click() +/obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click(mob/user) if(bananium.amount(MAT_BANANIUM)) on = !on update_icon() - loc << "You [on ? "activate" : "deactivate"] the prototype shoes." + user << "You [on ? "activate" : "deactivate"] the prototype shoes." else - loc << "You need bananium to turn the prototype shoes on!" + user << "You need bananium to turn the prototype shoes on!" /obj/item/clothing/shoes/clown_shoes/banana_shoes/update_icon() if(on) @@ -72,5 +72,6 @@ else icon_state = "clown_prototype_off" usr.update_inv_shoes() - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index ed673d40c50..bc4c31f0aa3 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -5,7 +5,7 @@ var/magboot_state = "magboots" var/magpulse = 0 var/slowdown_active = 2 - action_button_name = "Toggle Magboots" + actions_types = list(/datum/action/item_action/toggle) strip_delay = 70 put_on_delay = 70 burn_state = FIRE_PROOF diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index ec6fdaa65fd..de2d07a8e87 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -22,7 +22,7 @@ desc = "An advanced spacesuit equipped with teleportation and anti-compression technology" icon_state = "chronosuit" item_state = "chronosuit" - action_button_name = "Toggle Chronosuit" + actions_types = list(/datum/action/item_action/toggle) armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90) var/list/chronosafe_items = list(/obj/item/weapon/chrono_eraser, /obj/item/weapon/gun/energy/chrono_gun) var/hands_nodrop_states @@ -93,8 +93,7 @@ if(camera) camera.remove_target_ui() camera.loc = user - if(teleport_now.button) - teleport_now.button.UpdateIcon() + teleport_now.UpdateButtonIcon() /obj/item/clothing/suit/space/chronos/proc/chronowalk(atom/location) var/mob/living/carbon/human/user = src.loc @@ -108,8 +107,7 @@ if(camera) camera.remove_target_ui() - if(teleport_now.button) - teleport_now.button.UpdateIcon() + teleport_now.UpdateButtonIcon() var/list/nonsafe_slots = list(slot_belt, slot_back, slot_l_hand, slot_r_hand) for(var/slot in nonsafe_slots) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 7e586e890c5..8117736920a 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -10,7 +10,7 @@ var/on = 0 var/obj/item/clothing/suit/space/hardsuit/suit item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite) - action_button_name = "Toggle Helmet Light" + actions_types = list(/datum/action/item_action/toggle_helmet_light) /obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user) @@ -25,8 +25,9 @@ user.AddLuminosity(brightness_on) else user.AddLuminosity(-brightness_on) - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/head/helmet/space/hardsuit/pickup(mob/user) @@ -78,7 +79,7 @@ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/pipe_dispenser) siemens_coefficient = 0 var/obj/item/clothing/head/helmet/space/hardsuit/helmet - action_button_name = "Toggle Helmet" + actions_types = list(/datum/action/item_action/toggle_helmet) var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit var/obj/item/weapon/tank/jetpack/suit/jetpack = null @@ -86,12 +87,16 @@ ..() if(jetpack) if(slot == slot_wear_suit) - jetpack.cycle_action.Grant(user) + for(var/X in jetpack.actions) + var/datum/action/A = X + A.Grant(user) /obj/item/clothing/suit/space/hardsuit/dropped(mob/user) ..() if(jetpack) - jetpack.cycle_action.Remove(user) + for(var/X in jetpack.actions) + var/datum/action/A = X + A.Remove(user) /obj/item/clothing/suit/space/hardsuit/item_action_slot_check(slot) if(slot == slot_wear_suit) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. @@ -198,7 +203,7 @@ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) on = 1 var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null - action_button_name = "Toggle Helmet Mode" + actions_types = list(/datum/action/item_action/toggle_helmet_mode) visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE|HIDEFACIALHAIR visor_flags = STOPSPRESSUREDMAGE @@ -240,6 +245,9 @@ if(istype(user, /mob/living/carbon)) var/mob/living/carbon/C = user C.head_update(src, forced = 1) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/head/helmet/space/hardsuit/syndi/proc/toggle_hardsuit_mode(mob/user) //Helmet Toggles Suit Mode if(linkedsuit) @@ -270,7 +278,6 @@ item_state = "syndie_hardsuit" item_color = "syndi" w_class = 3 - action_button_name = "Toggle Helmet" armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi @@ -387,15 +394,14 @@ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 100, bio = 100, rad = 60) var/obj/machinery/doppler_array/integrated/bomb_radar scan_reagents = 1 + actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_research_scanner) /obj/item/clothing/head/helmet/space/hardsuit/rd/New() ..() bomb_radar = new /obj/machinery/doppler_array/integrated(src) /obj/item/clothing/head/helmet/space/hardsuit/rd/equipped(mob/living/carbon/human/user, slot) - ..(user, slot) - user.scanner.Grant(user) - user.scanner.devices += 1 + ..() if(user.glasses && istype(user.glasses, /obj/item/clothing/glasses/hud/diagnostic)) user << ("Your [user.glasses] prevents you using [src]'s diagnostic visor HUD.") else @@ -404,8 +410,7 @@ DHUD.add_hud_to(user) /obj/item/clothing/head/helmet/space/hardsuit/rd/dropped(mob/living/carbon/human/user) - ..(user) - user.scanner.devices = max(0, user.scanner.devices - 1) + ..() if(onboard_hud_enabled && !(user.glasses && istype(user.glasses, /obj/item/clothing/glasses/hud/diagnostic))) var/datum/atom_hud/DHUD = huds[DATA_HUD_DIAGNOSTIC] DHUD.remove_hud_from(user) diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index dbce102f077..e89458f6da9 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -44,7 +44,7 @@ Contains: strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT unacidable = 1 - action_button_name = null + actions_types = list() /obj/item/clothing/head/helmet/space/hardsuit/deathsquad/attack_self(mob/user) return @@ -262,7 +262,7 @@ Contains: item_state = "syndicate" armor = list(melee = -20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 75) //As whimpy as a space carp brightness_on = 0 //luminosity when on - action_button_name = "" + actions_types = list() flags = STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP @@ -284,7 +284,7 @@ Contains: item_state = "hardsuit0-prt" item_color = "knight_grey" max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT - action_button_name = null + actions_types = list() /obj/item/clothing/suit/space/hardsuit/ert/paranormal name = "paranormal response team suit" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 83d21d2117a..1cd1b4616a5 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -131,7 +131,7 @@ item_state = "reactiveoff" blood_overlay_type = "armor" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) - action_button_name = "Toggle Armor" + actions_types = list(/datum/action/item_action/toggle) unacidable = 1 hit_reaction_chance = 50 diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index b4444726662..b1386ed9eea 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -31,7 +31,6 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/internals/emergency_oxygen) hooded = 1 - action_button_name = "Toggle Chaplain Hoodie" hoodtype = /obj/item/clothing/head/chaplain_hood /obj/item/clothing/head/chaplain_hood diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index d0c8e507ab9..f565dd1d316 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -136,7 +136,7 @@ togglename = "wings" body_parts_covered = ARMS|CHEST allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic) - action_button_name = "Toggle Owl Wings" + actions_types = list(/datum/action/item_action/toggle_wings) /obj/item/clothing/suit/toggle/owlwings/griffinwings name = "griffon cloak" @@ -215,7 +215,6 @@ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/weapon/gun/projectile/automatic/speargun) hooded = 1 - action_button_name = "Toggle Carp Hood" hoodtype = /obj/item/clothing/head/carp_hood /obj/item/clothing/head/carp_hood @@ -238,7 +237,6 @@ //min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT allowed = list(,) hooded = 1 - action_button_name = "Toggle Ian Hood" hoodtype = /obj/item/clothing/head/ian_hood /obj/item/clothing/head/ian_hood @@ -259,7 +257,7 @@ body_parts_covered = CHEST|GROIN|ARMS allowed = list(,) hooded = 1 - action_button_name = "Toggle Human Head" + actions_types = list(/datum/action/item_action/toggle_human_head) hoodtype = /obj/item/clothing/head/human_head /obj/item/clothing/head/human_head @@ -374,7 +372,6 @@ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter) hooded = 1 - action_button_name = "Toggle Winter Hood" /obj/item/clothing/head/winterhood name = "winter hood" diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index dbbfc5dbb00..fc8d0cf89ac 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -37,8 +37,9 @@ H.unEquip(hood, 1) H.update_inv_wear_suit() hood.loc = src - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/suit/hooded/dropped() ..() @@ -59,8 +60,9 @@ suittoggled = 1 src.icon_state = "[initial(icon_state)]_t" H.update_inv_wear_suit() - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() else RemoveHood() @@ -93,8 +95,9 @@ src.icon_state = "[initial(icon_state)]_t" src.suittoggled = 1 usr.update_inv_wear_suit() - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/suit/toggle/examine(mob/user) ..() diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index f38708348bb..a72f6ea4539 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -5,7 +5,7 @@ item_state = "bl_suit" item_color = "black" desc = "It's a plain jumpsuit. It has a small dial on the wrist." - action_button_name = "Change" + actions_types = list(/datum/action/item_action/change) origin_tech = "syndicate=3" sensor_mode = 0 //Hey who's this guy on the Syndicate Shuttle?? random_sensor = 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index de750a6d833..3d7c28a98c4 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -5,20 +5,6 @@ These are general powers. Specific powers are stored under the appropriate alien /*Alien spit now works like a taser shot. It won't home in on the target but will act the same once it does hit. Doesn't work on other aliens/AI.*/ -/datum/action/spell_action/alien - -/datum/action/spell_action/alien/IsAvailable() - if(!target) - return 0 - var/obj/effect/proc_holder/alien/ab = target - - if(usr) - return ab.cost_check(ab.check_turf,usr,1) - else - if(owner) - return ab.cost_check(ab.check_turf,owner,1) - return 1 - /obj/effect/proc_holder/alien name = "Alien Power" @@ -32,6 +18,10 @@ Doesn't work on other aliens/AI.*/ var/action_icon_state = "spell_default" var/action_background_icon_state = "bg_alien" +/obj/effect/proc_holder/alien/New() + ..() + action = new(src) + /obj/effect/proc_holder/alien/Click() if(!istype(usr,/mob/living/carbon)) return 1 @@ -307,9 +297,8 @@ Doesn't work on other aliens/AI.*/ vessel.storedPlasma = min(vessel.storedPlasma, vessel.max_plasma) //upper limit of max_plasma, lower limit of 0 for(var/X in abilities) var/obj/effect/proc_holder/alien/APH = X - if(APH.action && APH.action.button) - var/obj/screen/movable/action_button/AB = APH.action.button - AB.UpdateIcon() + if(APH.has_action) + APH.action.UpdateButtonIcon() return 1 /mob/living/carbon/alien/adjustPlasma(amount) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index cb6a42efb16..b6b13b41669 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -555,13 +555,6 @@ var/const/GALOSHES_DONT_HELP = 4 abilities.Add(A) A.on_gain(src) if(A.has_action) - if(!A.action) - A.action = new/datum/action/spell_action/alien - A.action.target = A - A.action.name = A.name - A.action.button_icon = A.action_icon - A.action.button_icon_state = A.action_icon_state - A.action.background_icon_state = A.action_background_icon_state A.action.Grant(src) sortInsert(abilities, /proc/cmp_abilities_cost, 0) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 6bde0e6fc25..c7e5f8174fe 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -170,10 +170,10 @@ s_store = null update_inv_s_store() -/mob/living/carbon/human/wear_mask_update(obj/item/clothing/C, unequip = 1) +/mob/living/carbon/human/wear_mask_update(obj/item/clothing/C, toggle_off = 1) if((C.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || (initial(C.flags_inv) & (HIDEHAIR|HIDEFACIALHAIR))) update_hair() - if(unequip && internal) + if(toggle_off && internal) update_internals_hud_icon(0) internal = null if(C.flags_inv & HIDEEYES) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index d32dc722d84..910cbf3c338 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -40,7 +40,7 @@ update_inv_back() if(slot_wear_mask) wear_mask = I - wear_mask_update(I, unequip=0) + wear_mask_update(I, toggle_off = 0) if(slot_head) head = I head_update(I) @@ -77,7 +77,7 @@ update_inv_back() else if(I == wear_mask) wear_mask = null - wear_mask_update(I, unequip=1) + wear_mask_update(I, toggle_off = 1) else if(I == handcuffed) handcuffed = null if(buckled && buckled.buckle_requires_restraints) @@ -88,10 +88,10 @@ update_inv_legcuffed() //handle stuff to update when a mob equips/unequips a mask. -/mob/living/proc/wear_mask_update(obj/item/clothing/C, unequip = 1) +/mob/living/proc/wear_mask_update(obj/item/clothing/C, toggle_off = 1) update_inv_wear_mask() -/mob/living/carbon/wear_mask_update(obj/item/clothing/C, unequip = 1) +/mob/living/carbon/wear_mask_update(obj/item/clothing/C, toggle_off = 1) if(C.tint || initial(C.tint)) update_tint() update_inv_wear_mask() diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 6b90a274f3d..29873a676fe 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -196,16 +196,12 @@ /mob/living/carbon/proc/get_breath_from_internal(volume_needed) if(internal) - if (!contents.Find(internal)) + if(internal.loc != src) internal = null - if (!wear_mask || !(wear_mask.flags & MASKINTERNALS) ) - internal = null - if(internal) + update_internals_hud_icon(0) + else update_internals_hud_icon(1) return internal.remove_air_volume(volume_needed) - else - update_internals_hud_icon(0) - return /mob/living/carbon/proc/handle_changeling() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 190ad0dfc10..be63fc849a6 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -116,47 +116,4 @@ /mob/living/proc/update_damage_hud() return -/mob/living/update_action_buttons_icon() - for(var/X in actions) - var/datum/action/A = X - if(A.button) - A.button.UpdateIcon() - -/mob/living/update_action_buttons(reload_screen) - if(!hud_used || !client) - return - - if(hud_used.hud_shown != HUD_STYLE_STANDARD) - return - - var/button_number = 0 - - if(hud_used.action_buttons_hidden) - for(var/datum/action/A in actions) - A.button.screen_loc = null - if(reload_screen) - client.screen += A.button - else - for(var/datum/action/A in actions) - button_number++ - var/obj/screen/movable/action_button/B = A.button - B.UpdateIcon() - if(!B.moved) - B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number) - else - B.screen_loc = B.moved - if(reload_screen) - client.screen += B - - if(!button_number) - hud_used.hide_actions_toggle.screen_loc = null - return - - if(!hud_used.hide_actions_toggle.moved) - hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) - else - hud_used.hide_actions_toggle.screen_loc = hud_used.hide_actions_toggle.moved - if(reload_screen) - client.screen += hud_used.hide_actions_toggle - diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 58c5c241ccd..b86e8f7ca21 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -80,7 +80,6 @@ equip_to_slot_or_del(I, slot_head) access_card.flags |= NODROP - scanner.Grant(src) alert_drones(DRONE_NET_CONNECT) diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm index cbb93197426..fb9d09c1565 100644 --- a/code/modules/mob/living/simple_animal/slime/death.dm +++ b/code/modules/mob/living/simple_animal/slime/death.dm @@ -9,6 +9,10 @@ M.regenerate_icons() is_adult = 0 maxHealth = 150 + for(var/datum/action/innate/slime/reproduce/R in actions) + R.Remove(src) + var/datum/action/innate/slime/evolve/E = new + E.Grant(src) revive(full_heal = 1) regenerate_icons() number = rand(1, 1000) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 7f908f28430..9068660597e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -888,18 +888,9 @@ var/next_mob_id = 0 /mob/proc/setEarDamage() return -/mob/proc/AddSpell(obj/effect/proc_holder/spell/spell) - mob_spell_list += spell - if(!spell.action) - spell.action = new/datum/action/spell_action - spell.action.target = spell - spell.action.name = spell.name - spell.action.button_icon = spell.action_icon - spell.action.button_icon_state = spell.action_icon_state - spell.action.background_icon_state = spell.action_background_icon_state - if(isliving(src)) - spell.action.Grant(src) - return +/mob/proc/AddSpell(obj/effect/proc_holder/spell/S) + mob_spell_list += S + S.action.Grant(src) //override to avoid rotating pixel_xy on mobs /mob/shuttleRotate(rotation) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 017c9a0369b..5be8673a352 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -84,7 +84,6 @@ var/datum/hud/hud_used = null var/research_scanner = 0 //For research scanner equipped mobs. Enable to show research data when examining. - var/datum/action/innate/scan_mode/scanner = new var/list/grabbed_by = list( ) var/list/requests = list( ) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 85063e88e10..e749d430867 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -257,30 +257,26 @@ obj/item/weapon/gun/proc/newshot() else return -/obj/item/weapon/gun/attackby(obj/item/A, mob/user, params) - if(istype(A, /obj/item/device/flashlight/seclite)) - var/obj/item/device/flashlight/seclite/S = A +/obj/item/weapon/gun/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/device/flashlight/seclite)) + var/obj/item/device/flashlight/seclite/S = I if(can_flashlight) if(!F) - if(!user.unEquip(A)) + if(!user.unEquip(I)) return user << "You click [S] into place on [src]." if(S.on) SetLuminosity(0) F = S - A.loc = src + I.loc = src update_icon() update_gunlight(user) verbs += /obj/item/weapon/gun/proc/toggle_gunlight - action_button_name = "Toggle Gunlight" + var/datum/action/A = new /datum/action/item_action/toggle_gunlight(src) if(loc == user) - if(!action) - action = new - action.name = action_button_name - action.target = src - action.Grant(user) + A.Grant(user) - if(istype(A, /obj/item/weapon/screwdriver)) + if(istype(I, /obj/item/weapon/screwdriver)) if(F) for(var/obj/item/device/flashlight/seclite/S in src) user << "You unscrew the seclite from [src]." @@ -290,16 +286,13 @@ obj/item/weapon/gun/proc/newshot() S.update_brightness(user) update_icon() verbs -= /obj/item/weapon/gun/proc/toggle_gunlight - action_button_name = null - if(action && loc == user) - action.Remove(user) + for(var/datum/action/item_action/toggle_gunlight/TGL in actions) + qdel(TGL) if(unique_rename) - if(istype(A, /obj/item/weapon/pen)) + if(istype(I, /obj/item/weapon/pen)) rename_gun(user) - ..() - return /obj/item/weapon/gun/proc/toggle_gunlight() set name = "Toggle Gunlight" @@ -337,8 +330,9 @@ obj/item/weapon/gun/proc/newshot() user.AddLuminosity(-5) else if(isturf(loc)) SetLuminosity(0) - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/weapon/gun/pickup(mob/user) diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 4bd3852b935..54313c7f174 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -6,7 +6,7 @@ can_suppress = 1 burst_size = 3 fire_delay = 2 - action_button_name = "Toggle Firemode" + actions_types = list(/datum/action/item_action/toggle_firemode) /obj/item/weapon/gun/projectile/automatic/proto name = "\improper NanoTrasen Saber SMG" @@ -67,8 +67,9 @@ playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() - if(action && action.button) - action.button.UpdateIcon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/weapon/gun/projectile/automatic/can_shoot() return get_ammo() @@ -119,7 +120,7 @@ fire_delay = 2 can_suppress = 0 burst_size = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/wt550/update_icon() ..() diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm index ed5c2f204e9..e7d55f30c16 100644 --- a/code/modules/projectiles/guns/projectile/launchers.dm +++ b/code/modules/projectiles/guns/projectile/launchers.dm @@ -39,7 +39,7 @@ mag_type = /obj/item/ammo_box/magazine/m75 burst_size = 1 fire_delay = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/gyropistol/process_chamber(eject_casing = 0, empty_chamber = 1) ..() @@ -62,7 +62,7 @@ burst_size = 1 fire_delay = 0 select = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/speargun/update_icon() return diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 6df4c8eb333..5c45df2cb17 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -8,7 +8,7 @@ can_suppress = 1 burst_size = 1 fire_delay = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/pistol/update_icon() ..() @@ -55,4 +55,4 @@ can_suppress = 0 burst_size = 3 fire_delay = 2 - action_button_name = "Toggle Firemode" + actions_types = list(/datum/action/item_action/toggle_firemode) \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/rechargable_magazine.dm b/code/modules/projectiles/guns/projectile/rechargable_magazine.dm index d24dd02c71b..2ae94e94355 100644 --- a/code/modules/projectiles/guns/projectile/rechargable_magazine.dm +++ b/code/modules/projectiles/guns/projectile/rechargable_magazine.dm @@ -36,7 +36,7 @@ fire_delay = 2 can_suppress = 0 burst_size = 0 - action_button_name = null + actions_types = list() fire_sound = 'sound/weapons/Laser.ogg' /obj/item/weapon/gun/projectile/automatic/laser/process_chamber(eject_casing = 0, empty_chamber = 1) diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 72a3631cb3f..76f18ad2a36 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -312,7 +312,7 @@ burst_size = 1 fire_delay = 0 pin = /obj/item/device/firing_pin/implant/pindicate - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/unrestricted pin = /obj/item/device/firing_pin diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm index 2555a8ac16a..417f13ea9b5 100644 --- a/code/modules/projectiles/guns/projectile/toy.dm +++ b/code/modules/projectiles/guns/projectile/toy.dm @@ -29,7 +29,7 @@ can_suppress = 0 burst_size = 1 fire_delay = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/toy/pistol/update_icon() ..() diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 5b26cc14c33..b46d9f4a49c 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -156,6 +156,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin /obj/effect/proc_holder/spell/New() ..() + action = new(src) still_recharging_msg = "[name] is still recharging." charge_counter = charge_max @@ -169,13 +170,13 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin return /obj/effect/proc_holder/spell/proc/start_recharge() - if(action && action.button) - action.button.UpdateIcon() + if(action) + action.UpdateButtonIcon() while(charge_counter < charge_max && isnull(gc_destroyed)) sleep(1) charge_counter++ - if(action && action.button) - action.button.UpdateIcon() + if(action) + action.UpdateButtonIcon() /obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells before_cast(targets) diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 6fd62d8c645..8a6634f35c1 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -47,7 +47,7 @@ implant_color = "#DE7E00" slot = "brain_antidrop" origin_tech = "materials=5;programming=4;biotech=4" - organ_action_name = "Toggle Anti-Drop" + actions_types = list(/datum/action/item_action/organ_action) /obj/item/organ/internal/cyberimp/brain/anti_drop/ui_action_click() active = !active @@ -260,7 +260,7 @@ implant_color = "#007ACC" slot = "shoulders" origin_tech = "materials=5;biotech=4;powerstorage=4" - organ_action_name = "Toggle Arm Mod" + actions_types = list(/datum/action/item_action/organ_action) var/obj/holder//is defined as the retractable item itself. ensure this is defined somewhere! var/out = 0//determines if the item is in the owner's hand or not var/overloaded = 0//is set to 1 when owner gets EMPed. if set to 1, implant doesn't work. @@ -309,7 +309,7 @@ desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arms and remains in the shoulders when not in use." icon_state = "armcannon_tase_implant" origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4" - organ_action_name = "Toggle Arm Cannon Taser" + actions_types = list(/datum/action/item_action/organ_action) /obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created... holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun) @@ -319,7 +319,7 @@ desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arms and remains in the shoulders when not in use." icon_state = "armcannon_lase_implant" origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4;syndicate=5"//this is kinda nutty and i might lower it - organ_action_name = "Toggle Arm Cannon Laser" + actions_types = list(/datum/action/item_action/organ_action) /obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New() holder = new /obj/item/weapon/gun/energy/laser/mounted(src) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 93ef30267ae..5501ac870ed 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -6,7 +6,6 @@ var/zone = "chest" var/slot var/vital = 0 - var/organ_action_name = null /obj/item/organ/internal/proc/Insert(mob/living/carbon/M, special = 0) if(!iscarbon(M) || owner == M) @@ -19,12 +18,9 @@ owner = M M.internal_organs |= src loc = null - if(organ_action_name) - if(!action) - action = new/datum/action/item_action/organ_action - action.name = organ_action_name - action.target = src - action.Grant(src) + for(var/X in actions) + var/datum/action/A = X + A.Grant(src) /obj/item/organ/internal/proc/Remove(mob/living/carbon/M, special = 0) owner = null @@ -32,9 +28,9 @@ M.internal_organs -= src if(vital && !special) M.death() - if(organ_action_name) - if(action) - action.Remove(M) + for(var/X in actions) + var/datum/action/A = X + A.Remove(M) /obj/item/organ/internal/proc/on_find(mob/living/finder) return @@ -79,6 +75,9 @@ else ..() +/obj/item/organ/internal/item_action_slot_check(slot,mob/user) + return //so we don't grant the organ's action to mobs who pick up the organ. + //Looking for brains? //Try code/modules/mob/living/carbon/brain/brain_item.dm diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 8c1c3f5e68583f6db4ef0a6780e4a45cff5a58ba..caeb4fc5671f6ac9ac08c6652b08554ba19e88e2 100644 GIT binary patch delta 71914 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 delta 71595 zcmX_HbyO6M*PdM#SVB6L4gskJm5}ZbrBj3jsh3tdXF<9f5owW@l5UZbRHRh8ySu*e z_s4h6EW_E^vwP>pbMJlbox%x3=@=r84HjL=?vF*i9bM27+d07~+&OsqXVK{*-E_l4 z`&_-c6^ow)q((+WuHs%?`q;mHdtK{l5=s)duyDR8zk(}u=Ha_-XR2(Q;+T8ZL3|@I zUr9^WhKjSP5*{mK%58=LiO;EC+}kITEM6LpQ(ml(0*s}@6b2rK7m>K&Fw(RAUX*$k z8yv-Qz$x&~!X77)l@+LtTFnBxz5Y0Ocv@}#21Za|wEJw4^sDzo&%vF?szxxn>+)xHB>QyXGMr_3YQ5 zF};#!H{hg$-ovv!*0CkOZ3Z!klol}H`n}wy>6ZzY1MENHrVx3`}|r%)_L#CyrVo$ zxJPS+3V55t;KYN1Z)Di&6y3T^)z-Cg0gRY(5 zbuTV%@|4!>BY_t;oM9aq{PwvXDim$4-4QQL?ko&Z3;jr=2zbnU`g7~ChvGQ#%v0iV zNkz{C+@JR{RXQ6KWW%N{1Vy*qn;P@z!ZXSPt&q=;oxxzXUHNMY;y=!NL$ z3?+W*GEFdfo;a%^i&Rdzn2nR5m~Gx%`2yljk^k1(#$Mtpr?;LixEnYX)ggTM_*j%3 z5I?_N==C}KTU>LoX&=!JDs^F@Q^4&KW?yeqkY$r4Pk&;7et_lEZ(kw-^&7j{Td`)3 zzSyG)NcRgP9h~eo26j{1_1Jt z-l^S(j({$2B(u&Tq3r#{KGukZuv|_#$tF3FA;iG-Cqv708rB8 zQ!}@iVRO?GKNyHSx)J-y4_}vlQU>C5n1>swD+AB}`is51`RhXcEq&uo=sYU@^=8!= zklp4zTKa*uaMB|m+wG~vNGgU}%C2LOKX`B9F%=y@WkB8NEiK}2ONC|XLi7eMAPwHB z_Zjtf0B9t^-&vpk2Ij`s8M5BkD`LN{l}E6txOUa^19jQb*IN>r`SwzJzG}LsqVwa)G@xdrYR^g{I3rp08HJB z=R-z#GFy)=->ed(ukH5_7#Q)*O*2(|F>c@2BJFev9nB<^G`OTO z9DT#z^)p&Sd^I4`BgaCY31GVF;1(zYncVv3Tn%p_nE0d=L#GL77^WzwBy0u683RNz zBx>N@>U1PCm28*_MOPdX5?0uUZp!7f0up%oWeii;Rk>j3`$6w=@ZS!aSN0Nxc9P=< zhrk0cRpwn0qWM6q_#w++nm!q`f5hwK=RqXOsy1Iu45$V9l!?(krdhvxw@?1?hw&5g z!`(GouBX_*xjbF6@A7k9c4ZYfoF=6eLm=|}A&L~mKOKf~VL%ivffXkLfie5+aYbym zkBn{sX-Wkd5xQCf9;(nO`yrt;HN#v^{P$x{P`Fqa-cQmpte&G(En-0iLNSdONRq_H zMS>qpp-I6Dx!Wgtbv)(YFu`QCpxUVf3fKJPr{yq1875stcDr-ssX93FV);E?` zy+)Lu>9Tv<21<9IdJqA?zyQ_=+N6=x&S)n;6!Y2yC?Ql0skg>l!GMTdWCB|nyGj*w z8A92sWLt0M1_i@>_shzqPrqdhualzuhXW%Y61+4D5ehK1K!rgJ zjRM97)cAR$7VT;_E&(WR@%(z_iyDj9$InZNDzT$##nqP@u4KPb+3yGEdJ!EDfpHRC0e?2vCjIy;r-h zK%u}zfe*?gu-P19BY_7W4dzw-@AYd|G!5keK$Y8q>DW+HT&oxRY> zCcEjWDiD384uOY+rdHs#pC9Q$ozd~)jfV<|2eeO(1&5Z6bCzV`DGKPwyo*78V*!;u z^buFTB)c$^=Q*IJubiF9y;H=G7p;5oUq4^8sLkU%FLG4*En!K*dAS-QBGgAdQjEsNvRD#a7TnIFO}g4<03F>k%5tYqBM2aWj8Y zMdk!DaYp2Nmg$v1WyKVd*-AlETunK9h|uZ~ACcIXo!^5=@Cd2L`|?Q+aAt`IVX}O)#t&l{Bcdgbs! zvi7s*Q0H|AH_Dr!51m>NzGYyj-sbtp?`wQ&s**U!5F4&#ONo$)V^jG-)@B7EmsPbP ziGn5tLMA5(hh0VMOImv_6EatCn-xk#P;J)bSVvIB^MWfsm#1G+K{I=h5e2KzP#uiO zB}x3xb`)bme9f@z)*{i&@o=M2&s&^{o5V+NEjxW=?@wcRrV&)0Z78Bto3@ z04$I>yUsgH<;`N5^}6whPtbecI4PCBMakbMW_aLHwfO2EaxjstPLzNE-Jf#@qpEDU z@JkPYyQX3hA)Dohzpt`Qh=)#G7h{I~?gG-dxO*-@M%%3uV2cd%f+-F&k@8~Z5zSgsFv`5m0yrD&FW-PpLsJ3b`gwnxqA)Xi`Ag!;t$9 zB_8vARW4G69}w8S>wz4X#dgVw6w&dyCJANd6~HA&F*sT4C+5C8Q|9!i#YZ^o^!isb zEspqJetPdv)>X*+H}af10a2(cljJLyG()1yHboT~;+XyRhgxX;s{nebGenWJJft!~?M>a8S?7+!!p+E@H}Hk>(1{<&;m)dHRTy zL?_Rb#NbSk0Gl*=PXQ`hE30aNb6SRec@d{~V z?_%`h7%)u@VKs(@?t96kh5e0W&*#U)R7~*Lgc0nL{te z_DFTU^5bAyB`H>y^XJ=+<`tVaG7#LpEAARcaJfc#=@d)lgpW2VFZFhcY@+`j2@M-@ zBXc=bH8d$y><*}?5FPSdmgHR)vSCaSxp>9zz)1y7w)=@t>(jx9gxm27EME$n9y5tf zoRMH-s$xL~TjqG|Y0%$jHY-7xjp!W-O?+`Nqfm7!uljPm=jBQeZpBr@sI?ITwA)^&DXsVfd}l=^TtZ|LX<+|7YBYQVB&A%6O~3hBtQC)HCLe2*a;CpNeUm> z1(`GKnHA$BrLvVw??@_Y>K?lH9Y=B1zbVFUyjcF8f4%>{`biD%r*G$Wxxb~rMV1ti7kvE11i>6|s z$(!9>mNUHvZps}*0OK6H{xi4mL1K1o(( zYO*nBL9I_NESOtZTITSF>{*~B!h`}pjNO;$9!9I-U=K6?wu586SnnydW`j#Zp|%YQnnetSp^ zwl_JohR442V!!FBnE)5!l^D|EjbF6PpO1BGxE04KCwSxvjFQF}mcz~a2fS~sOc~up zGR{JJ-Y(?z?4u@p!?hwJi|IvXUXumv`A!Z<6dD_Zcg)Ms3~Ljjg@2`WddrH)5Mz?v zTc_U$=G>w|Q0l>h2dIpxnDD^eo4#>tZ=pST@+NrQ%##?uEO51U`s6DC-fYQMJ_$Xd zQ{Zk3Z6Bk?A@+G{+TsxTy9WmU6(Dd=pf%WE2=385`GpytPlzg#CvJlU8*X}2?v^R>%u{)Kl z;ML`eMZPCsXT5PzV zpC^2*(AXZj-S+y*YoOLnSDNGQJrzGWEC zr)M{py`hE(a|i3=8>~w?RQHv(D8V}r{L4xV6%Fw%D?`0k0MYsme&d^EeD9+*0eInd z&Y?aPR_4;se}ZX{?c~!xCgX-O&o{zdNTW)EnUt(6i#2Isthl zbZ3>~@iT@=#t5S@Bt3y zAa);0!<2jt&ZUB+kU^_zurS&8K~P*aX9O953yk9%jWdvP{nrCE3n`CC)2fyGS-q@i ztA&X%tV_$r36_vczKpS9iDgHKuOCkSoxn9gKmTZu^LUp@dqd>uT&F}e%-<1+wXnP4 z==_n_)B8P{d#%U6gbB11aQAwzEVx8G_J%t9{(qejxd;jcQc49d=RHlY2ICc<&k>ai7 z;gZweRL(CknYkz6hgl%sRX)YCm@@+6e!kA5C=txk$ao0edUsEKumUh2IU_h#5_C11 z+Jhl|&01A+L9H#6e#1$~fH_TyuBTk|`z~Uij(~f z4wdHiZ7uUSjs1%qLlYK3SWlYW=Ntl4zsHB{YFPHh z$-@rSUaX8P6co*vWNxSYXU~`**5jv_*fAGzP+RxZbCJSgD>SKRXr+RuUH_sntBCWXRR@a?Sat}Ne`-zxSbiDd^ z6IBAjf2G}Ck04;sIn7{zeQ)3I)d#7W6GBOG8{1;$<757je}YSM^Bckz&U}az36;wk!Axw@6NGk}DQH>@bd3Bb(A{$*#X~8L*?C{X% z(T~WzStgyF>H|!2i+&IlXwUkqa3YLd?qFkr%Ue}FpJpx-KDT-0l?yuA+Oy5t*klhh zy^9>bl~noJtI@hNS}*Z(qL~DhtVgo$&0@f^NQ7P9BO@;4=p#4` zL#vqTB8~D+ic)R`{4&C^#rWb6V`E}|{{8zGh0%m+FcmOCw`61g0t&m?-BgGnAZ7Ni zuBAKf$z+6hoUn1NC&=~!PF3YidWug;IItkSaubPFabT`fV4j;QLfAMKqLLL1SJwej z1q!En6H|4E(UeDKxjixm29@U6z}#fzQKWR^kRLP4kDbhQZyt+MjzHLhBF2UBsdtZY zck`9O`A&3{ipki4eqR=;B&3byDH>jhTJXZQBkPBXIs=UL%a)yXF>R(h6JmgjdIva*g^eqXKgy3T?UC9z{4uyp7`+h3!Ay6YdvF+D(0a zvu6*yj(pTLSR1g~-x60} zbw%AN$8mVA{#8{*yp>7!_0*6t1;q*$u#(CLfI9}BN0;g&DO8Ws(lRm#ng($~S?>WT z)Fd(VFUXYLmXgei09-w?0{%!ueD8{PXVNR{x9~VkD?IdUaXbUDY}*Ps{LjkMh9%w- zehN<)cF39aU843pyBTJtB^_}A9xB{y8L1%zH7c|1e~6IM+@q`wkf2pc1cM&?b>n9qO2_65hcVwee-cf27RSbA-+Sj`12`0ZZ?@u$}~~d zY&n64!$@N6F#cpQSsPPVI z29Z*&W6|N#?6e<_LU0!(kfO&a?KA;;5n%H0q92jUj>Xmafey^Y?~uKwF%c0|rW509 zWVM?x&D!@XY3(>F`=ofiE-v=r&dSTo?j!33Yf|V|WJ^*T$nKt+QNc2=${TH;{bV6w z2S8f$%)9QA6>l@QMTv_w#Lug5-;Jm4h0(S_!vYzd#EIm;xtq)3{OS2|rGJ*x#uX2T^VQkwj4Rlju?Mxc_b}{C9C&Qs zS$dJv;qUsvQO@0+@9&Og#$F_TF10Tr|S6K9tEWqqnpqa3dw5O354M zVVPKzgRB-ii1wyAxf}#W9%@+NX1Ar8xrAdY+cE#b4p5-f&nr1R#yhRcu#ahy8hiI& zr9grd=A#1BB1{cSeb*}~)8;>=*JeV++^R6Z!+uIF!?5;0JQzV|g*+b#^A30uAjxC& zh314u?7^eW*-d&m6b5JscV(> z<(Y>1T-8&7sw$!m4U+j2cM6~pjU=Ep+pB$nx;-~#Z7Lw15*1xr6L~yVw;I@E>cL>> z@&l`c=((hz=p=R`eS0BE3O?A5C*5ma1>37Sc1TXA*XWnV@_BN?^;@W_;FakoHrEKW z83${npkRzb<9>|FSPiWw^Sg~oLRw;U#N>H9(T2N^rt!Pz+94CaOLn(p&s$I2oyn>+ z$-}MI|G>SBjDpIYDsDht`GetcBo%MS?5fhOG~>YmKB~<%V28fK7XUlg)=>YcND&x>wG5{IS1D*YW?`n7f)inX$wktaW zFC~B6wG+eCr+8FVo_kKL$VqkUvywH0M&Y8c#amW2H!5D3RU>USx5mmq06KL+N;%8U z!+p_qR_EHtoMUh8sPlCK@?wd82Fl-Dd=J1MW&S=X^w(G$5AS-GNC^uwLQ1PBb;rJv zl-k(XaGu+4%l1}r_}c($Mp95x$r)AvCppYtzR=0lQeD>lw(lM4lTqG$R%QPy)TQkf z>rKyJ?@U0W1p_xFnR$!r78{_8J!lC-r|72TA*M}^{lKFYr-gE{*tuL>y=ykz39v}} zk3)aC)#KfP89|j){Y3 z6SgCP{>&J^#h0Crn3I=o7y5@2{(y58z79k6&uqHA znkjHpJiKB#<8Pu^mOA$s;N}aEBEfXVM?)AOLN^6zEx^Z~5bNzV*gK{w@ehkXvU^51 z1g50C^46N9v3idbbM)Du1GcFGO5p`K@h< z2RApv&-~actc#YMcwonu*POgBvqPh3LU2NlRr4S`4qL{f@Er*;0(hO;uu8hfbk7%^ zEjl;dI`4KSc!*R9peAFhs)D_>(sF9uu^XF))k@%N5w`l&>KFPtO$$TDk76#LzHs?j zeaC6$3mBZjSNiRsG2MCL%&FoF8t=2AKl|s+lAebJreB+{%-_kod`}Gg2T70r++Pjgz zHa9&q&?U7eY{r8xU=xWppOpsoN4p~VrJjN}uX|p(MiX#8c(8c#WfAS-VN?pgDv?-P~hZCki#Ee*FLrycu3$85XWr*`n1zfePVf~Z(2$5YTua8geKwqjd+XF_LWz&?lUw|w70o8AeXl>Dq}Bn>;OLd zMNogrc$;Q5we8(^pIC9L^gBntqmqdU?2XHqipk5D1)48kVoBe@y>oQhu}RbAzSHt{dVyHG*h+@uJ%6QE&)yi z($`72IkNm*?TCf+f0%1g24-G?u=aJH_5!}Cu%X)LA1XpCIGgC4?lAV~ezjeKrscbm zhq@PerV;|%yYH=z2{3mcD^#OKI5CRY-|u2bFa|Iq#2gEtlvH61m+@r8=)(<_r6mBq zJ5QJV;5=9()n#uEkpS1!nUq~v&$sMWe_VxX#T!0gGUC4ao!4I#_Q9n@=|TEF9r%xTUt@|K9&E#W9m?0X=w>S@NM zx-rY41DPKui8oiC34V@6=|@huP-K`9M{Ic%NZNcw%McnvocXS3Z`N93)d zbOlfeU`(mMLr9ai^EeB$5|u`xX{a7^kT4E$XNt9wA&SFLy&ZvO|J7r=1YZljyID>m z&(beAPL6HOB}0ID2ozh$Ji^PC1YYUnh|2ptpNb3Dkom-hI8K8ZYH){sVh3z-b*S5Q z4Z)qlS(#ZoN4@Yi!)v>P3dbTo^ri_QW}`j&dEex1b%2l;SwHC>)mcdNDf*T>7V9jx z6@<>OI=g+G_Xe#sTLvf?R+K>1S9O>lmD}-pH zf*1&K%xaACYP(q67ppUyo|sOwU_gU89kS! zSQ0(fzYhm;d$YC~>E0U+HdQXa9o|*qr1+&W)02#W(@_6j-YX3SPIz65D z1sTaYEWX`-H@$J4>gJX_uYD~#F8b*n{+lNRN0#eXTomC`A}~f^?z_U%kvB^ue0)VA ziwW#Bo=${WpG{(Sq)xiUUb4gigrdn9tYUx@fCGv}YSY)vNPNLw*wk3J#mB_it+x2Pm#}Z`}3gjVCZ&rDIsD^P#bh|p=z)i~Uu|9s9 z^I`p~uR;d4u^w1UauWzA{A>(M>yLxoG8tl`RqM2COQvDB?$ zFVn8PwuqLm{tF1xKTNc7cj)^3>E%bRp@xD$NVUEFdM=JUd<}sH{^00Mo0Tl4XNYq&Ps<5vZ%*=$nv7OdYsUqBhN&+X0!gkY#`k9%UEMp znbB7NWmF1lD9YKWePj=J?MYT_@%yD4@IyYszY-CSMqDcnn5<^u#Vrtq^D@O?M@ z286UQ#M2J8lfv;z>Nh>jxC0 z>VG-#)hB$0FUUy&sD&K`6L&5MNfgR^&60&77pG!%96P)V<>U>^&xNy6FEWV)9+IMy zC3zHwtr)701FENO#L|oo_#g1goffVA%@+7bZWr?CFyy|Rj-i3sO*8HJL-XloWWz(| zxt74?6~(Wsh$muVcpzY`{_mde|oKd}w;n&4wkZC{0W zk2iiEDG54bbCxk{o$-xvc*W4(js|sJ)g?9YLN9h; z9KHwJ1GNo_08b*@vjU=af+P)??c)(!K)+Y8<*x1EE%zgy5P;D9t^LI%#&NB}Pb#Z( zNNeC>*RU|7tYW12mqS>U$MEoa-mFic9)D5rpNGY#CuT?--KSa4@LzqLnexJyYy%m0 zAKzm8n||b?Q$N{lK1^M^oOtp!CMIf4#a#N%FslDUjr|EVMZ3pTzKDJ`MV_c_LY-^t z1-o_lUk%Qnz^~>Ad;*krUzc$gWj-|(v8pGZtsXPBzkv9%6Hz^Jpy*pFHNTozdbaOR#3q9yFGhRXtMIv;w2pV4Rn9? zrgm7Lh<1BwaugT6euVm<9q^BRh zDSuiq?xvsvrvV`P;OP3wem-}hS8X0WLhO?w5wR7D6FLuZl!GwzM^hbx(&2H+p^VP& z0i+ZR5=8x8HQqfELZ3ndo;B4dRN)y`cge#o})3m!!i22j;=mF``vS9gdWH3xk2%|3*TDX zu5e!NR2Mc}R0F>lr*k7p^5oI)%~3ct6grr@D=>_gM%Nq}OZ%NUD`YR$2o4i&yYGVt zGhj#pq`wp&Rk;yFahp6_kSy{BUev)o$vpB5?-2YqCdHTf0DsWAV{9wpi6kvlk8doA zK=}r0a`^*-Z9m~tIYzMmh8pg-5MZ6jb&?y+-Hf21%+swvb^pn!#pZr{YQX(K&xr=~ z8$i)mdsLa|gHyJzXV@v+pguGnJQk!D2Q!(EGS|bN5Nq2OR0GdB=JpAhQMsfxfu>0_ zhjNWI<%yD}*dKYRmqgu20nBNv2NP)&6dbW3bPx}E^;5YufmBreW&jH<8t~(Xnd^VG z2e}H7#}Bf5g9MIg^l+X$5+Mv_<#<4h-Z~%t{~YF2gZ6GeXj^TT zFB~?0drG#_U#!%jj^95t6zv^0V1XK1D>DS9?{N;OZn@Y=Ok^C10}NX}qubkZIhQ;{ z11|zSh^5|soe`ucJ0IhE%L^?N{BM^)WX5axwSB#f1ZHh%9c1N`UbI~$Vn+g5fgOnm9ujA95=wP&g2tYn?3jPKVGf& z-Vf}Og=#Mo_w{-w zf1IASK2kx;4D~Bh@KAi?@meAMb{XmB`<41(`y%bn)ac6P&o?eKSEMsF1-+pz2|JX5|@6wrn}b-ufJQQ0n;2lac$6(olYWDQhene6fBKYv`8i^rf* zNYKWB!`mJ7n#$h`4Iw4ODNwtSc9r@5FF772M%6ER(eJl+AM)~?p-9Abp?1a?s!A+C zXgm`Y@gHq?TVXSyf<|&2h?O?>52mPIilY`xYMRx`H~D#b$9es5T3516cXsGI6&^oE zrSsJLk47Kmr-EWT1S5ZarA-;`(v5T2?q^7!J8Ps!{Jbh_Y*ftRMm;GuI(8^9g7{9D zuRpX1qO)Mt1CQ^KlRRsGZq)Ko2;49+pa)ST(mm@!fGt5NlvLv1=ZiFb!B5VZZbwT6 z{?=}#DXLbI6Ri03MtVszuCh5y9{pvBgXQ==_L}N1xp&B`*x^~btd}dDEjir5zaHbNFfB}o&!pbh?I!9SRq4?;m_U;`pm$R$$ z6eRN9L^71J^qt)bKS@QVC%|PM?8pMR-!vuaZ((6w6_zdUh{2?mL&%TluXvHrqI5pPs zM24}2820v@MWMwec0qK7>F)F>G}IW1v~@1dCA@j62j*e5A9UQE`zz|l17utoe)Zt& zkATZJW8IhuYRi<849T0(Q}LOz#C<0r$-b$e(v^35cvGJ;p^&JQkUBs_m_^WTm{bR8 zjnGX9+Ii$Gq%TgEQZAx_OMh`6(HNjI++?}??NMU8;v+9x{uW~RQpYY9|P zQ8p{H$=*N>@jIuh?%GPPJ3Kw@-yCkaH{7DPbIbHi43d_q2 z_E)efyns?iPpD@48JxT(F&ZGA1gD9pqVoh%CAYcn?*_?{i8~5E;7(=Y<|Y7~#Y1R* zjg|dM?bJff#|5EBVh>k!_tTUCPiXFzSAF=1E{2YW^F`3g3KrCfeC_Rx%S2esGmkS3 zO(KW@Ma7V~^mInuJBY%0b|F0be?ujg>6eWp6?#LCr<^PQjmbl&s%jTz54T*fwuC(I zb~;S8`kB)`vzjRly;>5gNbDAg={;OHr$NKr-ST>54mV#9`)w^X5mWI&422{K-GX*6LT({bt9Miag7F zvgN`VXmnf+x#{s~>L5Xw$CXYCaAR;EF73J{o>I71{g1G~nJHPaCabojg1<8EHcjU} zyo}VKqPz&N89-S}V4#8(YAERHGJ@TroG3cOnuJvmp2ltKir>M~lS4m0RQe!v0GPv7 zA2Xr!ylLby7xv%pv91oP+U#@IzdMoBt}vuGN-Ie*L0|#d&C+G zD}F}uhvf&`UB*;9df6N%h!i(HWx%XiV^=7tABY0upVOSC2BgS-G9t4RA{Viwl|(S5 z8~MGjH;MDWKtCH~jRe-3=PuKm7D?%Jz^ZP_HNH|^0P#o{MXKD@V1A8}$jqt#ELJTa zefi1j90e5Bl_>v8>4d1jNR1cruCR(72t@wsHF(iT3;p_>h5rlB!o6@thGs);E-AZ+ zOLnIzYMb6X$Txu(dwEtYlg^7ft7QVn_1@phNeAUKIp{Wjt06oC@8G-@5%!g3tYZR2 zf#j&Po_Nml!-eiv?Pib8-|9fT;BYwE58&vN>z2f;8T{Fwfzy9J90TTKH3z-WPX4{s zRcMdtDgSNCKfM|mHXv4qGTwHk1$#YrGl3oqm@cY?S^0 zcXl3t^ki7;XDDXAN!)zVr|s;wb{2-%zsqzN*jbsql4H2HgQMp~9NDcj2L5 z3!WTxlAO<6-~WuPsPrA{dPLq%VS5M)wMJ>uf%K=uXsoYLOlU_b|*vK zSnBq@t`ZIJgL2JFT%1eL?6mP%@wG3mM)`z9zWWF@%Or8_Y1D-RyX-|rs>lHSh}U+!!kbs!%U2@ZZ{&{q^6H092;FZ58{lN5dZ z{Y+~FVr!sMz^rbmC(6D8pWR=)iJD319Lr@A3-$F(W`7*yIRImI`=F;9vxu96{byTl zWog5GBqZPUtL@c~dDaf^D)`I5LPGtJPnn@**7cy_=J3YGWY42YCvs`Zci05x_dX5W z9j^MLsjnZp*b}>Xd9$~%dn_-&j{^;Ahc7HY4yXE1QLJn-=Y_gUO4rWRWORE|0kd0W zn5UDqU+6}yk>DY3UYXFnp$w6b=FjevYVowK-Di>|_qBElM7BjSX2 zUkjCgJ$t9zN-YIs#3?<$uYRLQ{MF|5!-~+aY^?Co?|lYsjPs?wU)mb8do5BxB?=Ob9`oPwy(jbj+zBDMBxYSRLb;9qG)B*jw8CX|uFY_4X<8SvWjQj`X z=UaVlgQ1O_sHnnVN~=T#)0LjeX8~^BMQ_yUEzOTSN@!zJ# zRS*h*9@XeSo@#or`}?_}XK39?bj{5cUF`Ly2a=?T@=@&JwVx*Y2l2C%VW^CZv#Tyr zng78IN|R%s@W9%r4vNZN20-JtC+mkfAED(3+@H)ttUEKe!!zkUb(%Bhi@WhWhP7;2 zmGokvE@B-ja&hZF;Qsewn2SaK{T5Yubzqnp*y8rjzIgIz|y2sP^Cd~FK z4e%FCA4KnQ8qmC@Uv(x*?A-TL9_Jn0js5Y^`?=Mlhwo{l*+SQ@y+vsU#UDBiDqs8^ zUX_WjF($#uz2&I%P6!$!c(N<4N6jkkdf-0(@zY0_zSmm$A3u?W>jRfh+|B!%lMVOb zCvIBwL((6bI+9g*bo<|B44jR*+pZae{?Zk7@U}CG*I-#-0v@vA(0ymQI2Nx3iEZiN_j`^ly6WiT+!9eG~ZntLidr?W|4nkpEj*A?&ARwRq884jRIP z&65PbBl`tcBaKKGV#FI}POT~Bp{HGgYMBC$3toRM11HVH=5pHDw6Yh2$P3g$J2eA} zjuSDOl+^A%;ajf-*LlVo+r5?q7?||83v}>of)YzL1xOg&0S-mTmAW~; zWb|D9#|4z_JX?JsTv7cwj;Lk{+Q?pI^qf~J<5_vrz*aZyDE!w^*jT5H`L3gVVE?k} z6D8Ywjz7Lt941NS!?Uf&!cY63dB;5|I82n#x=Vc6%SudiPuS7IYo3EDA}!HMi&a7} zVE02~JT}JknLihIv(#&oE3oe*R)W#@;k^&*2cVM;<)!lZiOY(QhY2&^6++JzXYNgd z2w!SgD0Me&Vz(9}c>F;d-mhPZ9>aI>{*ZDQ1(04%X&}Drv6ojDA&&O`eZ|w8VeWt< z=anVyt>*LaCr2^0R==J#2yI)d27!KlxzihadniRk#ii#zx@1C?5n;QZ%hY(dH}}2f zj_pi0Ur_M@Z=UesUKPtq%V&?$TJJ}QyIS2_JYPbh0SAM|x*u z^#YD(+TI}W@mGYSEF0C$N4*p=6FvhPm@@LV;dq6O9c7Y3v8f+9-Q+Id9c1z(P%M!F zld#9$^Kc#SW9O~%xqFDgtrorv@lM;Ve{F3oRVWd?tcptboPml8-cIYKV{J|jYZt?G!))|2T({^4Si=@(_kKmsE+bI0m*WFI4k1^l&!}s{B-jFlf z%&Xs*1;TY-uf>s&-rzRnHj~i|Gs&hS_gp_)etZ0DPOQMuqRnMP@kBq-)VwMgS45ww z_9VLEW*3shef?*C;on^aIXNsvB_&NQt*^JyF)_K2G|87O292&eMc{5{+_?fEPRe_c_4Wgwhd+T%CtZK4V7&4|X&Z+BR(tY7X6 zy6lzRGdM81<9{=P_20F#zw>PDqwC2oswNZe%n;HE8>Q%}%@k#(aY9rvw+~bH;?3LR%^Dw$o~^cBftd3jkX*IT zPSKFs*0$7KB{Lq|QJt9c`@8z$-kkGGp{{%q`#;Djy?Dr$&>mv!162<9-V39(NAGvN zzV|-3X3w^};4T(m(nkIH4xi)TE9`n9BzfPzH|5T%@y0{}KGK0;uls`^nAiM;?J@}p zVi}-MpC!^^baM68!Gl!f;rK%iooIGdX@aC6-$vE;|0C)xprY!&xZyhkNK1#bG}0<1 zF#`sr)B}=|DhMd4(s$@okVZgIX{1q7hHeD~1SE$>1csi0VdlO5-}QdqT6fKy8#DLB zK0AJA?|ocE_PbdOv3iFPxqlDXES{~gSp{l4WFybhioLdfx>0oU0}#YtQZ=v_fEmm6CHH=sU3Bh8gQe??xFO0N?T-PBsLn#VsLgdYb%X-kf;91b(SH- z&qH*BqCXNSY66ez^7g7gTo-?BRtQ5WbM;~4T`COJr;Sjofu*25StxM4GZ+8csxshX zOH1~`e9KE&7s*@=Lx%OAh5CDhgApf8XQZwk3S8l_vbNq^l?7F#Wh8Fh%|gDI6~UC_c=?K$X(4%KGGNdn z>;IZOny*L8r%Vr?^0aBSA9V|-{YOox#^r}#58|tlQ!b0-J1YBqZAmhP^{tQ;Xr8yV zff|43zj8xC9F6;fl4fX1btB23qu2bqgzGT^w&)P`mXPy+Uyth?h+bmNEiFHO|Bn0d z!?^y-mk%v1+y{xO4t3MGnoZ$w{vfR88h$;m4}D@2|LfO%jURW3dU|@J(DUGK6Z;5) z)cT$e`Q!-$t!LQRj}@1q8KN`ayy1Ebshgq+3FC7A&Y|gOi%r>ceJ>15(D+_Wzeq3f z%1jdVuYBJX(5P3T3XuW z$&-$3kG6qbp_#1SiiX)R=e$6fa(E_+od|e#P;g*pvchZ~TvHjpE1+4y4bPFKP+gbo zoesjXfvLGqyo8y#xf9e}#qTz;J!C1uBV*y;vX!nOD*P!XCMN#z4=ye)9J)|H<3n>Z z*T2izN*;={`(mBJ^90f1ET>1YNwU)04(r1;`z&4k%HHp|`j5U02)lgW8>|vd5IVjv z9tBc~@xui_6CY-S7netM?L`;>)I(;A&EI-B{7r^xXzoV8Cga87NBGh|W6`)C+5H*F z%dT?-JeCW=b_L4shWY>RK`Y776(l)!VYi7gL&g&RcP7INCbhP+wbd0$Mp-LJIM6{E zG#?)ycS0k$*Dl=ZgrJ!zp+A$z!`ZOKu!{P@J&hHp_3fS;{YPspk{w4EEK7bOJeSZbDkYzev0TlEvw zr;>(u zM_g`(m!1Hx%YaHjJXHS|55X0m;T)Cw$5;&GE)1}5`c2|9HJ#}80q!XWWwJ2N;i z_CkDEGlvv!M-U{v^#i6EiAXKL1Khj)sd=*~f!e+^_|Gu#Lg6~NSkuSX<&>zNE=<^M zTIUOq!e2WLE@3Ok(rbU5o!5P8ZEeja7V!DYmwikI)DlRb+g^h5$3R0F=d5bwwbdF4 z$+~+(WCAMD(CvX7vc0>%s_Z=a*X@kWQtA^|0Em&`ZpjV6N>mWM{brPfCggWCD{qLW z3386;l)*tkc0>iai=n^-#WfK^Xar@_y-_&soAomoF#BTWDWD9y>kUP;dF%IH2`4^6 zG?=b8ufOX`#{~*>k_IKKx*vEJNgG3RhEqhrZ-I&h2&A!KcYnCO% z7xj}Xby>b1@AMe%(a3OT$G*B|zVzcfHj~twB^mk=iEpN@fjH-j1G}Gw!^tOgRRwI_ zEP!&MeciMl#>133Q|5r@l5RJs3tBi&&d7dvHuyP=2Zr+d*qHLy-i~4TesCO87Zsm| zO4Z6w9C)Bjtp~UHL|(ueW-K4jBrN+)pE&uS=oM84ObgFW-+e7$oEs{W7ZX=*4aed_G8o&Y12@G4KgS66>K^#P=3W?plq3B-BE zWL@hUgttSZ^0;SJ2?NcbjbNWOi)rYIlG3cOjy66so@d?G4xP$Fxkv-1(VW9COzEoh zDz^ptWbZWZYVQPfmMVix3HRZSbg!Nt%&Zn3sU!k3LBedsY{q|gT&B^UfjTQBuRj;%l zrWGS6_Dch>y*x@vfs&uhhcHRXpsCf>#g^G_mHOMraOg<1T7ez1X=FyKw!^v}<+QV4nZe_X z>bNYcb~5m92HHU1bIl5H&d%6rNhxE>o>f`Dipce)U|!7=9?(a#hZ_uX(SLZzE@RWb z>-O}i!t5#krBcvAPd{*~5$gq1_BKFa%do|5&GU*AeqMy4R_wA_h*KqLR8#ey;6c)ncj5qNyN@kQ5&ypJpW{h;M4xvXz7 zw?9rDE!biDn5N1f(^RJEF%|5?$Eoa_+;YmltsGJr3rU80f2&g5{5>->L~Cz_9C@oS zg#8`#Haz61GPSY@^5k^W#jUqrhyJFXx^C=7R?0W2OWFYxkC^XAv)wONs1sIMGc>ch zVzys8aZML&60L4zDY3wjwLdan2!HuPt(Tv2P(cDF(!oF#i2(l95_=SF*Vo}8T)FqJ z;IaEv&vUK{LAasAT3b}~7Tspd7s|6gcN4*Fl%pq`!OQ<#`( z=?QdZQH9ia5*uc!96~24)`xSAulSuGMMw5+ZjI^{6%|?K+q-azv~F$%-A@bsT|L}1 zoM-S;fdhVnJ6}3z>9Wg{bAhOLw#v|G!Q8%7VH*B>UtiDq=+UEAxK0Cy;p97+;kL($ zAUc=kwIF3qkAW?~JwdA@y@Gqh2GkG-0?<~-D(+9cw0;m}JvOmiMF;+ws1Ld8csu{$ zxw95^flscQccQ!SgAs~;krxx9L9e>6mA^AqsI0HQF4UAMRK;hk@ZER?`Myx@sGUwT z)~<$oqk3KH)G(JlBB-tQ_`*QVVTd3B{OkuyJl~(ZTcmY0z%OBAHj9HedyNsHT^hW6 z2~unx2LuMzcw)4OiLdeN@*$cLpeQSfixK1Yc}3LjO&sEps!I(sZtGWu*BiIwMUT!1 zr++7~4Hn`u+opJED|Q|E4(9)Qh2*n6?GEwICr_VJ;8pD+!F%6Q3p@?4gNI&LDyX}W zNS&!@DpFc(xv zBLuKm2I@5GJlRJ1P&|ZO|Kz?EJT+AM2_G@v~nztW8?BvaeKRe{pd0t1T$z5&aP!Dj6{CF*nq@s zNl^0|=2N66YkOAGC@Sc@yj|&gaQV(Bs$&RS82P)Na_`^Qmvz^!+W`UU%1$>?qbDlPze~=>Z-qTLb-K|@NT2prXpY|1*tEyn-rMx4uj89S8<}qy;%RY8 z0^wN)P~tDk;T$F1XE8vUPJ(%}j6Yc^?pmxG7(n0-_1I83w!|26tjmy80RgY?s)zBZ zlfnf5m5T{OtAj1}{zS+z0Wkvd?fcN6lHwOk!6JdRp@Vh&0pZ`RUw9T3Ag;AZ<-Nq) zw-Fv!=A7=`lXhq^eI9tE4!d3kdLs8%vU-cLbH=knOH~ld?JVKA>`85R0vLm^C`K3Y? zc@v9MyRX zOHDH6r(nJ zCftwhu30~KzNOHAzMiLwVOSv&eIy9fU}Xd%e+Tbj*Y)|s3#$rjMB@=~U;SgH>XR!a zOvK6Ice&l9KTO~@T63B)$@o2AlasehQu55_o$cpA3|QaGeO0W-E;e&6nLXvJ#0d+$ zl{!rN1abCuy81?ic$SSIP6+z^fNyeXB4sx`TP2xjZd>5b3@@II%Ubu63d4TaxbBiZ zM?dTO#Xp~uY%aNi>v71-P9N^69hq=WM1(u=D-cRMK@E>8>*#H_U-lE%MzHWacMrR| z3(%zucCf5^)tSPr%!&6}5vOb8aCmeZq| z+751%8h5DyO(SS=zHIdN=gCEWP5@}FejyEDJKrV1+7o}!s0`)V1n%5Z+MC?@T}KJ{ zIe3txEpX;()5d0x`=Hh(d`66Y*{R@*i9}#1QR@6|)+hHF4rxd;N{!fYQ6(A6`-vyl zD@PzO5sMBQV(-{8$$qt9$QtIC!(IR~6K8(UP*mwZRSZEGQ!RPvF|GiqS9}w~-u;8# z5@InFZ^k*9ldIEy8*ND4HK7X7j6gGk%YS->Lu#}}X;d)i(kCg%Mea+)_m{;8iLC+T z+P3Op?KzoXG~j1~Nhg?xB-~&jn25ioof%Z|F;a29NII?SMISrM<_ETCGl}F!fg^nn zbP0DPLVeFLcD0}QE=IE{e7|B@p?e7dyD?|R+O%%h#M z?8NNZ9bsC~I#5-yX|5~{z}z(fx@ldWJ-g%MbFDF*Z`RJI4$NN23;Lw8D*u%MNmo8r zc7=oSkR0zB$+@{-9_wG+CHv@{TZAxyW!cI@>P;0p;kSZ`3A!PF;(pfnq#^#(LrSB$ zMA~bATVEjkzfBFOL8;_|3K zE|aQQW}~hVP$cwGfWEsUC(*Fg?vG#D+(_jujl1zu@_x87orh))gXhQXAJ z89X2lB32eCBGeO;Zwl2H0bw@nIs!?)IaGmM4?!MXy5cTF<~DBvw=j)gzj89?{Ut+u z#aw&sR6Z6HmpE3{L)z*|A8HVg6KwUDz})I&9r+XxMY;yxp82h?m%{1)#c??c-sHUZ zb^T4SjznmvG2-pc@Li%dorH*-+@HQ8bW?{8r(YH-2P>ApO!{~MbY5j{G0{>PQ$d*$ zKr3$`*$nA>)sLmi2(D(CM4Ra2;_4b_7k%+ePN#V6-7D#63aCCLrPo zt`Ve6G4d*}D40ByHP0UOO`gf23`xhDU#chX~@#tA=M!9>inO!Qr&B zmt2B=#M($WNLIo>^!=cI_%)xU$%L?UMIeAD7nx3Get~93G~$;^cu|pP2R}!jvu_IC zT?`cUl-Wa9zo__=_4$Vp6)_YRl3vY3co2B(vL;p+@oF(6Y{GG^OU8rb&08jBpmmVK zZ7K;@CkRgu)qX;OM}v1v4Ra#sC!3(Fp9#C$n_7l1_y11$N`ulTy9tInEPc4pl`8_x zrsJh@5=IPYxh%(QboVf>Z|nBimlu{Hg}17V z3EugU=TU3)ZzIr5nZe)O=Y^7K5+$g?uZ)tgQ^R=dByA0I(vrCl;aVs-gl?gLDnhPK zChmLxv4|Mb3F;~sDC!Lt=1CpML^H>Xim8MSHMnE+HDTB}1XrJY!DH)ofS2zmhdDrk}A~$jnM8{!r&Fm zuK1O~jT>YS`PygDHeydAxsUKep~GYrUu%t%(fvC*fw?fRJbvkP(CdxR_Wdzv$y;Ei zl)3GW8fZ1elC*6~y&xDZR664VOPY<>(zV!97mfM_+6uT1-pI2&qO%jcB0?A%9KwiEpfzAEX49FWy8iOr*u|KMv1} zP>;cG@ogyP*y&O~TqdS{BDv3^nIZk%$AMpv&{7KdL3N#{R5LJXkbRv#C+JQ=0)|99 z_qJyco$Z+{NP-L< zC3~c4gNOve{|XnX2QKdg+%n zZ)NF!J{^f{4fB7dj{eqdjwIaB#vk-MZS!u?o$v9tz7$;30D~08X06_=kEnwhk-VmXr^}M%+@P9UF(@HU0 zd$PZzS#I0%jFWw?g1wshRMTFtn(0XHOS?$}8zSLr<9^Ga76t#dQP`bJ>Q^Rt5 z@8_NPo-oijky796of|pW+SloZ-P?r2ax}qmT_{rOBV*qfVf#ZE= z<9T_<-6B*Bd=RyDrO2VL;pOt5zU|sctE(O&vLN~RKFi3 z>)2A*!K-4HQc>jI=jTF!lEtwaq!6+^gn%mBhuT)FW3^wK%aLs-{TDw4EdJ+Cnz)K- zLZfNGvkjSlU0WiR!5~RTcjUT8iP}DEc;EVoE*;nX#XFn+v8OHaxfxr4>I=t-rHQyn zo#+Me6+8=p0>}b7wgnJvNC6ZQ6iBMs3B4}%^BO(4M4t4n@cZp84A1kP^$h2tLqRP0{dZHZX5PJh{cW|}SRzowNyD)zQgP*gVo&21_LR{3+TpMh{GQ30nC67JZY7k758ZA7y?XvppQ~LND&ITY?t=jh>Ix6it*a=SUH4q+dJceFI2Jm32B!(fMmFkv6{V7Pn%>2uqymVH!ij4hPa`MRkm8FywCL}%R-dlB!0Zqn zmqr#Q-eiBa@CkiX8KC^vCf>Yw&b0)t!x7zlTu?zy^<`n8Vn?y*(=E`;X6&X`A^QBg zg2hq67q;vI&wFF;W`yi{W~=?l>)(3Izx|%nVz)-w1uy=mhMN~EXg*dtpPdXa=)i}$?HsYP8Xb1=!Am}K4Q=|8B*-DvIOcI(KoP$*V2b_R4%Fm6`vj z+)qQV4ecxZ)z-yg0zG!71Jut&-W!JVHK4~{eHgsP$@z0cwigrn0@}{Nf{ndVLR`GP zC0A7;5Uz3nG|GNFm5|GBTj;hX{Sp+@3Q2q{i&`5W+zoMK@i-qNShb>jaj?a=_&Sjj z^zR}Amkn@L>=%0M9S(lu?|mts3AaJAfQ1}e*V|&` z@8JEQjh)u_ByR=wtZ% zUP#h}z|$Xf$R+$e>dmEG?2IaiVAU+kL_p~p^iz6^1}R2!^a!Pn#OsJ{ih@CklGS2O z+F<9)C%46=mmVj+!jXl^m$HWPg~;piDt0@@R!Ui=qL>Kew?>u5efFFM57X2Db%GVB z4u?iA+OAwXzks|zxv&iNmm`>7n^&JX)(&vuCuaRevlxN!55^yy2)=MsdSTnj2sEm| z_S}-=1VwbHMXhjT$m?9Ii9hB66$43F1$%{OQ0}u1!*ClXuvm5V%=pH<%6MoP{3+AH z;f@^_hm2P{>!c<}?wUsYx9G$5ZO~-?O{zd~1qfHSMRDm+d;dP=IB*u^Kt?pzjSkWV z$#0y$vw!TkUw>rxXAyT-^uqTgtq#r#HqA}cm;EOqNfL~*Na^v2@OqRV%nCQLM(#qJ zWI-f$uxwcPbBJo3`ga@rjpEnQgJ%~>uR|LA;{N(>Pgbd$G2Vj#4*UYadin(myQ+7cm*UK6g)(H2;x7}aUG5rh0Ll(Y|bDX`{Ey~3npWc6^F ztvyOaCILq_wf4*~KKp_+f!akR>03m#a`#PWnOHcqF#p(xG0!QLd331i4z&(-)Ku); zEZst%iX@*-H;Fp#O3|J!1`-}lknTYS@e7DQ$_ceEX43m%!LR5KB}>!^J!uhEA7f|@m@uR=yI`fKqXbkuyA8g;0ywLPi;iTyCFf;)*{<6gP*ehnU zvB8FFV{Qp5eu;YhM+}@ZR{pOk)IWOSDM@Ul&JS~WoHqu8^gdzdOZ2Gj-iE1!sDWY}SojoEdhB@ZW$Jxe^_@z(w zpV_gcF#GnG>}fqL6lYH^%Qk%T!G9NhV4XstF?uom5k+U7J4;d~qFo}kPF+3DN3cE+ z2ya|EeS|w4Gq8vYZ^h=RJ-KS|P9qX+c;&*iwJr|et~Hv+F8HrmD<)gqM>>rU^>zwD zUqcBdRrXYg9?SL^s-b+PLlijoC?DR`y0m_Lp?drCi=Zu%P3-);u`oHKB2BTNfvr99 z!zVHNx9jM=N=sNb_}3;9XZDKM)AOB{A8?j%M7cK(@;_07m{Mkubl=@w4RSKN3sC`k zi?eLA9Z$uY5Nrg;Rw72<^F}VDeCYba;C0~iaAN$OkJZ!e&FTON$;WMq^iOc-zj!h*dg^(dNraze$MTM#|trFFRA6tR1~rDMea z@Q=3539Eh$>6&{p6){n#a&iw%dL+uB#STA3H9!RRj+S9@99!~NUPXVQf0O|nS*53H zMcF-_51pyB1AvX4qsMAQLs}5DC-0iy`9uRMgtg)|-tXBLV9ka4m2588-#bKGFa{P7F*+S8o>O%*f)%e=Vwyh(vO9Tp7V^L+dpZ{+(IuHc>O{oQSAYYkXzn) z_mWuEQ$=oQ)0AgWH2}{IaQF#;yvdu~3Mg=5b62Z0?d&|*UR&U_KN|bysmC|}{#{U` zH~DjL_mXOu;l+9(_ISrX<5^IW2;~dW7v#Y|zBxR6-7C5&dpns7Jsu59%dZoEjB#r{ zio6k0NynO<|Ao%T@FG$#Yc$6SceDZ&q{gy`G=J!0p&JnOPkUY11sYcO&Gj^Z;?Jk5 zPxWnbYw8*q`Rt6?JZ=!k?@&Q_iPa!7?Rax_(&R!}z2R#g`x1^ok}oas%f3uo-Fn_q z-`%lv+EgGZhgM*+vC0h+JM&R!HBj~g8D)oGfay0%Mp{w9aj3~q7>T=LHj-(y+M=tR#mE`Ht=Er!t=AMUVlo?%A-W@_tG z$Bt$#0C~g2N=}^Fs?yRCgWb{>+2%J@G=ljl?SL3nRrAK3)`Nj^i0~W#eBc)Gzy6JU zM`{t&Qce|F5Xj|TtGsM-kr;ZTjcCV!Xg@;!nMTtCM*lsK_P^V@pu+$Fa;C3t@{6^B zQbUm;I^regew0OqS+7Ii!|oAuzbzIdUE$9cBg#%D=zF`z1)<*I(Ci^9E=;&P`z#`( zb6aeGhpv+l3YEPw4e}UP1ww$eX8-osU=`TF7BQ=#5&}2rs5>{e>sq+~Y#A(p1g}bn zdjh|{E2&R|P?s;|3ynLZGj+$|IK3YzJkTm6|8MM2mg@D7M|p>Cr(CpRN&~irk_e-W zhXed3RIB=t@#AfYrgKKH{AjCzcwdbNH#`bgLMn9d8qszmO5 za_*v7BZU`VkK}Wze4^_B>{m_<8RA5hSzBIRq&w=ZcrJ??zuz(iN@g^*K!D}#w9XvOfCI)_+6RQ2h05PWue8)# zkWk+rd!ml7jzFF%scC6@h<4xXH&3Jwe5c|UeOVzOZ06fk9M45o)tpv%{|&I_|H5GP zSZIle_q!u#3wwA*d_^Qax&0#ox4w`^AW)}DHBc^`Nq(0(qk6s zro)RpcHj3>Iiyk=S=!S3(x!!B_)vVQ+7Pp@|EtjVpDdpcZbqCzdnhQ-L-(YpEs-2$}Te zBZ$cbgdkxeh`3~noEK7s?92xHiI-(H#E(ytojd|*{7zp~YA2n4sCrLSY7gdKE{`5S zR#CWaHS86>d-$uWB2N-8%!2NXq=byhZ&l^I^;V1x+4<#?ZyK-H^49P`ek%Db&I08G z;lDTKJin;65caAWMiw$2gfN50mz8I7=l-EM{M2WRbU8^OM1t3kyNkRFJO8YAzM$Qz z64JMIhm)OfJ4dNkx!enVH;*K1gxanbFm1s`1;XYXYp~0@bLijyNJKX$kpO2vmETj8 z;k$A5YI3TtPZMj1%gtx`vyJ>8UJmEw9P%ck5ibGHOD^K4U*`+Jf-39x>Pcsui*FqS z&?68!_nbe4e>ardfQ;h((RqD4Fy@UvjMaqtl8R(%y`KQqPpu^90sV+qqCI%9 z_wvyeX$+%81Nw(t2DM;~v#6Ousr*-A`b*A?>*ma((~HoDCB~fb|CXi~M~+TpXH)KkV`GIaS6p@?nzndsz#0!}S_Z`| zWH-MipV^VHA|XT+YyCd=D>X1I&#TF1b{2f}M_-pjwfVGRh8{XN3d9~a)lkc1NN)0! zK5e{>ID~vpNNOv)m;Q8>I_2rvCbpj~^b|avBt;R8j5wspdMWPrMf?}hT8H|AqAI%NL8ooqr4!oadsPA6(Fti$6U5%8wqVU@< zBs}SVaHmR$iS*-!8F@uTQI`NQist6K-z>Zz1hg`pET}HSP5D*xw`K>f715NV(!06& z3L$<%3l9YrxW0V)Lk+p=-?#kW=~#sktj>^p>#$w zZ|DSqR(VK;4>9c3i*w%Tt&SbF4?CFH0kWuAQmF11?OXOGASuK%VYo?Qb)bchF9sldU-}j$gi$m}RvE#PZ%n!gj zSi2i9DJ-hNm>T(8PR6%BGTr*X6!Fm^Lg+GirzW{p2oB21prwJk=|mMlpo$`+x*bNP ztrc^tGv=01%pK_XIQzT=&B;whn{IObbQi&!a54ghYzrp5diB1dg#v1#*g3SC|DxrA zw++K;@R5{+XC3>x`VoQsE`c2^;G&u3MDumkgP;3T36$H7U{W z2DE*gK~uav0ziBdz>#wf^f2YUCtT;l6VoykNao^}jjTX%>V(?MkGQd(rtcovbUA8o zzzsvhqYhzmgTkSa51$H{-&l~#3s&PvPSmjPy^WFD?O`yox+dUpFSJD$U6g~p<6XI| zyK?et!VIAfcg5whDI_Y`+L<`vBi%xVTT!e?=yM zZ@Ioi1YaJr5N5h5$^uB@dmR0|Mx8bQNO_x-a=|$39km5Cu5*-7?9%2f=Sj;D(udwn zmnVqV46nbwy0l75x5_Z3=jHlaWTWaqoJEhjRF-2We=?7WY&{Mv!T-t)=JT=dK4 z8MU|&O}6>h23__?f~HZ?a!;`NmkH!Kt0NPMq(j87C3MKajexULqi>+>&o{gbQV(*< z3Elg$;yOESzGYkWu7=3CJPM=xCb6Ev5%$V4p4TIEt|v1R-Rb0IsFV5`x*IIg^t`#`yYq0VSCC&vzcBvIWwS}Jq>cAnT$E4nQ@N*F9`d1` zOrYu#3t8f1;_Et4`#Hw_CXVd5lyH3VHcYv3Rmc}Sm1wVRJUrcUP~<@Eoh;7B>tkQ2 z@nRTG>8zM^sq*^59gA5Onl=pxXQ2CPB=|+G`mST^!Q?%#?2a&Vy88Fp)7?;*-1Vyv zV6VgY#wC;C4E2cVrsG#j(P!Irz~_rkmpJ)}u=UHC_a0l&(l|&|e`vP>;w_uy^Tq?K zPQH)<%{;FNFRqL_weY+u%j@tX5vT>}91_rLO|;N5I4HWVnp8FZ(mohwW5E+^E&~#E7Q+ z1dy=!W>*ZY{SkkS+Kh0seFdN5xwJtYGFhKB=6RZOxNtV=iGVvGf-WPp-Uv93w=y%+ zz=8i}%ba1|j`F}K0T@UpXTLmg>tT?<;?2=N+FtK@)8U)H#!XHTj17xhhC2~kOO|Cj z(3XAQBUVY5EZ@Z2;)kI<_gIn8u>NCq;L~~n#Jqc0AXxKR$q_@zA)s@_kkm?b{b^(} z=|8hVmkCsOxR`uRGd%ir?ycKdWZ_*o`Nis?9Za$pqQ4SAFYTIp$8R?S05Jys-mFTQ zP&lIy3m;I^y7h;|avZ5of7DLIF*X#{aY?pKK}iReHSLGvJ3^jC?!-|)4+>dIWRS31 zxA_b_O=%+a_yf!&%6wHQH{PSdG)`JS7@E2$DYju}bN3SUX40)^QhcIuZ?HzKSNpp& z8DB*)J#qr&vWKfPrNzIf7(JHl%QOsFDq1=(uP08}=x-l@9-m-!*^Q!p>JRwyi-?ZX zZeLmtXl;xob7w|}46D!Dw}Ms^rIz|2`o3;Me9F)ZbwXv!AMIE~Atmw;anp!w4}cc6 z{9wZO;Q?x}Cd&UXF(kXSMUt2vfI{L@mdV0Fz8*JM3`ZcqA!GM?0K&3p+Fck>mBcqU zoB5_b;bqkJgCEfn?RIA35E|Xogbw00!W2TIo<02BSDX9I590FXiP%Kky zel;@S`PEZm&tAyyQ*f)|96(7{T1er4Ki`vTL@*k>FiD}!$0u53&_p24!F%UD1V#U^ z8@0R36)!_VZ-4oos^*HL?k|uv!KctD$y%UJU^iF!HQY)VWVyxCLuH%0MrU%U60Fd|;Cl9+Ce^CNO~* zPN4M{QBzaPDexUTYNv`($|rZkk2y(-j_>LIu{?MHH$?f#E}ZpnpE~8AO;p@#b*&+| zTA+^Ct4z;@qTad+JPEnL_Q+^5+1wsTDIIDlp$_|;2Q6^IuxyCyI@IE?&cA*Y7Z*p(J>4q*6kodDC_^w?|J-w18zqxZ9AEcw={245FThg3{X zTs8O$3wpkMhwkv?0HGnlxeANfBI*v!)z)5}zebj@*A8GEctq$-B(r~%WLnUU@(m85 z``V4F1U&LrE{XRdp;h40!Rh3{6OaGY71_WmLv}O)YZTR>y}a@`rCooty)w!(HG6_P z{&q*4Bx*_5wmK$|O1_dR)WQDoFr@ReI@>E|Ib6+RQjBDzj%K90U|*+G6(IbaG>HB* zKDre;a!2;{b+Wqbwy037)L{-rD$wzK%ocfXPD(&6qB$$WseTuj{}Ux+h+6a5dZy{% za2b*hG&CR$^jH3vizo)lH_S$;@{2SV!lAxG3Nu5Gyf0dKzfw1tf5cF*4>Yr|w8~g} z(%V92OoxLN@P-Fc6`6e~ply79%lom5r5yjj@XHrKIG5R*@c;l#oIk;CV!8lS-^=Y} zwZ09W_BR<|;+fUPw*OF0Lpf6qMg-ItU|9X~RPo@cX;+w2LQ`6C=8MTr4B@ z$Mgf~h3<5|B*jlwtz2n3+Z6x4%h{`X=W!|~qx*zQ7sSP@?FZ|1lP3_4NnUh9AR;;H z;?Rfs0yqUsl5m+{3nLJQ0R(?gdCXm-vsYyEq=BTWlV!*kPshjAmqdFLI6-cTp;`hD z3SLKXJMwn5WgH_NE@dHg_Gafq;D+Td(o4M)4iG@91z|i5Y{0eI|*R*006;~nNZlr#?HR~ z4oE6t{keZ`O<^DCFJv172Ey(jKU3P*SU_&@P^6ul-1rbJFSK=9KP{sO9?FPtWV5JLL!$sZR6E zH_ahSu%t#rmLw1rDxtxE@}qyFLr&o(E5J(AZnqfz&8pxJF?7}+s8(FmImk=tO-Y+!O_?w4X7tZLal5bd|M~8#jUX1{ZxwS zOZGy3@Q$&$mZl_d@+loYWj!CWkb53c4!_Dc$cF?SQ>19MwHSSEQIINlu-w1&0}^a= zUn?>#9$YRVTwZ-ge(2`qUoy#|^Ohm0k`har1wF}{FM8JnfeSwcpU1uDYquw5;doGz z^3^1T?{G?TYK*UXHQ3}){((|!M60(ZQO@rRcUYd_9##K~EnA|I@*-ybnu-jWJbG&1 zaFrsa0#q?XZXXm^klH0=IPy~|?KvxHVusn04&W;|ef=xA3m$Fx3<(2?I@fck@F+=e zliV1PcgUuap+xH4YMM-k(?S|8q~)<%J^e?G)cP+!6)u#U{>}UHccS$I^T5MoTBByL z6aDg`A|s}=d{Qa5yZJUUQA(!n^&0fqUY86gOZ5ON@g!VUy&RH*>M@Pe?cfWcj>+ez;bQjYePkR;jH zyUa=>V8Mv2>Cb=DOoF^l3*CyjSm;vifBaO10os=KLn7_Q$JXMidwfxp-)X+rWZZXh zFW}(iDWW0|z=n?>$v)ov=^)G1Vb2JqPzVxI`WS+Ca&i)vlDZ`)o;PCJl|gNY z{6R*=zuxv2S~bIXX4-L^(%jle@(M+^C-ERBe7^?^rnIA0l|L$~zsM!vV$GrTCc4p>rsallbC&KvcS9O){$9ADF#sZ)Z=};R*a7rmiX| z&L-F{?(XjHPS8b?;2zv15F~hTK3qa@5AGJ+Hn=-MLU4C?*Sr6%x>fgSYqxk|W_qT( z&*^h^;}DADVn<>6WTJsuPl32dp8h>Jr^Jo`S&0DVFkSY6YF22WU4yS{T2EL2nT$!Z zA*`5r@p*r?^b(j7X_^HaMK!65FoV%>?3b{%2Fn(}RBLmPRhltyBI>#+4g#+5Hh!tYzT8Jukk0PFq1TPOZ#mBWLg1wB4xJGcpRWk~R6yz)<0mP2H(cU%_Q~P{6Yx>l=a61Ae&si5eM+!mD%m~q{W3!0 zeaq_zY6*A(}CW}Zw-WvPP!Aq#}5Av)`1cf3~a>1!1ugDkg#Q$$+s<@4Ku0M z_c90f;Gk67K-odHI%O{e!urr0B-3X3r8|YQPf(&liEU_R{m^VwN*DW#k{+|L3L65b zG`$YnTBQx?%tmP0CTJAlc)m6m3+`mT7LGF&tzhs4r16G`(z*QW5t{V;%H$1=eM{uV zURY%T@V0bB6-`d~_@?pX-eIkmUy|W*wb00kzz*{TvyE0b>pcj3FSO-fH=t@CKs$?F zN@g<6lwdQuTbhS}plUVHD8V%}sYH}8;w2DIB%;$0Btv5)*tkgOw18@KbWw_gT;3BC zb|D8~gT|m2$IIT?Io?&#J-rB-c;ZK%KnkF@Pkkf7QJ)>8p`(i10QY1fv$M&?fZ_{H z5CZD|G@769tifG)!3eg>ziDW8}Ku-U}118~0*{eU8 zZ1badCI?FmQSF)IME7IIge5Ri{#5?VNsbR>rJ)mYVFA(A zbY0v5MP1)FX+<;piz40^rgA2GSJM-%XVvk3aUlv!vZf|@QgwghezW`o(oVC&IwzAYL9!9SegN*^uXKUX;;z}qxGN%h!6|5@QJSVUsKZp$ z5<^3XZM9QUcmH<-D_e!!f;e|p5W_G2Z`+OP;cEpdBaP=zvX40hp`C4oxSvg6pgHER zDLJvWURrz<8gdjGQaaRtZ5Z5tQc7(%GVFvq1XBE@FnCb`Fu~GM7=i{knYS7>>Ia*l zNfRbjy(O|a)Bv3~j1i1`yWh4MbVif^ExzhO#}9gLw(fi1UJ*SE0U}WD*)dZotD~${ z9!tO8^z#=lkfm59{`6Ep)S;2h7Y~ca>vUn)UG(D^b1hNfJZWi4c;mBDY8qu@s3oW| zik6OQUnD1|m+#}XJij2P+86>e6pxONL83;=SP7&9xZWs z8B!4NWgFyzKv(Wx2Q8=up~&QBk>AAT07J9w=FB#Xtm^xR^ioUTYy7(+dT4X|93+=! zJ$5AH?8l?xM$w-($5e(5-G2CBf9Sg)OwK?|Lb3a_J@fCM*_h&E_Pv^Ml|2)y7ifaA zuFL&}B5igm&{T)0&mA8J^!n(1U)>1@0OFP~&fKuM+zNX5H`BH5~sFjIpwhJ&R~ zb7*w;^5dNjb^BrmoM)05>g4lBR>@Qamyqev*bpJHyUDBUCx2|OYt{|rE{4prfVx?Zs6NPK(A5MEe`W(M)L_whQ@o)?&G@QmKf zyYj==?`djX`@;WS=p{xjo+}po=UE`e-MDwycpkkufj@Je=-GLb2q}{6JNfJIFxXwk z9`+G&v+>QW<5hBC8m-55d{q}O%7%Vq@Ien$4AH@k>W4^3*CKb-0o>`Rpc>P3X4(xX z!L@+7q3{&39La?;=4 z^v$bI5`g09cTEbAk`d+3@}>hunq2HUS}kvN8<^zpj3WMmZh0{vt|RXETU?c;pT$gJ z;;tw3W+SQYtNVNgd%3YF1`7ZBaQi^u`uhcQb!`Yqtzbw_0;7G!OBH%wiz&}^YxA$5(K-P6*#k zy1$684t24*z?tLCZ z0ZQDoP=J$|_%L*E3+EVk=}n#Fe?ene3&FQ#Zw$JdTDHwEAl`a;h!uLZ-vy-@pQGPW zuH$xfU6q!4W;egGv1ZTNKj6{(;T7@^9Z_|_|373E%3*W5Wjb?|c;&2W*&ir80$mEp zhd=^46>X;AmY+f1R4+eu?>Aj1lOd=JwfSV|`X38{(fu(TF58LY z_gm{s%nd|vx0W#RhiLizsMA}4B*WE6d%VCoKhy-;;Hk{AaQOeo1cIDMxt|GYw4N>H z2kWL$o;Bjod(RtRL68)zTqZA+WDtxb4Erj@jQQ>(Ou7=|5AQJe#KAt|i3!QQ=au!R z$8(Dw#WcMC0G1G>a_2(QAbbM^O>8- z6t|fKw3pqzbwN*|a|xCBbiz}RV}s6vevsh;`t18J7IeBDQ;qR{+x)`%8`~BWRO(h= z>2@#wdk5ObyceVNPvN*2lUrkq9ZZ~t6V=Iiv(9?U*=3JxPV6hB2R2q@d!@{6C=!4b?hOs2uL~>F&hoZs6>A~#SiP=`^ zm~YT#0+()SD09I7_IPS3LD1^+u4pueWg9xBvIh%gljvz=*aV=xPb?qm>5=Xbv9Y&T zic3{W1x$0PfaGMnt~%8qvs3s{7Y-icU6l?|TdSRrBwvl^F(|mbld-tR!&!4xOQm>f z;x(a)eSOa$UW4MkAYZy;#vX#!#Y9G`aHOUvbx7)E6YRmQ-oIBGmy`ADn<3-mBTVyd zcTW`8w43oCg05Lf`{4s2xBnn-?>Fra9Yt<}>yjD3qQ)@&>*dHAKk(WNY|UALK5Mqd zh~2EMO}o?m_rn_3w{_GrQ*)Kz0$*C+UUBYpG+j_lveuw)?~3-Ln2#3+**PXJD2;Xx zepXaW=8|?IUx9Y>y`gKL*)qSV= z6qt225JU8Tf$wa$8YL8aKJWF4jzfxt1?QlBsK#5DuT9D&k3gGg-4q(L&*V?dM>j&2 zO*eXrr%wu=TNzhMhqW`IG7vnJ8l!56);jan;+^mC?MK~Z0@a((aekT>nB&~9Eg-Fn zKr|m18wLfu<+Ss~I+l+;-rs#z{n>Od0%+gD)-hKE$>iY(X=SQweQ?HiU&eNJgJwk( z?#lzt=~6hv{mvQAB(kzN{TQ0e`uHOqD9A~tii^cxZnwSO_TBaf=ErM&;@%7Dl^avxVYdvuD{sQk>o3&r@%gg;FG1a`bnobBF_1`u*XXH6q z7)MIWv5bQGE4LXTt?*Oh5ZfO(coQdt4@k{^IL>eVG6fZPtLneRr(Jqafp^VS*e>et zynJ>f9TN^ezv2Z*QD?&*M72yjfyM={Qn#D_;nog%e{esX(O=V6{OLVI z5{enCn5V;vGP9`pXlb~PNxoK{I34!jo~xmgY=g`DCpax%Q;h*&ZEK}On((vGbCQ#-)_wr73R0^f!2QlU#t!k$CO*z-G)k$t3p@g=<`O34B z^T6e=oOY7F49F!&_kRU;lAVFYY?773Le#?8%nz+#mQyr)7=0_4{dP3@rsNpfUe z+M!d6juUXa)dEZWX<6&!{X^chtWEHP1v<+=+zJ|g$>Ya*0<4A zQzqhF_~=(RXpzxAK$vIe(4#R&$od7-+2d`!J6X|$PKTKaIYO-$Zmm8R(s#RbF@N+Y zU>-{Y{oBtJOJt9!q}3!AtzNLfo=Vlq2RKc2fgk)1hA*!JOQ26g#$Xdg?YEX%17Dnf zc6{%j`=#oX$o~yA&yUNoixU5&*4O;NuXrwbv$y}Hfdx<44p_79X5`LT=9ZTK6hrla zIe4jL{@lA+Xi1)lJlaD2DX&>)o#if{nI%Y-UaMnZr~G>gC&hwiro?XO0W6Q4^fTW4 zsfdr^;N7Snh|K&#DO5f!mSw)~gw?g!Xu{0l z^HC7FzK&wPNJZQsXkzCgQpeb&2-R0`Sxn*vOR0m<6L2M(^;526ddo0?M!t$B||T~#$yaf6K$-0Bw&_Isy@7aRAv(p+lG;h|01b=Sd+S594U7g6l2RguhDT9?D9UzFRWB&|e zI>_=V%YCW7{R59I%ROYSvYEl*o$0Ti-#OMl>M_!cli2y624|(b$N2RFE8~mcYP!wv zv`tJ}E7}yctB2`-Ax>HiW5@>#A9PWJVWck40KcEL`{hP;xL|dUwsGx%l7T8Q2uBps z=|lTb^~Bo}|7(Hh*+lzM#YcS9P*Sz|+ph%0e~aN|v+Ru?iPf9fK7J8#Pypq64-$TQ zh75O*=76HL(|Ny{Q?Ff&YYzG@{>^!MLbBF5OjUOnqlrzo9EDXEHBlRwZP; z8{#<8V5$7Y;n-#>Vd;ZOjcQ@6WP5kV^%UNG`-{)Uu@I}9asza|2kV%=;xvn&Yox9K z8SJ3nomL78s8%IO0{7S6?ds#NG3T=Tdr1wolG zlpw-`zOblQ&Z`u$GH#fv%WPUfp7pc0xR&Sn9S6JCDn-=Y7s-5u_v_=N_|-{jX^7AB zp39?LonqzIHdxw~`tLQQ59QIQQQzZroQv+w5=gT-3wGhM0m@oT_3G{OD=P}*5u z%o#{rs}seb4r3yDs?^T-=uQL!zkDwa9+MU@DnO8@X(CRq+hEbzkTa-Hi*c#o!%Aw0 z)3E-ij~%Q=zThVwaz}dvMDvUV%EX4j92pR7Smj~f~8OV1F+ z!q}XUzb8A6d)gO61NfBb#sfJW-0>2&H&32X>aw89 znc4cm?|UyReGU}?>bwyG;`w0n&8mxwi@vz^NKy)uG)H?uA|Y62Xd~NwTQZ`B$L}-g$ij8_&9uSUfUa$r!)0 zZOHwbKV_@lS^-{YV6|Q@(o2X|>SjpKZ{J=a*^;F_R<7rD)y4!caDn27IpHi$)=Dd4 z^B=$HAtvH>u74V0$yftzUe2c=4!>p0- zlOzgeN3)ga{v}h2&!aEwCM`)i+P}bF{wuX+Jl86e$Xzc&V7s=*?S-pK+E2o179(Caxce)sntie?XK!AHwQxbLzVbDXT>cb}Pbv%hj%vDUF; zfdZW_n|~51;9e{8*Vg50v~=$f?65YTox#MKh)@s6mDJtwiAonBx1dVX&%MYqG--f@pCrbux5{5DC2AKUJ&^-|*{qTG)Ead{cDM)a#1#(}OoZctGx3giv z);dI>YZzuZ_}sp&E^V%lyHa`k-jz*=zjYO(*D?8JW=yG}G=%-P^2#+uZ|{W5b9?kD zp7T)X)_ZncxP|?QkrYPgjMwxOa`|e%Xn+1=09ULcVR7jN()xseGI!*zZnR@QUvmLn z>$d)xVPJ+O5PH<hdgprB&rMzTSRQnPwEN+Y%LzQ=N+{s3b*T&K$ zH2md-nA?dI^gCnCp@u?Us^KHaHWk`s#an$?u~IQjT64lX3q*rr_|d*XaUU9k=C2t3 z)%EbFonM+fUHT6{TYYeVA!lF1qkT$B8ftW!u>}P5o+Ruv<(LDe#B_ej!Rn7RK*Y>qz6mNJk2!=|!-_ zBz$M+4trnyiRR(KF8Y!qS7-ssNqa>6YS_`0K~0;(1QkW1XKhOCdUf;-j`NdwH#r|; z#*osUC)wByA#wdtM2gsM6vL>6?_{lDhNdLJcyqCB6tBNaN_T8>o!)EO8dLY1xx)jsFGH@q(a9_+Z{TVxLBHE@yVGDo7}z?USJ%h z!sG9)WamxY6Tk#3%-g~Bgsb$WQ^hAi>|XXUqiI;wK zyr811@G!wFrsr|dnhSnb1oxGo~Mg0^?+M?vD$TjWH zCY9dKUrpa{l)v<2RN2*JVeLGenSVbS4=K}W8ihqpc*`<}{)Cb>;}IhtF@I zWNkJfsLrm>-I?`p0t34t08wK%ZqrSu3{06UN1z^j3BQ9);RvX!tBd1>rcL>c@ERAy z2rXl%ZT;5VR&yft3mN*U-3FHfn~N}WCe2(crQ*KxjtPuKrTv&V^U0hcAD9ax`lw~@ z9-?5V*M%f$`*kUC;Kt|VDHXyIC;e^f+Jt{qISPG@A^&nixufUz->eAGdoc-m_+R*T2=->C98Vp>W|E(bj2~=XSvbw>YG<2Z**CTeG-Ctu7yo;=oe%pOmKW9ubQYy{k|@(MB1i!4{@; z^k|qWh@#sv!~pK{!iixr^F26| zVk>Om9xg$)(IldLwRxF_pz~Tfs?nEzl#aH)4Sc}3>w>U;e@Rt2^jj;jc5P!nTUI}=n zAx4B8O1&+QQoS8Q6Y=$UM0s-#R+vy}nlFv|4ambB^5eDvXyjYkezx;dU2Uzo-aS86 zw_Le+Y(FXgR3W>mm4ieIbyW=*Uim!T9{+x`eBGC#N!6CwMD$PXg-2ossRty!7$$srGu5l8+ z@c;b@FW_p7r#Cgy34Nm9KMqmX7RP1|1qA*b8cORbz(Ta+f3LW_u{TT@@=I$``V|O9 z!uouByzt+%9nvRDnJHX5{0=2j8EBZG$h~Nd!tY`FTAs^jIlY1g$s^hfYqe_9{eFu%aD^Za-&<)1XB$ON2 z9VRh8L%ia(B85IktJA0%Le=6v0p(sD`TURorNuay?YA_dkw3}S=X*IO1J(XkTYZuI zmsgFY^lGAPkyQF9Ti>abqi6>r>Q%{+Tq??xZg?j53eM(hJqd0k?Gr!rlqN7cBiw&o zx>chD-@aBK*~0v5h4CLI1hZ`eg6CtMXT!cCelw8Iy`VS0SjSU=3Ck5UfSq<*#5Nzk zNuY|PP>q@XDdueEjy-cU-hK5Q)d5x~!2#vY!VAJbyjhShX^ziu$;IzfLp5=;@&A6B zhs(xAzdQy`+ARHWD6PpU+h$r|$`DcLzWSQVAto1$pB>a%ui;AM5P4F(pi{I3L`-$} zWK<{R9^v;k#MT$j{HzCDI>hK)FGrHu()p}0p?jYP5#GO?hw#i>tY@CpH7OnSWd{7h zk|gR4E3s&N7oo1G1&iXWOvdqPksOkxV%r{M*8BHiUDB?e%~{4iSnT(A06w142rQ1LIoi6ymp&&+w!*OBV=28D<*3Ub-tM1CH1 zJAt)VWyN zUw#)JLoQWN#-+bxh6b+G4i{1Wq?HmTXI!Qws7n-=9I$qVmBnO$TDgN*iY*w(Oqh#G zeWR{u_B-0$Y1Ol}Ts8WQ&@TT{Qb9E1MgaJ(fV0I);y89wEyxu|KQH9XpJA?kT*2s+ z_^)lfUUqc)ie?{{6`9b|ZS?n(mHX5O4zo68#j}EM-_XgxmEGX-im*UYR~|pQz-mdG zE$*_Dw9Ljh=0FwIAN#>yA&5R@6fp?m7&0H{4+L6Le(Q1CSGL8P)FG&a57NZ}$a8>L z;-~8~pZ&jv#Ou(2BoOd$(ES~O)_W)7P(*LNyn%qvC{xpOlFGtxmiznc}yWtLfj8Vkizxf=g_!0UWU<5igG?qAU&Laqh339MnWDCvX(Jlx2>wJ55x`Df9y6g+yJD;1FXB{*4sGvWP0z0vtf#+S2@Pyt zdw$!EWr;k!ef2M{c^gXkuSyjpMNdjejsKY$#KIyc{fR(ZVRSTthgg@-_Rw3tPv7NS5gA&Se>VwKq&Rvs~^2bpucmG-omR#QE;f-7(X_Y}qzt5GLj2_VnkvSzDX z5vrOhKopD~#pxM3rcFoE{{wuDpDiyDPA;I30B^ZBRP!qkG4c0_RWPsFG|`NV7^ zGL-+~CH`9}MIj6^>iCn+4YW|({K5SXO_l_xVVRstD5SS+esl>616 zbLy(Sx>I2w>Q6*>TCsR};8#4nmf5@=jh7(_WFz%4klFWbSnEt}72c@yTh+UM zd(at@S9Q5)=1M%OU_j@VPUpg;$W@t%$0iz$fx9^~Kn|quKKuIcab@jg4Tr@aBLDTl z;7+$^u-2k`VKsS9k{%W&P?`qDpPw|6>Gf7ZRot6F$N1^v#c2kR3i>?p+ZgoA_(4Bo zc)*VqkbCV7i!Ny?H``o1$LSu*pu(g?KdGo~aC*9-3Ca?JKA+KmT(RogX;zaRR zo;y`nl_!yxB-0TeMY90l=ho|^Bbx_-fRKvCd?kX0%K*jd_Y(vDj}zqVbrSj|8kyc< zQ4_1`qnx?a4}dV&f|^NZCqFd~RNz;~h<5F9TOOhqDAatZa)6H>t>2KM=djKpm7W$- zNvfgg6UZx^{a0_41P>|i-(f^7mN(c)1z%`+`&Lh$SW=shtsgKTn+Pd8y39ZZvl&pepuIEGHk)YwNmx@xF6} zmdQ)}VOvb%!O|lY8=9flV}iQ-O-Y~@q)cLxxjZ8FFiNDpj0Um(WRIL55r&aX;KSBQ zy9&Fl>-YdRYP-iR^Mz&!#}q9cPY<)PPs^=ObMhL{uy#N~!x$_^>RSCXMO zL0bTPp5iADqt&c!Hx(X_uUEgIAcz2SXx-12#=m6NG5d)UzOplB0YZP=?!2sCqyh?l z8XWx}Hy}WRxm|}~mDEHCYW~sC|99fE8Que2vE_YAwdY51=H6r0^3sh{MH2`-GgKsZ z4e3%4dJ=%5nCIkx?p!8qim3K-;)N$_7!m&N!V*g-xm+n)#K0;Y$&nbnc(-A#`Q`3J zik%@K#oG`4_NQ$~C!%c4!+r61w?B$;PU@Or+#e*WGmEJ#sHP2TWRxPPZP{-SLF_8F zvF+mU?IL_{buW63YPUGU#Ny=V-uctA{Yr~|+Y>OGGi9q)Sa|!s;!_=PrqAPPvy^Y~ z;{yRS74P0~yS!Lz982dz%9X;8`vw2m$d?DPyUWh?P7UL8 zBUM1oj~_n>hp9v?FhIhR8$vf^@A;9RLWAElL- zpF@e3q6542qbID+ncJA|(T%oU4mo;Kii-f>A!1`LLEdj~P?iBfm-PX6Kk8?;V`U^W z1Pddsg}Z>P?tSV8XY7*lrz&`dl{-h(xI&39F#H8JnC*Y>a;)cm2NlCDLQlyH?QU50 zUK10#)3<1!s@wK-0mo~f4Z|)!qgN^kU+AH#|FWy2b99S}@I9`Gxf%wfBL|DEkOXKD zFq@aT&r3n#)Nn0bQPl6&CK4vli>o4AWae4eSm;!W5FBw-es*jHhX(;zQbKB<&dphD zzCa<^nHKu0)>~;~PiF$G6#xV9dNvWJzb1BO33&WcR_OqnjD7&p@twY$A8bArXw`V@o|V80PwCt=a{0W zjtb3;o8_i#e~+cwP&F6tcM-VmnhM}u3N}KY}xCH z-M&fT^>yszc%?CPsziBre}nqrju2?;6gwiYD=P}TFKamN%2n!wrricB%IrATy zT=aHp))*?0#TD9$3es1%8K+V}T668pSJvxyFP#&kcn7eC@+n0+##m|NyNmX`T8JY6 zdam#Cz@!h#=&!lrKr=Bt zNDzfQH)GX(8#jR=7IR~7vK12tHgsAz|H?=(+TJ#Tqizjm^CW zlwUViS`d>c5Dc6rPwL~_)5|aGwlYc>F{=zUR zzN_>}W#dkVX`~nCA8wO^XZB;b!SArTIN;0NtBN4%c+bAiA|P8aoAS{JRZ6f_5m}`O zLfa<@hz^%z=bgQR1RnC|oC9RWEci(vE`ThxnGj1p7bBtFG6JRDqp|(lmXd0t*BjK^}6p~b6tB;^gN7&e!{(NX1$4_2hcF$ z_*6#q^%SwIi-w^2t9j6I4 z#|}g%5FTIXcI!3vnU65){WZ|CLufUCBY(DuFBFS@Y4*i4>tCCxe!kV0zRt;WpEq@w z9O0X1+u&de7KIKqGGTpr1%Y{qC2|FVqUZpRjKdgeTZF>@D&#$&y4wHrRsRkQfrJAcD;Mi?;noXcq3V-sq z^%0pYjFE^P{_W30HT<}4o6V`tjtMxR-*wfsR^Y3=*GUBWIE5kAp zX>L?x%;O~$gMt9T%p4${&g0ExX7R#1SWv}tJ2n%J`VJ8!B0%$tN6-QF)mKqbQC?Zu zN;ZoY)dS~ch9*3y31MMjfnC2Lg2SMR+w0O&Lcc!D#KZ-Ks!|V6#QJ(DUf3KlL_xYa zOi&NxB3yd>R$a=D5$Zb{HS1*wb&Kj5%V&~Byq)#VtVk;$ zckLdyt}(egT>mq&z+Mfpi&o592Kmh!Vy@8lJDGBquDNQa%LctEx)hG-N#r70GKPla z!|jO+i5a7XX+WNho4&7rzi&thO+#ja(=@D2#3?e|%pjxuPR6Vq9+UDQ7d_@4(UI7b zhx1&)#Dm~l(Kkv&DrWQGc;m~SDjJx|f&`4=f{l)L-&8SD5CzP0ql(6bCPx-P?CIObpiw(CdYj-_wt@~9>dd>{h+@`40QxlRmk=~#jqxK5>5 zkF6VbP6wN_=_c%XIK_rSooA59P`TUKA{HRv@CR<*$-f3p_kN7ZbSPH>YN8%5sXA&t zKKsHBGm4^PH8J^_LA`FeNhP)Fqnb1NJa8hLMRt8t#I z2SuI$U44jCo^G8b%4iCQ#Zr?4yFn9rKZ*!C|tZJ(o?TY0eqK8yZzACmf$xlm76b56q9J6GkzO+JEIH)67d~^K5!t&(qhs zP{8-Hb(1{R(ZR~h`gU3?dlkA0Pi{_CK*Sge5YC}(bQ&HOsoU4zz1W(Yj{OatU-ZmN4fB6MLCJcRJ=@675M8IdUncjCzHN>LAR9037 z6|evP{X5j_tg<5*T1qV8E9->8EV4z(XL}RHw69&rTo6Bh#A;EpV0;ifX1iu697u%v z0E8rI$?EYCD+M5Cov+J=647NOFj)-B0a+QmOmdHq^`IpE;L743ed?x(Kq_a=mUP8b zAS0oCxhif_p((w(VtN-So;PrB^*#iA@6@_1c3v{dT;X)N3S?tN|ILQ4`H$z&A^LPV zOkM${-I4MqSPb53>KlKk?3Jq4Tn7fDyC1yWYVY|iptLEk0aSH+syiHcVw!nQIL=bJ(LS)99WV`!y(zJlnfnvtJIDXpsyyL03H{o9*)SjolmJ@ zo6kFcOnDGxm{r$TJS32_e4ctT?mbTi^LPrfBAaIwraz;74jfhJ{#+k=`(E^eD(%@l zW4Y~OHp()gc`Tvw;+^czcK?(on%dghJiQL+DOTxBvqC4EiXGS3dssyg)lRQz68PmLgR~0Yr+bjrALn=q z9hcWe-X%WTednlPC)>G7R%Lfz1U;zI5yqc(U&SMp&4xjG9KD7|G3J^cpEu;>+y%>bG6( z)b=<_WAoK}Gp-f;yA7v>&337d6SacY&0xY^-cD?B$kwHg^DCMn_!Rzpmr{E-y4y}m z(@3{xhHt`D=PM_~w)Dt(BIm3_r2J{-$U-`F9SU5udQe&4RZ;2Pm8HH*Roz<8qpfOp z`4%p}`C~_K8YtFFe|LHNZcmAhY0p4K{6>p94G$C|5}cfp8hV@Mwd?uqY;`<|#afW0 zp5rp_3)}GY^fV({yO)>O_Rh`}@rlF7g?}~`PbC#N8lZ)zPDYDuy>Z+m!$m312kg@` ztTnCzhI}-~ADnbwd(o`A_+r*2bNz2ICYRd4DAGC+T0m07bry<*n3Ql6F<#V3o~moV|q zy{W}0dw_Sj%Uo6l?Z|=kxeKHYo*O&I2Hy7`e#RVhU0TY3fMm)PW-2NhUPpM%7*@hO zpU|4DY2Ll&A_Q&8U#;jU#)?0soPR>RQc@9jrv~weq+MmC8%et$-BM9Q*VDhA%WgE> zQf0N>$D{8`!q{LfTTi07psv?IUVn77{~h0Ffcxz6NG6c^Kh!shD+m~c8U(amEZXUg zj=nc{sl)&BBRk~yby&2cY(?JGC=d}^NSY_$NQ|aRj*fJEz4cVIXhc##K7Rks34WCr z@6$gdjx#~s4aK@PPpiO(+h$y-hudV`G9vmcF8d}4N|yV?2?Y}_j|bDD^q6>H6*3&a z&vrFM`-O6+&m8H}E^r?1Zl#4{ziJGO|`(k>!Xfuh&qVSx@8+YR+#GTQv zby?B~fk168{jek&c2vU*)M3!FHxUEIp;^WoxgQTDUpD3@faLOA-nxI($qoy4{PD4Dwq7)ChMroNXXYzMoEmX#aEwuT2i%Q@K)Ey<_Cyul zY0GpYX`2^=4L)iU1xGgpH%`IdbvF0F2^it2gX?*}T>6yTq|(E$L-lWRQ4mTf)2{1> z9EwSOor_2>Du|h#V`n3r3e#Z?aGx{EJDW2B#6fm*m3B_!ELk)Vyh+cE=KH>>9P|e` zIl`!-lC!*z7p-Jf4mw4XZv@YK|AYWu;0Kd4F4I)IO&#*HqO8H^yDXFijiEQ5*wa~Q zTuH3aGkTT$Rx`m2SAEF}8g@d(5~enHBo)>G?vT`=eFc7Fy0~FLUuYOuYk0GRpX@X! z%<7YW_JzuNyN1|2xhW+SX66*&3YUQnCylnbMs0t=w?sW#>1Bv`#Y>Pb8+k=~3Yv{` z&F)+)08k6)blzMn!q@D4hN+}OpIeks40l`AwK7W$OeZ`n(wjPr zCIAhX5SpLtpGovY>!g7-zCo)dc@hbi2x?5!txs&_cZv$v}?{yY|lG0zL5XRJfpL><5i9(~#u!6^2qqNSbJ z>6}i!i&u~LVthg*wkK)^Xx~KPpV1$xBBD4C4_c4Bhqi$T3lKRSRX{z_pRcL75hJj= zFVl(UUGAf);b*Qp&(^O^6r!Ls@1y!r80|Ix$L9vAZsw;y^e3kYRO9Gkb|1APd}-2V z#VvNT>~%YZ57Pn9kL&?eNo$1cwpt}9>%R$yb{0Ye5|n(SQEElE@AyTY9$L}xFqiRK z=9V?H52o&XMm66EbX2LvEI5gXqt|bOw9!6&G8FgYZWg;SxtR9rJW29Ndg2}8%$sd$ zh1=K$lJGEMDClxr35{nzGhipf&bPR;1+RV4`gFi`2i5;L&@k4kh242@9}MfC6n&SL z<@u&u|9&wyNktugg`u;c@7}djg4B|9jWCh1eXNmhBWBPM^90!FPSvv%jH)znWE_=f z?iO_vTRIs!ZWh1vAo8QtEyQ0)Bf?g0T*%_wsxiaiD7#OAvs_Pqutwi z1*6k?=MDglh7FDgk1hX)rmqZ(qiMQc+}&M5a19~2Lm;@j1qtpRWbgzC?oM!bcb5>{ z-GjT^?z{K%UEi;no!;GUT&`fqG=Uk9NcK9YRYd5W@9+VUDI>ha?Jh@@=&9CF@=J>y=7%zK@yhc!) zzW+yL24m|PseuK1_Z(h04sPq2F(J#e)$=Rh_!?lcQUHUX&u0tdK`~z61mur8!N=Wv zF8voIs3wg;(<5Im4=i&q?4!mtLK;+DH^7^Ndgk@?d92j{egudDs7G? z1Uc~JlUY&D$UeDQy&c58yMdt>y+uVMVn^4k)Q1WOZTirFD8bYAK+D0Szd~*27o`)K zh3Jad7{jUq986#tL%j`BKh=2jjzKNkcxr1Ur|tFA*VRu_hB!*K?qqhW3r`>X^R8W8 zT$Jz^=1q{GHQeVG7F=$|c|GOL?X}0S7$9F(iE7+mXQnL8-cO}2WvC-()t>(+2}urK zP=KKLd#93$%-ckxj@O}#j{3?(-isshhe>4u<9i=t0pQ?l3_ig7JQQP1Ooq?_vB%|! zD61V2n{HEZ5DE{J#6W_IN06aA*fT(`Jc-P)ExhyPq27EH7fOxJNXTKt+PDzQN9tDm zdP(B;O~S^BFbfOXlR8Vtrw_vxbzk31_vX%>Mnt@pWsI|p#WWS22S~gYqFEKfHiVhG zJG~|V(>TJkaS83FsEiX~&W_jXPaA6scm9vri8%=guCONm{{DOm@p?WgRt6asA-Ab_ zl@}2k+Bw$ELeR0F-R2wC2Ic6VWFvC(<+hTG!7Kw;b{i|mJUo&7keM;B=faey+uSU% zJD93B&nB;%^j{t^j_5&RG<6m>DD|C8; zv4rPtd-7w#WWAtEH!(NEBSBiozZ%_578Wfx9e=aMk<`F<%dWn_&k&29zk*%i4_cig zx#Gcm9;d|G2L6I#c-Iu%PUZ<*59FIvdJSh^o+`RHjvsJQI2;oocunh3hYnBt{QL|F zcWYRH&qb$L>`y^`6zDiYwLFfVyhR3D{TjxH3Exkd+Jl6?GpUfI~ZHI2RquSU8vsLd|VS|cim$9}sd@d}GW(paqx}J}fRAB*O8e=Wk zz!Q*Yz&NJQJZwxIyJ@ZWDP z2LAQjjzJ-Y`;0@f{dz*{Ox?mdQ0r%F**A8wy^@xTrf=k2*puP@(k_Q`8}d4|XWP7r zcHGv@4a?f>@piQtu#o>A|k$g zxav<(QVY5W_J8VPu&TA`#~+X8zJe#we5xVlYMA;>k#UC z2xY9X3h%B5--&=pXfF(LrjjMhRCQsrvnbM&XwokW4w&a+EGVz{J!+Ez$(Pr3a&)-a z$Gd;z-=l~}FUH3B?`Kt?t&Jkw0M>1MixW$;o^oO z(ovw;DO&#&8jh*+bz`cc)K83|6F*^(*`J~;$A6##=37(KuTER)e-?#N^BFUvD7)H>uyBpz#`nBLJ zv~D_RalzKn=swNsF?#tm@Z*P9ElR%&G6zUynq@tf>L(xIb4^5Ee>l@-e|0g|)?1eM zt^D*=EJJp9K9Y;7c%x2=&BcfJ^ell@*O2CvSF)JtrF7&Ud7W^UmX<%jqkF5wS<>M3 z_o7TRJhvR(c|Xn7jsKuVtLa-?{5fPgZ2aC}gCTS8(DSuYqI_YiM$6g!0ug%Ydu29L zezA(abzudt#W-5jwWp0AmlzviR6Y#-X0^RYbaU~(44h%U_OYCGOZC;&#AoG^=4HDP zkq6|x)kmM*8-K0qc3Sz?&g2m7N;MsxPb7#dX@tEzmuC^DC zMh}z3sE0=CHsnS%RC~O`5q-ZKT8hfyxqW(SmRbM|xjZubVCpR=5w{Mf^X(wMNV}6{ zL=kPeU2fLFu7b0$hnP>>+?QfK%D*nH7_cw7yaqJ>jNPl7HR5KZ z%DViKjiy{vpx!FZt4nMs5ZO!G|524vozx7JUF!!|u@c+gWDe3&7|hk+2UnqQh2#m66>9%$#&-J+t8MhlQ!7gUywzrV13d zp;J-cihua>83g~CBFW9+7%F8iUw<_ayttxr+%1E`XrR zPEq}*v(WBi{of0umxse1KL@lrUPSz(2sQ15Qo8DuO2QQW{Sp~fIL!KcGAt+ii%V_q z-o>>WzC*&)>dQGI>;s0JEp)-?E&V^Xj8OL5`O$)6H?lL z{@aaylmC!j!pI^~xX5{onFHl|15ty%NQrBhOwsv@a4?4wW^|Ir42Q~9TVGn&r{t?y zT|IT66MsZWGLn?mRdvd2yV`S=E2Cv8%1)-jFtQ5O(HGoMb!&dD;T-di!X!z5qC8s5 zseEnfQ@w3fNuNmUIFD}cd9A%-#8X$Hr#CxXC+ZfT{PCV=?f%JwooornAQ}Dq?^bcI zOL*|L{f~^8qu9WEF*_k96cqG`v()yRlz>nAAeM{PaO?h}IK|n)rAq{zLsGO{mi-@- zJvU?5;oL*B4DNgj5meB#-Ftzb+(Y@A!?|i@DnkRIB0QuPhb_>OlsR+TkC}~pev~t6 zGb0>hmSPYSjGMk7DgcPT_7s_)s{C-@^(;MC`=DDul>H$RdZb&Yt#7fLvNd=edH36O zQREt#S2+Y{az1CVC=X>Hd)BDYtC3{r3@sSae32v5v zkv&1PA#{+D@0E0}>kX()(!T}EsCq_4&#-TsstcwEA5U4){yjWh2$j=(md?Y`75~-a zTIwx*1;L;Wz!GuwXizZpke647-zg{g<;wXZvv5%e{@kD6h6i^=>3h{!R%?gRNi!txCz! z-s;znanc2h|-)O!Oa^jDcAHGC2%i@7QS?009y3ywlMRp3PNCoL_6T+<0vt zEL{$1x0*OLO<=pJP{;1|Q~5XIRe!P#Aw4GhR` zsU|R9SQlD=)HtQ$n`hzckn^KIlUP|PZ=vSkBgzy@Emim^oO3G_6SBsrfePCNvdJRM zVu!H>o}7JQuxf{vrrf_2%^~jU+iPXAGe~@7TV2Vz)(=wX*rr?a@&NyPer^+-TwnA} z{pK?@drc-uzYWD2-3*I@YpLKZcRwg)A`|Y%hZ7xYT%WN&WhJ%h?@&&3oH)StoVefI z>pP+b%uWgwkB4;JSIkN*KHhx?s~<^QnNGb2(wy>OE5p1R<2gD=5v_x{!9OBge1w4C z?+&eotD6j{l3@A1-&!5Mz?Jh#xqcaWn~77KT4(EaChx*UAV?}?JV}-#k0yOB6vah; zy!yWO`(}=vjVD5Gja`QEuUZ$ouR`%^xR#|@{YEP(s_o-8>RoW%PyK|DjY?!ssTo@ml|HN>5(r7Q2w zM|Yz{IUaxDQoT?s{|lv9RAr)$q+R6hlC7vNCj=&u5irfPjGB02M}ORDk1iRM`By zVBw2T6w&v>0kNbV%W9Co%2m1WqD&#^zf~5S0W?oZw=TqDEVS3rlOErUK+tDKErhKej#4WfGPzYTtKV_vb*~+%cLarg zxZcrF9*aSANmMl36oLoBo7dqW3VRT>Da!YkZ_UOLt*+H)bw1Z5=!bMV7t@?7c&}uX z1)6HiN5lo1v9H_)xAwoHJzi~2?o{QP8o#V3! zs&_JcV>Q4@Su#g7+AX1hx+rd4jdk$dmv<$v_qmO_?%LyRf&g>3GxzP^Hvc}+2gIXk z>Y4h_FR$B;ZyEYzRu#l+4h-zYS?)Q$E7SUpL3B|O_>EFjC<^XiusA8g74Gdcqkpoh z==Oi2dT+2vPo$!a{i6KE-?kFB++J&rlnn+5u+jIso4!or!%hzrTvxi)6NdScxAIN8 zoO|o$vq$$UfWHUfkfiT4#(k2!PhkcUYMtn?g)gYK>%%$BuM1(bG=iNUexM7 z^3y(y>288kJ9)3|Z7pLW>YuSly-K9Hglh;94Uk~+=%Ku!?3pi^1A)posAs>yllduF z;lB3~oQQ}jMk`J6`pVA&I`o37qY;NLYcj;~;&14UmaQl*HkF=j;j%V$9uS}RUfn4W93 znlq3(m@?v`xK;1@SC!zC9iQu^)x_(8DBb|pWqml>zEq4v>Azw?LwzIx zaoz~aP=^a7Dd%Dkjv)^%hIk->>`RU;N}vlPriMp_{CO=r^MHX;GbaA(N#R~}wKWuQ z*vlClCc^V$E=-qg0myS89)~huU34tqo;}w!>W4%3TV@ga#`J7G)B06eicuT(*3$7j zTvG={IM2kBYiQeiIgoVz_y|Co{A+IBHU2|F@GhC5V^&na(?BS&rVSAT72zXG=OQB* zF2+evW5E6H5e+px)g}lrlVD!p(K;)3NA@vIk_w1LMw#jIR5VcT=w<~A#WjLH!)yqA zzs)>t_w9oRZ4jBtcPD)MS}e>fVap!t0>0e1O6!euJ-8S2$X8rC0w$sc(xWGoM1V(5 zwHO?{02JiFDl)D8=2&Vm)Yu{^R6J=M;;=w$SZUQjVl{~b+StA_c*2MviTKyTcj%c1 z_id=$`X8>GduO4H-=CbjgjY1 zp}Uni_tFPvV?hJHJ%Ap*_rOrNn0&{B%JrT2sdbfNGy8fcj0Ql%by~e^giw>kmwcZc z0>YR6TK3h{+cmz5qCZhqQIZCPpvvhf?AP9QbEpZ`a+xlRSjk~ zRtKMhOYzaoz>}S}cT;WU3Knk`UzR2=0v1`pItV*eEe|MV?rShb{dubGiQk8Y54SHy z6MOLN{8QAVdKN?wIoDqMP4X62wW8{9!d8ZnSf`H~HM1e-hY2>!)<;6vrAZw5cCni4 zu?44y?FNQ%T5j~ue=SMc4FhShRy*gu(b)K< zzv`JS7;^@&XpQ9YZsNn~!WY{x6})rhMVxv3;X?(-iFcu7l1FQo6NT-8u3h5warT)R zZssE=SMS1YWiTv$cp|l3rEv)=E*?f;EPavbL(;engv9J_6+Q>>Q+$95JZbCA)4@26q1chYn1%B< zCwA6=|5QD8zI@Zq7>dye@$&1c+O$l#XMf<~FKVq>`FMe}RBa8(JnvF>e;Wf~T>g|t z=6guvS6sYsHIN{Z<%ei|2q6F9Noi|i!`EUeEgJ9n6JSi4euVxjcnE4T?*0~h5#qMy z#Py^Q`I|sMum}IFEiYJb(c(ld+65=muI%aO$oJP!Q8C>1!p6q*Ri49;!%_c+B|-U$ z3ZQ+oMTQFx`bPT2woi2%Ur;PF3Kkvp$D{7l!yO4ed~}W|(HJUYKQuXKuR1RFIeb`Z zZPWi_O~V`e7Q7R=Rj&(?v@;Xf8bQoP`N)m9jK`X=f0(fjgj>_-U#58D|Km}Rz{01k zapI}8%^!dhg57FD{EUnF8(NZcD4Jp{55ONYDKJCG5%q1!+1#Y@mcedW7lNx)3}q5; z!xcpDmrAF`XNgm1v=NOmL}ocbV!cKhj6gsR91zRRMG0iWa8sw&AW%O}&gHCl$&SFe zyw&bzzwq6eh5=F}v#6L(4V&)uCvL1y7JY5El8VDb_PTrAP3zsy(NSP1-)r84(i(sWzl%N_?w#B|_p`TrV7}t`H3&X~tA22uuswM7SA02u_Ez+^7SZEuzTsk`xia7(bgA!n z{sMCm)d~5HK=VD-6dBnS5fK*9;?H5{q%`uUM=ArkkY>Zy>L|OO&`cB_Q-qOA# z%oshGOCxwLFAC|Z_8OLJLn6pUBVK@n1_NGX>q3Y0qRN$4kudC3iNR|;rsU9ER2IWI z_>hKUB$djOf`(UxvVnmJEY81>$_J6l*v$4r*zA@Ak*E3LuGNcUhI61*S&OYLz=z69 z*8gG~X)+aison0Z*+EY;#p|uFu5nWUPa>Dm-oT*NiKf#!ELEPN4yHBSX53)}bW&?~2%sL8eG28F4l1eC5En6F_XQ`Wi*v+=6 zl1_TNmOws|=;PK+cn+|tr7Q8(`g~>f`E)oved5ogQ?2@}zi8}2Hz(ms^PE{$M4ex8 zk;SLBGyJJ8(@>4G1Nm$p%)#u~`7TrGorj#2w`;f9=vNB!^!M;bm7p=U1eJp`av+da zLj@mSIu~_%(ah{mqJe1SBgSk5dMYkHO4^zFqlt7dk3P2uWJouRWZ^|Z8~ipN9}$i zqT@Fqp`3M2-~w^hN?|H_5PU7Nkn9XaL0c79?TF~-56I;GwEo?G_8>+WxwAVi%h?9P zfLX1NjfEuu8Iq^(Tyf*!b2dgF4RCO!pwMFMZP$1U{}S`@*Ifwbiu=MO_>5#$gpl1g zY*njQn-VN!x(&OBlyNpZ2{&2ew9PHl!(+^Rg|N+iL>2>)AfUyN_W=4UihDBJCR&*j73t&c+$0rqBIKV zivqtH`9AdjImD4=QpL_?l(ja|s}@U_m4uO|p^VYr`Hlt6iL36 zW&ylN^PG?8yp*w&>bTnQJZS$^f0vyuH3dhEs;6-}(8l<^`Fl_1$NXCIoK^%sbYIKu zJic2rxY<%HKc*BgOYT_?4I?PIi~IYceMVK>vWjvouuesx9W(6zxAzao#RiU?NEIYs za!WHQ9^7-X2(B_VwwAq5{-@4#VkiM(6$d!gB(}amh~D=Q*j5ep4D|FwBJ~qyGNX!g z@V(V!HI=-JVz|g0FkZ z@_9?J9nDm?ybQxVhQ+jgcl7%6zht+z^sMdlmBIGp@Y+94f9f zAB@SEjhG&3H!QNWVnZA?4RVF80u#3fPUhGijYHkX5TgEKfdP4cM47m#d$y5L8?79At zc^FN%khK26<`e#FcWZCm;_pl650(#v?)iW0WhJT%2RT)QmH4q!jrct;=(m56gEIt< z+SF;MG;Fstoa!Nw*L8y_c#VcykWm(?@M-x}K4*MRM9tJ?Wq9~H`n2dD##E0pM%xj91)B329HFoWo59oZx)X>lp0_;0$d54~p zPCgLA=l8;<7M*Ou`I8o~2nzZ8fdZiLIVgM=G*t{~2skV!Je=>&t5sXaiW7f3}}DAKb5|}HFocY=vpEMfZe*o}vti;UNwi2R!tfA;w}9amD%HM4M@cqD>ksgk$1ApepZDy3p4c>7EdV^BD%tJ$gC~_|NWd=G`R7JB3g5%ENoz2*6?=d6TblB`Ym8W%f+dp`XVGyR1!}28673F`CBg& zTA;0fLpijPbTb~k1R2FJ`?5y8m;8jPDYyUumnK4Vm^vWmUh!^zdazaz=Jj>G(zp^< z=YF8^?u6)-{vC}II~xd&v>Ey8dsiaCQA7vg^y$mjTqwDYZ3?zxT2mk&{d@byMy+IJ zc{HG*DIVC3QhU(7V?Bd9(CMQIUm^ZIHZe7g9prim%eG`ZQ8kHfvQNg6XS_NuKenyz zq28INfoczD1uiF3=ovUJ+>9AkQ>WLIsp5WEE<#V!T1OZB;rHT$JuDKnn?49x-pf2M zO;hS!gJ&rJKP=Am-EDc%*RIF$6tGbkK9Homss+$Z+@)4uT?^tFh3UXuS{g+DY zBwB?$62s%=*Y+bM#$oMo>r}IxItts1hVmd3YOmsKtGu0F+T1g%_70tn9@yc+POtFAUFD@#omRw2wg5(FriXLpPfLQ|AVl#wWAoH-V zXOB7g8eKF$1-mWsAI3|L#U}AUeBfD#m{WERsurcbAtan9ryvS5Zy;Klmxp6RZAwmeZ#s;;e;dsNeQsw{r?>;2Iz0BX86r-Qv3J?(n zv}6CJ|L3nZGJUuXV{-7QQmq~u2uOm134-{+F9dB9)tX6iIWbY`L-7aMX8lXGd0Sy* zbYkOsqapdK9tv51;v|2JK#r6LQ(3BFZ?b)&G44B+WW!6X!35J*=8~ir&CnY}Z8-78 zHSSv7mX>Cvbx_I@^Fb+H=~kqQJ-{T$(UZg1FFBUz1*7dTIV;+a7gR4m_T#kh!=Dvt zq8iUxp9=W@-T*A?3|1+#c>m!$^!xK=nX?^fasc3dM*{D$1s_1w`Y%0%=Tbr_+sl3! z9(SSVXb2%p@>Tw!$Q-+M+Xbnx7M2_)R&vH-7s^sh2ML(*w~tl8aEA}UWAvzi*%qiW z)rD`R^TEJi18uD#2LjNw?DchbM?^xyjhVkvh*i*@riPG}*J(2)jg4TJLJG!~2WX(w zh&$54u_F0II87I({7&$=+R*i#_nwIfWqWdxQ2r}RuTEyR%1_^~g{RDn$S>1&JiXO< zKd7Y!YQ>^aO46U2iRw>9MWE4-nQ9~g*nCFB*no`JbqUZ69`I(em&3F+-xbJo~gBJ{CHZQcR9{m+5J>!QGBiS z91E1OFi=ceN`M_sT`{=7_>Wa~yOn=uG;ev2Pg}oeIJIuw#x0L0G4@JV+rP&1rc)tl>eEmqZU7Ac7tD=yW)|@P(|?SB?PT5R@VDMnqCh4Pg@oQ zx&X^gpD0N%eR9BPKPtQ>J!pcU?MP852KSv5kV@>Vfv@qBQ!|MHUz}sgg+LxYYTjaw z?Dna7w?8s)*^NN{X;D#`js5arhDGsKg`69yoJjufz@=UvLqs%AXr5_ka&t6WG#kef zd~P14x@!4cT2}$rC(uMF!WMpz_;d0^=|Fb$+-w%v&sWV7g@$;_TGXAY5l1+;q34>+bnc(8}W zdJ}P_HN^sG6+`e#B1{ns3mSyPlm_^N0b;R)N#)Q*`4T~iVX!bfLFCpOC052+;^cqs zsbL4QqtL`CR`bntbPQvr0EH0cO2^x5Q7;E%)BYY4^eV2wR{tgNYU3A2s7U@~t`?2maW8>>Fn92ZGYnT>2 z0jv|qfYZk}CQdA-JB1bT10%pasaor&?E`Xe^0f;sgHp|2>w(EQDdt4BqN0$}=s>uF zpbLBe1xFWhPW{Hv)1=5)jzc$v@y9=(70pVq7YRA^?{`!*d(%F7$#>GvK8ih;nVzt{ ziL0~iXoZ}O@~H9<^f$adO6WYjfl>ye3Wi4rL6X)t4zJV4Uwdy;ukY{LD~F?wnZJbrvqU%a_~I6UHOT`{4Dh1^cQ zyGOtV{*SW13-`D~!3Tg&A~8Z_s|q4Orii zvkN4}nD!gS#DtuivwR9^vF)=Y;gpf$i$}DzQcl^4v4{Fi3vd}C{HTLPH7d7er8{oX#k}INH{J~-M)BWG< zap@~QG9zDAR$+ewFjNza26jtBe*3^-%uO;R;7CYb6QDO7=ofM5YRQYg8szj3#foHN+CAa%KljuBesp*MtJ@!- zN^yw(db!L1P~lBHaf`p!YghIeg8uceA(Oj#xa+2gogn7i2^$n>p>V9*TA;Qf^oCiJ zvAabx)bM+=ult>8VROY3w4HA{qRX3kwgpJkk?MSD9dfG-EP!kt(OErU(b!Z|@S|-h zOkiH_y#LHPI4Sy(E>LoDluo&S7|f18zV4pk5B zq32}pludfn>Tq=7LDQ;Eo_<=sqcv&Y?$?zj`(O2jViT<^WR4B6-Q3@%POmsAepVX* zOuVq(`}^e94i2oKxG!ccZfs;>%&5V1(^%#>=yTYZbj-Mhdfu7eXmiwQ@dq7H>ErzpwFo1$D4sOq71CM*DA-(KOSX(x(_YJkv|h%OC>-bCLo@%6Z?4Ybg^P(HuE@S zZJw0KdvHMKkAeAbg4X#;RKI^Ch!w%CadQb$OC*B)3$m`$n4Tw8>!zewGC!J_{_{bT zN)jW7i=D|`-2L6!h3DG}XXIH>nt(#^G~g?j^YGO~Yw)M|$yScpM;(xf`=wm~AX9Yw zz1zm5+2dm3`HLk+O9N0$Fc5nKBCT#?#xl9y8=X7foV+hp_kNn9fybw{75sOj3PstyecE5$Gdt-bU} z*4+m|NxYiij$hh-+HmM_?nG@BRT|$^60y=;VqfOEu1!DxZ#V_mAisEjxVC%DSiCNc z#6GS&tqDaJO-0=ixnF~`e&uTPc^*6oiklqxpPSUo%Ci45j7g|P0Aj<*tO~v%@pb-W z*RO}V=F~8G1GuHx(JHc)aI&Fd*zc5f{q%K#ecRx!2m8(D4~mpXUF$E1t|Ff9a5~Z! zS+gvkc+RbL*J?^mvG6weJ(i)fq3Wl`p+Df>y#a8r1`#oNOTlAvt$mjE;$$ss&jc8U zwgIvQI!VFGMiqzvSOY{POp1%%MDiFRC~uA6z@UEr*$(frD&uon2n~*IE$t+h;YAeL zkM2b!*uyhv5K?gO210cQtxl6dn7rI$&u;I>c)+z2%JE(-%6784l8Pi0mvT^w61oGj zkf8SQLGk^^{h@X;!_fol&VL5yMQqTd_%ryPR})!d-sJ^gl*l{zw!>oQmr>ag(7@tb zTkj7l-`3Alj_vt~F7Ks-3({=l?{!lffVr6qDj2LKHnd-V#0buPYv+g_tT3%#A% zp+a`>jFALe=0lVvUVea|-ZBzwmFg86@@oa}KqhxLM0Dz+S+^>(dWg|tPLuE+Efcla zYwifq1hGIGnpKHTPg*8L?r$1ST!JplwMNiHe!|6tPz(-(Qs%ihqKBZ<2r$8GH}16Q zJ_FEdRHp2|GpZ5_m)b6Vz z7ThHcri|OBO<@Xld=0yOyNmo1t2m~p(;@r)>wpY0j+h+b{Njzw_;dC0`b-}KM)0D< zZ_w140t_6neiHieM{-f6=?upRTYC&(A%ehLsXpkvpvUF#iry_0QpKuIABqjbddBf!ycs$DK3ME~ZN!RG zG8w!S9k|+Esc_u<;#P_`W4*9B@QW{ye8G{x;b+#V^LFiyThevtnnQaaRUqI}m-Q~- zT;1v%-qpLeX!jn>mhqi11z+~oB^UZou7gD^luecRYU5dqYomPO0B|HkRw5SY%Hr&o2`;uG-fB^jW%AK$Eo?UDvS!K#SD8p zzIxqyt(D<>Y|Hf@J~!GhA&}YHrj=VSc78>}w4{<1#bM1F%K75Thm_V5oGDQgoYQrr z9f2)NGZhl_H408r6+a{|Fma*TK&Q$`eI=*|lN^ovh>%c6S8AqIIj--|Jy)Toi(P-B z-`K#1&~}bkyh}yTQ+#N#G;$gs_Pbrd0|_$O!cw5&;mQ5-n&)`w#%2|~$Mc&^Eooz^ z4xr;%4Gha6OVTQDpdbr&z2*A-m6@^mx%^;P4v3-L^%aE9p=gvj6Dwqx=U|A_YbyeE1f0zeXMox^cFQhi5R8n3 z2mNOW%>J|8FvvJ>dq0a7=+aoNYV6MI`uoXo8_k!MXh_%LIIr|r1i`gHe~mzZ0D|!+ zBlUS-6hn@3W`2piw+(=k8OHJ~ccr@>b*WcO(rAtN*jGT7e5UEMFl~jDS#e|VM~l4D zjIVOGm18*^8t>y)9g|{F%Z+1YQQ_5toc7=JJ43>TXa9>W7??aD!17u1elNd4!X0L2 z*YO%c?8|hu-^^M`E0ScKRXRCWIzc2j>`mW4*?SWV>Y08t(*gFV7_501?@zFk?L1jQ zKOQA@5_&LA$B~r=5S0Yc4mG|Zp+A5@8m$5eglH@!`c}3)6h(I(t06*zv~M%pX9-S_ z0&<^G|E{x?u|2au#VOjO`=cob4bS8<3a?RBO)5nKXS_tp)vo&V|@S zK~d@7FjPB_%f!aYtLZ=b$fP1~6%>X4(KcS+gvKI7#kuCBIC&9I2=+uom+qjpjS+s9 zl|@<=zx+!^mWWAuSY>PZLI|fAo{5~TUI+FUXvlFi2B13);!vDD)%u-GCQFM;1EQ&@ z$W?H@fWsPv?tt?Xa+wrqnvwCF-x)`gFb`>*EYtl6&{c`BNR=n<5BDO->jtwVa~WQmkH zLs`6(2DlYCO|EK*>j`|_ZldHH6i8GxhxzMveP2`fo=dBPW*;VTE+m8V6+I+VXlJbw7b+9i(jwlj~&gox}6Y8kO z%lBbaWHXGA>Sn5bbOz*16eV|$o?(iMCu{Vp&VMdJ|9*<0>j z5@J+GQ|n_xI=`2;lT^G0_ZcbSTZ#wZ(ENeVI@gen`-ecy&u+M}&bcrP3Um&Pk9e83 z7;n43DyjSiI&|wNA_!{k@?)MUTvx=~jV0rIW-F-|H$=hD+3eQ zF1)(5Z9=qVPB|t_3PkarEJ^pqZ&ws1(WJNQbkMDX!UM6}D(CbSvn(X~Jy#@v76XwY zDY*oyy@RF7JjHf)F>yJ(Y8B29*G^auK@^J?dND#vbdUE=$b6q&7(1f(QEdiip0fl% zyhp`gzE*JZhKV1;O3m75C8t)hL+7x*n3Zo%K(wsPUrRg((=M?;PaviI7B{DAlAm+j zt&>h$v0hN^341W`-oJ1W&h7vxnRW+H7Nmc7C+B>b)|Rnk=-lqgdM3B`uSxBZt-z7s z{M_tvOW~5D)T5=N)twk1JiJIsvQ-9GvnpA>bd(c;+V)i!yDZ2$1%y0^3QvZ}Shh?0 z#}uC?=#JuekoG%8WJ!B=*PYg|<%KyaKNxtZ02#zYOK-RMxW%*6zfAxKIm+l3xF?I% zqWL+@k-b+_XU#dYjyn{>!WlCZoPu zDn2GjqQ3A~6;?5sr#jK!Yc6mf$?&&(jzO&})LtM&^E;V1u z>Vc2c3-6``!}k-n@4f?c(9ms>O&&`T$$hHXP)G-t;gt6Wjw0j)tG}`EJ7qXYZIqwf zx8urqsbccv-mkn<$WLimjQPhjm|ub`NfZ)|Bc1z>YjPhv2_DXXdq{rd?x|Bhoz0OZ z)Xfx8T1II2`u07}+Bm5V8w#yTf(BO%rK%`v7_5s%B! z)4-{tBG1xcJZ{J8$7nl)%W8h5TUrqb9*pp$ddZ6`54U!}CyRla~;ROb?E+auvYVlK=P8R?U!n3PP9j8BV%yF>|t7XAR3tw zoL+~&#|kC8*w|_SOJ$dDUP?@ds(jOX^TH9@-%+vOZy1eR_Dn~UOA=7d;`ZiJh#2N~tbOmYh-_SJU4!%@0gx-y%!dZ{YEhS5^R*`; za34Q(mT#%6sridHe{D>0epW{)1|1kdb8{HC zHW%DcES{jW3dJ)P)RC-pd`QG&Cu5<)tfxRV)m$XEAzSvur4hE%|t!3D&*ccxHn^~ysTsi!SRq>-6C zG74|z)}ivk|NDL)({l$2(LU!ddRtxdxWU%JTvj(IJbHTw`4`_`BU(lb`JpFqO*+99 zf`z+@WxY7juHxL>o*S864$-!%f5BHTlInWn($ec=yMoLIUJu%c_+PS#KApm;T6j6K zByRvEA-Yh8b&-#znjA-Fo*b!ed8b%1X!qf|Ma6F^!kQYp!dY(+D}z?`qq8K>?O%`a>m4pH9zj-`?iNQSzRW0(T~TELFZ$g zIRmE1`Yu$`pjm}_Uah7WjN%>dNs3?JE>k0_wRGi?Uuq!G!~*EN018`^Xdl5ln*e3E z_fClO3l3^1xMw?(z01wUQ~RJMquU}*n(%PdaQr6zj+w*U^x09`(}fj}{MOq5yl%Z9=mn-{J)uRECKupHTu7 zMppQ9NraMUxiqEKLE% z8KH^|1EHEzG_zC|*$P!u;5m){_w#PrIaHvRR7O09wZU96F=4JgZS5){#6C}dSZ-EG zAF>w92`O1QIH>$LFIekl9Ee?jD9V9knHVds;G$bN|3siPhQdqS!oZ6CH^D=X}Y`WYu)5?V$fP38-t=~_S zy@|a}kQFt~7d%jJKR`yec`Ir>?M^H6tqo$;7Yy0Gj|h$Yw_yY((_Yf|Jk1xPTiTy?6E5eY`#3v%MB?W<4eHh!>xEos%P|}FohSW z_WW3ZWQa0)=-FIdE^6s2<7=adw5tzmLp-wFCqfvgtjD|{(?Jwui%EY|-8ZNdNB35a zGntm8&#M3>k=HH1bp3Q`hbd7gM-r2$ zt%H!i)n=6;FKgFxGF$C#do~M|x`({ylyUvNt?|oV`Y@GfV_?I7#^|TnoDRqfesj6; zbgJ$+UwS_8{e>mQShH`FSHHomEu)dB#G}|4f~v{nAg1oRt0ILSzLk3XdCqvo*A;jb z_MpR0p}>fdm813&$=!%z*C@kBGi3rmKm0IT{7KXg$nu#eU(8ulF6q z3JnRxbGM7;R0awCGxTUM%u=C7l5@d1>73F65)@i{}76{QpU zSg@bOYTu(Ls^PA5OM-cgv5dRm6bNV;T=r<{wKjFVzT8S(y{BL>OIV41`2LJDE%pMu z0L!#pH(2Ert>pKa!e4m}-6^NV_!M>Qe}gVB*UMWDYH2?#10S~|GDJL^W$sv`L)-39 zcxD}!TecO4v=ZY|GJ-|1_kz$;oYpaNzUe{J9?IxH09S(=$`!xcdH?P)9jF@UDOqZ3 ze-$F_@}8Ny!AyxR)p;!y>;~Vqf(>-dfjDX7%&VfU;KpdD{%Ybi!_Lw+G2+9xXt9>& zG11x?m0*N`B52WH1*XtM9GJEP@&)5MZ1OsjO3KZ8IhXmaJPN&$(AWau# z9h*e!|MYn~KN3Hf*Fh$YCe^9HKQx;T`NfXkAwhQnsko3AY z|4j2h#oqO@evz%Unf1FW=hMk+t90Q$Ka^0+V&Sya&E1{LUW?5qn!LE`hz{Ys*&*gI zV`WKRhYc)3A%Q}cv&gLFJZ|LR=om*qb8||+kH_<^>|_avdot7uqjMfY?G2MS?i7xY zl2%K{($=J$%voLa@{f}-{T?d;BuV74FjMElYVbKI_X&|SjzH2ZD_+*z_JjDm4j#>US|FjI32RG1=R-}H*E=rsK+5?4 z3&IaQ@E8%RpHS2O!S~M;x2#zsZ@u*vR$RG~O`G47Yk%?_0Ih9pJhd{;zc$U|?|&+` z_Pfq~{7Y|mC@n7L@4xgV`J<i1^6k>+C6>v{B@x84+U7hOn0T^-9-UWwxIlUFGt?LWRjKD82P`VX*m>VI#|Prvr? zp=3**_u3^NweRGGV^)Ud|6Tj@LI2)`W!0bP=-ge<(H)|p;TRJpPUK`qH`8WLVA9kg zG>@0&%}B+I$Lk}nq?FBndYcQETy)Ffoo_uj>HOtc zOCXCZMiDef5^_3X&V=AI8GqrI`a1Q#Cv`2hQ`WrS6VW0eLz_3Hy`@|UOFSK*=1bHd z2m=}wNh^H=zBhdWzI1gydRq=gb0fd_sHACv*-=p*-k<+gNA1pu^3dFA6QsIpzZTsV zp1n05+j23<5!nOo572RJH-%$ofC4+7z9Ho*+XxVVp(1q!^f;{{Eq^X_!{ad{>d|9I zLy9y!)5Z_HfBTPb=<~ZM`kS8*c+P=C@XvNsa(kgQjLRYV!y%LR+O5mJ@Grj<^MNl6 z^ao18(xpp9-TsfhQeRicoVjz+4FesGhK2^p$Bw78yb@EIbar;)_xZ^$D59;kg^H^2 z032&z0gn&I2XB8x1}0yG#nMKcrYAX6WID*D}5 zk!Ft)Z|@0(J!K``xj7m{+MqiIq8xIAplBeSU@I2+e|jnWkINx`q7${dlXzG#Cem59 z_P~T4p_o6KD|SwqTX?Lzs{;;2OB#JaPsATd^O4f*j|oQ1%6~Lc6?=}hbE)k6BTWNg z7?>t_q~U3ec*CYtOhpg*J;GGFI%L}Y(-FLL%&o<{;gCDP436_&yY>7F|ME-W5d8p# z!H^I_aB%mBGvcurmE$IomzT$s>9fc!C?SxOhoY*eLZfUU-*|_3ddi6%bGQ^w78ftW5*`e+;`u7Blb7k zv-wZ8-5qTOh8`yr3NyB<3RUx>dA%r#f)D~B1f}H_9%d<1Z!<(c#TQBJKX^wER@}%`I!zNbE;9`Hv*= zJLv3aF@pI;A}2QwZy?A=yLPjC?|zmn`vl|0k58=I^6opl@&A6o)ETpxG<7<&<}SeF z^?xCRpridH8~^ktYQ|O2(cVTuejfhZycp5mk$$^bWRb;bARz!oYQ*DU80`KzIf!wE zCT|}Ve9-LC_jCo@7mevD6H#ARm#!Hf)M;^bOW40S7mmd(f?Tk`mHwFnq7oDzXd2`K z%?NA~2tw`xxg^nY(mLy8Y)r{F2!6z-kG7iQoO+{_ong zXH5`?dct{u+yW_uB4Uv+6=TMr`GV;2zNHIuFSv-Y<0jzs`H4j%?Af`EKp=>!X@B^9 zUS>?2N_%TFfnY9Pe}LS)Lcz(b0LUVX(S$Qz2aqWg0e|Wcyw@w(AkY6VkymhH#u!03 z6!y=mFx7BejlZ#{yzTHFn1x`Pokp{HGu*fezWBF55$GkLRzvYDxVSdtyS`}i`HH4! zrl+98s};6P8zbmUJh5O#k$|vQ{MLZPq*{K=a2He@3!;sqn(D7 zmMciu&EeWl?glSt0q|;)pZ)HmKy=okjf3s~Ub{@VdQ!>%Y$NPx-r9bmITi_r&=i43 zQl~8XFvllF;X8J6uCrlzQzkr-zkbjdcEwrC( zrJ%T!STxddE~M`C7cU)7P`9-q-bm+C57S zwh7(|Pk-+`j!kPgKyhV2Qj;&xeUj@J!>29~9NMW8iWmf9R<}-X9#qeibhpKn2jp)r zZIAe46K3e%o8CR|5A8h%FMphx(vN@8{W}FObj(le|KMla=x!8vf~NYd``Y>Dci``D z7U()W`s`8exdnYA6NM#X*tqEf zX3w3+iOjD5^$LaWST8Vj4PIw`}3ifql%JI+1WBOn-ZOJD1L?rMt83 z;JN;6S!9t#UyPn!Kssz}D%!0COy6~7TQ3h5NP;mqa6~8Gn?R000JVNklYdjX@4NIUli&BLnyJQOKEIS0^Mov$Z77caf6LKM ze@kp%*){pi1;qt$bdMlf4}m;MaWB+VNFx4Fupk_sG(Fxn>9sUzIK$b$zD+ZJ8=Agj zOlf{Bzo0dTd(e~<$;sW@aE8F?Ob5;>qcSmOXk0yj-#t*cfuCK%*VQ)!U zImhddvS9HNN=r-Fwsi~RCrskP#S3X{Yy>1@$4#KV?kKTHh;daF?Af`Ej`nsAA3Dsn zt8bvQy>(MduX40})V9FOB8xvyq_qGt5dxVGg~`;V)PLSebm8S~b5xI{{+KV6Td0_x zd{Z;>z!O&`C}ywphfOmaDDd=W(5l$pvIUiJvK@9G^%@7nq|OEYy~U~@N=jjTmE>Rt z{BloDgBlH2pU(ahgNC|_opT#{#iwpRr(f5rczZe6@R+c8X1G?-Lydi#%7 zT(JDpEqm9ly(y%s_s*C(QUWh1S+q#*Z6E zd3ky0$bnsJKJ%sff3smjc2;~AS&UYQ_3PIU>w>|0|D1}Y@X$k-%lY#yIn>eud-mvw za~)A(>d-HNkk?VuF6ddme=zp4`tL3F} zfhK8fPwqE;x`q>s+_J^m>s;>t;Df&(-4S6MyZ`vRPvz$4f2y#!5q!s@{BrvE?c(j48QX%vdCf}3_A_FQLBNVu@6P)en$sH0LXfL1;4L}|0XN909=Wxh~x zzSKQq#(_UKuJv?5JV)b12h7y^%d9P1bPgXCVNZb!oXh=B_4jtRG2`OD_{Fki%U=4) zQxA@bMS6Jlt`u&IUi%b5f_2j?b78c#YJM{gs$bTY>bB|$L0B)SB z%g2qs{_7PXKm^9&S5=9r3t}hKh!I12bBsVBS0V&NIutz~*W&(w?(=x1(%tEa3Pl)5 zq?&7b6pvJlcF4&$G|ek9r9k>197RT2gyG4Tnl~ts2AG;4) Date: Tue, 23 Feb 2016 19:59:11 +0100 Subject: [PATCH 3/4] Fixes error in mergeconflict fixing. --- tgstation.dme | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tgstation.dme b/tgstation.dme index d398fa69bc0..4d742004b8e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -111,6 +111,7 @@ #include "code\_onclick\hud\monkey.dm" #include "code\_onclick\hud\movable_screen_objects.dm" #include "code\_onclick\hud\other_mobs.dm" +#include "code\_onclick\hud\revenanthud.dm" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\swarmer.dm" @@ -200,6 +201,7 @@ #include "code\datums\diseases\advance\symptoms\sneeze.dm" #include "code\datums\diseases\advance\symptoms\stimulant.dm" #include "code\datums\diseases\advance\symptoms\symptoms.dm" +#include "code\datums\diseases\advance\symptoms\viral.dm" #include "code\datums\diseases\advance\symptoms\vision.dm" #include "code\datums\diseases\advance\symptoms\voice_change.dm" #include "code\datums\diseases\advance\symptoms\vomit.dm" @@ -599,9 +601,11 @@ #include "code\game\objects\items\weapons\flamethrower.dm" #include "code\game\objects\items\weapons\gift_wrappaper.dm" #include "code\game\objects\items\weapons\handcuffs.dm" +#include "code\game\objects\items\weapons\holosign_creator.dm" #include "code\game\objects\items\weapons\holy_weapons.dm" #include "code\game\objects\items\weapons\kitchen.dm" #include "code\game\objects\items\weapons\manuals.dm" +#include "code\game\objects\items\weapons\miscellaneous.dm" #include "code\game\objects\items\weapons\mop.dm" #include "code\game\objects\items\weapons\paint.dm" #include "code\game\objects\items\weapons\paiwire.dm" @@ -985,6 +989,7 @@ #include "code\modules\events\meateor_wave.dm" #include "code\modules\events\meteor_wave.dm" #include "code\modules\events\operative.dm" +#include "code\modules\events\portal_storm.dm" #include "code\modules\events\prison_break.dm" #include "code\modules\events\radiation_storm.dm" #include "code\modules\events\shuttle_loan.dm" From 448ae3eeebc1b355cc5c462593c2a4600687b54f Mon Sep 17 00:00:00 2001 From: phil235 Date: Wed, 24 Feb 2016 02:49:47 +0100 Subject: [PATCH 4/4] Fixes organ_action, they can now be named something other than "toggle [target.name]" --- code/datums/action.dm | 13 ++++++++----- code/modules/surgery/organs/augments_internal.dm | 8 ++++---- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/code/datums/action.dm b/code/datums/action.dm index 2743fd5f0fb..59b1021b579 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -252,17 +252,20 @@ /datum/action/item_action/organ_action check_flags = AB_CHECK_CONSCIOUS -/datum/action/item_action/organ_action/New(Target) - ..() - name = "Toggle [target.name]" - button.name = name - /datum/action/item_action/organ_action/IsAvailable() var/obj/item/organ/internal/I = target if(!I.owner) return 0 return ..() +/datum/action/item_action/organ_action/toggle + +/datum/action/item_action/organ_action/toggle/New(Target) + ..() + name = "Toggle [target.name]" + button.name = name + + //Preset for spells diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 8a6634f35c1..b793fd05fc8 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -47,7 +47,7 @@ implant_color = "#DE7E00" slot = "brain_antidrop" origin_tech = "materials=5;programming=4;biotech=4" - actions_types = list(/datum/action/item_action/organ_action) + actions_types = list(/datum/action/item_action/organ_action/toggle) /obj/item/organ/internal/cyberimp/brain/anti_drop/ui_action_click() active = !active @@ -260,7 +260,7 @@ implant_color = "#007ACC" slot = "shoulders" origin_tech = "materials=5;biotech=4;powerstorage=4" - actions_types = list(/datum/action/item_action/organ_action) + actions_types = list(/datum/action/item_action/organ_action/toggle) var/obj/holder//is defined as the retractable item itself. ensure this is defined somewhere! var/out = 0//determines if the item is in the owner's hand or not var/overloaded = 0//is set to 1 when owner gets EMPed. if set to 1, implant doesn't work. @@ -309,7 +309,7 @@ desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arms and remains in the shoulders when not in use." icon_state = "armcannon_tase_implant" origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4" - actions_types = list(/datum/action/item_action/organ_action) + actions_types = list(/datum/action/item_action/organ_action/toggle) /obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created... holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun) @@ -319,7 +319,7 @@ desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arms and remains in the shoulders when not in use." icon_state = "armcannon_lase_implant" origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4;syndicate=5"//this is kinda nutty and i might lower it - actions_types = list(/datum/action/item_action/organ_action) + actions_types = list(/datum/action/item_action/organ_action/toggle) /obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New() holder = new /obj/item/weapon/gun/energy/laser/mounted(src)