From df25bb4682ef6ad88f8cd13733ac297c13c55b35 Mon Sep 17 00:00:00 2001 From: Russell Larkin Date: Sun, 16 Jul 2023 01:23:21 +0100 Subject: [PATCH] useHeroAction, Versions - Remove forceUpdateTokenActionHud when calling useHeroAction. - Update verified versions and TAH Core minimum. --- module.json | 8 ++++---- scripts/roll-handler.js | 4 ++-- scripts/token-action-hud-pf2e.min.js | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/module.json b/module.json index fca956f..3021062 100644 --- a/module.json +++ b/module.json @@ -19,7 +19,7 @@ "version": "This is auto replaced", "compatibility": { "minimum": "10", - "verified": "11.304" + "verified": "11.305" }, "esmodules": [ "./scripts/token-action-hud-pf2e.min.js" @@ -95,7 +95,7 @@ "compatibility": [ { "minimum": "4.6.4", - "verified": "5.0.2" + "verified": "5.1.2" } ] } @@ -106,9 +106,9 @@ "type": "module", "compatibility": [ { - "minimum": "1.4.8", + "minimum": "1.4.16", "maximum": "1.4", - "verified": "1.4.10" + "verified": "1.4.16" } ] } diff --git a/scripts/roll-handler.js b/scripts/roll-handler.js index 5e9fc20..3cb64b1 100644 --- a/scripts/roll-handler.js +++ b/scripts/roll-handler.js @@ -625,11 +625,11 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => { async #useHeroAction (actor, actionId) { if (actionId === 'drawHeroActions') { await game.modules.get('pf2e-hero-actions')?.api?.drawHeroActions(actor) + + Hooks.callAll('forceUpdateTokenActionHud') } else { await game.modules.get('pf2e-hero-actions')?.api?.useHeroAction(actor, actionId) } - - Hooks.callAll('forceUpdateTokenActionHud') } /** diff --git a/scripts/token-action-hud-pf2e.min.js b/scripts/token-action-hud-pf2e.min.js index 038f9e3..48e959a 100644 --- a/scripts/token-action-hud-pf2e.min.js +++ b/scripts/token-action-hud-pf2e.min.js @@ -1 +1 @@ -const e={ID:"token-action-hud-pf2e"},t={ID:"token-action-hud-core"},i="1.4",s={1:"A",2:"D",3:"T",free:"F",reaction:"R",passive:"",A:"A",D:"D",T:"T",F:"F",R:"R","bow-arrow":"fa-solid fa-bow-arrow fa-fw",axe:"fa-solid fa-axe fa-fw"},a={action:"TYPES.Item.action",attribute:"tokenActionHud.pf2e.attribute",auxAction:"PF2E.WeaponStrikeLabel",condition:"TYPES.Item.condition",effect:"TYPES.Item.effect",familiarAttack:"PF2E.AttackLabel",feat:"PF2E.Item.Feat.LevelLabel",heroAction:"tokenActionHud.pf2e.heroAction",initiative:"PF2E.InitiativeLabel",item:"PF2E.ItemTitle",save:"tokenActionHud.pf2e.save",skill:"PF2E.SkillLabel",skillAction:"tokenActionHud.pf2e.skillAction",spell:"TYPES.Item.spell",strike:"PF2E.WeaponStrikeLabel",toggle:"tokenActionHud.pf2e.toggle",utility:"tokenActionHud.utility"},n={held1:{icon:'',tooltip:"PF2E.CarryType.held1"},held2:{icon:'',tooltip:"PF2E.CarryType.held2"},dropped:{icon:'',tooltip:"PF2E.CarryType.dropped"},stowed:{icon:'',tooltip:"PF2E.CarryType.stowed"},worn:{icon:'',tooltip:"PF2E.CarryType.worn"}},o={armor:{groupId:"armor"},consumable:{groupId:"consumables"},backpack:{groupId:"containers"},equipment:{groupId:"equipment"},treasure:{groupId:"treasure"},weapon:{groupId:"weapons"}},l={bludgeoning:"PF2E.TraitBludgeoning",piercing:"PF2E.TraitPiercing",slashing:"PF2E.TraitSlashing"},c={acrobatics:"acr",arcana:"arc",athletics:"ath",crafting:"cra",deception:"dec",diplomacy:"dip",intimidation:"itm",medicine:"med",nature:"nat",occultism:"occ",performance:"prf",perception:"per",religion:"rel",society:"soc",stealth:"ste",survival:"sur",thievery:"thi"},r={melee:"systems/pf2e/icons/mdi/sword.svg",thrown:"systems/pf2e/icons/mdi/thrown.svg"},d={melee:{name:"PF2E.WeaponRangeMelee"},ranged:{name:"PF2E.NPCAttackRanged"},thrown:{name:"PF2E.TraitThrown"}},m={attack:{id:"attack",name:"PF2E.AttackLabel",type:"system"},toggles:{id:"toggles",name:"PF2E.TogglesLabel",type:"system"},strikes:{id:"strikes",name:"PF2E.StrikesLabel",type:"system"},actions:{id:"actions",name:"PF2E.ActionsActionsHeader",type:"system"},reactions:{id:"reactions",name:"PF2E.ActionsReactionsHeader",type:"system"},freeActions:{id:"free-actions",name:"PF2E.ActionsFreeActionsHeader",type:"system"},passives:{id:"passives",name:"PF2E.NPC.PassivesLabel",type:"system"},skillActionsGrouped:{id:"skill-actions-grouped",name:"tokenActionHud.pf2e.skillActions",listName:"tokenActionHud.pf2e.skillActionsGrouped",type:"system"},skillActionsUngrouped:{id:"skill-actions-ungrouped",name:"tokenActionHud.pf2e.skillActions",listName:"tokenActionHud.pf2e.skillActionsUngrouped",type:"system",settings:{sort:!0}},weapons:{id:"weapons",name:"PF2E.InventoryWeaponsHeader",type:"system"},armor:{id:"armor",name:"PF2E.InventoryArmorHeader",type:"system"},equipment:{id:"equipment",name:"PF2E.InventoryEquipmentHeader",type:"system"},consumables:{id:"consumables",name:"PF2E.InventoryConsumablesHeader",type:"system"},containers:{id:"containers",name:"PF2E.InventoryBackpackHeader",type:"system"},treasure:{id:"treasure",name:"PF2E.InventoryTreasureHeader",type:"system"},ancestryFeatures:{id:"ancestry-features",name:"PF2E.FeaturesAncestryHeader",type:"system"},classFeatures:{id:"class-features",name:"PF2E.FeaturesClassHeader",type:"system"},ancestryFeats:{id:"ancestry-feats",name:"PF2E.FeatAncestryHeader",type:"system"},classFeats:{id:"class-feats",name:"PF2E.FeatClassHeader",type:"system"},skillFeats:{id:"skill-feats",name:"PF2E.FeatSkillHeader",type:"system"},generalFeats:{id:"general-feats",name:"PF2E.FeatGeneralHeader",type:"system"},bonusFeats:{id:"bonus-feats",name:"PF2E.FeatBonusHeader",type:"system"},spells:{id:"spells",name:"PF2E.SpellLabelPlural",type:"system"},heroPoints:{id:"hero-points",name:"PF2E.HeroPointsLabel",type:"system"},initiative:{id:"initiative",name:"PF2E.InitiativeLabel",type:"system"},perceptionCheck:{id:"perception-check",name:"PF2E.PerceptionLabel",type:"system"},coreSkills:{id:"core-skills",name:"PF2E.CoreSkillsHeader",type:"system"},loreSkills:{id:"lore-skills",name:"PF2E.LoreSkillsHeader",type:"system"},conditions:{id:"conditions",name:"PF2E.ConditionsLabel",type:"system"},effects:{id:"effects",name:"PF2E.EffectsLabel",type:"system"},combat:{id:"combat",name:"tokenActionHud.combat",type:"system"},token:{id:"token",name:"tokenActionHud.token",type:"system"},recoveryCheck:{id:"recovery-check",name:"PF2E.Check.Specific.Recovery",type:"system"},rests:{id:"rests",name:"tokenActionHud.pf2e.rests",type:"system"},saves:{id:"saves",name:"PF2E.SavesHeader",type:"system"},utility:{id:"utility",name:"tokenActionHud.utility",type:"system"}},p={l5pbgrj8SSNtRGs8:{name:"PF2E.Actions.AdministerFirstAid.Stabilize.Title",actionCost:2,skill:"medicine",image:"systems/pf2e/icons/features/feats/treat-wounds.webp"},ZEWD4zcEDQwYhVT8:{name:"PF2E.Actions.AdministerFirstAid.StopBleeding.Title",actionCost:2,skill:"medicine",image:"systems/pf2e/icons/conditions/persistent-damage.webp"},"55mxH0w8UkY1o3Xv":{name:"PF2E.Actions.Balance.Title",skill:"acrobatics",actionCost:1,image:"icons/skills/movement/feet-winged-boots-brown.webp"},LXCy1iJddD95Z91s:{name:"PF2E.Actions.Climb.Title",skill:"athletics",actionCost:1,image:"icons/sundries/misc/ladder.webp"},"9RNumMausgG7adgL":{name:"PF2E.Actions.Coerce.Title",skill:"intimidation",actionCost:"passive",image:"icons/skills/social/intimidation-impressing.webp"},xcrdOOiN0l6O1sIn:{name:"PF2E.Actions.CommandAnAnimal.Title",skill:"nature",actionCost:1,image:"icons/environment/creatures/horse-white.webp"},zn0HadZeoKDALxRu:{name:"PF2E.Actions.ConcealAnObject.Title",skill:"stealth",actionCost:1,image:"systems/pf2e/icons/equipment/adventuring-gear/wax-key-blank.webp"},Tu7LIRelQsiOuo1l:{name:"PF2E.Actions.Craft.Title",skill:"crafting",actionCost:"passive",image:"icons/skills/trades/smithing-anvil-silver-red.webp"},aDsYSdRqiC6qQIOQ:{name:"PF2E.Actions.CreateADiversion.DistractingWords.Title",skill:"deception",actionCost:1,image:"icons/magic/control/mouth-smile-deception-purple.webp"},zUJ0UhuoFt5a7tiN:{name:"PF2E.Actions.CreateADiversion.Gesture.Title",skill:"deception",actionCost:1,image:"icons/skills/social/wave-halt-stop.webp"},"1JpYPlIkjyseE9JU":{name:"PF2E.Actions.CreateADiversion.Trick.Title",skill:"deception",actionCost:1,image:"systems/pf2e/icons/spells/charming-words.webp"},mNphXpAkmGsMadUv:{name:"PF2E.Actions.CreateForgery.Title",skill:"society",actionCost:"passive",image:"systems/pf2e/icons/spells/transcribe-moment.webp"},U6WjxFPn4fUqIrfl:{name:"PF2E.Actions.DecipherWriting.Title",skill:"arcana",actionCost:"passive",image:"icons/skills/trades/academics-book-study-runes.webp"},RZyfkw1DiqVy3JUC:{name:"PF2E.Actions.DecipherWriting.Title",skill:"occultism",actionCost:"passive",image:"icons/skills/trades/academics-book-study-purple.webp"},sDUERv4E88G5BRPr:{name:"PF2E.Actions.DecipherWriting.Title",skill:"religion",actionCost:"passive",image:"systems/pf2e/icons/equipment/other/spellbooks/thresholds-of-truth.webp"},YWAvvDXpdW1fYPFo:{name:"PF2E.Actions.DecipherWriting.Title",skill:"society",actionCost:"passive",image:"icons/skills/trades/academics-study-reading-book.webp"},nEwqNNWX6scLt4sc:{name:"PF2E.Actions.Demoralize.Title",skill:"intimidation",actionCost:1,image:"icons/skills/social/intimidation-impressing.webp"},T2QNEoRojMWEec4a:{name:"PF2E.Actions.DisableDevice.Title",skill:"thievery",actionCost:2,image:"systems/pf2e/icons/equipment/adventuring-gear/thieves-tools.webp"},ooiO59Ch2QaebOmc:{name:"PF2E.Actions.Disarm.Title",skill:"athletics",actionCost:1,image:"icons/skills/melee/sword-damaged-broken-glow-red.webp"},"50Q0DYL33Kalu1BH":{name:"PF2E.Actions.Escape.Title",skill:"acrobatics",actionCost:1,image:"icons/skills/movement/feet-winged-boots-glowing-yellow.webp"},lkEcQQss16SIrVxM:{name:"PF2E.Actions.Escape.Title",skill:"athletics",actionCost:1,image:"icons/skills/movement/feet-winged-boots-glowing-yellow.webp"},RjfPFjqPrNve6eeh:{name:"PF2E.Actions.Feint.Title",skill:"deception",actionCost:1,image:"icons/skills/melee/maneuver-sword-katana-yellow.webp"},yMTKMnaYSGtDz4wk:{name:"PF2E.Actions.ForceOpen.Title",skill:"athletics",actionCost:1,image:"icons/equipment/feet/boots-armored-steel.webp"},rCgGPEyXbzLFcio6:{name:"PF2E.Actions.GatherInformation.Title",skill:"diplomacy",actionCost:"passive",image:"icons/skills/social/diplomacy-handshake.webp"},i95kcGLIQKOTsnv6:{name:"PF2E.Actions.Grapple.Title",skill:"athletics",actionCost:"passive",image:"icons/skills/melee/unarmed-punch-fist.webp"},FlM3HvpnsZpCKawG:{name:"PF2E.Actions.Hide.Title",skill:"stealth",actionCost:1,image:"systems/pf2e/icons/features/classes/wild.webp"},v3dlDjFlOmT5T2gC:{name:"PF2E.Actions.HighJump.Title",skill:"athletics",actionCost:2,image:"icons/skills/movement/arrows-up-trio-red.webp"},k5nW4jGyXD0Oq9LR:{name:"PF2E.Actions.Impersonate.Title",skill:"deception",actionCost:"passive",image:"icons/equipment/head/mask-carved-scream-tan.webp"},VTg4t8kYTvXcHROq:{name:"PF2E.Actions.Lie.Title",skill:"deception",actionCost:"passive",image:"icons/magic/control/mouth-smile-deception-purple.webp"},QPsV0qi2zXm7syt6:{name:"PF2E.Actions.LongJump.Title",skill:"athletics",actionCost:2,image:"icons/skills/movement/figure-running-gray.webp"},"1Sj2Pz3VI2SFWqZw":{name:"PF2E.Actions.MakeAnImpression.Title",skill:"diplomacy",actionCost:"passive",image:"icons/environment/people/commoner.webp"},"9Ul5Op5OceT9P5SS":{name:"PF2E.Actions.ManeuverInFlight.Title",skill:"acrobatics",actionCost:1,image:"icons/commodities/biological/wing-bird-white.webp"},Gj68YCVlDjc75iCP:{name:"PF2E.Actions.PalmAnObject.Title",skill:"thievery",actionCost:1,image:"icons/sundries/gaming/playing-cards.webp"},dWcrojMk0d2WRPBq:{name:"PF2E.Actions.Perform.Title",skill:"performance",actionCost:1,image:"icons/skills/trades/music-singing-voice-blue.webp"},"8YrH37NzKRuiKFbF":{name:"PF2E.Actions.PickALock.Title",skill:"thievery",actionCost:2,image:"icons/sundries/misc/lock-bronze-reinforced.webp"},BQTA7bL264189Xla:{name:"PF2E.Actions.Repair.Title",skill:"crafting",actionCost:"passive",image:"icons/tools/smithing/anvil.webp"},tbveXG4gaIoKnsWX:{name:"PF2E.Actions.Request.Title",skill:"diplomacy",actionCost:1,image:"icons/skills/social/thumbsup-approval-like.webp"},tikhJ2b6AMh7wQU7:{name:"PF2E.Actions.Seek.Title",skill:"perception",actionCost:1,image:"icons/tools/scribal/magnifying-glass.webp"},LN67MgbGE8IHb2X0:{name:"PF2E.Actions.SenseDirection.Title",skill:"survival",actionCost:"passive",image:"icons/tools/navigation/compass-brass-blue-red.webp"},PmHt7Gb5fCrlWWTr:{name:"PF2E.Actions.SenseMotive.Title",skill:"perception",actionCost:1,image:"icons/environment/people/commoner.webp"},yNry1xMZqdWHncbV:{name:"PF2E.Actions.Shove.Title",skill:"athletics",actionCost:1,image:"systems/pf2e/icons/spells/hydraulic-push.webp"},HSTkVuv0SjTNK3Xx:{name:"PF2E.Actions.Sneak.Title",skill:"stealth",actionCost:1,image:"systems/pf2e/icons/conditions/unnoticed.webp"},UKHPveLpG7hUs4D0:{name:"PF2E.Actions.Squeeze.Title",skill:"acrobatics",actionCost:"passive",image:"icons/commodities/tech/claw-mechanical.webp"},zjovbAeuLvyuWFKd:{name:"PF2E.Actions.Steal.Title",skill:"thievery",actionCost:1,image:"icons/containers/bags/coinpouch-gold-red.webp"},mkKko3CEBCyJVQw1:{name:"PF2E.Actions.Subsist.Title",skill:"society",actionCost:"passive",image:"icons/environment/settlement/building-rubble.webp"},zkqh01BoXDVgydzo:{name:"PF2E.Actions.Subsist.Title",skill:"survival",actionCost:"passive",image:"icons/environment/wilderness/camp-improvised.webp"},TIlUkCzviYxdVk4E:{name:"PF2E.Actions.Swim.Title",skill:"athletics",actionCost:1,image:"icons/creatures/fish/fish-shark-swimming.webp"},Al5LYMMdeDcpC9Br:{name:"PF2E.Actions.Track.Title",skill:"survival",actionCost:"passive",image:"systems/pf2e/icons/conditions/observed.webp"},m4iM5r3TfvQs5Y2n:{name:"PF2E.Actions.TreatDisease.Title",skill:"medicine",actionCost:"passive",image:"icons/magic/nature/root-vine-caduceus-healing.webp"},R03LRl2RBbsm6EcF:{name:"PF2E.Actions.TreatPoison.Title",skill:"medicine",actionCost:1,image:"systems/pf2e/icons/effects/treat-poison.webp"},gRj7xUfcpUZQLrOC:{name:"PF2E.Actions.Trip.Title",skill:"athletics",actionCost:1,image:"icons/skills/wounds/bone-broken-marrow-yellow.webp"},"2qhYHkcSsTJoSwrJ":{name:"PF2E.Actions.TumbleThrough.Title",skill:"acrobatics",actionCost:1,image:"icons/skills/movement/feet-winged-sandals-tan.webp"}},u={acrobatics:{name:"PF2E.SkillAcrobatics"},arcana:{name:"PF2E.SkillArcana"},athletics:{name:"PF2E.SkillAthletics"},crafting:{name:"PF2E.SkillCrafting"},deception:{name:"PF2E.SkillDeception"},diplomacy:{name:"PF2E.SkillDiplomacy"},intimidation:{name:"PF2E.SkillIntimidation"},lore:{name:"PF2E.SkillLore"},medicine:{name:"PF2E.SkillMedicine"},nature:{name:"PF2E.SkillNature"},occultism:{name:"PF2E.SkillOccultism"},perception:{name:"PF2E.PerceptionLabel"},performance:{name:"PF2E.SkillPerformance"},religion:{name:"PF2E.SkillReligion"},society:{name:"PF2E.SkillSociety"},stealth:{name:"PF2E.SkillStealth"},survival:{name:"PF2E.SkillSurvival"},thievery:{name:"PF2E.SkillThievery"}};let h=null;Hooks.once("tokenActionHudCoreApiReady",(async t=>{h=class Utils{static getSetting(i,s=null){let a=s??null;try{a=game.settings.get(e.ID,i)}catch{t.api.Logger.debug(`Setting '${i}' not found`)}return a}static async setSetting(i,s){try{s=await game.settings.set(e.ID,i,s),t.api.Logger.debug(`Setting '${i}' set to '${s}'`)}catch{t.api.Logger.debug(`Setting '${i}' not found`)}}}}));let g=null;Hooks.once("tokenActionHudCoreApiReady",(async e=>{g=class ActionHandler extends e.api.ActionHandler{actors=null;actorId=null;actorType=null;tokenId=null;items=null;groupIds=null;activationGroupIds=null;effectGroupIds=null;inventoryGroupIds=null;spellGroupIds=null;featureActions=null;inventoryActions=null;spellActions=null;async buildSystemActions(t){this.actors=this.actor?[this.actor]:this.#e(),this.actorType=this.actor?.type;if(!this.actorType||["character","familiar","hazard","npc"].includes(this.actorType)){if(this.actor){let t=this.actor.items;t=e.api.Utils.sortItemsByName(t),this.items=t}this.abbreviateSkills=h.getSetting("abbreviateSkills"),this.addAuxiliaryActions=h.getSetting("addAuxiliaryActions"),this.addDamageAndCritical=h.getSetting("addDamageAndCritical"),this.addStowedItems=h.getSetting("addStowedItems"),this.addUnequippedItems=h.getSetting("addUnequippedItems"),this.calculateAttackPenalty=h.getSetting("calculateAttackPenalty"),this.colorSkills=h.getSetting("colorSkills"),this.showStrikeImages=h.getSetting("showStrikeImages"),this.showStrikeNames=h.getSetting("showStrikeNames"),this.splitStrikes=h.getSetting("splitStrikes"),this.groupIds=t,"character"===this.actorType?await this.#t():"familiar"===this.actorType?await this.#i():"hazard"===this.actorType?await this.#s():"npc"===this.actorType?await this.#a():this.actor||this.#n()}}async#t(){await Promise.all([this.#o(),this.#l(),this.#c(),this.#r(),this.#d(),this.#m(),this.#p(),this.#u(),this.#h(),this.#g(),this.#f(),this.#y(),this.#k()]),this.#b(),this.#A(),this.#v(),this.#w(),this.#I()}async#i(){await Promise.all([this.#o(),this.#l(),this.#p(),this.#u(),this.#h(),this.#f()]),this.#C(),this.#b(),this.#c()}async#s(){await Promise.all([this.#o(),this.#m(),this.#h()]),this.#b()}async#a(){await Promise.all([this.#o(),this.#l(),this.#c(),this.#r(),this.#m(),this.#p(),this.#u(),this.#h(),this.#g(),this.#f(),this.#k(),this.#y()]),this.#b()}async#n(){await Promise.all([this.#m(),this.#h(),this.#f()]),this.#u(),this.#g()}async#o(){const t="action";if(0===this.items.size)return;const i=["action","reaction","free","passive"],s=new Map([...this.items].filter((([e,t])=>"action"===t.type||i.includes(t.system?.actionType?.value)))),a=new Map;for(const[e,t]of s){const i=t.system.actionType?.value;switch(i){case"action":a.set("actions",a.get("actions")||new Map),a.get("actions").set(e,t);break;case"reaction":a.set("reactions",a.get("reactions")||new Map),a.get("reactions").set(e,t);break;case"free":a.set("free-actions",a.get("free-actions")||new Map),a.get("free-actions").set(e,t);break;case"passive":a.set("passives",a.get("passives")||new Map),a.get("passives").set(e,t)}}for(const[i,s]of a){const a=s,n={id:i,type:"system"},o=await Promise.all([...a].map((async([i,s])=>{const a=this.#P(s),n=this.#F(s),o=this.#S(s,t),l=this.#$(s),c=[t,a].join(this.delimiter),r=this.#E(s,t),d=e.api.Utils.getImage(s),m=this.#T(s),p=await s.getChatData(),u={name:n,description:p.description.value,properties:p.properties,traits:p.traits};return{id:a,name:n,encodedValue:c,cssClass:l,img:d,icon1:r,info:m,listName:o,tooltip:await this.#U(u)}})));this.addActions(o,n)}}#C(){const t="familiarAttack",i=this.actor.system.attack;if(i){const s=i.slug,n=e.api.Utils.i18n("PF2E.AttackLabel"),o=`${`${e.api.Utils.i18n(a[t])}: `??""}${n}`,l=[t,s].join(this.delimiter),c=e.api.Utils.getModifier(i?.totalModifier),r=[{id:s,name:n,listName:o,encodedValue:l,info1:this.actor?{text:c}:""}],d={id:"attack",type:"system"};this.addActions(r,d)}}#b(){const t="utility",i={endTurn:{id:"endTurn",name:e.api.Utils.i18n("tokenActionHud.endTurn")}};game.combat?.current?.tokenId!==this.token?.id&&delete i.endTurn;const s=Object.entries(i).map((i=>{const s=i[1].id,n=i[1].name,o=`${`${e.api.Utils.i18n(a[t])}: `??""}${n}`,l=[t,s].join(this.delimiter);return{id:s,name:n,listName:o,encodedValue:l}}));this.addActions(s,{id:"combat",type:"system"})}async#l(){const t="condition",i=["doomed","dying","wounded"],s=new Map([...this.items].filter((e=>e[1].type===t)).map((e=>{const t=e[1];return[t.slug,t]}))),n=[...game.pf2e.ConditionManager.conditions].filter((([e])=>!e.startsWith("Compendium"))).map((([e,t])=>(t.name=t.name.replace(" 1",""),[e,t]))),o=await Promise.all(n.map((async([n,o])=>{const l=o.slug,c=s.get(n),r=c?.id,d=o.name,m=`${`${e.api.Utils.i18n(a[t])}: `??""}${d}`,p=[t,l].join(this.delimiter),u=e.api.Utils.getImage(o),h=`toggle${r?" active":""}`;let g="",f="";if(r)if(i.includes(c.slug)){const e=this.actor.system.attributes[c.slug];f=e.value;const t=e.max;g={text:t>0?`${f??0}/${t}`:""}}else c.system.value.isValued&&(f=c.system.value.value,g={text:f});const y={name:`${d}${f?` ${f}`:""}`,description:o.description};return{id:l,name:d,listName:m,encodedValue:p,cssClass:h,img:u,info1:g,tooltip:await this.#U(y)}})));await this.addActions(o,{id:"conditions",type:"system"})}async#A(){const t="heroPoints",i=this.actor.system.resources?.heroPoints,s=i.value,a=i.max,n=[{id:"heroPoints",name:e.api.Utils.i18n("PF2E.HeroPointsLabel"),encodedValue:[t,t].join(this.delimiter),info1:{text:a>0?`${s??0}/${a}`:""}}];this.addActions(n,{id:"hero-points",type:"system"})}async#c(){const t="effect",i=new Map([...this.items].filter((e=>"effect"===e[1].type&&(!e[1].system?.unidentified&&!e[1].unidentified||game.user.isGM)))),s=await Promise.all([...i].map((async([i,s])=>{const a=this.#P(s),n=this.#F(s),o=this.#S(s,t),l=this.#$(s),c=[t,a].join(this.delimiter),r=this.#E(s,t),d=e.api.Utils.getImage(s),m=this.#T(s),p={name:n,description:s.description};return{id:a,name:n,listName:o,encodedValue:c,cssClass:l,img:d,icon1:r,info:m,tooltip:await this.#U(p)}})));this.addActions(s,{id:"effects",type:"system"})}async#r(){const t="feat",i={ancestryfeature:"ancestry-features",classfeature:"class-features",ancestry:"ancestry-feats",class:"class-feats",skill:"skill-feats",general:"general-feats",bonus:"bonus-feats"},s=new Map;for(const[e,t]of this.items){if("feat"!==t.type)continue;const a=i[t.system?.category??t.featType];s.set(a,s.get(a)||new Map),s.get(a).set(e,t)}for(const[i,a]of s){const s=a,n={id:i,type:"system"},o=await Promise.all([...s].map((async([i,s])=>{const a=this.#P(s),n=this.#F(s),o=this.#S(s,t),l=this.#$(s),c=[t,a].join(this.delimiter),r=this.#E(s,t),d=e.api.Utils.getImage(s),m=this.#T(s),p=await s.getChatData(),u={name:n,description:p?.description.value,properties:p.properties,traits:p.traits};return{id:a,name:n,encodedValue:c,cssClass:l,img:d,icon1:r,info:m,listName:o,tooltip:await this.#U(u)}})));this.addActions(o,n)}}async#d(){if(!game.modules.get("pf2e-hero-actions")?.active)return;const t="heroAction",i=e.api.Utils.i18n(a[t]),s=this.actor.getFlag("pf2e-hero-actions","heroActions")??[],n=[],o=this.actor.heroPoints?.value,l=o-(s?.length??0);l>0&&n.push({id:"drawHeroActions",name:game.i18n.format("pf2e-hero-actions.templates.heroActions.draw",{nb:l}),listName:`${i}: ${game.i18n.localize("pf2e-hero-actions.templates.heroActions.draw").replace("({nb}) ","")}`,encodedValue:[t,"drawHeroActions"].join(this.delimiter)});const c=await Promise.all([...s].map((async s=>{const a=s?.uuid,n=s?.name,o=`${i}: ${n}`,l=[t,a].join(this.delimiter),c=e.api.Utils.getImage("systems/pf2e/icons/actions/Passive.webp"),r={name:n,description:s?.uuid?await(fromUuid(s?.uuid)?.text?.content):null};return{id:a,name:n,encodedValue:l,img:c,listName:o,tooltip:await this.#U(r)}})));n.push(...c),this.addActions(n,{id:"hero-actions",type:"system"})}async#m(){const t="initiative",i=this.actor?Object.entries(this.actor.skills).filter((([e,t])=>!!t.label&&t.label.length>1)):this.#H();if(!i)return;const s=this.actor?.system?.attributes?.initiative?.statistic??null,n=[];if("hazard"!==this.actorType){const i=this.actor?this.actor.system.attributes.perception:CONFIG.PF2E.attributes.perception,o=e.api.Utils.i18n(CONFIG.PF2E.attributes.perception),l=this.abbreviatedSkills?c.perception??o:o,r=`${`${e.api.Utils.i18n(a[t])}: `??""}${l}`,d=[t,"perception"].join(this.delimiter),m=`toggle${"perception"===s?" active":""}`,p=e.api.Utils.getModifier(i?.totalModifier),u=this.actor?{text:p}:"",h={name:`${o}${this.actor&&p?` ${p}`:""}`,modifiers:i?.modifiers},g=this.actor?await this.#U(h):null;n.push({id:"initiative-perception",name:l,listName:r,encodedValue:d,cssClass:m,info1:u,tooltip:g})}const o=await Promise.all(i.map((async([i,n])=>{const o=`initiative-${i}`,l=n,r=e.api.Utils.i18n(l.label)??e.api.Utils.i18n(CONFIG.PF2E.skillList[i]),d=this.abbreviatedSkills?c[l.slug]??r:r,m=`${`${e.api.Utils.i18n(a[t])}: `??""}${d}`,p=[t,i].join(this.delimiter),u=`toggle${s===i?" active":""}`,h=e.api.Utils.getModifier(n.check?.mod),g=this.actor?{text:h}:"",f={name:`${r}${this.actor&&h?` ${h}`:""}`,modifiers:n?.modifiers};return{id:o,name:d,listName:m,encodedValue:p,cssClass:u,info1:g,tooltip:this.actor?await this.#U(f):null}})));n.push(...o);this.addActions(n,{id:"initiative",type:"system"})}async#p(){if(0===this.items.size)return;const t="item",i=new Map;for(const[e,t]of this.items){const s=t.system?.quantity>0,a=this.#D(t),n=this.#N("nonContainer",t),o=t.type;if(s&&n){const s=a?"equipped":"unequipped",n=i.get(s)??new Map;if(n.set(e,t),i.set(s,n),a){const s=i.get(o)??new Map;s.set(e,t),i.set(o,s)}}}for(const[s,a]of i){const i=o[s]?.groupId;if(!i)continue;const n={id:i,type:"system"},l=await Promise.all([...a].map((async([i,s])=>{const a=this.#P(s),n=this.#F(s),o=this.#S(s,t),l=this.#$(s),c=[t,a].join(this.delimiter),r=this.#E(s,t),d=this.#R(s),m=e.api.Utils.getImage(s),p=this.#T(s),u=await s.getChatData(),h={name:n,description:u?.description.value,rarity:u.rarity,traits:u.traits,traits2:u.properties};return{id:a,name:n,encodedValue:c,cssClass:l,img:m,icon1:r,icon2:d,info:p,listName:o,tooltip:await this.#U(h)}})));this.addActions(l,n)}if(i.has("backpack")){const s={id:"containers",type:"system"},a=i.get("backpack");for(const[i,n]of a){const a=n.contents;if(!a.size)continue;const o={id:i,name:n.name,listName:`Group: ${n.name}`,type:"system-derived"};await this.addGroup(o,s);const l=new Map;for(const e of a){this.#N("container",e)&&l.set(e.id,e)}const c=await Promise.all([...l].map((async([i,s])=>{const a=this.#P(s),n=this.#F(s),o=this.#S(s,t),l=this.#$(s),c=[t,a].join(this.delimiter),r=this.#E(s,t),d=this.#R(s),m=e.api.Utils.getImage(s),p=this.#T(s),u=await s.getChatData(),h={name:n,description:u?.description.value,properties:u.properties,rarity:u.rarity,traits:u.traits};return{id:a,name:n,encodedValue:c,cssClass:l,img:m,icon1:r,icon2:d,info:p,listName:o,tooltip:await this.#U(h)}})));this.addActions(c,o)}}}async#u(){const t=this.actor?this.actor.system.attributes.perception:CONFIG.PF2E.attributes.perception,i=e.api.Utils.i18n(CONFIG.PF2E.attributes.perception),s=e.api.Utils.getModifier(t?.totalModifier),a=this.actor?{text:s}:"",n={name:`${i}${this.actor&&s?` ${s}`:""}`,modifiers:t?.modifiers},o=await this.#U(n),l=[{id:"perception",name:i,encodedValue:["perceptionCheck","perception"].join(this.delimiter),info1:a,tooltip:o}];this.addActions(l,{id:"perception-check",type:"system"})}#v(){const t="recoveryCheck",i=this.actor?.system.attributes?.dying;if(i?.value>=1){const i=[{id:t,name:e.api.Utils.i18n("PF2E.Check.Specific.Recovery"),encodedValue:[t,t].join(this.delimiter)}],s={id:"recovery-check",type:"system"};this.addActions(i,s)}}#w(){if(!this.actor&&!this.actors.every((e=>"character"===e.type)))return;const t="utility",i=[{id:"treatWounds",name:e.api.Utils.i18n("PF2E.Actions.TreatWounds.Label"),encodedValue:[t,"treatWounds"].join(this.delimiter)},{id:"rest",name:e.api.Utils.i18n("PF2E.Actor.Character.Rest.Label"),encodedValue:[t,"rest"].join(this.delimiter)}];game.settings.get("pf2e","staminaVariant")&&i.push({id:"takeBreather",name:e.api.Utils.i18n("tokenActionHud.pf2e.takeBreather"),encodedValue:[t,"takeBreather"].join(this.delimiter)});this.addActions(i,{id:"rests",type:"system"})}async#h(){const t="save",i=this.actor?Object.entries(this.actor.saves||[]):Object.entries(CONFIG.PF2E.saves);if(!i||0===i.length)return;const s=await Promise.all(i.map((async([i,s])=>{const n=s.label??("string"==typeof s?e.api.Utils.i18n(s):""),o=`${`${e.api.Utils.i18n(a[t])}: `??""}${n}`,l=[t,i].join(this.delimiter),c=e.api.Utils.getModifier(s.mod),r=this.actor?{text:c}:"",d={name:`${n}${this.actor&&c?` ${c}`:""}`,modifiers:s?.modifiers};return{id:i,name:n,listName:o,encodedValue:l,info1:r,tooltip:this.actor?await this.#U(d):null}})));this.addActions(s,{id:"saves",type:"system"})}async#g(){const t="compendiumMacro",i=await game.packs.get("pf2e.action-macros").getIndex();if(!i.size)return;const s=new Map,n=[];for(const o of i){const i=p[o._id];if(!i)continue;const l=o._id,c=e.api.Utils.i18n(i.name),r=`${c} - ${e.api.Utils.i18n(u[i.skill]?.name)}`,d=`${`${e.api.Utils.i18n(a.skillAction)}: `??""}${r}`,m=[t,"pf2e.action-macros",l].join(this.delimiter),h=this.#M(i.actionCost),g=i.image,f=e.api.Utils.getModifier(this.actor?.skills[i.skill]?.check?.mod),y={id:l,name:r,listName:d,encodedValue:m,icon1:h,img:g,info1:this.actor?{text:f}:null};n.push(y),s.set(i.skill,s.get(i.skill)||new Map),s.get(i.skill).set(o._id,{...y,name:c})}await this.addActions(n,{id:"skill-actions-ungrouped",type:"system"});for(const[t,i]of Object.entries(u)){const a=t,n=e.api.Utils.i18n(i.name),o=s.get(a);if(!o)continue;const l={id:a,name:n,type:"system-derived"};await this.addGroup(l,{id:"skill-actions-grouped",type:"system"});const c=[...o].map((([e,t])=>t));await this.addActions(c,l)}}async#f(){const t="skill",i=this.actor?Object.entries(this.actor.skills).filter((e=>!!e[1].label&&e[1].label.length>1)):this.#H();if(!i)return;const s=new Map;for(const e of i){const t=e[1].lore;s.has("skills")||s.set("skills",new Map),s.get("skills").set(e[0],e[1]),t&&(s.has("lore-skills")||s.set("lore-skills",new Map),s.get("lore-skills").set(e[0],e[1])),t||(s.has("core-skills")||s.set("core-skills",new Map),s.get("core-skills").set(e[0],e[1]))}for(const[i,n]of s){const s=n,o={id:i,type:"system"},l=await Promise.all([...s].map((async([i,s])=>{const n=i,o=e.api.Utils.i18n(s.label)??e.api.Utils.i18n(CONFIG.PF2E.skillList[i]),l=this.abbreviatedSkills?c[s.slug]??o:o,r=o,d=`${`${e.api.Utils.i18n(a[t])}: `??""}${l}`,m=[t,n].join(this.delimiter),p=this.actor&&this.colorSkills&&s.rank>0?`tah-pf2e-skill-rank-${s.rank}`:"",u=e.api.Utils.getModifier(s.check?.mod),h=this.actor?{text:u}:"",g={name:`${r}${this.actor&&u?` ${u}`:""}`,modifiers:s?.modifiers};return{id:n,name:l,fullName:r,listName:d,encodedValue:m,cssClass:p,info1:h,tooltip:this.actor?await this.#U(g):null}})));this.addActions(l,o)}}#H(){if(!this.actors)return;const e=this.actors.map((e=>Object.entries(e.skills).filter((e=>!!e[1].label&&e[1].label.length>1)))),t=Math.min(...e.map((e=>e.length)));return e.find((e=>e.length===t)).filter((t=>e.every((e=>e.some((e=>e[0]===t[0]))))))}async#y(){const t="spell",i={id:"spells",type:"system"},s=[...this.items].filter((e=>"spellcastingEntry"===e[1].type));for(const a of s){const s=`spells+${a[1].name.slugify({replacement:"-",strict:!0})}`,n={id:s,name:a[1].name,type:"system-derived",info1:this.#x(a[1])};await this.addGroup(n,i),this.addGroupInfo(n);const o=await(a[1].getSpellData?a[1].getSpellData():a[1].getSheetData()),l=o.levels.filter((e=>e.active.length>0));for(const i of Object.entries(l)){const a=i[1].level,l={id:`${s}+${a}`,name:String(e.api.Utils.i18n(i[1].label)),type:"system-derived"};await this.addGroup(l,n),await this.#j(n,l,i,o);const c=i[1].active.filter((e=>!e?.expended&&e)).map((e=>e.spell)),r=new Map(c.map((e=>[e.id,e]))),d=await Promise.all([...r].map((async([i,s])=>{const n=this.#P(s,t,a),o=this.#F(s),l=this.#S(s,t),c=this.#$(s),r=this.#z(s,t,a),d=this.#E(s,t),m=e.api.Utils.getImage(s),p=this.#L(s),u=await s.getChatData(),h={name:o,description:u.description.value,properties:u.properties,rarity:u.rarity,traits:u.actionTraits,traitsAlt:u.spellTraits};return{id:n,name:o,listName:l,encodedValue:r,cssClass:c,img:m,icon1:d,info:p,tooltip:await this.#U(h)}})));this.addActions(d,l)}}}async#j(t,i,s,n){const o=s[1].isCantrip,l=n.isFlexible,c=n.isFocusPool,r=n.isInnate,d=n.isPrepared;if(!c&&(o||r))return;if(!c&&d&&!l)return;const m="spellSlot",p=this.actor.system.resources.focus,u=s[1].uses,h=c?"focus":`slot${s[1].level}`,g="focus"===h?p?.max:u?.max,f={text:g>=0?`${("focus"===h?p?.value:u?.value)??0}/${g}`:""};i.info={info1:f},this.addGroupInfo(i);const y=e.api.Utils.i18n(a.spell),k=[{id:`${n.id}>${h}>slotIncrease`,name:"+",listName:`${y}: ${t.name}: ${i.name}: +`,encodedValue:[m,`${n.id}>${h}>slotIncrease`].join(this.delimiter),cssClass:"shrink"},{id:`${n.id}>${h}>slotDecrease`,name:"-",listName:`${y}: ${t.name}: ${i.name}: -`,encodedValue:[m,`${n.id}>${h}>slotDecrease`].join(this.delimiter),cssClass:"shrink"}];this.addActions(k,i)}async#k(){const t="strike",i={id:"strikes",type:"system"},s=this.actor.system.actions.filter((e=>e.type===t&&(e.item.system.quantity>0||"npc"===this.actor.type)));if(s)for(const n of s){let s=[],o=[],c=null;const m=[],p=`strikes+${`${n.item.id}-${n.slug}`}`,u=n.label,h=`${e.api.Utils.i18n(a[t])}: ${n.label} (${n.item.id})`,g=n.imageUrl,f=this.showStrikeNames,y=this.#O({description:n.description,criticalSuccess:n.criticalSuccess,success:n.success}),k=(await(n?.item?.getChatData()))?.properties.filter((e=>"PF2E.WeaponTypeMartial"!==e)),b={name:n.label,descriptionLocalised:y,modifiers:n.modifiers,properties:k,traits:n.traits,traitsAlt:n.weaponTraits},A=await this.#U(b);if(c={id:p,name:u,listName:h,type:"system-derived",settings:{showTitle:f},tooltip:A},this.showStrikeImages&&(c.settings.image=g),this.addGroup(c,i),n.auxiliaryActions?.length&&this.addAuxiliaryActions&&(s=n.auxiliaryActions.flatMap(((t,i)=>{if("Modular"===t.purpose){const s=n.item.system.traits.toggles.modular.options,a=n.item.system.traits.toggles.modular.selection;return s.map((s=>{const o=encodeURIComponent(`${n.item.id}>${n.slug}>${i}>${s}`),c=e.api.Utils.i18n(l[s]);return{id:o,name:c,listName:`${h}: ${c}`,encodedValue:["auxAction",o].join(this.delimiter),icon1:this.#M(t.glyph),cssClass:this.#$({selected:s===a})}}))}{const e=encodeURIComponent(`${n.item.id}>${n.slug}>${i}>`),s=t.label;return{id:e,name:s,listName:`${h}: ${s}`,encodedValue:["auxAction",e].join(this.delimiter),icon1:this.#M(t.glyph),info:this.#T(t)}}}))),n.ready){n.versatileOptions?.length&&(o=n.versatileOptions.map((t=>{const i=encodeURIComponent(`${n.item.id}>${n.slug}>${t.value}>`),s=e.api.Utils.i18n(t.label);return{id:encodeURIComponent(`${n.item.id}>${n.slug}>${t.value}>`),name:"",fullName:s,listName:`${h}: ${s}`,encodedValue:["versatileOption",i].join(this.delimiter),cssClass:this.#$(t),icon1:this.#M(t.glyph,s)}})));const i=n.altUsages?[n,...n.altUsages]:[n];for(const s of i){const a=n.glyph;let o;switch(`${s.item.isMelee}_${s.item.isThrown}_${s.item.isRanged}`){case"true_false_false":o="melee";break;case"false_true_true":o="thrown";break;case"false_false_true":o="ranged"}const l=`${p}+${o}`,c=s.attackRollType?e.api.Utils.i18n(s.attackRollType):e.api.Utils.i18n(d[o].name),u=`${h}: ${c}`,g="thrown"!==o&&a?`${a}`:r[o],f=i.length>1?r[o]:"",y=!(f||i.length<=1),k={id:l,name:c,listName:u,icon:g,type:"system-derived",settings:{showTitle:y,image:f}},b=s.variants.map(((i,s)=>{const a=encodeURIComponent(`${n.item.id}>${n.slug}>${s}>`+o),l=i.label.includes(e.api.Utils.i18n("PF2E.MAPAbbreviationLabel").replace(" {penalty}",""))?n.totalModifier+parseInt(i.label.split(" ")[1]):parseInt(i.label.split(" ")[1]),c=this.calculateAttackPenalty?l>=0?`+${l}`:`${l}`:i.label;return{id:a,name:c,encodedValue:[t,a].join(this.delimiter),listName:`${u}: ${c}`}})),A=encodeURIComponent(`${n.item.id}>${n.slug}>damage>${o}`),v=e.api.Utils.i18n("PF2E.DamageLabel");b.push({id:A,name:v,listName:`${u}: ${v}`,encodedValue:[t,A].join(this.delimiter),systemSelected:this.addDamageAndCritical});const w=encodeURIComponent(`${n.item.id}>${n.slug}>critical>${o}`),I=e.api.Utils.i18n("PF2E.CriticalDamageLabel");if(b.push({id:w,name:I,listName:`${u}: ${I}`,encodedValue:[t,w].join(this.delimiter),systemSelected:this.addDamageAndCritical}),s.selectedAmmoId&&!s.ammunition){const i=this.actor.items.get(s.selectedAmmoId);if(i){const e=this.#P(i),s=this.#F(i);b.push({id:e,name:s,listName:`${u}: ${s}`,encodedValue:[t,e].join(this.delimiter)})}else{const t="noAmmo",i=e.api.Utils.i18n("tokenActionHud.pf2e.noAmmo");b.push({id:t,name:i,listName:`${u}: ${i}`,encodedValue:t})}}m.push({actions:b,usageGroupData:k})}}if(this.splitStrikes){this.addActions([...s,...o],c);for(const e of m)this.addGroup(e.usageGroupData,c),this.addActions(e.actions,e.usageGroupData)}else{this.addActions([...s,...m[0]?.actions||[],...o],c),m.shift();for(const e of m)this.addGroup(e.usageGroupData,c),this.addActions(e.actions,e.usageGroupData)}}}#I(){const t="toggle",i=game.system.version.startsWith("4")?this.actor.system.toggles:this.actor.synthetics.toggles;if(!i.length)return;const s=i.map((i=>{const s=[i.domain,i.option].join("."),a=e.api.Utils.i18n(i.label);return{id:s,encodedValue:[t,JSON.stringify(i)].join(this.delimiter),name:a,cssClass:`toggle${i.checked?" active":""}`}}));this.addActions(s,{id:"toggles",type:"system"})}#_(e,t,i,s){const a=t.slugify({replacement:"-",strict:!0});return{id:a,name:t,encodedValue:[e,a].join(this.delimiter),info1:{text:`${i}/${s}`}}}#P(e,t,i){return"spell"===t?`${e.id??e._id}-${i}`:e.id??e._id}#F(e){return e?.name??e?.label??""}#S(t,i){const s=this.#F(t),n=`${e.api.Utils.i18n(a[i])}: `??"";return t.listName??`${n}${s}`}#$(e){if(Object.hasOwn(e,"disabled")){return`toggle${e.disabled?"":" active"}`}if(Object.hasOwn(e,"selected")){return`toggle${e.selected?" active":""}`}}#z(e,t,i){const s=e?.spellcasting?.id;return[t,"spell"===t?`${s}>${i}>${e.id??e._id}`:this.#P(e,t,i)].join(this.delimiter)}#E(e,t){const i=e.system?.actions,s=e.system?.actionType?.value,a=i?parseInt((i||{}).value,10):null,n=e.system?.time?.value,o=e.actionIcon,l="spell"===t?n:["free","reaction","passive"].includes(s)?s:a??o,c=this.#F(e);return this.#M(l,c)}#V(e){return["downtime","exploration"].includes(e.system.traits?.value)}#x(t){let i="";const s=t.statistic,a="function"==typeof s.dc?s.dc().value:s.dc.value,n=s.check.mod;return i=`${n>=0?`${e.api.Utils.i18n("tokenActionHud.pf2e.atk")} +${n}`:`${e.api.Utils.i18n("tokenActionHud.pf2e.atk")} ${n}`} ${`${e.api.Utils.i18n("tokenActionHud.pf2e.dc")}${a}`}`,i}#L(e){return{info1:this.#G(e),info2:this.#q(e)}}#G(e){return{text:e.components.value??e.system.components?.value??"",title:Object.entries(e.components).filter((e=>!0===e[1])).map((e=>e[0].trim().charAt(0).toUpperCase()+e[0].slice(1))).join(", ")}}#q(e){const t=e?.uses?.value,i=e?.uses?.max;return{text:t&&i>=0?`${t}/${i}`:""}}#e(){const e=["character","npc"],t=canvas.tokens.controlled.map((e=>e.actor));if(t.every((t=>e.includes(t.type))))return t}#D(e){const t=e.system.equipped?.carryType;return!!this.addUnequippedItems||!(!["held","worn"].includes(t)||e.system.containerId?.value?.length)}#N(e,t){return"stowed"!==t.system.equipped?.carryType||this.#W(e,t)}#W(e,t){return"stowed"!==t.system.equipped?.carryType||("both"===this.addStowedItems||("container"===e&&"containers"===this.addStowedItems||"nonContainer"===e&&"nonContainers"===this.addStowedItems))}#T(e){return{info1:{text:this.#B(e)??""}}}#B(e){const t=e?.system?.quantity?.value;return t>1?t:""}#M(e,t=""){return["bow-arrow","axe"].includes(e)?``:s[e]}#R(t){let i="";if("held"===t?.carryType)i=2===t?.handsHeld?"held2":"held1";else i=t?.carryType;const s=e.api.Utils.i18n(n[i]?.tooltip)??"";return n[i]?.icon.replace("placeholder",s)??""}#Y(e,t){return e?.sort||t?.sort?e.sort-t.sort:0}async#U(t){if("string"==typeof t)return t;const i=e.api.Utils.i18n(t.name),s=`

${i}

`,a=e.api.Utils.i18n(t?.description??t?.descriptionLocalised??""),n=t?.rarity?`${e.api.Utils.i18n(t.rarity.label)}`:"",o=t?.properties?`
${t.properties.map((t=>`${e.api.Utils.i18n(t)}`)).join("")}
`:"",l=t?.traits?t.traits.map((t=>`${e.api.Utils.i18n(t.label)}`)).join(""):"",c=t?.traits2?t.traits2.map((t=>`${e.api.Utils.i18n(t.label??t)}`)).join(""):"",r=t?.traitsAlt?t.traitsAlt.map((t=>`${e.api.Utils.i18n(t.label)}`)).join(""):"",d=t?.modifiers?`
${t.modifiers.filter((e=>e.enabled)).map((t=>`${e.api.Utils.i18n(t.label)} ${`${t.modifier>=0?"+":""}${t.modifier??""}`}`)).join("")}
`:"",m=[n,l,c,r].join(""),p=m?`
${m}
`:"",u=p||d?`
${p}${d}
`:"";if(!a&&!p&&!d)return i;return await TextEditor.enrichHTML(`
${s}${u}${a}${o}
`,{async:!0})}#O(t){return`${t?.description?`

${e.api.Utils.i18n(t?.description)}

`:""}${t?.criticalSuccess?`

${e.api.Utils.i18n("PF2E.Check.Result.Degree.Check.criticalSuccess")}

${e.api.Utils.i18n(t?.criticalSuccess)}

`:""}${t?.success?`

${e.api.Utils.i18n("PF2E.Check.Result.Degree.Check.success")}

${e.api.Utils.i18n(t?.success)}

`:""}`}}}));let f=null;Hooks.once("tokenActionHudCoreApiReady",(async e=>{const t=m;Object.values(t).forEach((t=>{t.name=e.api.Utils.i18n(t.name),t.listName=`Group: ${e.api.Utils.i18n(t.listName??t.name)}`}));const i=Object.values(t);f={layout:[{nestId:"attack",id:"attack",name:e.api.Utils.i18n("PF2E.AttackLabel"),groups:[{...t.attack,nestId:"attack_attack"}]},{nestId:"strikes",id:"strikes",name:e.api.Utils.i18n("PF2E.StrikesLabel"),groups:[{...t.toggles,nestId:"strikes_toggles"},{...t.strikes,nestId:"strikes_strikes"}],settings:{customWidth:500}},{nestId:"actions",id:"actions",name:e.api.Utils.i18n("PF2E.ActionsActionsHeader"),groups:[{...t.actions,nestId:"actions_actions"},{...t.reactions,nestId:"actions_reactions"},{...t.freeActions,nestId:"actions_free-actions"},{...t.passives,nestId:"actions_passives"}]},{nestId:"inventory",id:"inventory",name:e.api.Utils.i18n("PF2E.TabInventoryLabel"),groups:[{...t.weapons,nestId:"inventory_weapons"},{...t.armor,nestId:"inventory_armor"},{...t.equipment,nestId:"inventory_equipment"},{...t.consumables,nestId:"inventory_consumables"},{...t.containers,nestId:"inventory_containers"},{...t.treasure,nestId:"inventory_treasure"}]},{nestId:"feats",id:"feats",name:e.api.Utils.i18n("PF2E.TabFeatsLabel"),groups:[{...t.ancestryFeatures,nestId:"feats_ancestry-features"},{...t.classFeatures,nestId:"feats_class-features"},{...t.ancestryFeats,nestId:"feats_ancestry-feats"},{...t.classFeats,nestId:"feats_class-feats"},{...t.skillFeats,nestId:"feats_skill-feats"},{...t.generalFeats,nestId:"feats_general-feats"},{...t.bonusFeats,nestId:"feats_bonus-feats"}]},{nestId:"spells",id:"spells",name:e.api.Utils.i18n("PF2E.SpellLabelPlural"),groups:[{...t.spells,nestId:"spells_spells"}]},{nestId:"attributes",id:"attributes",name:e.api.Utils.i18n("tokenActionHud.pf2e.attributes"),groups:[{...t.heroPoints,nestId:"attributes_hero-points"},{...t.initiative,nestId:"attributes_initiative"},{...t.perceptionCheck,nestId:"attributes_perception-check"},{...t.saves,nestId:"attributes_saves"}]},{nestId:"skills",id:"skills",name:e.api.Utils.i18n("PF2E.SkillsLabel"),groups:[{...t.coreSkills,nestId:"skills_core-skills"},{...t.loreSkills,nestId:"skills_lore-skills"}]},{nestId:"effects",id:"effects",name:e.api.Utils.i18n("PF2E.EffectsLabel"),groups:[{...t.conditions,nestId:"effects_conditions"},{...t.effects,nestId:"effects_effects"}]},{nestId:"utility",id:"utility",name:e.api.Utils.i18n("tokenActionHud.utility"),groups:[{...t.combat,nestId:"utility_combat"},{...t.token,nestId:"utility_token"},{...t.recoveryCheck,nestId:"utility_recovery-check"},{...t.rests,nestId:"utility_rests"},{...t.utility,nestId:"utility_utility"}]}],groups:i}}));let y=null;function register(t){game.settings.register(e.ID,"calculateAttackPenalty",{name:game.i18n.localize("tokenActionHud.pf2e.setting.calculateAttackPenalty.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.calculateAttackPenalty.hint"),scope:"client",config:!0,type:Boolean,default:!0,onChange:e=>{t(e)}}),game.settings.register(e.ID,"colorSkills",{name:game.i18n.localize("tokenActionHud.pf2e.setting.colorSkills.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.colorSkills.hint"),scope:"client",config:!0,type:Boolean,default:!0,onChange:e=>{t(e)}}),game.settings.register(e.ID,"showStrikeImages",{name:game.i18n.localize("tokenActionHud.pf2e.setting.showStrikeImages.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.showStrikeImages.hint"),scope:"client",config:!0,type:Boolean,default:!0,onChange:e=>{t(e)}}),game.settings.register(e.ID,"showStrikeNames",{name:game.i18n.localize("tokenActionHud.pf2e.setting.showStrikeNames.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.showStrikeNames.hint"),scope:"client",config:!0,type:Boolean,default:!1,onChange:e=>{t(e)}}),game.settings.register(e.ID,"splitStrikes",{name:game.i18n.localize("tokenActionHud.pf2e.setting.splitStrikes.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.splitStrikes.hint"),scope:"client",config:!0,type:Boolean,default:!0,onChange:e=>{t(e)}}),game.settings.register(e.ID,"addAuxiliaryActions",{name:game.i18n.localize("tokenActionHud.pf2e.setting.addAuxiliaryActions.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.addAuxiliaryActions.hint"),scope:"client",config:!0,type:Boolean,default:!0,onChange:e=>{t(e)}}),game.settings.register(e.ID,"addDamageAndCritical",{name:game.i18n.localize("tokenActionHud.pf2e.setting.addDamageAndCritical.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.addDamageAndCritical.hint"),scope:"client",config:!0,type:Boolean,default:!0,onChange:e=>{t(e)}}),game.settings.register(e.ID,"addStowedItems",{name:game.i18n.localize("tokenActionHud.pf2e.setting.addStowedItems.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.addStowedItems.hint"),scope:"client",config:!0,type:String,default:"containers",choices:{containers:game.i18n.localize("tokenActionHud.pf2e.setting.addStowedItems.choice.containers"),nonContainers:game.i18n.localize("tokenActionHud.pf2e.setting.addStowedItems.choice.nonContainers"),both:game.i18n.localize("tokenActionHud.pf2e.setting.addStowedItems.choice.both"),none:game.i18n.localize("tokenActionHud.pf2e.setting.addStowedItems.choice.none")},onChange:e=>{t(e)}}),game.settings.register(e.ID,"addUnequippedItems",{name:game.i18n.localize("tokenActionHud.pf2e.setting.addUnequippedItems.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.addUnequippedItems.hint"),scope:"client",config:!0,type:Boolean,default:!1,onChange:e=>{t(e)}})}Hooks.once("tokenActionHudCoreApiReady",(async e=>{y=class RollHandler extends e.api.RollHandler{BLIND_ROLL_MODE="blindRoll";async doHandleActionEvent(e,t){const i=t.split("|");2!==i.length&&super.throwInvalidValueErr();const s=i[0],a=i[1];this.#Q();if(["item","feat","action","lore","ammo"].includes(s)&&this.isRenderItem())return this.doRenderItem(this.actor,a);const n=["character","familiar","hazard","npc"];if(this.actor)await this.#X(e,s,this.actor,this.token,a);else{const t=canvas.tokens.controlled.filter((e=>n.includes(e.actor?.type)));for(const i of t){const t=i.actor;await this.#X(e,s,t,i,a)}}}#Q(){const e=game.user.getFlag("pf2e","showRollDialogs");this.rollMode=this.ctrl?"gmroll":null,this.skipDialog=e?this.shift:!this.shift}async#X(e,t,i,s,a){let n;i&&(n=i.type);if(!["ability","spell","item","skill","lore","utility","toggle","strike"].includes(t))switch(n){case"npc":await this.#J(e,t,i,s,a);break;case"character":case"familiar":case"hazard":await this.#K(e,t,i,s,a)}switch(t){case"ability":this.#Z(e,i,a);break;case"action":case"feat":case"item":this.#ee(e,i,a);break;case"condition":this.#te(i,a);break;case"effect":this.#ie(i,a);break;case"heroAction":this.#se(i,a);break;case"spell":await this.#ae(i,a);break;case"skill":await this.#ne(e,i,a);break;case"strike":this.#oe(e,i,a);break;case"toggle":await this.#le(i,a);break;case"utility":this.#ce(s,a)}}async#K(e,t,i,s,a){switch(t){case"save":this.#re(i,a);break;case"initiative":this.#de(e,i,a);break;case"attribute":case"perceptionCheck":{const e={rollMode:this.rollMode,skipDialog:this.skipDialog};this.actor.perception.roll(e);break}case"spellSlot":await this.#me(i,a);break;case"heroPoints":await this.#pe("heroPoints","value",i);break;case"recoveryCheck":i.rollRecovery({event:e});break;case"familiarAttack":this.#ue(e,i);break;case"auxAction":this.#he(i,a);break;case"versatileOption":this.#ge(i,a)}}async#J(e,t,i,s,a){switch(t){case"initiative":this.#de(e,i,a);break;case"attribute":case"perceptionCheck":await this.#fe(e,i,a);break;case"save":this.#re(i,a);break;case"strike":this.#ye(e,i,a)}}async#ne(e,t,i){const s=t.skills[i];await s.check.roll({event:e})}#Z(e,t,i){t.rollAbility(e,i)}async#de(e,t,i){await t.update({"system.attributes.initiative.statistic":i});const s={rollMode:this.rollMode,skipDialog:this.skipDialog};t.initiative.roll(s)}async#fe(e,t,i){t.rollAttribute(e,i)}async#me(e,t){const i=decodeURIComponent(t).split(">"),s=i[0],a=i[1],n=i[2],o=e.items.get(s);let l,c,r;if("focus"===a)l=e.system.resources.focus.value,c=e.system.resources.focus.max;else{const e=o.system.slots;l=e[a].value,c=e[a].max}switch(n){case"slotIncrease":if(l>=c)break;l++;break;case"slotDecrease":if(l<=0)break;l--}"focus"===a?e.update({"data.resources.focus.value":l}):(r=[{_id:o.id,data:{slots:{[a]:{value:l}}}}],await Item.updateDocuments(r,{parent:e})),Hooks.callAll("forceUpdateTokenActionHud")}#re(e,t){const i={rollMode:this.rollMode,skipDialog:this.skipDialog};e.saves[t].check.roll(i)}#oe(e,t,i){const s=decodeURIComponent(i).split(">"),a=s[0],n=s[1],o=s[2],l=s[3]?s[3]:null;let c=null,r=t.system.actions.filter((e=>"strike"===e.type)).find((e=>e.item.id===a&&e.slug===n));if(this.isRenderItem()){const e=r.item;if(e&&"xxPF2ExUNARMEDxx"!==e.id)return this.doRenderItem(t,e.id)}if(r.altUsages?.length)switch(!0){case"melee"===l&&!r.item.isMelee:c=l,r=r.altUsages.find((e=>e.item.isMelee));break;case"ranged"===l&&!r.item.isRanged:c=l,r=r.altUsages.find((e=>e.item.isRanged));break;case"thrown"===l&&!r.item.isThrown:c=l,r=r.altUsages.find((e=>e.item.isThrown))}switch(o){case"damage":r.damage({event:e});break;case"critical":r.critical({event:e});break;default:r.variants[o]?.roll({event:e,altUsage:c})}}#he(e,t){const i=decodeURIComponent(t).split(">"),s=i[0],a=i[1],n=i[2],o=i[3]?i[3]:null,l=e.system.actions.filter((e=>"strike"===e.type)).find((e=>e.item.id===s&&e.slug===a));if(this.isRenderItem()){const t=l.origin;if(t)return this.doRenderItem(e,t.id)}l.auxiliaryActions[n]?.execute({selection:o})}async#ge(t,i){const s=decodeURIComponent(i).split(">"),a=s[0],n=s[2],o=e.api.Utils.getItem(t,a);await async function toggleWeaponTrait({weapon:e,trait:t,selection:i}){if(e.system.traits.toggles[t].selection===i)return!1;const s=e.actor?.items.get(e.id);if(s?.isOfType("weapon")&&s===e)await s.update({[`system.traits.toggles.${t}.selection`]:i});else if(s?.isOfType("weapon")&&"melee"===e.altUsageType)s.update({[`system.meleeUsage.traitToggles.${t}`]:i});else{const a=s?.rules.find((t=>"Strike"===t.key&&!t.ignored&&t.slug===e.slug));await(a?.toggleTrait({trait:t,selection:i}))}return!0}({weapon:o,trait:"versatile",selection:n})}#ye(e,t,i){const s=decodeURIComponent(i).split(">"),a=s[0],n=s[1],o=s[2],l=t.system.actions.filter((e=>"strike"===e.type)).find((e=>e.item.id===a&&e.slug===n));if("plus"===a){const i=t.items.find((e=>0===o.toUpperCase().localeCompare(e.name.toUpperCase(),void 0,{sensitivity:"base"})));return this.isRenderItem()?this.doRenderItem(t,i.id):void i.toChat(e)}if(this.isRenderItem())return this.doRenderItem(t,a);switch(o){case"damage":l.rollNPCDamage(e);break;case"critical":l.rollNPCDamage(e,!0);break;case"0":l.rollNPCAttack(e);break;case"1":l.rollNPCAttack(e,2);break;case"2":l.rollNPCAttack(e,3)}}#ee(e,t,i){t.items.get(i).toChat(e)}#ue(e,t){const i=t.getRollOptions(["all","attack"]);t.system.attack.roll({event:e,options:i})}async#ae(e,t){const i=decodeURIComponent(t).split(">"),[s,a,n,o]=i;if(this.isRenderItem())return this.doRenderItem(e,n);const l=e.items.get(s),c=e.items.get(n);l&&c&&(await l.cast(c,{message:!o,consume:!0,level:Number(a)}),Hooks.callAll("forceUpdateTokenActionHud"))}async#ce(e,t){switch(t){case"treatWounds":this.#ke("6duZj0Ygiqv712rq");break;case"rest":this.#ke("0GU2sdy3r2MeC56x");break;case"takeBreather":this.#ke("aS6F7PSUlS9JM5jr");break;case"endTurn":game.combat?.current?.tokenId===e.id&&await(game.combat?.nextTurn())}}async#ke(e){game.packs.get("pf2e.pf2e-macros").getDocument(e).then((e=>e.execute()))}async#pe(e,t,i){let s=i.system.resources[e][t];const a=i.system.resources[e].max;if(this.rightClick){if(s<=0)return;s--}else{if(s>=a)return;s++}const n=[{_id:i.id,data:{resources:{[e]:{[t]:s}}}}];await Actor.updateDocuments(n),Hooks.callAll("forceUpdateTokenActionHud")}async#te(e,t){this.rightClick?e.decreaseCondition(t):e.increaseCondition(t),Hooks.callAll("forceUpdateTokenActionHud")}async#ie(t,i){const s=e.api.Utils.getItem(t,i);this.rightClick?s.decrease():s.increase(),Hooks.callAll("forceUpdateTokenActionHud")}async#se(e,t){"drawHeroActions"===t?await(game.modules.get("pf2e-hero-actions")?.api?.drawHeroActions(e)):await(game.modules.get("pf2e-hero-actions")?.api?.useHeroAction(e,t)),Hooks.callAll("forceUpdateTokenActionHud")}async#le(e,t){const i=JSON.parse(t);i.domain&&i.option&&await e.toggleRollOption(i.domain,i.option,i.itemId)}}}));let k=null;Hooks.once("tokenActionHudCoreApiReady",(async e=>{k=class SystemManager extends e.api.SystemManager{doGetCategoryManager(t){return new e.api.CategoryManager}doGetActionHandler(e){return new g(e)}getAvailableRollHandlers(){return{core:"Core PF2E"}}doGetRollHandler(e){let t;return t=new y,t}doRegisterSettings(e){register(e)}async doRegisterDefaultFlags(){const t=f;if(game.modules.get("pf2e-hero-actions")?.active){const i=e.api.Utils.i18n("tokenActionHud.group"),s=e.api.Utils.i18n("tokenActionHud.pf2e.heroActions");t.groups.push({id:"hero-actions",name:s,listName:`${i}: ${s}`,type:"system"}),t.groups.sort(((e,t)=>e.id.localeCompare(t.id)))}return t}}})),Hooks.on("tokenActionHudCoreApiReady",(async()=>{const t=game.modules.get(e.ID);t.api={requiredCoreModuleVersion:"1.4",SystemManager:k},Hooks.call("tokenActionHudSystemReady",t)}));export{s as ACTION_ICON,a as ACTION_TYPE,g as ActionHandler,n as CARRY_TYPE_ICON,t as CORE_MODULE,f as DEFAULTS,m as GROUP,o as ITEM_TYPE,l as MODULAR_OPTION,e as MODULE,i as REQUIRED_CORE_MODULE_VERSION,y as RollHandler,u as SKILL,c as SKILL_ABBREVIATION,p as SKILL_ACTION,r as STRIKE_ICON,d as STRIKE_USAGE,k as SystemManager,h as Utils,register}; +const e={ID:"token-action-hud-pf2e"},t={ID:"token-action-hud-core"},i="1.4",s={1:"A",2:"D",3:"T",free:"F",reaction:"R",passive:"",A:"A",D:"D",T:"T",F:"F",R:"R","bow-arrow":"fa-solid fa-bow-arrow fa-fw",axe:"fa-solid fa-axe fa-fw"},a={action:"TYPES.Item.action",attribute:"tokenActionHud.pf2e.attribute",auxAction:"PF2E.WeaponStrikeLabel",condition:"TYPES.Item.condition",effect:"TYPES.Item.effect",familiarAttack:"PF2E.AttackLabel",feat:"PF2E.Item.Feat.LevelLabel",heroAction:"tokenActionHud.pf2e.heroAction",initiative:"PF2E.InitiativeLabel",item:"PF2E.ItemTitle",save:"tokenActionHud.pf2e.save",skill:"PF2E.SkillLabel",skillAction:"tokenActionHud.pf2e.skillAction",spell:"TYPES.Item.spell",strike:"PF2E.WeaponStrikeLabel",toggle:"tokenActionHud.pf2e.toggle",utility:"tokenActionHud.utility"},n={held1:{icon:'',tooltip:"PF2E.CarryType.held1"},held2:{icon:'',tooltip:"PF2E.CarryType.held2"},dropped:{icon:'',tooltip:"PF2E.CarryType.dropped"},stowed:{icon:'',tooltip:"PF2E.CarryType.stowed"},worn:{icon:'',tooltip:"PF2E.CarryType.worn"}},o={armor:{groupId:"armor"},consumable:{groupId:"consumables"},backpack:{groupId:"containers"},equipment:{groupId:"equipment"},treasure:{groupId:"treasure"},weapon:{groupId:"weapons"}},l={bludgeoning:"PF2E.TraitBludgeoning",piercing:"PF2E.TraitPiercing",slashing:"PF2E.TraitSlashing"},c={acrobatics:"acr",arcana:"arc",athletics:"ath",crafting:"cra",deception:"dec",diplomacy:"dip",intimidation:"itm",medicine:"med",nature:"nat",occultism:"occ",performance:"prf",perception:"per",religion:"rel",society:"soc",stealth:"ste",survival:"sur",thievery:"thi"},r={melee:"systems/pf2e/icons/mdi/sword.svg",thrown:"systems/pf2e/icons/mdi/thrown.svg"},d={melee:{name:"PF2E.WeaponRangeMelee"},ranged:{name:"PF2E.NPCAttackRanged"},thrown:{name:"PF2E.TraitThrown"}},m={attack:{id:"attack",name:"PF2E.AttackLabel",type:"system"},toggles:{id:"toggles",name:"PF2E.TogglesLabel",type:"system"},strikes:{id:"strikes",name:"PF2E.StrikesLabel",type:"system"},actions:{id:"actions",name:"PF2E.ActionsActionsHeader",type:"system"},reactions:{id:"reactions",name:"PF2E.ActionsReactionsHeader",type:"system"},freeActions:{id:"free-actions",name:"PF2E.ActionsFreeActionsHeader",type:"system"},passives:{id:"passives",name:"PF2E.NPC.PassivesLabel",type:"system"},skillActionsGrouped:{id:"skill-actions-grouped",name:"tokenActionHud.pf2e.skillActions",listName:"tokenActionHud.pf2e.skillActionsGrouped",type:"system"},skillActionsUngrouped:{id:"skill-actions-ungrouped",name:"tokenActionHud.pf2e.skillActions",listName:"tokenActionHud.pf2e.skillActionsUngrouped",type:"system",settings:{sort:!0}},weapons:{id:"weapons",name:"PF2E.InventoryWeaponsHeader",type:"system"},armor:{id:"armor",name:"PF2E.InventoryArmorHeader",type:"system"},equipment:{id:"equipment",name:"PF2E.InventoryEquipmentHeader",type:"system"},consumables:{id:"consumables",name:"PF2E.InventoryConsumablesHeader",type:"system"},containers:{id:"containers",name:"PF2E.InventoryBackpackHeader",type:"system"},treasure:{id:"treasure",name:"PF2E.InventoryTreasureHeader",type:"system"},ancestryFeatures:{id:"ancestry-features",name:"PF2E.FeaturesAncestryHeader",type:"system"},classFeatures:{id:"class-features",name:"PF2E.FeaturesClassHeader",type:"system"},ancestryFeats:{id:"ancestry-feats",name:"PF2E.FeatAncestryHeader",type:"system"},classFeats:{id:"class-feats",name:"PF2E.FeatClassHeader",type:"system"},skillFeats:{id:"skill-feats",name:"PF2E.FeatSkillHeader",type:"system"},generalFeats:{id:"general-feats",name:"PF2E.FeatGeneralHeader",type:"system"},bonusFeats:{id:"bonus-feats",name:"PF2E.FeatBonusHeader",type:"system"},spells:{id:"spells",name:"PF2E.SpellLabelPlural",type:"system"},heroPoints:{id:"hero-points",name:"PF2E.HeroPointsLabel",type:"system"},initiative:{id:"initiative",name:"PF2E.InitiativeLabel",type:"system"},perceptionCheck:{id:"perception-check",name:"PF2E.PerceptionLabel",type:"system"},coreSkills:{id:"core-skills",name:"PF2E.CoreSkillsHeader",type:"system"},loreSkills:{id:"lore-skills",name:"PF2E.LoreSkillsHeader",type:"system"},conditions:{id:"conditions",name:"PF2E.ConditionsLabel",type:"system"},effects:{id:"effects",name:"PF2E.EffectsLabel",type:"system"},combat:{id:"combat",name:"tokenActionHud.combat",type:"system"},token:{id:"token",name:"tokenActionHud.token",type:"system"},recoveryCheck:{id:"recovery-check",name:"PF2E.Check.Specific.Recovery",type:"system"},rests:{id:"rests",name:"tokenActionHud.pf2e.rests",type:"system"},saves:{id:"saves",name:"PF2E.SavesHeader",type:"system"},utility:{id:"utility",name:"tokenActionHud.utility",type:"system"}},p={l5pbgrj8SSNtRGs8:{name:"PF2E.Actions.AdministerFirstAid.Stabilize.Title",actionCost:2,skill:"medicine",image:"systems/pf2e/icons/features/feats/treat-wounds.webp"},ZEWD4zcEDQwYhVT8:{name:"PF2E.Actions.AdministerFirstAid.StopBleeding.Title",actionCost:2,skill:"medicine",image:"systems/pf2e/icons/conditions/persistent-damage.webp"},"55mxH0w8UkY1o3Xv":{name:"PF2E.Actions.Balance.Title",skill:"acrobatics",actionCost:1,image:"icons/skills/movement/feet-winged-boots-brown.webp"},LXCy1iJddD95Z91s:{name:"PF2E.Actions.Climb.Title",skill:"athletics",actionCost:1,image:"icons/sundries/misc/ladder.webp"},"9RNumMausgG7adgL":{name:"PF2E.Actions.Coerce.Title",skill:"intimidation",actionCost:"passive",image:"icons/skills/social/intimidation-impressing.webp"},xcrdOOiN0l6O1sIn:{name:"PF2E.Actions.CommandAnAnimal.Title",skill:"nature",actionCost:1,image:"icons/environment/creatures/horse-white.webp"},zn0HadZeoKDALxRu:{name:"PF2E.Actions.ConcealAnObject.Title",skill:"stealth",actionCost:1,image:"systems/pf2e/icons/equipment/adventuring-gear/wax-key-blank.webp"},Tu7LIRelQsiOuo1l:{name:"PF2E.Actions.Craft.Title",skill:"crafting",actionCost:"passive",image:"icons/skills/trades/smithing-anvil-silver-red.webp"},aDsYSdRqiC6qQIOQ:{name:"PF2E.Actions.CreateADiversion.DistractingWords.Title",skill:"deception",actionCost:1,image:"icons/magic/control/mouth-smile-deception-purple.webp"},zUJ0UhuoFt5a7tiN:{name:"PF2E.Actions.CreateADiversion.Gesture.Title",skill:"deception",actionCost:1,image:"icons/skills/social/wave-halt-stop.webp"},"1JpYPlIkjyseE9JU":{name:"PF2E.Actions.CreateADiversion.Trick.Title",skill:"deception",actionCost:1,image:"systems/pf2e/icons/spells/charming-words.webp"},mNphXpAkmGsMadUv:{name:"PF2E.Actions.CreateForgery.Title",skill:"society",actionCost:"passive",image:"systems/pf2e/icons/spells/transcribe-moment.webp"},U6WjxFPn4fUqIrfl:{name:"PF2E.Actions.DecipherWriting.Title",skill:"arcana",actionCost:"passive",image:"icons/skills/trades/academics-book-study-runes.webp"},RZyfkw1DiqVy3JUC:{name:"PF2E.Actions.DecipherWriting.Title",skill:"occultism",actionCost:"passive",image:"icons/skills/trades/academics-book-study-purple.webp"},sDUERv4E88G5BRPr:{name:"PF2E.Actions.DecipherWriting.Title",skill:"religion",actionCost:"passive",image:"systems/pf2e/icons/equipment/other/spellbooks/thresholds-of-truth.webp"},YWAvvDXpdW1fYPFo:{name:"PF2E.Actions.DecipherWriting.Title",skill:"society",actionCost:"passive",image:"icons/skills/trades/academics-study-reading-book.webp"},nEwqNNWX6scLt4sc:{name:"PF2E.Actions.Demoralize.Title",skill:"intimidation",actionCost:1,image:"icons/skills/social/intimidation-impressing.webp"},T2QNEoRojMWEec4a:{name:"PF2E.Actions.DisableDevice.Title",skill:"thievery",actionCost:2,image:"systems/pf2e/icons/equipment/adventuring-gear/thieves-tools.webp"},ooiO59Ch2QaebOmc:{name:"PF2E.Actions.Disarm.Title",skill:"athletics",actionCost:1,image:"icons/skills/melee/sword-damaged-broken-glow-red.webp"},"50Q0DYL33Kalu1BH":{name:"PF2E.Actions.Escape.Title",skill:"acrobatics",actionCost:1,image:"icons/skills/movement/feet-winged-boots-glowing-yellow.webp"},lkEcQQss16SIrVxM:{name:"PF2E.Actions.Escape.Title",skill:"athletics",actionCost:1,image:"icons/skills/movement/feet-winged-boots-glowing-yellow.webp"},RjfPFjqPrNve6eeh:{name:"PF2E.Actions.Feint.Title",skill:"deception",actionCost:1,image:"icons/skills/melee/maneuver-sword-katana-yellow.webp"},yMTKMnaYSGtDz4wk:{name:"PF2E.Actions.ForceOpen.Title",skill:"athletics",actionCost:1,image:"icons/equipment/feet/boots-armored-steel.webp"},rCgGPEyXbzLFcio6:{name:"PF2E.Actions.GatherInformation.Title",skill:"diplomacy",actionCost:"passive",image:"icons/skills/social/diplomacy-handshake.webp"},i95kcGLIQKOTsnv6:{name:"PF2E.Actions.Grapple.Title",skill:"athletics",actionCost:"passive",image:"icons/skills/melee/unarmed-punch-fist.webp"},FlM3HvpnsZpCKawG:{name:"PF2E.Actions.Hide.Title",skill:"stealth",actionCost:1,image:"systems/pf2e/icons/features/classes/wild.webp"},v3dlDjFlOmT5T2gC:{name:"PF2E.Actions.HighJump.Title",skill:"athletics",actionCost:2,image:"icons/skills/movement/arrows-up-trio-red.webp"},k5nW4jGyXD0Oq9LR:{name:"PF2E.Actions.Impersonate.Title",skill:"deception",actionCost:"passive",image:"icons/equipment/head/mask-carved-scream-tan.webp"},VTg4t8kYTvXcHROq:{name:"PF2E.Actions.Lie.Title",skill:"deception",actionCost:"passive",image:"icons/magic/control/mouth-smile-deception-purple.webp"},QPsV0qi2zXm7syt6:{name:"PF2E.Actions.LongJump.Title",skill:"athletics",actionCost:2,image:"icons/skills/movement/figure-running-gray.webp"},"1Sj2Pz3VI2SFWqZw":{name:"PF2E.Actions.MakeAnImpression.Title",skill:"diplomacy",actionCost:"passive",image:"icons/environment/people/commoner.webp"},"9Ul5Op5OceT9P5SS":{name:"PF2E.Actions.ManeuverInFlight.Title",skill:"acrobatics",actionCost:1,image:"icons/commodities/biological/wing-bird-white.webp"},Gj68YCVlDjc75iCP:{name:"PF2E.Actions.PalmAnObject.Title",skill:"thievery",actionCost:1,image:"icons/sundries/gaming/playing-cards.webp"},dWcrojMk0d2WRPBq:{name:"PF2E.Actions.Perform.Title",skill:"performance",actionCost:1,image:"icons/skills/trades/music-singing-voice-blue.webp"},"8YrH37NzKRuiKFbF":{name:"PF2E.Actions.PickALock.Title",skill:"thievery",actionCost:2,image:"icons/sundries/misc/lock-bronze-reinforced.webp"},BQTA7bL264189Xla:{name:"PF2E.Actions.Repair.Title",skill:"crafting",actionCost:"passive",image:"icons/tools/smithing/anvil.webp"},tbveXG4gaIoKnsWX:{name:"PF2E.Actions.Request.Title",skill:"diplomacy",actionCost:1,image:"icons/skills/social/thumbsup-approval-like.webp"},tikhJ2b6AMh7wQU7:{name:"PF2E.Actions.Seek.Title",skill:"perception",actionCost:1,image:"icons/tools/scribal/magnifying-glass.webp"},LN67MgbGE8IHb2X0:{name:"PF2E.Actions.SenseDirection.Title",skill:"survival",actionCost:"passive",image:"icons/tools/navigation/compass-brass-blue-red.webp"},PmHt7Gb5fCrlWWTr:{name:"PF2E.Actions.SenseMotive.Title",skill:"perception",actionCost:1,image:"icons/environment/people/commoner.webp"},yNry1xMZqdWHncbV:{name:"PF2E.Actions.Shove.Title",skill:"athletics",actionCost:1,image:"systems/pf2e/icons/spells/hydraulic-push.webp"},HSTkVuv0SjTNK3Xx:{name:"PF2E.Actions.Sneak.Title",skill:"stealth",actionCost:1,image:"systems/pf2e/icons/conditions/unnoticed.webp"},UKHPveLpG7hUs4D0:{name:"PF2E.Actions.Squeeze.Title",skill:"acrobatics",actionCost:"passive",image:"icons/commodities/tech/claw-mechanical.webp"},zjovbAeuLvyuWFKd:{name:"PF2E.Actions.Steal.Title",skill:"thievery",actionCost:1,image:"icons/containers/bags/coinpouch-gold-red.webp"},mkKko3CEBCyJVQw1:{name:"PF2E.Actions.Subsist.Title",skill:"society",actionCost:"passive",image:"icons/environment/settlement/building-rubble.webp"},zkqh01BoXDVgydzo:{name:"PF2E.Actions.Subsist.Title",skill:"survival",actionCost:"passive",image:"icons/environment/wilderness/camp-improvised.webp"},TIlUkCzviYxdVk4E:{name:"PF2E.Actions.Swim.Title",skill:"athletics",actionCost:1,image:"icons/creatures/fish/fish-shark-swimming.webp"},Al5LYMMdeDcpC9Br:{name:"PF2E.Actions.Track.Title",skill:"survival",actionCost:"passive",image:"systems/pf2e/icons/conditions/observed.webp"},m4iM5r3TfvQs5Y2n:{name:"PF2E.Actions.TreatDisease.Title",skill:"medicine",actionCost:"passive",image:"icons/magic/nature/root-vine-caduceus-healing.webp"},R03LRl2RBbsm6EcF:{name:"PF2E.Actions.TreatPoison.Title",skill:"medicine",actionCost:1,image:"systems/pf2e/icons/effects/treat-poison.webp"},gRj7xUfcpUZQLrOC:{name:"PF2E.Actions.Trip.Title",skill:"athletics",actionCost:1,image:"icons/skills/wounds/bone-broken-marrow-yellow.webp"},"2qhYHkcSsTJoSwrJ":{name:"PF2E.Actions.TumbleThrough.Title",skill:"acrobatics",actionCost:1,image:"icons/skills/movement/feet-winged-sandals-tan.webp"}},u={acrobatics:{name:"PF2E.SkillAcrobatics"},arcana:{name:"PF2E.SkillArcana"},athletics:{name:"PF2E.SkillAthletics"},crafting:{name:"PF2E.SkillCrafting"},deception:{name:"PF2E.SkillDeception"},diplomacy:{name:"PF2E.SkillDiplomacy"},intimidation:{name:"PF2E.SkillIntimidation"},lore:{name:"PF2E.SkillLore"},medicine:{name:"PF2E.SkillMedicine"},nature:{name:"PF2E.SkillNature"},occultism:{name:"PF2E.SkillOccultism"},perception:{name:"PF2E.PerceptionLabel"},performance:{name:"PF2E.SkillPerformance"},religion:{name:"PF2E.SkillReligion"},society:{name:"PF2E.SkillSociety"},stealth:{name:"PF2E.SkillStealth"},survival:{name:"PF2E.SkillSurvival"},thievery:{name:"PF2E.SkillThievery"}};let h=null;Hooks.once("tokenActionHudCoreApiReady",(async t=>{h=class Utils{static getSetting(i,s=null){let a=s??null;try{a=game.settings.get(e.ID,i)}catch{t.api.Logger.debug(`Setting '${i}' not found`)}return a}static async setSetting(i,s){try{s=await game.settings.set(e.ID,i,s),t.api.Logger.debug(`Setting '${i}' set to '${s}'`)}catch{t.api.Logger.debug(`Setting '${i}' not found`)}}}}));let g=null;Hooks.once("tokenActionHudCoreApiReady",(async e=>{g=class ActionHandler extends e.api.ActionHandler{actors=null;actorId=null;actorType=null;tokenId=null;items=null;groupIds=null;activationGroupIds=null;effectGroupIds=null;inventoryGroupIds=null;spellGroupIds=null;featureActions=null;inventoryActions=null;spellActions=null;async buildSystemActions(t){this.actors=this.actor?[this.actor]:this.#e(),this.actorType=this.actor?.type;if(!this.actorType||["character","familiar","hazard","npc"].includes(this.actorType)){if(this.actor){let t=this.actor.items;t=e.api.Utils.sortItemsByName(t),this.items=t}this.abbreviateSkills=h.getSetting("abbreviateSkills"),this.addAuxiliaryActions=h.getSetting("addAuxiliaryActions"),this.addDamageAndCritical=h.getSetting("addDamageAndCritical"),this.addStowedItems=h.getSetting("addStowedItems"),this.addUnequippedItems=h.getSetting("addUnequippedItems"),this.calculateAttackPenalty=h.getSetting("calculateAttackPenalty"),this.colorSkills=h.getSetting("colorSkills"),this.showStrikeImages=h.getSetting("showStrikeImages"),this.showStrikeNames=h.getSetting("showStrikeNames"),this.splitStrikes=h.getSetting("splitStrikes"),this.groupIds=t,"character"===this.actorType?await this.#t():"familiar"===this.actorType?await this.#i():"hazard"===this.actorType?await this.#s():"npc"===this.actorType?await this.#a():this.actor||this.#n()}}async#t(){await Promise.all([this.#o(),this.#l(),this.#c(),this.#r(),this.#d(),this.#m(),this.#p(),this.#u(),this.#h(),this.#g(),this.#f(),this.#y(),this.#k()]),this.#b(),this.#A(),this.#v(),this.#w(),this.#I()}async#i(){await Promise.all([this.#o(),this.#l(),this.#p(),this.#u(),this.#h(),this.#f()]),this.#C(),this.#b(),this.#c()}async#s(){await Promise.all([this.#o(),this.#m(),this.#h()]),this.#b()}async#a(){await Promise.all([this.#o(),this.#l(),this.#c(),this.#r(),this.#m(),this.#p(),this.#u(),this.#h(),this.#g(),this.#f(),this.#k(),this.#y()]),this.#b()}async#n(){await Promise.all([this.#m(),this.#h(),this.#f()]),this.#u(),this.#g()}async#o(){const t="action";if(0===this.items.size)return;const i=["action","reaction","free","passive"],s=new Map([...this.items].filter((([e,t])=>"action"===t.type||i.includes(t.system?.actionType?.value)))),a=new Map;for(const[e,t]of s){const i=t.system.actionType?.value;switch(i){case"action":a.set("actions",a.get("actions")||new Map),a.get("actions").set(e,t);break;case"reaction":a.set("reactions",a.get("reactions")||new Map),a.get("reactions").set(e,t);break;case"free":a.set("free-actions",a.get("free-actions")||new Map),a.get("free-actions").set(e,t);break;case"passive":a.set("passives",a.get("passives")||new Map),a.get("passives").set(e,t)}}for(const[i,s]of a){const a=s,n={id:i,type:"system"},o=await Promise.all([...a].map((async([i,s])=>{const a=this.#P(s),n=this.#F(s),o=this.#S(s,t),l=this.#$(s),c=[t,a].join(this.delimiter),r=this.#E(s,t),d=e.api.Utils.getImage(s),m=this.#T(s),p=await s.getChatData(),u={name:n,description:p.description.value,properties:p.properties,traits:p.traits};return{id:a,name:n,encodedValue:c,cssClass:l,img:d,icon1:r,info:m,listName:o,tooltip:await this.#U(u)}})));this.addActions(o,n)}}#C(){const t="familiarAttack",i=this.actor.system.attack;if(i){const s=i.slug,n=e.api.Utils.i18n("PF2E.AttackLabel"),o=`${`${e.api.Utils.i18n(a[t])}: `??""}${n}`,l=[t,s].join(this.delimiter),c=e.api.Utils.getModifier(i?.totalModifier),r=[{id:s,name:n,listName:o,encodedValue:l,info1:this.actor?{text:c}:""}],d={id:"attack",type:"system"};this.addActions(r,d)}}#b(){const t="utility",i={endTurn:{id:"endTurn",name:e.api.Utils.i18n("tokenActionHud.endTurn")}};game.combat?.current?.tokenId!==this.token?.id&&delete i.endTurn;const s=Object.entries(i).map((i=>{const s=i[1].id,n=i[1].name,o=`${`${e.api.Utils.i18n(a[t])}: `??""}${n}`,l=[t,s].join(this.delimiter);return{id:s,name:n,listName:o,encodedValue:l}}));this.addActions(s,{id:"combat",type:"system"})}async#l(){const t="condition",i=["doomed","dying","wounded"],s=new Map([...this.items].filter((e=>e[1].type===t)).map((e=>{const t=e[1];return[t.slug,t]}))),n=[...game.pf2e.ConditionManager.conditions].filter((([e])=>!e.startsWith("Compendium"))).map((([e,t])=>(t.name=t.name.replace(" 1",""),[e,t]))),o=await Promise.all(n.map((async([n,o])=>{const l=o.slug,c=s.get(n),r=c?.id,d=o.name,m=`${`${e.api.Utils.i18n(a[t])}: `??""}${d}`,p=[t,l].join(this.delimiter),u=e.api.Utils.getImage(o),h=`toggle${r?" active":""}`;let g="",f="";if(r)if(i.includes(c.slug)){const e=this.actor.system.attributes[c.slug];f=e.value;const t=e.max;g={text:t>0?`${f??0}/${t}`:""}}else c.system.value.isValued&&(f=c.system.value.value,g={text:f});const y={name:`${d}${f?` ${f}`:""}`,description:o.description};return{id:l,name:d,listName:m,encodedValue:p,cssClass:h,img:u,info1:g,tooltip:await this.#U(y)}})));await this.addActions(o,{id:"conditions",type:"system"})}async#A(){const t="heroPoints",i=this.actor.system.resources?.heroPoints,s=i.value,a=i.max,n=[{id:"heroPoints",name:e.api.Utils.i18n("PF2E.HeroPointsLabel"),encodedValue:[t,t].join(this.delimiter),info1:{text:a>0?`${s??0}/${a}`:""}}];this.addActions(n,{id:"hero-points",type:"system"})}async#c(){const t="effect",i=new Map([...this.items].filter((e=>"effect"===e[1].type&&(!e[1].system?.unidentified&&!e[1].unidentified||game.user.isGM)))),s=await Promise.all([...i].map((async([i,s])=>{const a=this.#P(s),n=this.#F(s),o=this.#S(s,t),l=this.#$(s),c=[t,a].join(this.delimiter),r=this.#E(s,t),d=e.api.Utils.getImage(s),m=this.#T(s),p={name:n,description:s.description};return{id:a,name:n,listName:o,encodedValue:c,cssClass:l,img:d,icon1:r,info:m,tooltip:await this.#U(p)}})));this.addActions(s,{id:"effects",type:"system"})}async#r(){const t="feat",i={ancestryfeature:"ancestry-features",classfeature:"class-features",ancestry:"ancestry-feats",class:"class-feats",skill:"skill-feats",general:"general-feats",bonus:"bonus-feats"},s=new Map;for(const[e,t]of this.items){if("feat"!==t.type)continue;const a=i[t.system?.category??t.featType];s.set(a,s.get(a)||new Map),s.get(a).set(e,t)}for(const[i,a]of s){const s=a,n={id:i,type:"system"},o=await Promise.all([...s].map((async([i,s])=>{const a=this.#P(s),n=this.#F(s),o=this.#S(s,t),l=this.#$(s),c=[t,a].join(this.delimiter),r=this.#E(s,t),d=e.api.Utils.getImage(s),m=this.#T(s),p=await s.getChatData(),u={name:n,description:p?.description.value,properties:p.properties,traits:p.traits};return{id:a,name:n,encodedValue:c,cssClass:l,img:d,icon1:r,info:m,listName:o,tooltip:await this.#U(u)}})));this.addActions(o,n)}}async#d(){if(!game.modules.get("pf2e-hero-actions")?.active)return;const t="heroAction",i=e.api.Utils.i18n(a[t]),s=this.actor.getFlag("pf2e-hero-actions","heroActions")??[],n=[],o=this.actor.heroPoints?.value,l=o-(s?.length??0);l>0&&n.push({id:"drawHeroActions",name:game.i18n.format("pf2e-hero-actions.templates.heroActions.draw",{nb:l}),listName:`${i}: ${game.i18n.localize("pf2e-hero-actions.templates.heroActions.draw").replace("({nb}) ","")}`,encodedValue:[t,"drawHeroActions"].join(this.delimiter)});const c=await Promise.all([...s].map((async s=>{const a=s?.uuid,n=s?.name,o=`${i}: ${n}`,l=[t,a].join(this.delimiter),c=e.api.Utils.getImage("systems/pf2e/icons/actions/Passive.webp"),r={name:n,description:s?.uuid?await(fromUuid(s?.uuid)?.text?.content):null};return{id:a,name:n,encodedValue:l,img:c,listName:o,tooltip:await this.#U(r)}})));n.push(...c),this.addActions(n,{id:"hero-actions",type:"system"})}async#m(){const t="initiative",i=this.actor?Object.entries(this.actor.skills).filter((([e,t])=>!!t.label&&t.label.length>1)):this.#H();if(!i)return;const s=this.actor?.system?.attributes?.initiative?.statistic??null,n=[];if("hazard"!==this.actorType){const i=this.actor?this.actor.system.attributes.perception:CONFIG.PF2E.attributes.perception,o=e.api.Utils.i18n(CONFIG.PF2E.attributes.perception),l=this.abbreviatedSkills?c.perception??o:o,r=`${`${e.api.Utils.i18n(a[t])}: `??""}${l}`,d=[t,"perception"].join(this.delimiter),m=`toggle${"perception"===s?" active":""}`,p=e.api.Utils.getModifier(i?.totalModifier),u=this.actor?{text:p}:"",h={name:`${o}${this.actor&&p?` ${p}`:""}`,modifiers:i?.modifiers},g=this.actor?await this.#U(h):null;n.push({id:"initiative-perception",name:l,listName:r,encodedValue:d,cssClass:m,info1:u,tooltip:g})}const o=await Promise.all(i.map((async([i,n])=>{const o=`initiative-${i}`,l=n,r=e.api.Utils.i18n(l.label)??e.api.Utils.i18n(CONFIG.PF2E.skillList[i]),d=this.abbreviatedSkills?c[l.slug]??r:r,m=`${`${e.api.Utils.i18n(a[t])}: `??""}${d}`,p=[t,i].join(this.delimiter),u=`toggle${s===i?" active":""}`,h=e.api.Utils.getModifier(n.check?.mod),g=this.actor?{text:h}:"",f={name:`${r}${this.actor&&h?` ${h}`:""}`,modifiers:n?.modifiers};return{id:o,name:d,listName:m,encodedValue:p,cssClass:u,info1:g,tooltip:this.actor?await this.#U(f):null}})));n.push(...o);this.addActions(n,{id:"initiative",type:"system"})}async#p(){if(0===this.items.size)return;const t="item",i=new Map;for(const[e,t]of this.items){const s=t.system?.quantity>0,a=this.#D(t),n=this.#N("nonContainer",t),o=t.type;if(s&&n){const s=a?"equipped":"unequipped",n=i.get(s)??new Map;if(n.set(e,t),i.set(s,n),a){const s=i.get(o)??new Map;s.set(e,t),i.set(o,s)}}}for(const[s,a]of i){const i=o[s]?.groupId;if(!i)continue;const n={id:i,type:"system"},l=await Promise.all([...a].map((async([i,s])=>{const a=this.#P(s),n=this.#F(s),o=this.#S(s,t),l=this.#$(s),c=[t,a].join(this.delimiter),r=this.#E(s,t),d=this.#R(s),m=e.api.Utils.getImage(s),p=this.#T(s),u=await s.getChatData(),h={name:n,description:u?.description.value,rarity:u.rarity,traits:u.traits,traits2:u.properties};return{id:a,name:n,encodedValue:c,cssClass:l,img:m,icon1:r,icon2:d,info:p,listName:o,tooltip:await this.#U(h)}})));this.addActions(l,n)}if(i.has("backpack")){const s={id:"containers",type:"system"},a=i.get("backpack");for(const[i,n]of a){const a=n.contents;if(!a.size)continue;const o={id:i,name:n.name,listName:`Group: ${n.name}`,type:"system-derived"};await this.addGroup(o,s);const l=new Map;for(const e of a){this.#N("container",e)&&l.set(e.id,e)}const c=await Promise.all([...l].map((async([i,s])=>{const a=this.#P(s),n=this.#F(s),o=this.#S(s,t),l=this.#$(s),c=[t,a].join(this.delimiter),r=this.#E(s,t),d=this.#R(s),m=e.api.Utils.getImage(s),p=this.#T(s),u=await s.getChatData(),h={name:n,description:u?.description.value,properties:u.properties,rarity:u.rarity,traits:u.traits};return{id:a,name:n,encodedValue:c,cssClass:l,img:m,icon1:r,icon2:d,info:p,listName:o,tooltip:await this.#U(h)}})));this.addActions(c,o)}}}async#u(){const t=this.actor?this.actor.system.attributes.perception:CONFIG.PF2E.attributes.perception,i=e.api.Utils.i18n(CONFIG.PF2E.attributes.perception),s=e.api.Utils.getModifier(t?.totalModifier),a=this.actor?{text:s}:"",n={name:`${i}${this.actor&&s?` ${s}`:""}`,modifiers:t?.modifiers},o=await this.#U(n),l=[{id:"perception",name:i,encodedValue:["perceptionCheck","perception"].join(this.delimiter),info1:a,tooltip:o}];this.addActions(l,{id:"perception-check",type:"system"})}#v(){const t="recoveryCheck",i=this.actor?.system.attributes?.dying;if(i?.value>=1){const i=[{id:t,name:e.api.Utils.i18n("PF2E.Check.Specific.Recovery"),encodedValue:[t,t].join(this.delimiter)}],s={id:"recovery-check",type:"system"};this.addActions(i,s)}}#w(){if(!this.actor&&!this.actors.every((e=>"character"===e.type)))return;const t="utility",i=[{id:"treatWounds",name:e.api.Utils.i18n("PF2E.Actions.TreatWounds.Label"),encodedValue:[t,"treatWounds"].join(this.delimiter)},{id:"rest",name:e.api.Utils.i18n("PF2E.Actor.Character.Rest.Label"),encodedValue:[t,"rest"].join(this.delimiter)}];game.settings.get("pf2e","staminaVariant")&&i.push({id:"takeBreather",name:e.api.Utils.i18n("tokenActionHud.pf2e.takeBreather"),encodedValue:[t,"takeBreather"].join(this.delimiter)});this.addActions(i,{id:"rests",type:"system"})}async#h(){const t="save",i=this.actor?Object.entries(this.actor.saves||[]):Object.entries(CONFIG.PF2E.saves);if(!i||0===i.length)return;const s=await Promise.all(i.map((async([i,s])=>{const n=s.label??("string"==typeof s?e.api.Utils.i18n(s):""),o=`${`${e.api.Utils.i18n(a[t])}: `??""}${n}`,l=[t,i].join(this.delimiter),c=e.api.Utils.getModifier(s.mod),r=this.actor?{text:c}:"",d={name:`${n}${this.actor&&c?` ${c}`:""}`,modifiers:s?.modifiers};return{id:i,name:n,listName:o,encodedValue:l,info1:r,tooltip:this.actor?await this.#U(d):null}})));this.addActions(s,{id:"saves",type:"system"})}async#g(){const t="compendiumMacro",i=await game.packs.get("pf2e.action-macros").getIndex();if(!i.size)return;const s=new Map,n=[];for(const o of i){const i=p[o._id];if(!i)continue;const l=o._id,c=e.api.Utils.i18n(i.name),r=`${c} - ${e.api.Utils.i18n(u[i.skill]?.name)}`,d=`${`${e.api.Utils.i18n(a.skillAction)}: `??""}${r}`,m=[t,"pf2e.action-macros",l].join(this.delimiter),h=this.#M(i.actionCost),g=i.image,f=e.api.Utils.getModifier(this.actor?.skills[i.skill]?.check?.mod),y={id:l,name:r,listName:d,encodedValue:m,icon1:h,img:g,info1:this.actor?{text:f}:null};n.push(y),s.set(i.skill,s.get(i.skill)||new Map),s.get(i.skill).set(o._id,{...y,name:c})}await this.addActions(n,{id:"skill-actions-ungrouped",type:"system"});for(const[t,i]of Object.entries(u)){const a=t,n=e.api.Utils.i18n(i.name),o=s.get(a);if(!o)continue;const l={id:a,name:n,type:"system-derived"};await this.addGroup(l,{id:"skill-actions-grouped",type:"system"});const c=[...o].map((([e,t])=>t));await this.addActions(c,l)}}async#f(){const t="skill",i=this.actor?Object.entries(this.actor.skills).filter((e=>!!e[1].label&&e[1].label.length>1)):this.#H();if(!i)return;const s=new Map;for(const e of i){const t=e[1].lore;s.has("skills")||s.set("skills",new Map),s.get("skills").set(e[0],e[1]),t&&(s.has("lore-skills")||s.set("lore-skills",new Map),s.get("lore-skills").set(e[0],e[1])),t||(s.has("core-skills")||s.set("core-skills",new Map),s.get("core-skills").set(e[0],e[1]))}for(const[i,n]of s){const s=n,o={id:i,type:"system"},l=await Promise.all([...s].map((async([i,s])=>{const n=i,o=e.api.Utils.i18n(s.label)??e.api.Utils.i18n(CONFIG.PF2E.skillList[i]),l=this.abbreviatedSkills?c[s.slug]??o:o,r=o,d=`${`${e.api.Utils.i18n(a[t])}: `??""}${l}`,m=[t,n].join(this.delimiter),p=this.actor&&this.colorSkills&&s.rank>0?`tah-pf2e-skill-rank-${s.rank}`:"",u=e.api.Utils.getModifier(s.check?.mod),h=this.actor?{text:u}:"",g={name:`${r}${this.actor&&u?` ${u}`:""}`,modifiers:s?.modifiers};return{id:n,name:l,fullName:r,listName:d,encodedValue:m,cssClass:p,info1:h,tooltip:this.actor?await this.#U(g):null}})));this.addActions(l,o)}}#H(){if(!this.actors)return;const e=this.actors.map((e=>Object.entries(e.skills).filter((e=>!!e[1].label&&e[1].label.length>1)))),t=Math.min(...e.map((e=>e.length)));return e.find((e=>e.length===t)).filter((t=>e.every((e=>e.some((e=>e[0]===t[0]))))))}async#y(){const t="spell",i={id:"spells",type:"system"},s=[...this.items].filter((e=>"spellcastingEntry"===e[1].type));for(const a of s){const s=`spells+${a[1].name.slugify({replacement:"-",strict:!0})}`,n={id:s,name:a[1].name,type:"system-derived",info1:this.#x(a[1])};await this.addGroup(n,i),this.addGroupInfo(n);const o=await(a[1].getSpellData?a[1].getSpellData():a[1].getSheetData()),l=o.levels.filter((e=>e.active.length>0));for(const i of Object.entries(l)){const a=i[1].level,l={id:`${s}+${a}`,name:String(e.api.Utils.i18n(i[1].label)),type:"system-derived"};await this.addGroup(l,n),await this.#j(n,l,i,o);const c=i[1].active.filter((e=>!e?.expended&&e)).map((e=>e.spell)),r=new Map(c.map((e=>[e.id,e]))),d=await Promise.all([...r].map((async([i,s])=>{const n=this.#P(s,t,a),o=this.#F(s),l=this.#S(s,t),c=this.#$(s),r=this.#z(s,t,a),d=this.#E(s,t),m=e.api.Utils.getImage(s),p=this.#L(s),u=await s.getChatData(),h={name:o,description:u.description.value,properties:u.properties,rarity:u.rarity,traits:u.actionTraits,traitsAlt:u.spellTraits};return{id:n,name:o,listName:l,encodedValue:r,cssClass:c,img:m,icon1:d,info:p,tooltip:await this.#U(h)}})));this.addActions(d,l)}}}async#j(t,i,s,n){const o=s[1].isCantrip,l=n.isFlexible,c=n.isFocusPool,r=n.isInnate,d=n.isPrepared;if(!c&&(o||r))return;if(!c&&d&&!l)return;const m="spellSlot",p=this.actor.system.resources.focus,u=s[1].uses,h=c?"focus":`slot${s[1].level}`,g="focus"===h?p?.max:u?.max,f={text:g>=0?`${("focus"===h?p?.value:u?.value)??0}/${g}`:""};i.info={info1:f},this.addGroupInfo(i);const y=e.api.Utils.i18n(a.spell),k=[{id:`${n.id}>${h}>slotIncrease`,name:"+",listName:`${y}: ${t.name}: ${i.name}: +`,encodedValue:[m,`${n.id}>${h}>slotIncrease`].join(this.delimiter),cssClass:"shrink"},{id:`${n.id}>${h}>slotDecrease`,name:"-",listName:`${y}: ${t.name}: ${i.name}: -`,encodedValue:[m,`${n.id}>${h}>slotDecrease`].join(this.delimiter),cssClass:"shrink"}];this.addActions(k,i)}async#k(){const t="strike",i={id:"strikes",type:"system"},s=this.actor.system.actions.filter((e=>e.type===t&&(e.item.system.quantity>0||"npc"===this.actor.type)));if(s)for(const n of s){let s=[],o=[],c=null;const m=[],p=`strikes+${`${n.item.id}-${n.slug}`}`,u=n.label,h=`${e.api.Utils.i18n(a[t])}: ${n.label} (${n.item.id})`,g=n.imageUrl,f=this.showStrikeNames,y=this.#O({description:n.description,criticalSuccess:n.criticalSuccess,success:n.success}),k=(await(n?.item?.getChatData()))?.properties.filter((e=>"PF2E.WeaponTypeMartial"!==e)),b={name:n.label,descriptionLocalised:y,modifiers:n.modifiers,properties:k,traits:n.traits,traitsAlt:n.weaponTraits},A=await this.#U(b);if(c={id:p,name:u,listName:h,type:"system-derived",settings:{showTitle:f},tooltip:A},this.showStrikeImages&&(c.settings.image=g),this.addGroup(c,i),n.auxiliaryActions?.length&&this.addAuxiliaryActions&&(s=n.auxiliaryActions.flatMap(((t,i)=>{if("Modular"===t.purpose){const s=n.item.system.traits.toggles.modular.options,a=n.item.system.traits.toggles.modular.selection;return s.map((s=>{const o=encodeURIComponent(`${n.item.id}>${n.slug}>${i}>${s}`),c=e.api.Utils.i18n(l[s]);return{id:o,name:c,listName:`${h}: ${c}`,encodedValue:["auxAction",o].join(this.delimiter),icon1:this.#M(t.glyph),cssClass:this.#$({selected:s===a})}}))}{const e=encodeURIComponent(`${n.item.id}>${n.slug}>${i}>`),s=t.label;return{id:e,name:s,listName:`${h}: ${s}`,encodedValue:["auxAction",e].join(this.delimiter),icon1:this.#M(t.glyph),info:this.#T(t)}}}))),n.ready){n.versatileOptions?.length&&(o=n.versatileOptions.map((t=>{const i=encodeURIComponent(`${n.item.id}>${n.slug}>${t.value}>`),s=e.api.Utils.i18n(t.label);return{id:encodeURIComponent(`${n.item.id}>${n.slug}>${t.value}>`),name:"",fullName:s,listName:`${h}: ${s}`,encodedValue:["versatileOption",i].join(this.delimiter),cssClass:this.#$(t),icon1:this.#M(t.glyph,s)}})));const i=n.altUsages?[n,...n.altUsages]:[n];for(const s of i){const a=n.glyph;let o;switch(`${s.item.isMelee}_${s.item.isThrown}_${s.item.isRanged}`){case"true_false_false":o="melee";break;case"false_true_true":o="thrown";break;case"false_false_true":o="ranged"}const l=`${p}+${o}`,c=s.attackRollType?e.api.Utils.i18n(s.attackRollType):e.api.Utils.i18n(d[o].name),u=`${h}: ${c}`,g="thrown"!==o&&a?`${a}`:r[o],f=i.length>1?r[o]:"",y=!(f||i.length<=1),k={id:l,name:c,listName:u,icon:g,type:"system-derived",settings:{showTitle:y,image:f}},b=s.variants.map(((i,s)=>{const a=encodeURIComponent(`${n.item.id}>${n.slug}>${s}>`+o),l=i.label.includes(e.api.Utils.i18n("PF2E.MAPAbbreviationLabel").replace(" {penalty}",""))?n.totalModifier+parseInt(i.label.split(" ")[1]):parseInt(i.label.split(" ")[1]),c=this.calculateAttackPenalty?l>=0?`+${l}`:`${l}`:i.label;return{id:a,name:c,encodedValue:[t,a].join(this.delimiter),listName:`${u}: ${c}`}})),A=encodeURIComponent(`${n.item.id}>${n.slug}>damage>${o}`),v=e.api.Utils.i18n("PF2E.DamageLabel");b.push({id:A,name:v,listName:`${u}: ${v}`,encodedValue:[t,A].join(this.delimiter),systemSelected:this.addDamageAndCritical});const w=encodeURIComponent(`${n.item.id}>${n.slug}>critical>${o}`),I=e.api.Utils.i18n("PF2E.CriticalDamageLabel");if(b.push({id:w,name:I,listName:`${u}: ${I}`,encodedValue:[t,w].join(this.delimiter),systemSelected:this.addDamageAndCritical}),s.selectedAmmoId&&!s.ammunition){const i=this.actor.items.get(s.selectedAmmoId);if(i){const e=this.#P(i),s=this.#F(i);b.push({id:e,name:s,listName:`${u}: ${s}`,encodedValue:[t,e].join(this.delimiter)})}else{const t="noAmmo",i=e.api.Utils.i18n("tokenActionHud.pf2e.noAmmo");b.push({id:t,name:i,listName:`${u}: ${i}`,encodedValue:t})}}m.push({actions:b,usageGroupData:k})}}if(this.splitStrikes){this.addActions([...s,...o],c);for(const e of m)this.addGroup(e.usageGroupData,c),this.addActions(e.actions,e.usageGroupData)}else{this.addActions([...s,...m[0]?.actions||[],...o],c),m.shift();for(const e of m)this.addGroup(e.usageGroupData,c),this.addActions(e.actions,e.usageGroupData)}}}#I(){const t="toggle",i=game.system.version.startsWith("4")?this.actor.system.toggles:this.actor.synthetics.toggles;if(!i.length)return;const s=i.map((i=>{const s=[i.domain,i.option].join("."),a=e.api.Utils.i18n(i.label);return{id:s,encodedValue:[t,JSON.stringify(i)].join(this.delimiter),name:a,cssClass:`toggle${i.checked?" active":""}`}}));this.addActions(s,{id:"toggles",type:"system"})}#_(e,t,i,s){const a=t.slugify({replacement:"-",strict:!0});return{id:a,name:t,encodedValue:[e,a].join(this.delimiter),info1:{text:`${i}/${s}`}}}#P(e,t,i){return"spell"===t?`${e.id??e._id}-${i}`:e.id??e._id}#F(e){return e?.name??e?.label??""}#S(t,i){const s=this.#F(t),n=`${e.api.Utils.i18n(a[i])}: `??"";return t.listName??`${n}${s}`}#$(e){if(Object.hasOwn(e,"disabled")){return`toggle${e.disabled?"":" active"}`}if(Object.hasOwn(e,"selected")){return`toggle${e.selected?" active":""}`}}#z(e,t,i){const s=e?.spellcasting?.id;return[t,"spell"===t?`${s}>${i}>${e.id??e._id}`:this.#P(e,t,i)].join(this.delimiter)}#E(e,t){const i=e.system?.actions,s=e.system?.actionType?.value,a=i?parseInt((i||{}).value,10):null,n=e.system?.time?.value,o=e.actionIcon,l="spell"===t?n:["free","reaction","passive"].includes(s)?s:a??o,c=this.#F(e);return this.#M(l,c)}#V(e){return["downtime","exploration"].includes(e.system.traits?.value)}#x(t){let i="";const s=t.statistic,a="function"==typeof s.dc?s.dc().value:s.dc.value,n=s.check.mod;return i=`${n>=0?`${e.api.Utils.i18n("tokenActionHud.pf2e.atk")} +${n}`:`${e.api.Utils.i18n("tokenActionHud.pf2e.atk")} ${n}`} ${`${e.api.Utils.i18n("tokenActionHud.pf2e.dc")}${a}`}`,i}#L(e){return{info1:this.#G(e),info2:this.#q(e)}}#G(e){return{text:e.components.value??e.system.components?.value??"",title:Object.entries(e.components).filter((e=>!0===e[1])).map((e=>e[0].trim().charAt(0).toUpperCase()+e[0].slice(1))).join(", ")}}#q(e){const t=e?.uses?.value,i=e?.uses?.max;return{text:t&&i>=0?`${t}/${i}`:""}}#e(){const e=["character","npc"],t=canvas.tokens.controlled.map((e=>e.actor));if(t.every((t=>e.includes(t.type))))return t}#D(e){const t=e.system.equipped?.carryType;return!!this.addUnequippedItems||!(!["held","worn"].includes(t)||e.system.containerId?.value?.length)}#N(e,t){return"stowed"!==t.system.equipped?.carryType||this.#W(e,t)}#W(e,t){return"stowed"!==t.system.equipped?.carryType||("both"===this.addStowedItems||("container"===e&&"containers"===this.addStowedItems||"nonContainer"===e&&"nonContainers"===this.addStowedItems))}#T(e){return{info1:{text:this.#B(e)??""}}}#B(e){const t=e?.system?.quantity?.value;return t>1?t:""}#M(e,t=""){return["bow-arrow","axe"].includes(e)?``:s[e]}#R(t){let i="";if("held"===t?.carryType)i=2===t?.handsHeld?"held2":"held1";else i=t?.carryType;const s=e.api.Utils.i18n(n[i]?.tooltip)??"";return n[i]?.icon.replace("placeholder",s)??""}#Y(e,t){return e?.sort||t?.sort?e.sort-t.sort:0}async#U(t){if("string"==typeof t)return t;const i=e.api.Utils.i18n(t.name),s=`

${i}

`,a=e.api.Utils.i18n(t?.description??t?.descriptionLocalised??""),n=t?.rarity?`${e.api.Utils.i18n(t.rarity.label)}`:"",o=t?.properties?`
${t.properties.map((t=>`${e.api.Utils.i18n(t)}`)).join("")}
`:"",l=t?.traits?t.traits.map((t=>`${e.api.Utils.i18n(t.label)}`)).join(""):"",c=t?.traits2?t.traits2.map((t=>`${e.api.Utils.i18n(t.label??t)}`)).join(""):"",r=t?.traitsAlt?t.traitsAlt.map((t=>`${e.api.Utils.i18n(t.label)}`)).join(""):"",d=t?.modifiers?`
${t.modifiers.filter((e=>e.enabled)).map((t=>`${e.api.Utils.i18n(t.label)} ${`${t.modifier>=0?"+":""}${t.modifier??""}`}`)).join("")}
`:"",m=[n,l,c,r].join(""),p=m?`
${m}
`:"",u=p||d?`
${p}${d}
`:"";if(!a&&!p&&!d)return i;return await TextEditor.enrichHTML(`
${s}${u}${a}${o}
`,{async:!0})}#O(t){return`${t?.description?`

${e.api.Utils.i18n(t?.description)}

`:""}${t?.criticalSuccess?`

${e.api.Utils.i18n("PF2E.Check.Result.Degree.Check.criticalSuccess")}

${e.api.Utils.i18n(t?.criticalSuccess)}

`:""}${t?.success?`

${e.api.Utils.i18n("PF2E.Check.Result.Degree.Check.success")}

${e.api.Utils.i18n(t?.success)}

`:""}`}}}));let f=null;Hooks.once("tokenActionHudCoreApiReady",(async e=>{f=class RollHandler extends e.api.RollHandler{BLIND_ROLL_MODE="blindRoll";async doHandleActionEvent(e,t){const i=t.split("|");2!==i.length&&super.throwInvalidValueErr();const s=i[0],a=i[1];this.#Q();if(["item","feat","action","lore","ammo"].includes(s)&&this.isRenderItem())return this.doRenderItem(this.actor,a);const n=["character","familiar","hazard","npc"];if(this.actor)await this.#X(e,s,this.actor,this.token,a);else{const t=canvas.tokens.controlled.filter((e=>n.includes(e.actor?.type)));for(const i of t){const t=i.actor;await this.#X(e,s,t,i,a)}}}#Q(){const e=game.user.getFlag("pf2e","showRollDialogs");this.rollMode=this.ctrl?"gmroll":null,this.skipDialog=e?this.shift:!this.shift}async#X(e,t,i,s,a){let n;i&&(n=i.type);if(!["ability","spell","item","skill","lore","utility","toggle","strike"].includes(t))switch(n){case"npc":await this.#J(e,t,i,s,a);break;case"character":case"familiar":case"hazard":await this.#K(e,t,i,s,a)}switch(t){case"ability":this.#Z(e,i,a);break;case"action":case"feat":case"item":this.#ee(e,i,a);break;case"condition":this.#te(i,a);break;case"effect":this.#ie(i,a);break;case"heroAction":this.#se(i,a);break;case"spell":await this.#ae(i,a);break;case"skill":await this.#ne(e,i,a);break;case"strike":this.#oe(e,i,a);break;case"toggle":await this.#le(i,a);break;case"utility":this.#ce(s,a)}}async#K(e,t,i,s,a){switch(t){case"save":this.#re(i,a);break;case"initiative":this.#de(e,i,a);break;case"attribute":case"perceptionCheck":{const e={rollMode:this.rollMode,skipDialog:this.skipDialog};this.actor.perception.roll(e);break}case"spellSlot":await this.#me(i,a);break;case"heroPoints":await this.#pe("heroPoints","value",i);break;case"recoveryCheck":i.rollRecovery({event:e});break;case"familiarAttack":this.#ue(e,i);break;case"auxAction":this.#he(i,a);break;case"versatileOption":this.#ge(i,a)}}async#J(e,t,i,s,a){switch(t){case"initiative":this.#de(e,i,a);break;case"attribute":case"perceptionCheck":await this.#fe(e,i,a);break;case"save":this.#re(i,a);break;case"strike":this.#ye(e,i,a)}}async#ne(e,t,i){const s=t.skills[i];await s.check.roll({event:e})}#Z(e,t,i){t.rollAbility(e,i)}async#de(e,t,i){await t.update({"system.attributes.initiative.statistic":i});const s={rollMode:this.rollMode,skipDialog:this.skipDialog};t.initiative.roll(s)}async#fe(e,t,i){t.rollAttribute(e,i)}async#me(e,t){const i=decodeURIComponent(t).split(">"),s=i[0],a=i[1],n=i[2],o=e.items.get(s);let l,c,r;if("focus"===a)l=e.system.resources.focus.value,c=e.system.resources.focus.max;else{const e=o.system.slots;l=e[a].value,c=e[a].max}switch(n){case"slotIncrease":if(l>=c)break;l++;break;case"slotDecrease":if(l<=0)break;l--}"focus"===a?e.update({"data.resources.focus.value":l}):(r=[{_id:o.id,data:{slots:{[a]:{value:l}}}}],await Item.updateDocuments(r,{parent:e})),Hooks.callAll("forceUpdateTokenActionHud")}#re(e,t){const i={rollMode:this.rollMode,skipDialog:this.skipDialog};e.saves[t].check.roll(i)}#oe(e,t,i){const s=decodeURIComponent(i).split(">"),a=s[0],n=s[1],o=s[2],l=s[3]?s[3]:null;let c=null,r=t.system.actions.filter((e=>"strike"===e.type)).find((e=>e.item.id===a&&e.slug===n));if(this.isRenderItem()){const e=r.item;if(e&&"xxPF2ExUNARMEDxx"!==e.id)return this.doRenderItem(t,e.id)}if(r.altUsages?.length)switch(!0){case"melee"===l&&!r.item.isMelee:c=l,r=r.altUsages.find((e=>e.item.isMelee));break;case"ranged"===l&&!r.item.isRanged:c=l,r=r.altUsages.find((e=>e.item.isRanged));break;case"thrown"===l&&!r.item.isThrown:c=l,r=r.altUsages.find((e=>e.item.isThrown))}switch(o){case"damage":r.damage({event:e});break;case"critical":r.critical({event:e});break;default:r.variants[o]?.roll({event:e,altUsage:c})}}#he(e,t){const i=decodeURIComponent(t).split(">"),s=i[0],a=i[1],n=i[2],o=i[3]?i[3]:null,l=e.system.actions.filter((e=>"strike"===e.type)).find((e=>e.item.id===s&&e.slug===a));if(this.isRenderItem()){const t=l.origin;if(t)return this.doRenderItem(e,t.id)}l.auxiliaryActions[n]?.execute({selection:o})}async#ge(t,i){const s=decodeURIComponent(i).split(">"),a=s[0],n=s[2],o=e.api.Utils.getItem(t,a);await async function toggleWeaponTrait({weapon:e,trait:t,selection:i}){if(e.system.traits.toggles[t].selection===i)return!1;const s=e.actor?.items.get(e.id);if(s?.isOfType("weapon")&&s===e)await s.update({[`system.traits.toggles.${t}.selection`]:i});else if(s?.isOfType("weapon")&&"melee"===e.altUsageType)s.update({[`system.meleeUsage.traitToggles.${t}`]:i});else{const a=s?.rules.find((t=>"Strike"===t.key&&!t.ignored&&t.slug===e.slug));await(a?.toggleTrait({trait:t,selection:i}))}return!0}({weapon:o,trait:"versatile",selection:n})}#ye(e,t,i){const s=decodeURIComponent(i).split(">"),a=s[0],n=s[1],o=s[2],l=t.system.actions.filter((e=>"strike"===e.type)).find((e=>e.item.id===a&&e.slug===n));if("plus"===a){const i=t.items.find((e=>0===o.toUpperCase().localeCompare(e.name.toUpperCase(),void 0,{sensitivity:"base"})));return this.isRenderItem()?this.doRenderItem(t,i.id):void i.toChat(e)}if(this.isRenderItem())return this.doRenderItem(t,a);switch(o){case"damage":l.rollNPCDamage(e);break;case"critical":l.rollNPCDamage(e,!0);break;case"0":l.rollNPCAttack(e);break;case"1":l.rollNPCAttack(e,2);break;case"2":l.rollNPCAttack(e,3)}}#ee(e,t,i){t.items.get(i).toChat(e)}#ue(e,t){const i=t.getRollOptions(["all","attack"]);t.system.attack.roll({event:e,options:i})}async#ae(e,t){const i=decodeURIComponent(t).split(">"),[s,a,n,o]=i;if(this.isRenderItem())return this.doRenderItem(e,n);const l=e.items.get(s),c=e.items.get(n);l&&c&&(await l.cast(c,{message:!o,consume:!0,level:Number(a)}),Hooks.callAll("forceUpdateTokenActionHud"))}async#ce(e,t){switch(t){case"treatWounds":this.#ke("6duZj0Ygiqv712rq");break;case"rest":this.#ke("0GU2sdy3r2MeC56x");break;case"takeBreather":this.#ke("aS6F7PSUlS9JM5jr");break;case"endTurn":game.combat?.current?.tokenId===e.id&&await(game.combat?.nextTurn())}}async#ke(e){game.packs.get("pf2e.pf2e-macros").getDocument(e).then((e=>e.execute()))}async#pe(e,t,i){let s=i.system.resources[e][t];const a=i.system.resources[e].max;if(this.rightClick){if(s<=0)return;s--}else{if(s>=a)return;s++}const n=[{_id:i.id,data:{resources:{[e]:{[t]:s}}}}];await Actor.updateDocuments(n),Hooks.callAll("forceUpdateTokenActionHud")}async#te(e,t){this.rightClick?e.decreaseCondition(t):e.increaseCondition(t),Hooks.callAll("forceUpdateTokenActionHud")}async#ie(t,i){const s=e.api.Utils.getItem(t,i);this.rightClick?s.decrease():s.increase(),Hooks.callAll("forceUpdateTokenActionHud")}async#se(e,t){"drawHeroActions"===t?(await(game.modules.get("pf2e-hero-actions")?.api?.drawHeroActions(e)),Hooks.callAll("forceUpdateTokenActionHud")):await(game.modules.get("pf2e-hero-actions")?.api?.useHeroAction(e,t))}async#le(e,t){const i=JSON.parse(t);i.domain&&i.option&&await e.toggleRollOption(i.domain,i.option,i.itemId)}}}));let y=null;function register(t){game.settings.register(e.ID,"calculateAttackPenalty",{name:game.i18n.localize("tokenActionHud.pf2e.setting.calculateAttackPenalty.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.calculateAttackPenalty.hint"),scope:"client",config:!0,type:Boolean,default:!0,onChange:e=>{t(e)}}),game.settings.register(e.ID,"colorSkills",{name:game.i18n.localize("tokenActionHud.pf2e.setting.colorSkills.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.colorSkills.hint"),scope:"client",config:!0,type:Boolean,default:!0,onChange:e=>{t(e)}}),game.settings.register(e.ID,"showStrikeImages",{name:game.i18n.localize("tokenActionHud.pf2e.setting.showStrikeImages.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.showStrikeImages.hint"),scope:"client",config:!0,type:Boolean,default:!0,onChange:e=>{t(e)}}),game.settings.register(e.ID,"showStrikeNames",{name:game.i18n.localize("tokenActionHud.pf2e.setting.showStrikeNames.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.showStrikeNames.hint"),scope:"client",config:!0,type:Boolean,default:!1,onChange:e=>{t(e)}}),game.settings.register(e.ID,"splitStrikes",{name:game.i18n.localize("tokenActionHud.pf2e.setting.splitStrikes.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.splitStrikes.hint"),scope:"client",config:!0,type:Boolean,default:!0,onChange:e=>{t(e)}}),game.settings.register(e.ID,"addAuxiliaryActions",{name:game.i18n.localize("tokenActionHud.pf2e.setting.addAuxiliaryActions.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.addAuxiliaryActions.hint"),scope:"client",config:!0,type:Boolean,default:!0,onChange:e=>{t(e)}}),game.settings.register(e.ID,"addDamageAndCritical",{name:game.i18n.localize("tokenActionHud.pf2e.setting.addDamageAndCritical.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.addDamageAndCritical.hint"),scope:"client",config:!0,type:Boolean,default:!0,onChange:e=>{t(e)}}),game.settings.register(e.ID,"addStowedItems",{name:game.i18n.localize("tokenActionHud.pf2e.setting.addStowedItems.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.addStowedItems.hint"),scope:"client",config:!0,type:String,default:"containers",choices:{containers:game.i18n.localize("tokenActionHud.pf2e.setting.addStowedItems.choice.containers"),nonContainers:game.i18n.localize("tokenActionHud.pf2e.setting.addStowedItems.choice.nonContainers"),both:game.i18n.localize("tokenActionHud.pf2e.setting.addStowedItems.choice.both"),none:game.i18n.localize("tokenActionHud.pf2e.setting.addStowedItems.choice.none")},onChange:e=>{t(e)}}),game.settings.register(e.ID,"addUnequippedItems",{name:game.i18n.localize("tokenActionHud.pf2e.setting.addUnequippedItems.name"),hint:game.i18n.localize("tokenActionHud.pf2e.setting.addUnequippedItems.hint"),scope:"client",config:!0,type:Boolean,default:!1,onChange:e=>{t(e)}})}Hooks.once("tokenActionHudCoreApiReady",(async e=>{const t=m;Object.values(t).forEach((t=>{t.name=e.api.Utils.i18n(t.name),t.listName=`Group: ${e.api.Utils.i18n(t.listName??t.name)}`}));const i=Object.values(t);y={layout:[{nestId:"attack",id:"attack",name:e.api.Utils.i18n("PF2E.AttackLabel"),groups:[{...t.attack,nestId:"attack_attack"}]},{nestId:"strikes",id:"strikes",name:e.api.Utils.i18n("PF2E.StrikesLabel"),groups:[{...t.toggles,nestId:"strikes_toggles"},{...t.strikes,nestId:"strikes_strikes"}],settings:{customWidth:500}},{nestId:"actions",id:"actions",name:e.api.Utils.i18n("PF2E.ActionsActionsHeader"),groups:[{...t.actions,nestId:"actions_actions"},{...t.reactions,nestId:"actions_reactions"},{...t.freeActions,nestId:"actions_free-actions"},{...t.passives,nestId:"actions_passives"}]},{nestId:"inventory",id:"inventory",name:e.api.Utils.i18n("PF2E.TabInventoryLabel"),groups:[{...t.weapons,nestId:"inventory_weapons"},{...t.armor,nestId:"inventory_armor"},{...t.equipment,nestId:"inventory_equipment"},{...t.consumables,nestId:"inventory_consumables"},{...t.containers,nestId:"inventory_containers"},{...t.treasure,nestId:"inventory_treasure"}]},{nestId:"feats",id:"feats",name:e.api.Utils.i18n("PF2E.TabFeatsLabel"),groups:[{...t.ancestryFeatures,nestId:"feats_ancestry-features"},{...t.classFeatures,nestId:"feats_class-features"},{...t.ancestryFeats,nestId:"feats_ancestry-feats"},{...t.classFeats,nestId:"feats_class-feats"},{...t.skillFeats,nestId:"feats_skill-feats"},{...t.generalFeats,nestId:"feats_general-feats"},{...t.bonusFeats,nestId:"feats_bonus-feats"}]},{nestId:"spells",id:"spells",name:e.api.Utils.i18n("PF2E.SpellLabelPlural"),groups:[{...t.spells,nestId:"spells_spells"}]},{nestId:"attributes",id:"attributes",name:e.api.Utils.i18n("tokenActionHud.pf2e.attributes"),groups:[{...t.heroPoints,nestId:"attributes_hero-points"},{...t.initiative,nestId:"attributes_initiative"},{...t.perceptionCheck,nestId:"attributes_perception-check"},{...t.saves,nestId:"attributes_saves"}]},{nestId:"skills",id:"skills",name:e.api.Utils.i18n("PF2E.SkillsLabel"),groups:[{...t.coreSkills,nestId:"skills_core-skills"},{...t.loreSkills,nestId:"skills_lore-skills"}]},{nestId:"effects",id:"effects",name:e.api.Utils.i18n("PF2E.EffectsLabel"),groups:[{...t.conditions,nestId:"effects_conditions"},{...t.effects,nestId:"effects_effects"}]},{nestId:"utility",id:"utility",name:e.api.Utils.i18n("tokenActionHud.utility"),groups:[{...t.combat,nestId:"utility_combat"},{...t.token,nestId:"utility_token"},{...t.recoveryCheck,nestId:"utility_recovery-check"},{...t.rests,nestId:"utility_rests"},{...t.utility,nestId:"utility_utility"}]}],groups:i}}));let k=null;Hooks.once("tokenActionHudCoreApiReady",(async e=>{k=class SystemManager extends e.api.SystemManager{doGetCategoryManager(t){return new e.api.CategoryManager}doGetActionHandler(e){return new g(e)}getAvailableRollHandlers(){return{core:"Core PF2E"}}doGetRollHandler(e){let t;return t=new f,t}doRegisterSettings(e){register(e)}async doRegisterDefaultFlags(){const t=y;if(game.modules.get("pf2e-hero-actions")?.active){const i=e.api.Utils.i18n("tokenActionHud.group"),s=e.api.Utils.i18n("tokenActionHud.pf2e.heroActions");t.groups.push({id:"hero-actions",name:s,listName:`${i}: ${s}`,type:"system"}),t.groups.sort(((e,t)=>e.id.localeCompare(t.id)))}return t}}})),Hooks.on("tokenActionHudCoreApiReady",(async()=>{const t=game.modules.get(e.ID);t.api={requiredCoreModuleVersion:"1.4",SystemManager:k},Hooks.call("tokenActionHudSystemReady",t)}));export{s as ACTION_ICON,a as ACTION_TYPE,g as ActionHandler,n as CARRY_TYPE_ICON,t as CORE_MODULE,y as DEFAULTS,m as GROUP,o as ITEM_TYPE,l as MODULAR_OPTION,e as MODULE,i as REQUIRED_CORE_MODULE_VERSION,f as RollHandler,u as SKILL,c as SKILL_ABBREVIATION,p as SKILL_ACTION,r as STRIKE_ICON,d as STRIKE_USAGE,k as SystemManager,h as Utils,register};