diff --git a/module.json b/module.json index 32b3a89..bd4003c 100644 --- a/module.json +++ b/module.json @@ -19,7 +19,7 @@ "version": "This is auto replaced", "compatibility": { "minimum": "10", - "verified": "11.306" + "verified": "11.308" }, "esmodules": [ "./scripts/token-action-hud-pf2e.min.js" @@ -95,7 +95,7 @@ "compatibility": [ { "minimum": "4.6.4", - "verified": "5.2.1" + "verified": "5.4.4" } ] } @@ -108,7 +108,7 @@ { "minimum": "1.4.16", "maximum": "1.4", - "verified": "1.4.16" + "verified": "1.4.18" } ] } diff --git a/scripts/token-action-hud-pf2e.min.js b/scripts/token-action-hud-pf2e.min.js index ea83150..deeac58 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",hammer:"fa-solid fa-hammer 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 g=null;Hooks.once("tokenActionHudCoreApiReady",(async t=>{g=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 h=null;Hooks.once("tokenActionHudCoreApiReady",(async e=>{h=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=g.getSetting("abbreviateSkills"),this.addAuxiliaryActions=g.getSetting("addAuxiliaryActions"),this.addDamageAndCritical=g.getSetting("addDamageAndCritical"),this.addStowedItems=g.getSetting("addStowedItems"),this.addUnequippedItems=g.getSetting("addUnequippedItems"),this.calculateAttackPenalty=g.getSetting("calculateAttackPenalty"),this.colorSkills=g.getSetting("colorSkills"),this.showStrikeImages=g.getSetting("showStrikeImages"),this.showStrikeNames=g.getSetting("showStrikeNames"),this.splitStrikes=g.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.#g(),this.#h(),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.#c(),this.#p(),this.#u(),this.#g(),this.#f()]),this.#P(),this.#b()}async#s(){await Promise.all([this.#o(),this.#m(),this.#g()]),this.#b()}async#a(){await Promise.all([this.#o(),this.#l(),this.#c(),this.#r(),this.#m(),this.#p(),this.#u(),this.#g(),this.#h(),this.#f(),this.#k(),this.#y()]),this.#b()}async#n(){await Promise.all([this.#m(),this.#g(),this.#f()]),this.#u(),this.#h()}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.#C(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 this.#U(t,s);return{id:a,name:n,encodedValue:c,cssClass:l,img:d,icon1:r,info:m,listName:o,tooltip:await this.#H(t,p)}})));this.addActions(o,n)}}#P(){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),g=`toggle${r?" active":""}`;let h="",f="";if(r)if(i.includes(c.slug)){const e=this.actor.system.attributes[c.slug];f=e.value;const t=e.max;h={text:t>0?`${f??0}/${t}`:""}}else c.system.value.isValued&&(f=c.system.value.value,h={text:f});const y={name:`${d}${f?` ${f}`:""}`,description:o.description};return{id:l,name:d,listName:m,encodedValue:p,cssClass:g,img:u,info1:h,tooltip:await this.#H(t,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.#C(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.#H(t,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.#C(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 this.#U(t,s);return{id:a,name:n,encodedValue:c,cssClass:l,img:d,icon1:r,info:m,listName:o,tooltip:await this.#H(t,p)}})));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.#H(t,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.#D();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:e.api.Utils.i18n("PF2E.PerceptionLabel"),o=e.api.Utils.i18n("PF2E.PerceptionLabel"),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}:"",g={name:`${o}${this.actor&&p?` ${p}`:""}`,modifiers:i?.modifiers},h=this.actor?await this.#H(t,g):null;n.push({id:"initiative-perception",name:l,listName:r,encodedValue:d,cssClass:m,info1:u,tooltip:h})}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":""}`,g=e.api.Utils.getModifier(n.check?.mod),h=this.actor?{text:g}:"",f={name:`${r}${this.actor&&g?` ${g}`:""}`,modifiers:n?.modifiers};return{id:o,name:d,listName:m,encodedValue:p,cssClass:u,info1:h,tooltip:this.actor?await this.#H(t,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.#N(t),n=this.#R("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.#C(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.#M(s),m=e.api.Utils.getImage(s),p=this.#T(s),u=await this.#U(t,s);return{id:a,name:n,encodedValue:c,cssClass:l,img:m,icon1:r,icon2:d,info:p,listName:o,tooltip:await this.#H(t,u)}})));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.#R("container",e)&&l.set(e.id,e)}const c=await Promise.all([...l].map((async([i,s])=>{const a=this.#C(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.#M(s),m=e.api.Utils.getImage(s),p=this.#T(s),u=await this.#U(t,s);return{id:a,name:n,encodedValue:c,cssClass:l,img:m,icon1:r,icon2:d,info:p,listName:o,tooltip:await this.#H(t,u)}})));this.addActions(c,o)}}}async#u(){const t="perceptionCheck",i=this.actor?this.actor.system.attributes.perception:e.api.Utils.i18n("PF2E.PerceptionLabel"),s=e.api.Utils.i18n("PF2E.PerceptionLabel"),a=e.api.Utils.getModifier(i?.totalModifier),n=this.actor?{text:a}:"",o={name:`${s}${this.actor&&a?` ${a}`:""}`,modifiers:i?.modifiers},l=await this.#H(t,o),c=[{id:"perception",name:s,encodedValue:[t,"perception"].join(this.delimiter),info1:n,tooltip:l}];this.addActions(c,{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#g(){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.#H(t,d):null}})));this.addActions(s,{id:"saves",type:"system"})}async#h(){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),g=this.#x(i.actionCost),h=i.image,f=e.api.Utils.getModifier(this.actor?.skills[i.skill]?.check?.mod),y={id:l,name:r,listName:d,encodedValue:m,icon1:g,img:h,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.#D();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),g=this.actor?{text:u}:"",h={name:`${r}${this.actor&&u?` ${u}`:""}`,modifiers:s?.modifiers};return{id:n,name:l,fullName:r,listName:d,encodedValue:m,cssClass:p,info1:g,tooltip:this.actor?await this.#H(t,h):null}})));this.addActions(l,o)}}#D(){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.#j(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.#L(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.#C(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.#_(s),u=await this.#U(t,s);return{id:n,name:o,listName:l,encodedValue:r,cssClass:c,img:m,icon1:d,info:p,tooltip:await this.#H(t,u)}})));this.addActions(d,l)}}}async#L(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,g=c?"focus":`slot${s[1].level}`,h="focus"===g?p?.max:u?.max,f={text:h>=0?`${("focus"===g?p?.value:u?.value)??0}/${h}`:""};i.info={info1:f},this.addGroupInfo(i);const y=e.api.Utils.i18n(a.spell),k=[{id:`${n.id}>${g}>slotIncrease`,name:"+",listName:`${y}: ${t.name}: ${i.name}: +`,encodedValue:[m,`${n.id}>${g}>slotIncrease`].join(this.delimiter),cssClass:"shrink"},{id:`${n.id}>${g}>slotDecrease`,name:"-",listName:`${y}: ${t.name}: ${i.name}: -`,encodedValue:[m,`${n.id}>${g}>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,g=`${e.api.Utils.i18n(a[t])}: ${n.label} (${n.item.id})`,h=n.imageUrl,f=this.showStrikeNames,y=await this.#U(t,n),k=await this.#H(t,y);if(c={id:p,name:u,listName:g,type:"system-derived",settings:{showTitle:f},tooltip:k},this.showStrikeImages&&(c.settings.image=h),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:`${g}: ${c}`,encodedValue:["auxAction",o].join(this.delimiter),icon1:this.#x(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:`${g}: ${s}`,encodedValue:["auxAction",e].join(this.delimiter),icon1:this.#x(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:`${g}: ${s}`,encodedValue:["versatileOption",i].join(this.delimiter),cssClass:this.#$(t),icon1:this.#x(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=`${g}: ${c}`,h="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:h,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}",""))?game.system.version<"5.2.0"?n.totalModifier+parseInt(i.label.split(" ")[1]):parseInt(i.label.split(" ")[0]):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.#C(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"})}#V(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}`}}}#C(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.#C(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.#x(l,c)}#O(e){return["downtime","exploration"].includes(e.system.traits?.value)}#j(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}#_(e){return{info1:this.#q(e),info2:this.#G(e)}}#q(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(", ")}}#G(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}#N(e){const t=e.system.equipped?.carryType;return!!this.addUnequippedItems||!(!["held","worn"].includes(t)||e.system.containerId?.value?.length)}#R(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:""}#x(e,t=""){return["bow-arrow","axe","hammer"].includes(e)?``:s[e]}#M(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)??""}async#U(e,t){if("none"===this.tooltipsSetting)return"";const i=t?.name??"";if("nameOnly"===this.tooltipsSetting)return i;const s="strike"===e?await t.item.getChatData():await t.getChatData(),a="strike"===e?this.#Y(t):null;switch(e){case"item":return{name:i,description:s?.description.value,rarity:s.rarity,traits:s.traits,traits2:s.properties};case"spell":return{name:i,description:s.description.value,properties:s.properties,rarity:s.rarity,traits:s.actionTraits,traitsAlt:s.spellTraits};case"strike":return{name:t.label,descriptionLocalised:a,modifiers:t.modifiers,properties:s?.properties.filter((e=>"PF2E.WeaponTypeMartial"!==e)),traits:t.traits,traitsAlt:t.weaponTraits};default:return{name:i,description:s?.description?.value,properties:s?.properties,rarity:s?.rarity,traits:s?.traits}}}async#H(t,i){if("string"==typeof i)return i;const s=e.api.Utils.i18n(i.name),a=`

${s}

`,n=e.api.Utils.i18n(i?.description??i?.descriptionLocalised??""),o=i?.rarity?`${e.api.Utils.i18n(i.rarity.label)}`:"",l=i?.properties?`
${i.properties.map((t=>`${e.api.Utils.i18n(t)}`)).join("")}
`:"",c=i?.traits?i.traits.map((t=>`${e.api.Utils.i18n(t.label)}`)).join(""):"",r=i?.traits2?i.traits2.map((t=>`${e.api.Utils.i18n(t.label??t)}`)).join(""):"",d=i?.traitsAlt?i.traitsAlt.map((t=>`${e.api.Utils.i18n(t.label)}`)).join(""):"",m=i?.modifiers?`
${i.modifiers.filter((e=>e.enabled)).map((t=>`${e.api.Utils.i18n(t.label)} ${`${t.modifier>=0?"+":""}${t.modifier??""}`}`)).join("")}
`:"",p=[o,c,r,d].join(""),u=p?`
${p}
`:"";if(!n&&!u&&!m)return s;const g=`
${a}${u||m?`
${u}${m}
`:""}${n}${l}
`;return"condition"===t?await TextEditor.enrichHTML(g,{async:!0}):g}#Y(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.settings.showRollDialogs;this.rollMode=this.ctrl?game.user.isGM?"gmroll":"blindroll":null,this.skipDialog=this.shift?!e:e}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};i.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.#ge(i,a);break;case"versatileOption":this.#he(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})}}#ge(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#he(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 h(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,h 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,g 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",hammer:"fa-solid fa-hammer 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 g=null;Hooks.once("tokenActionHudCoreApiReady",(async t=>{g=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 h=null;Hooks.once("tokenActionHudCoreApiReady",(async e=>{h=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=g.getSetting("abbreviateSkills"),this.addAuxiliaryActions=g.getSetting("addAuxiliaryActions"),this.addDamageAndCritical=g.getSetting("addDamageAndCritical"),this.addStowedItems=g.getSetting("addStowedItems"),this.addUnequippedItems=g.getSetting("addUnequippedItems"),this.calculateAttackPenalty=g.getSetting("calculateAttackPenalty"),this.colorSkills=g.getSetting("colorSkills"),this.showStrikeImages=g.getSetting("showStrikeImages"),this.showStrikeNames=g.getSetting("showStrikeNames"),this.splitStrikes=g.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.#g(),this.#h(),this.#f(),this.#y(),this.#k(),this.#b(),this.#A(),this.#v(),this.#w(),this.#I()])}async#i(){await Promise.all([this.#o(),this.#P(),this.#l(),this.#c(),this.#r(),this.#g(),this.#h(),this.#k(),this.#A()])}async#s(){await Promise.all([this.#o(),this.#l(),this.#u(),this.#k()])}async#a(){await Promise.all([this.#o(),this.#l(),this.#c(),this.#r(),this.#d(),this.#u(),this.#g(),this.#h(),this.#k(),this.#b(),this.#A(),this.#w(),this.#v()])}async#n(){await Promise.all([this.#u(),this.#h(),this.#k(),this.#b(),this.#A()])}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.#C(s),n=this.#S(s),o=this.#F(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 this.#U(t,s);return{id:a,name:n,encodedValue:c,cssClass:l,img:d,icon1:r,info:m,listName:o,tooltip:await this.#H(t,p)}})));this.addActions(o,n)}}#P(){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)}}#l(){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#c(){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),g=`toggle${r?" active":""}`;let h="",f="";if(r)if(i.includes(c.slug)){const e=this.actor.system.attributes[c.slug];f=e.value;const t=e.max;h={text:t>0?`${f??0}/${t}`:""}}else c.system.value.isValued&&(f=c.system.value.value,h={text:f});const y={name:`${d}${f?` ${f}`:""}`,description:o.description};return{id:l,name:d,listName:m,encodedValue:p,cssClass:g,img:u,info1:h,tooltip:await this.#H(t,y)}})));await this.addActions(o,{id:"conditions",type:"system"})}async#p(){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#r(){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.#C(s),n=this.#S(s),o=this.#F(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.#H(t,p)}})));this.addActions(s,{id:"effects",type:"system"})}async#d(){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.#C(s),n=this.#S(s),o=this.#F(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 this.#U(t,s);return{id:a,name:n,encodedValue:c,cssClass:l,img:d,icon1:r,info:m,listName:o,tooltip:await this.#H(t,p)}})));this.addActions(o,n)}}async#m(){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):null)?.text?.content??null};return{id:a,name:n,encodedValue:l,img:c,listName:o,tooltip:await this.#H(t,r)}})));n.push(...c),this.addActions(n,{id:"hero-actions",type:"system"})}async#u(){const t="initiative",i=this.actor?Object.entries(this.actor.skills).filter((([e,t])=>!!t.label&&t.label.length>1)):this.#D();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:e.api.Utils.i18n("PF2E.PerceptionLabel"),o=e.api.Utils.i18n("PF2E.PerceptionLabel"),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}:"",g={name:`${o}${this.actor&&p?` ${p}`:""}`,modifiers:i?.modifiers},h=this.actor?await this.#H(t,g):null;n.push({id:"initiative-perception",name:l,listName:r,encodedValue:d,cssClass:m,info1:u,tooltip:h})}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":""}`,g=e.api.Utils.getModifier(n.check?.mod),h=this.actor?{text:g}:"",f={name:`${r}${this.actor&&g?` ${g}`:""}`,modifiers:n?.modifiers};return{id:o,name:d,listName:m,encodedValue:p,cssClass:u,info1:h,tooltip:this.actor?await this.#H(t,f):null}})));n.push(...o);this.addActions(n,{id:"initiative",type:"system"})}async#g(){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.#N(t),n=this.#R("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.#C(s),n=this.#S(s),o=this.#F(s,t),l=this.#$(s),c=[t,a].join(this.delimiter),r=this.#E(s,t),d=this.#M(s),m=e.api.Utils.getImage(s),p=this.#T(s),u=await this.#U(t,s);return{id:a,name:n,encodedValue:c,cssClass:l,img:m,icon1:r,icon2:d,info:p,listName:o,tooltip:await this.#H(t,u)}})));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.#R("container",e)&&l.set(e.id,e)}const c=await Promise.all([...l].map((async([i,s])=>{const a=this.#C(s),n=this.#S(s),o=this.#F(s,t),l=this.#$(s),c=[t,a].join(this.delimiter),r=this.#E(s,t),d=this.#M(s),m=e.api.Utils.getImage(s),p=this.#T(s),u=await this.#U(t,s);return{id:a,name:n,encodedValue:c,cssClass:l,img:m,icon1:r,icon2:d,info:p,listName:o,tooltip:await this.#H(t,u)}})));this.addActions(c,o)}}}async#h(){const t="perceptionCheck",i=this.actor?this.actor.system.attributes.perception:e.api.Utils.i18n("PF2E.PerceptionLabel"),s=e.api.Utils.i18n("PF2E.PerceptionLabel"),a=e.api.Utils.getModifier(i?.totalModifier),n=this.actor?{text:a}:"",o={name:`${s}${this.actor&&a?` ${a}`:""}`,modifiers:i?.modifiers},l=await this.#H(t,o),c=[{id:"perception",name:s,encodedValue:[t,"perception"].join(this.delimiter),info1:n,tooltip:l}];this.addActions(c,{id:"perception-check",type:"system"})}#f(){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)}}#y(){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#k(){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.#H(t,d):null}})));this.addActions(s,{id:"saves",type:"system"})}async#b(){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),g=this.#x(i.actionCost),h=i.image,f=e.api.Utils.getModifier(this.actor?.skills[i.skill]?.check?.mod),y={id:l,name:r,listName:d,encodedValue:m,icon1:g,img:h,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#A(){const t="skill",i=this.actor?Object.entries(this.actor.skills).filter((e=>!!e[1].label&&e[1].label.length>1)):this.#D();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),g=this.actor?{text:u}:"",h={name:`${r}${this.actor&&u?` ${u}`:""}`,modifiers:s?.modifiers};return{id:n,name:l,fullName:r,listName:d,encodedValue:m,cssClass:p,info1:g,tooltip:this.actor?await this.#H(t,h):null}})));this.addActions(l,o)}}#D(){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#v(){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.#j(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.#L(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.#C(s,t,a),o=this.#S(s),l=this.#F(s,t),c=this.#$(s),r=this.#z(s,t,a),d=this.#E(s,t),m=e.api.Utils.getImage(s),p=this.#_(s),u=await this.#U(t,s);return{id:n,name:o,listName:l,encodedValue:r,cssClass:c,img:m,icon1:d,info:p,tooltip:await this.#H(t,u)}})));this.addActions(d,l)}}}async#L(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,g=c?"focus":`slot${s[1].level}`,h="focus"===g?p?.max:u?.max,f={text:h>=0?`${("focus"===g?p?.value:u?.value)??0}/${h}`:""};i.info={info1:f},this.addGroupInfo(i);const y=e.api.Utils.i18n(a.spell),k=[{id:`${n.id}>${g}>slotIncrease`,name:"+",listName:`${y}: ${t.name}: ${i.name}: +`,encodedValue:[m,`${n.id}>${g}>slotIncrease`].join(this.delimiter),cssClass:"shrink"},{id:`${n.id}>${g}>slotDecrease`,name:"-",listName:`${y}: ${t.name}: ${i.name}: -`,encodedValue:[m,`${n.id}>${g}>slotDecrease`].join(this.delimiter),cssClass:"shrink"}];this.addActions(k,i)}async#w(){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,g=`${e.api.Utils.i18n(a[t])}: ${n.label} (${n.item.id})`,h=n.imageUrl,f=this.showStrikeNames,y=await this.#U(t,n),k=await this.#H(t,y);if(c={id:p,name:u,listName:g,type:"system-derived",settings:{showTitle:f},tooltip:k},this.showStrikeImages&&(c.settings.image=h),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:`${g}: ${c}`,encodedValue:["auxAction",o].join(this.delimiter),icon1:this.#x(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:`${g}: ${s}`,encodedValue:["auxAction",e].join(this.delimiter),icon1:this.#x(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:`${g}: ${s}`,encodedValue:["versatileOption",i].join(this.delimiter),cssClass:this.#$(t),icon1:this.#x(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=`${g}: ${c}`,h="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:h,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}",""))?game.system.version<"5.2.0"?n.totalModifier+parseInt(i.label.split(" ")[1]):parseInt(i.label.split(" ")[0]):game.system.version<"5.4.0"?parseInt(i.label.split(" ")[1]):parseInt(i.label),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.#C(i),s=this.#S(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"})}#O(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}`}}}#C(e,t,i){return"spell"===t?`${e.id??e._id}-${i}`:e.id??e._id}#S(e){return e?.name??e?.label??""}#F(t,i){const s=this.#S(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.#C(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.#S(e);return this.#x(l,c)}#V(e){return["downtime","exploration"].includes(e.system.traits?.value)}#j(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}#_(e){return{info1:this.#q(e),info2:this.#G(e)}}#q(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(", ")}}#G(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}#N(e){const t=e.system.equipped?.carryType;return!!this.addUnequippedItems||!(!["held","worn"].includes(t)||e.system.containerId?.value?.length)}#R(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:""}#x(e,t=""){return["bow-arrow","axe","hammer"].includes(e)?``:s[e]}#M(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)??""}async#U(e,t){if("none"===this.tooltipsSetting)return"";const i=t?.name??"";if("nameOnly"===this.tooltipsSetting)return i;const s="strike"===e?await t.item.getChatData():await t.getChatData(),a="strike"===e?this.#Y(t):null;switch(e){case"item":return{name:i,description:s?.description.value,rarity:s.rarity,traits:s.traits,traits2:s.properties};case"spell":return{name:i,description:s.description.value,properties:s.properties,rarity:s.rarity,traits:s.actionTraits,traitsAlt:s.spellTraits};case"strike":return{name:t.label,descriptionLocalised:a,modifiers:t.modifiers,properties:s?.properties.filter((e=>"PF2E.WeaponTypeMartial"!==e)),traits:t.traits,traitsAlt:t.weaponTraits};default:return{name:i,description:s?.description?.value,properties:s?.properties,rarity:s?.rarity,traits:s?.traits}}}async#H(t,i){if("none"===this.tooltipsSetting)return"";const s=e.api.Utils.i18n(i.name);if("nameOnly"===this.tooltipsSetting)return s;if("string"==typeof i)return i;const a=`

${s}

`,n=e.api.Utils.i18n(i?.description??i?.descriptionLocalised??""),o=i?.rarity?`${e.api.Utils.i18n(i.rarity.label)}`:"",l=i?.properties?`
${i.properties.map((t=>`${e.api.Utils.i18n(t)}`)).join("")}
`:"",c=i?.traits?i.traits.map((t=>`${e.api.Utils.i18n(t.label)}`)).join(""):"",r=i?.traits2?i.traits2.map((t=>`${e.api.Utils.i18n(t.label??t)}`)).join(""):"",d=i?.traitsAlt?i.traitsAlt.map((t=>`${e.api.Utils.i18n(t.label)}`)).join(""):"",m=i?.modifiers?`
${i.modifiers.filter((e=>e.enabled)).map((t=>`${e.api.Utils.i18n(t.label)} ${`${t.modifier>=0?"+":""}${t.modifier??""}`}`)).join("")}
`:"",p=[o,c,r,d].join(""),u=p?`
${p}
`:"";if(!n&&!u&&!m)return s;const g=`
${a}${u||m?`
${u}${m}
`:""}${n}${l}
`;return await TextEditor.enrichHTML(g,{async:!0})}#Y(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.settings.showRollDialogs;this.rollMode=this.ctrl?game.user.isGM?"gmroll":"blindroll":null,this.skipDialog=this.shift?!e:e}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};i.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.#ge(i,a);break;case"versatileOption":this.#he(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})}}#ge(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#he(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)}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 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 h(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,h 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,g as Utils,register};