From d9cbfb1342d01e07e09ebeeefb70f522b4f4b491 Mon Sep 17 00:00:00 2001 From: Idle <651462+reonZ@users.noreply.github.com> Date: Mon, 4 Dec 2023 14:53:25 +0100 Subject: [PATCH] 1.24.3 --- CHANGELOG.md | 6 ++++++ module.json | 4 ++-- scripts/main.js | 10 +++++----- scripts/main.js.map | 8 ++++---- styles/_target.scss | 2 ++ styles/toolbelt.css | 2 +- styles/toolbelt.css.map | 2 +- 7 files changed, 21 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6a2286..d1c1107 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 1.24.3 + +- `Target Token Helper` updates: + - increased the font size of the save result + - increased contrast between failure and critical failure colors for the save result + # 1.24.2 - fixed `Target Token Helper` adding targets to persistent damage, fast-healing and regeneration messages diff --git a/module.json b/module.json index 99316af..483d1e6 100644 --- a/module.json +++ b/module.json @@ -17,12 +17,12 @@ "verified": "11" }, "socket": true, - "version": "1.24.2", + "version": "1.24.3", "manifestPlusVersion": "1.2.0", "url": "https://github.com/reonZ/pf2e-toolbelt", "readme": "https://github.com/reonZ/pf2e-toolbelt/blob/master/README.md", "manifest": "https://raw.githubusercontent.com/reonZ/pf2e-toolbelt/master/module.json", - "download": "https://github.com/reonZ/pf2e-toolbelt/releases/download/1.24.2/module.zip", + "download": "https://github.com/reonZ/pf2e-toolbelt/releases/download/1.24.3/module.zip", "changelog": "https://github.com/reonZ/pf2e-toolbelt/blob/master/CHANGELOG.md", "bugs": "https://github.com/reonZ/pf2e-toolbelt/issues", "styles": [ diff --git a/scripts/main.js b/scripts/main.js index c52fad2..aab43dd 100644 --- a/scripts/main.js +++ b/scripts/main.js @@ -1,10 +1,10 @@ -(()=>{var ft=Object.defineProperty;var ta=(e,t,n)=>t in e?ft(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var o=(e,t)=>ft(e,"name",{value:t,configurable:!0});var re=(e,t,n)=>(ta(e,typeof t!="symbol"?t+"":t,n),n),na=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var ie=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)};var _=(e,t,n)=>(na(e,t,"access private method"),n);var S="pf2e-toolbelt";function L(e,t,n="WRAPPER"){return libWrapper.register(S,e,t,n)}o(L,"registerWrapper");function w(...e){let[t,n]=e;return t=`${S}.${t}`,n?game.i18n.format(t,n):game.i18n.localize(t)}o(w,"localize");function aa(e){return game.i18n.has(`${S}.${e}`,!1)}o(aa,"hasLocalization");function oa(e){return`${S}.${e}`}o(oa,"localizePath");function T(e){let t=o((...n)=>w(`${e}.${n[0]}`,n[1]),"fn");return Object.defineProperties(t,{warn:{value:(...n)=>D(`${e}.${n[0]}`,n[1],n[2]),enumerable:!1,configurable:!1},info:{value:(...n)=>J(`${e}.${n[0]}`,n[1],n[2]),enumerable:!1,configurable:!1},error:{value:(...n)=>W(`${e}.${n[0]}`,n[1],n[2]),enumerable:!1,configurable:!1},has:{value:n=>aa(`${e}.${n}`),enumerable:!1,configurable:!1},path:{value:n=>oa(`${e}.${n}`),enumerable:!1,configurable:!1},template:{value:(n,{hash:a})=>t(n,a),enumerable:!1,configurable:!1}}),t}o(T,"subLocalize");function ze(e,t,n,a){let s=typeof t=="string"?t:"info",r=typeof t=="object"?t:typeof n=="object"?n:void 0,i=typeof t=="boolean"?t:typeof n=="boolean"?n:a??!1;ui.notifications.notify(w(e,r),s,{permanent:i})}o(ze,"notify");function D(...e){let[t,n,a]=e;ze(t,"warning",n,a)}o(D,"warn");function J(...e){let[t,n,a]=e;ze(t,"info",n,a)}o(J,"info");function W(...e){let[t,n,a]=e;ze(t,"error",n,a)}o(W,"error");function v(e){return game.settings.get(S,e)}o(v,"getSetting");function ce(e,t){return game.settings.set(S,e,t)}o(ce,"setSetting");var sa="CONFIG.PF2E.Item.documentClasses.weapon.prototype.prepareBaseData",ra="CONFIG.PF2E.Item.documentClasses.weapon.prototype.prepareDerivedData";var ia="CONFIG.PF2E.Item.documentClasses.armor.prototype.prepareBaseData",ca="CONFIG.PF2E.Item.documentClasses.armor.prototype.prepareDerivedData";function ut(){return{settings:[{name:"arp",type:Boolean,default:!1,requiresReload:!0}],conflicts:["pf2e-arp"],init:()=>{v("arp")&&(L(sa,ua,"WRAPPER"),L(ra,da,"WRAPPER"),L(ia,ga,"WRAPPER"),L(ca,ha,"WRAPPER"))},ready:e=>{e&&v("arp")&&game.settings.get("pf2e","automaticBonusVariant")!=="noABP"&&(game.settings.set("pf2e","automaticBonusVariant","noABP"),J("arp.forceVariant"))}}}o(ut,"registerArp");function ke(e,t=!1){return e&&!e.getFlag("pf2e","disableABP")&&(!t||e.isOfType("character"))}o(ke,"isValidActor");var la={1:35,2:935,3:8935,4:8935},fa={striking:65,greaterStriking:1065,majorStriking:31065};function dt(e){let t=e._source.system.traits.value,n=e._source.system.group,a=e._source.system.category,s=e._source.system.slug;return n!=="shield"&&(s==="handwraps-of-mighty-blows"||a!=="unarmed")&&!t.includes("alchemical")&&!t.includes("bomb")}o(dt,"isValidWeapon");function ua(e){let t=this.actor;if(!ke(t,!0)||!dt(this))return e();let n=t.level,a=this._source.system.traits.value;if(a.includes("alchemical")&&a.includes("bomb"))return e();this.system.potencyRune.value=n<2?null:n<10?1:n<16?2:3,this.system.strikingRune.value=n<4?null:n<12?"striking":n<19?"greaterStriking":"majorStriking",e()}o(ua,"onPrepareWeaponData");function da(e){if(e(),!ke(this.actor)||this.isSpecific||!dt(this))return;let t=this.price.value.toObject();if(!t.gp)return;let n=this.system.potencyRune.value;n&&(t.gp-=la[n]);let a=this.system.strikingRune.value;a&&(t.gp-=fa[a]),t=new game.pf2e.Coins(t),(n||a)&&!this.system.runes.property.length&&(t=t.add(this._source.system.price.value)),this.system.price.value=t}o(da,"onPrepareWeaponDerivedData");var pa={1:160,2:1060,3:20560,4:20560},ma={resilient:340,greaterResilient:3440,majorResilient:49440};function pt(e){return!0}o(pt,"isValidArmor");function ga(e){let t=this.actor;if(!ke(t,!0)||!pt(this))return e();let n=t.level;this.system.potencyRune.value=n<5?null:n<11?1:n<18?2:3,this.system.resiliencyRune.value=n<8?null:n<14?"resilient":n<20?"greaterResilient":"majorResilient",e()}o(ga,"onPrepareArmorData");function ha(e){if(e(),!ke(this.actor)||this.isSpecific||!pt(this))return;let t=this.price.value.toObject();if(!t.gp)return;let n=this.system.potencyRune.value;n&&(t.gp-=pa[n]);let a=this.system.resiliencyRune.value;a&&(t.gp-=ma[a]),t=new game.pf2e.Coins(t),(n||a)&&!this.system.runes.property.length&&(t=t.add(this._source.system.price.value)),this.system.price.value=t}o(ha,"onPrepareArmorDerivedData");function R(e,t,n=()=>{}){let a=null;return function(s,r=[],i=!1){typeof r=="string"&&(r=[r]),s||=r.some(c=>v(c)),s&&!a?a=Hooks.on(e,t):!s&&a&&(Hooks.off(e,a),a=null),i||n(s)}}o(R,"createHook");function Q(e,t,n=()=>{}){let a=null;return function(s,r=!1){s===!1&&(s="disabled"),s==="disabled"&&a?(Hooks.off(e,a),a=null):s!=="disabled"&&!a&&(a=Hooks.on(e,t)),r||n(s)}}o(Q,"createChoicesHook");function mt(e,t){let n=Hooks.on(e,t),a=Hooks.events[e].findIndex(s=>s.id===n);if(a!==0){let[s]=Hooks.events[e].splice(a,1);Hooks.events[e].unshift(s)}return n}o(mt,"registerUpstreamHook");var We=R("renderEffectsPanel",ba,ya);function gt(){return{settings:[{name:"effect-remove",type:Boolean,default:!1,scope:"client",onChange:e=>We(e,"condition-sheet")},{name:"condition-sheet",type:Boolean,default:!1,scope:"client",onChange:e=>We(e,"effect-remove")}],conflicts:["pf2e-effect-description"],init:()=>{We(!1,["effect-remove","condition-sheet"])}}}o(gt,"registerEffectsPanelHelper");function ya(){game.pf2e.effectPanel?.render()}o(ya,"refreshEffectsPanel");function ba(e,t){let n=`
${w("effects.remove")}
`,a='',s=t.find(".effect-item[data-item-id]").toArray();for(let r of s){let i=r.dataset.itemId,c=e.actor?.items.get(i);if(c&&(v("effect-remove")&&!c.isLocked&&c.badge&&c.badge.type==="counter"&&(r.querySelector(".effect-info .instructions").insertAdjacentHTML("beforeend",n),r.querySelector(".icon").addEventListener("contextmenu",l=>Sa(l,e),!0)),v("condition-sheet")&&c.isOfType("condition"))){let l=r.querySelector(".effect-info > h1");l.insertAdjacentHTML("beforeend",a),l.querySelector('[data-action="edit"]').addEventListener("click",u=>va(u,e))}}}o(ba,"renderEffectsPanel");function va(e,t){let n=ht(e,t);n?.isOfType("condition")&&(e.preventDefault(),n.sheet.render(!0))}o(va,"onConditionSheet");function Sa(e,t){if(!e.shiftKey)return;let n=ht(e,t);!n||n.isLocked||!n.badge||n.badge.type!=="counter"||(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),n.delete())}o(Sa,"onRemoveEffect");function ht(e,t){let s=e.currentTarget.closest(".effect-item[data-item-id]").dataset.itemId;return t.actor?.items.get(s)}o(ht,"getEffect");var le=class extends FormApplication{constructor(t,n,a){super(t,n),this.onSubmitCallback=a}async getData(){let[t,n]=this.options.isPurchase?["PF2E.loot.PurchaseLootMessage","PF2E.loot.PurchaseLoot"]:["PF2E.loot.MoveLootMessage","PF2E.loot.MoveLoot"];return{...await super.getData(),maxQuantity:this.options.maxQuantity,newStack:this.options.newStack,lockStack:this.options.lockStack,prompt:t,buttonLabel:n}}static get defaultOptions(){return{...super.defaultOptions,id:"MoveLootPopup",classes:[],title:game.i18n.localize("PF2E.loot.MoveLootPopupTitle"),template:"systems/pf2e/templates/popups/loot/move-loot-popup.hbs",width:"auto",maxQuantity:1,newStack:!1,lockStack:!1,isPurchase:!1}}async _updateObject(t,n){this.onSubmitCallback(n.quantity,n.newStack)}};o(le,"MoveLootPopup");function x(e){return e&&!e.pack&&e.id&&game.actors.has(e.id)}o(x,"isPlayedActor");function C(e,t,n){return e.getFlag(S,t)??n}o(C,"getFlag");function G(e,t,n){return e.setFlag(S,t,n)}o(G,"setFlag");function yt(e,t){return e.unsetFlag(S,t)}o(yt,"unsetFlag");function q(e,t,n){return e.updateSource({[`flags.${S}.${t}`]:n})}o(q,"updateSourceFlag");function fe(e,t,n){e[`flags.${S}.${t}`]=n}o(fe,"moduleFlagUpdate");function qe(){return CONFIG.ChatMessage.documentClass}o(qe,"getChatMessageClass");function*ue(e,t){let n=game.messages.contents,a=(t?n.findLastIndex(s=>s===t):n.length)-1;for(let s=a;s>=a-e;s--){let r=n[s];if(!r)return;yield r}}o(ue,"latestChatMessages");function j(e,t,n=!1){return n?`${t}`:t?`@UUID[${e}]{${t}}`:`@UUID[${e}]`}o(j,"chatUUID");function we(e){let t=e.id,n=C(e,"target.save");n&&Hooks.once("preCreateChatMessage",a=>{q(a,"target.messageId",t),q(a,"target.save",n)})}o(we,"bindOnPreCreateSpellDamageChatMessage");function X(e){game.socket.on(`module.${S}`,e)}o(X,"socketOn");function Z(e){game.socket.off(`module.${S}`,e)}o(Z,"socketOff");function O(e){game.socket.emit(`module.${S}`,e)}o(O,"socketEmit");function ee(){return game.user===game.users.activeGM}o(ee,"isActiveGM");function Ee(){let e=game.data.users.find(t=>t._id===game.data.userId);return e&&e.role>=CONST.USER_ROLES.GAMEMASTER}o(Ee,"isUserGM");function bt(){return game.users.some(e=>e.active&&e.isGM)}o(bt,"isGMOnline");function vt(e,t=!1){return t?game.users.find(n=>n.active&&n.character===e):game.users.find(n=>n.character===e)}o(vt,"getCharacterOwner");function Ca(e){let t=game.users.filter(n=>n.active&&!n.isGM&&e.testUserPermission(n,"OWNER"));return t.sort((n,a)=>n.id>a.id?1:-1),t[0]||null}o(Ca,"getActiveOwner");function Ve(e){return Ca(e)===game.user}o(Ve,"isActiveOwner");function St(e,t=!1){return t?game.users.find(n=>n.active&&e.testUserPermission(n,"OWNER")):game.users.find(n=>e.testUserPermission(n,"OWNER"))}o(St,"getOwner");var Ie=!1,de=null;function Et(){return{settings:[{name:"giveth",type:String,default:"disabled",choices:["disabled","enabled","no-message"],onChange:Ct}],conflicts:["pf2e-giveth"],ready:e=>{v("giveth")!=="disabled"&&Ct(!0)}}}o(Et,"registerGiveth");function Ct(e){let t=game.user.isGM;e==="disabled"&&Ie?(t?Z(kt):de&&(Hooks.off("dropCanvasData",de),de=null),Ie=!1):e!=="disabled"&&!Ie&&(t?X(kt):de||(de=mt("dropCanvasData",ka)),Ie=!0)}o(Ct,"setup");function kt(e){ee()&&(e.type==="giveth-condition"?Ia(e):e.type==="giveth-effect"?Ta(e):Aa(e))}o(kt,"onSocket");function ka(e,t){if(!bt())return!0;let n=Ea(t);if(!n)return!0;let a=e.tokens.placeables.slice().filter(s=>{if(!s.document.actorLink)return!1;let r=s.actor;if(!It(r,t.actorId)||r.isOwner)return!1;let i=s.x+(s.hitArea?.right??0),c=s.y+(s.hitArea?.bottom??0);return t.x>=s.x&&t.y>=s.y&&t.x<=i&&t.y<=c}).sort((s,r)=>r.document.sort-s.document.sort).at(0)?.actor;return a?(wa(n.actor,a,n.item,n.value),!1):!0}o(ka,"onDropCanvasData");function wa(e,t,n,a){let s=e.id,r=t.id,i=!(n instanceof Item);if(!i&&n.isOfType("physical")){let c=n.quantity;if(c<1)return D("giveth.notification.zero");if(c===1)return wt(s,r,n.id,1,!1);new le(e,{maxQuantity:c,lockStack:!1,isPurchase:!1},(l,u)=>{wt(s,r,n.id,l,u)}).render(!0)}else{let c=i?`Compendium.${n.pack}.${n._id}`:n.uuid;n.type==="condition"?O({type:"giveth-condition",targetId:r,value:a??1,uuid:c}):O({type:"giveth-effect",targetId:r,uuid:c})}}o(wa,"giveth");function wt(e,t,n,a,s){O({type:"giveth-physical",ownerId:e,targetId:t,itemId:n,qty:a,stack:s})}o(wt,"sendPhysicalRequest");function It(e,t){return!x(e)||t&&e.id===t?!1:e.hasPlayerOwner&&!e.isToken&&e.isOfType("character","npc","vehicle")}o(It,"isValidActor");function Ea(e){if(e.tokenId||e.type!=="Item"||!e.uuid)return;let t=fromUuidSync(e.uuid);if(!t)return;let n=t.actor;if(!n){let s=e.context?.origin.actor;n=s?fromUuidSync(s):null}if(!It(n)||!n.isOwner)return;let a=!(t instanceof Item);if(a&&t.pack&&["effect","condition"].includes(t.type))return{actor:n,item:t,value:e.value};if(!a&&t.isOfType("physical","effect"))return{actor:n,item:t,value:e.value}}o(Ea,"getDetailsFromData");async function Ia({targetId:e,uuid:t,value:n}){let a=game.actors.get(e);if(!a)return;let s=await fromUuid(t);s&&a.increaseCondition(s.slug,{min:n})}o(Ia,"takethCondition");async function Ta({targetId:e,uuid:t}){let n=game.actors.get(e);if(!n)return;let a=await fromUuid(t);if(!a)return;let s=a.clone({"system.tokenIcon.show":!0,"system.unidentified":!1}).toObject();n.createEmbeddedDocuments("Item",[s])}o(Ta,"takethEffect");async function Aa({itemId:e,ownerId:t,qty:n,stack:a,targetId:s}){let r=game.actors.get(t),i=game.actors.get(s);if(!r||!i)return;let c=r.items.get(e);if(!c)return;n=Math.min(n,c.quantity);let l=c.quantity-n,u=c.toObject();u.system.quantity=n,u.system.equipped.carryType="worn",c.isOfType("physical")&&"invested"in u.system.equipped&&(u.system.equipped.invested=c.traits.has("invested")?!1:null);let f=await i.addToInventory(u,void 0,a);if(!f||(l<1?c.delete():c.update({"system.quantity":l}),v("giveth")==="no-message"))return;let h=j(f.uuid,f.name,!f.isIdentified);n>1&&(h+=` x${n}`),ChatMessage.create({flavor:`

${w("giveth.giveth",{target:i.name})}

`,content:h,speaker:ChatMessage.getSpeaker({actor:r})})}o(Aa,"takethPhysical");function I(...e){return e=e.filter(t=>typeof t=="string"),`modules/${S}/templates/${e.join("/")}.hbs`}o(I,"templatePath");var te=T("hero.templates.trade"),pe=class extends Application{constructor(t){super({id:`pf2e-hero-actions-trade-${t.id}`}),this._actor=t}static get defaultOptions(){return mergeObject(super.defaultOptions,{title:te("title"),template:I("hero/trade"),width:600,height:"auto"})}get actor(){return this._actor}get target(){return this._target}set target(t){if(!t){te.error("no-target");return}t!==this._target&&(delete this.target?.apps?.[this.appId],this._target=t,this.render())}getData(t){return mergeObject(super.getData(),{actor:this.actor,target:this.target,targets:game.actors.filter(n=>n.type==="character"&&n.id!==this.actor.id&&n.hasPlayerOwner),actions:F(this.actor),targetActions:this.target?F(this.target):[],i18n:te})}activateListeners(t){super.activateListeners(t),t.find('select[name="target"]').on("change",this.#n.bind(this)),t.find('[data-action="description"]').on("click",this.#t.bind(this)),t.find('[data-action="trade"]').on("click",this.#e.bind(this)),t.find('[data-action="cancel"]').on("click",()=>this.close())}render(t,n){return this.actor.apps[this.appId]=this,this.target&&(this.target.apps[this.appId]=this),super.render(t,n)}async close(t){await super.close(t),delete this.actor.apps?.[this.appId],delete this.target?.apps?.[this.appId]}#e(){if(!this.target){te.warn("no-target");return}let t=this.element.find('[name="action"]:checked').val(),n=this.element.find('[name="targetAction"]:checked').val();if(typeof t!="string"||typeof n!="string"){te.warn("no-select");return}let a=vt(this.target,!0)??St(this.target,!0)??game.users.activeGM;if(!a){te.warn("no-user");return}Tt({sender:{id:game.user.id,cid:this.actor.id,uuid:t},receiver:{id:a.id,cid:this.target.id,uuid:n}}),this.close()}async#t(t){let n=$(t.currentTarget).siblings("input").val();(await fromUuid(n))?.sheet.render(!0)}#n(t){let n=t.currentTarget.value;this.target=game.actors.get(n)}};o(pe,"Trade");function Te(e,t){return e.localeCompare(t,game.i18n.lang)}o(Te,"localeCompare");function V(e){for(let t of Object.values(ui.windows)){let n=t.actor;!(t instanceof ActorSheet)||!n.isOfType("character")||(!e||e===n)&&t.render()}}o(V,"refreshCharacterSheets");function Ke(e,t){if(e.length!==t.length)return!1;let n=t.slice();for(let a of e){let s=n.findIndex(r=>a===r);if(s===-1)return!1;n.splice(s,1)}return!0}o(Ke,"compareArrays");function At(e){let t=new Intl.PluralRules(game.i18n.lang,{type:"ordinal"}),n=game.i18n.localize(`PF2E.OrdinalSuffixes.${t.select(e)}`);return game.i18n.format("PF2E.OrdinalNumber",{value:e,suffix:n})}o(At,"ordinalString");function Ae(e,t){if(typeof e!="object")return!1;for(;e=Reflect.getPrototypeOf(e);)if(e.constructor.name===t)return!0;return!1}o(Ae,"isInstanceOf");function De(e,t,n){return setProperty(e,`modules.${S}.${t}`,n)}o(De,"setInMemory");function me(e,t){return getProperty(e,`modules.${S}.${t}`)}o(me,"getInMemory");var Re="pf2e-hero-actions",Dt=R("renderCharacterSheetPF2e",Oa,Ra),Da="Compendium.pf2e.journals.JournalEntry.BSp4LUSaOmUyjBko",Oe="Compendium.pf2e.rollable-tables.RollTable.zgZoI7h0XjjJrrNK",Pa="systems/pf2e/icons/features/feats/heroic-recovery.webp",Pe=!1;function Rt(){return{name:"heroActions",settings:[{name:"hero",type:Boolean,default:!1,onChange:e=>Dt(e)},{name:"hero-table",type:String,default:""},{name:"hero-trade",type:Boolean,default:!1,onChange:()=>V()},{name:"hero-private",type:Boolean,default:!1}],conflicts:[Re],api:{createTable:za,removeHeroActions:Ya,getHeroActions:F,useHeroAction:Ft,getHeroActionDetails:Me,drawHeroAction:$t,drawHeroActions:Mt,sendActionToChat:Nt,discardHeroActions:Lt,tradeHeroAction:xt,getDeckTable:Qe,giveHeroActions:Xa,createChatMessage:xe},ready:()=>{Dt(!1,"hero")}}}o(Rt,"registerHeroActions");function Ra(e){e&&!Pe?(X(Pt),Pe=!0):!e&&Pe&&(Z(Pt),Pe=!1)}o(Ra,"setupSocket");function Pt(e){switch(e.type){case"hero.trade-reject":if(e.sender.id!==game.user.id)return;zt(e);break;case"hero.trade-accept":if(!ee())return;jt(e);break;case"hero.trade-request":if(e.receiver.id!==game.user.id)return;ja(e);break;case"hero.trade-error":if(!e.users.includes(game.user.id))return;Bt(e.error);break}}o(Pt,"onSocket");async function Oa(e,t){let n=e.actor;x(n)&&(await Ma(t,n),xa(t,n))}o(Oa,"renderCharacterSheetPF2e");async function Ma(e,t){let n=F(t),a=t.heroPoints.value-n.length,s=t.isOwner,r=T("hero.templates.heroActions"),i=await renderTemplate(I("hero/sheet"),{owner:s,list:n,canUse:a>=0&&s,canDraw:a>0&&s,canTrade:v("hero-trade"),mustDiscard:a<0,diff:Math.abs(a),i18n:(c,{hash:l})=>r(c,l)});e.find(".sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] > .strikes-list:not(.skill-action-list)").first().after(i)}o(Ma,"addActionsToSheet");function xa(e,t){let n=e.find(".tab.actions .heroActions-list");n.find("[data-action=draw]").on("click",a=>_a(t,a)),n.find("[data-action=expand]").on("click",Ot),n.find("[data-action=use]").on("click",a=>Ua(t,a)),n.find("[data-action=display]").on("click",a=>La(t,a)),n.find("[data-action=discard]").on("click",Fa),n.find("[data-action=discard-selected]").on("click",()=>$a(t,e)),e.find("[data-action=hero-actions-trade]").on("click",()=>xt(t))}o(xa,"addSheetEvents");async function $a(e,t){let a=t.find(".tab.actions .heroActions-list .action.discarded").toArray().map(s=>s.dataset.uuid);Lt(e,a)}o($a,"onClickHeroActionsDiscard");function Fa(e){e.preventDefault();let t=$(e.currentTarget).closest(".action"),n=t.closest(".heroActions-list");t.toggleClass("discarded");let a=Number(n.attr("data-discard")??"0"),s=n.find(".action.discarded");n.toggleClass("discardable",s.length===a)}o(Fa,"onClickHeroActionDiscard");async function La(e,t){t.preventDefault();let n=$(t.currentTarget).closest(".action").attr("data-uuid");Nt(e,n)}o(La,"onClickHeroActionDisplay");async function Ua(e,t){t.preventDefault();let n=$(t.currentTarget).closest(".action").attr("data-uuid");Ft(e,n)}o(Ua,"onClickHeroActionUse");async function _a(e,t){t.preventDefault(),Mt(e)}o(_a,"onClickHeroActionsDraw");function F(e){return getProperty(e,`flags.${Re}.heroActions`)??[]}o(F,"getHeroActions");async function K(e,t){return e.update({[`flags.${Re}.heroActions`]:t})}o(K,"setHeroActions");async function Ot(e){e.preventDefault();let t=$(e.currentTarget).closest(".action"),n=t.find(".item-summary");if(!n.hasClass("loaded")){let a=t.attr("data-uuid"),s=await Me(a);if(!s)return;let r=await TextEditor.enrichHTML(s.description,{async:!0});n.find(".item-description").html(r),n.addClass("loaded")}t.toggleClass("expanded")}o(Ot,"onClickHeroActionExpand");async function Me(e){let t=await fromUuid(e);if(!t)return;let n=t instanceof JournalEntry?t:t.parent,a=t instanceof JournalEntry?t.pages.contents[0]:t,s=a?.text.content;if(s)return n.uuid===Da&&(s=s.replace(/^

/,"

Trigger ")),{name:a.name,description:s}}o(Me,"getHeroActionDetails");async function Mt(e){if(!e?.isOfType("character")){D("hero.onlyCharacter");return}let t=F(e),n=e.heroPoints.value-t.length,a=[];for(let s=0;sw("hero.actions-draw.header",{nb:s}),secret:!0}))}o(Mt,"drawHeroActions");function xe({actor:e,actions:t,label:n,secret:a=!1}){let{content:s,size:r}=Ha(t);n=typeof n=="function"?n(r):n;let i={flavor:`

${n}

`,content:s,speaker:ChatMessage.getSpeaker({actor:e})};a&&v("hero-private")&&(i.type=CONST.CHAT_MESSAGE_TYPES.ROLL,i.rollMode=CONST.DICE_ROLL_MODES.PRIVATE),ChatMessage.create(i)}o(xe,"createChatMessage");function Ha(e){let t=e.map(({uuid:n,name:a})=>j(n,a));return{content:t.map(n=>`
${n}
`).join(""),size:t.length}}o(Ha,"chatActions");function xt(e){if(!e?.isOfType("character")){D("hero.onlyCharacter");return}let t=F(e);if(!t||!t.length){D("hero.no-action");return}let n=t.length-e.heroPoints.value;if(n>0){D("hero.no-points",{nb:n.toString()});return}new pe(e).render(!0)}o(xt,"tradeHeroAction");async function $t(){let e=await Qe(),t=T("hero.table");if(!e)return t.error("drawError",!0),null;if(!e.formula)if(game.user.isGM){if(e.compendium)return t.error("noFormulaCompendium",!0),null;await e.normalize()}else return t.error("noFormula",!0),null;e.replacement===!1&&(e.results.some(r=>!r.drawn)||await e.resetResults());let n=(await e.draw({displayChat:!1})).results[0];if(!n)return;let a=Wt(n);if(a)return{uuid:a,name:await Ut(n,a)}}o($t,"drawHeroAction");async function Ft(e,t){if(!e?.isOfType("character")){D("hero.onlyCharacter");return}let n=e.heroPoints.value;if(n<1)return D("hero.use.noPoints");let a=F(e),s=a.findIndex(i=>i.uuid===t);if(s===-1)return;let r=await Me(t);r||W("hero.use.noDetails"),a.splice(s,1),r?(e.update({["system.resources.heroPoints.value"]:n-1,[`flags.${Re}.heroActions`]:a}),ChatMessage.create({flavor:`

${w("hero.actions-use.header")}

`,content:`

${r.name}

${r.description}`,speaker:ChatMessage.getSpeaker({actor:e})})):K(e,a)}o(Ft,"useHeroAction");async function Lt(e,t){if(!e?.isOfType("character")){D("hero.onlyCharacter");return}t=typeof t=="string"?[t]:t;let n=F(e),a=[];for(let s of t){let r=n.findIndex(i=>i.uuid===s);r!==-1&&(a.push(n[r]),n.splice(r,1))}K(e,n),xe({actor:e,actions:a,label:s=>w("hero.actions-discard.header",{nb:s})})}o(Lt,"discardHeroActions");async function Ut(e,t){return e.type!==CONST.TABLE_RESULT_TYPES.TEXT?e.text:/@UUID\[[\w\.]+\]{([\w -]+)}/.exec(e.text)?.[1]??(t&&(await fromUuid(t))?.name)}o(Ut,"getLabelfromTableResult");async function _t(e){if(!e)return;let t=await fromUuid(e);return t&&t instanceof RollTable?t:void 0}o(_t,"getTableFromUuid");async function Na(){return _t(Oe)}o(Na,"getDefaultCompendiumTable");function Ht(){return game.tables.find(e=>e.getFlag("core","sourceId")===Oe)}o(Ht,"getDefaultWorldTable");async function Ga(){return _t(v("hero-table"))}o(Ga,"getCustomTable");async function Qe(){return await Ga()??Ht()??await Na()}o(Qe,"getDeckTable");async function Nt(e,t){let n=await Me(t);if(!n)return W("hero.details.missing");ChatMessage.create({content:`

${n.name}

${n.description}`,speaker:ChatMessage.getSpeaker({actor:e})})}o(Nt,"sendActionToChat");function Tt(e){if(e.receiver.id===game.user.id){Gt(e);return}O({...e,type:"hero.trade-request"})}o(Tt,"sendTradeRequest");function Gt(e){if(game.user.isGM){jt(e);return}O({...e,type:"hero.trade-accept"})}o(Gt,"acceptRequest");async function jt(e){let{sender:t,receiver:n}=e,a=game.actors.get(t.cid),s=game.actors.get(n.cid);if(!a||!s){Ye(e);return}let r=F(a),i=F(s),c=r.findIndex(m=>m.uuid===t.uuid),l=i.findIndex(m=>m.uuid===n.uuid);if(c===-1||l===-1){Ye(e);return}let u=r.splice(c,1)[0],f=i.splice(l,1)[0];r.push(f),i.push(u),K(a,r),K(s,i);let h=j(u.uuid),p=j(f.uuid),d=T("hero.trade-success"),g=`
${d("offer",{offer:h})}
`;g+=`
${d("receive",{receive:p})}
`,ChatMessage.create({flavor:`

${d("header",{name:s.name})}

`,content:g,speaker:ChatMessage.getSpeaker({actor:a})})}o(jt,"onTradeAccepted");function Ye({sender:e,receiver:t},n="trade-error"){let a=new Set([e.id,t.id]);a.has(game.user.id)&&(a.delete(game.user.id),Bt(n)),a.size&&O({type:"hero.trade-error",users:Array.from(a),error:n})}o(Ye,"sendTradeError");function Bt(e){W("hero.trade-error")}o(Bt,"onTradeError");async function ja(e){let{sender:t,receiver:n}=e,a=game.actors.get(t.cid),s=game.actors.get(n.cid);if(!a||!s){Ye(e);return}let r=T("hero.trade-request"),i=`

${r("header",{sender:a.name,receiver:s.name})}

`;i+=`

${r("give",{give:j(t.uuid)})}

`,i+=`

${r("want",{want:j(n.uuid)})}

`,i+=`

${r("accept")}

`,await Dialog.confirm({title:r("title"),content:await TextEditor.enrichHTML(i,{async:!0})})?Gt(e):Ba(e)}o(ja,"onTradeRequest");function Ba(e){if(e.sender.id===game.user.id){zt(e);return}O({...e,type:"hero.trade-reject"})}o(Ba,"rejectRequest");async function zt({receiver:e}){let t=game.actors.get(e.cid);D("hero.trade-rejected",{name:t.name},!0)}o(zt,"onTradeRejected");async function za(){if(!game.user.isGM){D("hero.notGM");return}let e=T("hero.templates.createTable.choice"),t=I("hero/dialogs/create-table"),n={yes:{label:e("create"),icon:'',callback:r=>{let i=r.find('.window-content input[name="type"]:checked').val(),c=r.find('.window-content input[name="draw"]:checked').val()==="unique";return{type:i,unique:c}}},no:{label:e("cancel"),icon:'',callback:()=>null}},a={content:await renderTemplate(t,{i18n:e}),title:e("title"),buttons:n,default:"yes",close:()=>null},s=await Dialog.wait(a,void 0,{id:"pf2e-hero-actions-create-table"});s&&(s.type==="default"?Va(s.unique):Wa(s.unique))}o(za,"createTable");async function Wa(e){let t=await qa(e);await Je(t),t.sheet?.render(!0)}o(Wa,"createCustomTable");function qa(e=!0){let t=Xe(e);return RollTable.create(t,{temporary:!1})}o(qa,"createCustomActionsTable");async function Va(e){let t=T("templates.createTable.default.confirm"),n=await Ht();if(n&&await Dialog.confirm({title:t("title"),content:t("content")})){let s=Xe(e);return await n.update(s),Je(n,!0)}n=await Ka(e),await Je(n)}o(Va,"createDefaultTable");async function Ka(e=!0){let t=await fromUuid(Oe),n=Xe(e,t);return RollTable.create(n,{temporary:!1})}o(Ka,"createDefautActionsTable");async function Je(e,t=!1){t&&await e.normalize(),await ce("hero-table",e.uuid)}o(Je,"setTable");function Xe(e=!0,t){let n={name:w("hero.table.name"),replacement:!e,img:Pa,description:w("hero.table.description"),flags:{core:{sourceId:Oe}}};return t?mergeObject(deepClone(t._source),n):n}o(Xe,"getTableSource");async function Ya(){if(!game.user.isGM){D("hero.notGM");return}let e=T("hero.templates.removeActions"),t=I("hero/dialogs/remove-actions"),n={yes:{label:e("remove"),icon:'',callback:r=>r.find('input[name="actor"]:checked').toArray().map(i=>game.actors.get(i.value)).filter(i=>i)},no:{label:e("cancel"),icon:'',callback:()=>null}},a={content:await renderTemplate(t,{actors:game.actors.filter(r=>r.type==="character"),i18n:e}),title:e("title"),buttons:n,default:"yes",render:r=>{r.on("change",'input[name="all"]',()=>Ja(r)),r.on("change",'input[name="actor"]',()=>Qa(r))},close:()=>null},s=await Dialog.wait(a,void 0,{id:"pf2e-hero-actions-remove-actions"});if(s){if(!s.length){e.warn("noSelection");return}for(let r of s)K(r,[]);e.info("removed")}}o(Ya,"removeHeroActions");function Ja(e){let t=e.find('input[name="all"]')[0].checked;e.find('input[name="actor"]').prop("checked",t)}o(Ja,"removeActionsToggleAll");function Qa(e){let t=e.find('input[name="actor"]'),n=t.filter(":checked"),a=e.find('input[name="all"]');t.length===n.length?(a.prop("checked",!0).prop("indeterminate",!1),t.prop("checked",!0)):n.length?a.prop("checked",!1).prop("indeterminate",!0):(a.prop("checked",!1).prop("indeterminate",!1),t.prop("checked",!1))}o(Qa,"removeActionsToggleActor");function Wt(e){if(e.type===CONST.TABLE_RESULT_TYPES.TEXT)return/@UUID\[([\w\.]+)\]/.exec(e.text)?.[1];if(e.type===CONST.TABLE_RESULT_TYPES.DOCUMENT)return`${e.documentCollection}.${e.documentId}`;if(e.type===CONST.TABLE_RESULT_TYPES.COMPENDIUM)return`Compendium.${e.documentCollection}.${e.documentId}`}o(Wt,"documentUuidFromTableResult");async function Xa(e){if(!game.user.isGM){D("hero.notGM");return}let t=T("hero.templates.giveAction");if(!e?.isOfType("character"))return t.warn("noCharacter"),null;let n=await Qe();if(!n)return W("hero.table.drawError",!0),null;let a=n.replacement===!1,s=(await Promise.all(n.results.map(async m=>{let y=Wt(m);if(y)return{key:m.id,uuid:y,name:await Ut(m,y),drawn:m.drawn}}))).filter(Boolean),r=I("hero/dialogs/give-action"),i=await renderTemplate(r,{actions:s,isUnique:a,i18n:t}),c={yes:{label:t("give"),icon:'',callback:m=>({selected:m.find("[name=action]:checked").closest(".action").toArray().map(y=>y.dataset),asDrawn:m.find("[name=drawn]").prop("checked")??!1,withMessage:m.find("[name=message]").prop("checked")})},no:{label:t("cancel"),icon:'',callback:()=>null}},l={title:t("title"),content:i,buttons:c,render:m=>{m.find("[data-action=expand]").on("click",Ot)},close:()=>null},u=await Dialog.wait(l,void 0,{id:"pf2e-hero-actions-give-action"});if(!u)return;let{selected:f,asDrawn:h,withMessage:p}=u,d=F(e),g=[];for(let{uuid:m,name:y,key:b}of f){if(d.push({uuid:m,name:y}),!h)continue;let E=n.results.get(b);E&&!E.drawn&&g.push(b)}g.length&&await n.updateEmbeddedDocuments("TableResult",g.map(m=>({_id:m,drawn:!0}))),K(e,d),p&&xe({actor:e,actions:f,label:m=>w("hero.actions-give.header",{nb:m}),secret:!0})}o(Xa,"giveHeroActions");var qt=T("knowledges.editLore"),ge=class extends FormApplication{get actor(){return this.object}get id(){return`npc-edit-lores-${this.actor.id}`}get title(){return qt("title",this.actor)}get template(){return I("knowledges/lores")}getData(t){let n=this.actor;return mergeObject(super.getData(t),{unspecified:C(n,"knowledges.unspecified")??"",specific:C(n,"knowledges.specific")??"",i18n:qt})}async _updateObject(t,{unspecified:n,specific:a}){let s=this.object;G(s,"knowledges.unspecified",n.trim()),G(s,"knowledges.specific",a.trim())}activateListeners(t){t.find("button.cancel").on("click",this.#e.bind(this))}#e(t){t.preventDefault(),this.close()}};o(ge,"EditLores");var Vt=R("renderNPCSheetPF2e",Za);function Kt(){return{settings:[{name:"knowledges",type:Boolean,default:!1,onChange:e=>Vt(e)}],conflicts:["pf2e-npc-knowledges"],ready:e=>{e&&v("knowledges")&&Vt(!0)}}}o(Kt,"registerKnowledges");function Za(e,t){let n=e.actor;x(n)&&(to(n,t),ao(t),no(n,t))}o(Za,"renderNPCSheetPF2e");function Ze(e,t,n){return e.find(`[data-tab="main"] .recall-knowledge ${t==="header"?".section-header":".section-body"} ${n}`)}o(Ze,"knowledgeSelector");function eo(e){new ge(e).render(!0)}o(eo,"editLores");function to(e,t){let n=C(e,"knowledges.unspecified"),a=C(e,"knowledges.specific");if(!n&&!a)return;let s=e.identificationDCs.lore,r=Ze(t,"body","");r.find(".identification-skills").last().remove();function i(l,u,f){return`
${game.i18n.format("PF2E.Actor.NPC.Identification.Skills.Label",{skills:l,dc:u,adjustment:f})}
`}o(i,"tag");function c(l,{dc:u,start:f}){let h=l.split(",").filter(p=>p.trim()).map(p=>i(p,u,f)).join("");r.append(h)}o(c,"addTags"),c(n||"Unspecific",s[0]),c(a||"Specific",s[1])}o(to,"replaceLores");function no(e,t){Ze(t,"header","button.edit").on("click",()=>eo(e))}o(no,"addEvents");function ao(e){let t=Ze(e,"header","button"),n='';t.before(n)}o(ao,"addEditButton");var et=T("merge.multi"),he=class extends Application{#e;#t;constructor(t,n,a){super(a),this.#t=t,this.#e=n}get title(){return et("title",this.spell)}get template(){return I("merge/multi")}getData(t){return mergeObject(super.getData(t),{i18n:et})}activateListeners(t){t.find("[data-action=cast]").on("click",this.#n.bind(this)),t.find("[data-action=cancel]").on("click",this.#a.bind(this))}async#n(t){t.preventDefault();let n=this.element.find("[name=multi]").val();if(n<1){et.error("zero"),this.close();return}let a=this.#e;if(!a)return;let s=a.item,r=a.actor;if(!r||!s)return;let i=o((l,u)=>{for(let[f,h]of Object.entries(l))for(let p=0;ptt(e,"multi-cast")},{name:"multi-cast",type:Boolean,default:!1,scope:"client",onChange:e=>tt(e,"merge-damage")}],init:e=>{tt(!1,["multi-cast","merge-damage"],!0)}}}o(Zt,"registerMerge");function oo(){let e=ui.chat?.element;if(e)for(let t of ue(10)){let n=e.find(`[data-message-id=${t.id}]`);n.length&&(n.find("[data-action=multi-cast]").remove(),n.find("[data-action=merge-damage]").remove(),en(t,n))}}o(oo,"updateMessages");function en(e,t){!game.user.isGM&&!e.isAuthor||(v("merge-damage")&&on(e)?ro(e,t):v("multi-cast")&&e.getFlag("pf2e","origin.type")==="spell"&&so(e,t))}o(en,"renderChatMessage");function so(e,t){if(!e.item)return;let a=t.find(".message-content .chat-card .owner-buttons .spell-button");a.find("[data-action=spell-damage]").after(``),a.find("[data-action=multi-cast]").on("click",s=>{new he(s,e).render(!0)})}o(so,"renderSpell");function ro(e,t){let n='';if(C(e,"merge.merged")){let i=w("merge.damage.split-tooltip");n+=`',n+="";let s=Qt(e),r=Xt(e);t.find(".dice-result .dice-total").append(n),t.find(".pf2e-toolbelt-merge [data-action=merge-damage]").on("click",i=>{i.stopPropagation();for(let c of ue(5,e)){let l=Xt(c);if(!(!on(c)||Qt(c)!==s||!Ke(r?.map(u=>u.actor).filter(Boolean),l?.map(u=>u.actor).filter(Boolean)))){co(i,e,c,{actorUUID:s,targetUUIDs:r});return}}D("merge.damage.none")}),t.find(".pf2e-toolbelt-merge [data-action=split-damage]").on("click",i=>{i.stopPropagation(),io(i,e)})}o(ro,"renderDamage");async function io(e,t){let n=C(t,"merge.data").flatMap(a=>a.source);await nn(t.id),await qe().createDocuments(n)}o(io,"splitDamages");async function co(e,t,n,{actorUUID:a,targetUUIDs:s}){let r={},i=Yt(n).concat(Yt(t));for(let{name:d,notes:g,outcome:m,modifiers:y,tags:b}of i)r[d]??={name:d,tags:b,notes:new Set,results:[]},g.forEach(r[d].notes.add,r[d].notes),r[d].results.some(A=>A.outcome===m&&Ke(A.modifiers,y))||r[d].results.push({outcome:m,modifiers:y});let c=Object.values(r).map(d=>(d.label=d.name,d.results.forEach(g=>{g.outcome&&(g.label=game.i18n.localize(`PF2E.Check.Result.Degree.Attack.${g.outcome}`))}),d));c.at(-1).isLastGroup=!0;let l=await renderTemplate(I("merge/merged"),{groups:c,hasMultipleGroups:c.length>1}),u=Jt(t),f=Jt(n),h=[];for(let d of[].concat(f,u)){let{options:g,total:m,terms:y}=d,b=y[0],E=d.formula.replaceAll(/(\[[\w,]+\])/g,"").replace(/^\(/,"").replace(/\)$/,""),A=h.find(({options:{flavor:M,critRule:P}})=>M===g.flavor&&P===g.critRule);A?(A.terms.push(b),A.total+=m,A.formulas.push(E)):h.push({options:g,formulas:[E],total:m,terms:[b]})}for(let d of h){if(d.options.flavor.includes("persistent")){let{index:g}=d.formulas.reduce((m,y,b)=>{let E=tn(y),A=new Roll(E).evaluate({async:!1}).total;return A>m.value&&(m={value:A,index:b}),m},{value:0,index:-1});d.formulas=[d.formulas[g]],d.terms=[d.terms[g]]}d.formula=`(${d.formulas.join(" + ")})[${d.options.flavor}]`,d.term=d.terms.length<2?d.terms[0]:an(d.terms)}let p={class:"DamageRoll",options:{},dice:[],formula:`{${h.map(({formula:d})=>d).join(", ")}}`,total:h.reduce((d,{total:g})=>d+g,0),evaluated:!0,terms:[{class:"InstancePool",options:{},evaluated:!0,terms:h.map(({formula:d})=>d),modifiers:[],rolls:h.map(({options:d,formula:g,total:m,term:y})=>({class:"DamageInstance",options:d,dice:[],formula:g,total:m,terms:[y],evaluated:!0})),results:h.map(({total:d})=>({result:d,active:!0}))}]};if(game.modules.get("dice-so-nice")?.active){let d=o(g=>{"results"in g?g.results.forEach(m=>m.hidden=!0):(g.term??g).operands?.forEach(m=>d(m))},"setHidden");p.terms[0].rolls.forEach(g=>g.terms.forEach(m=>d(m)))}await nn(t.id,n.id),await qe().create({flavor:l,type:CONST.CHAT_MESSAGE_TYPES.ROLL,speaker:t.speaker,flags:{[S]:{merge:{actor:a,targets:s,merged:!0,type:"damage-roll",data:i},target:{targets:s}},pf2e:{context:{options:Array.from(new Set(i.flatMap(d=>d.itemTraits)))}}},rolls:[p]})}o(co,"mergeDamages");function tn(e){return new Roll(e).terms.reduce((a,s)=>{if(s instanceof Die){let r=s.number*(s.faces+1)/2;a.push(r)}else if(s instanceof OperatorTerm)a.push(s.operator);else if(s instanceof NumericTerm)a.push(s.number);else if(s instanceof ParentheticalTerm){let r=tn(s.term);a.push(`(${r})`)}return a},[]).join(" ")}o(tn,"getMeansFormula");function Yt(e){let t=C(e,"merge.data");if(t)return t;let n=e.toObject();delete n._id,delete n.timestamp;let a=$(`
${e.flavor}
`),s=a.find("h4.action + .tags").prop("outerHTML"),r=[];a.find(".tag.tag_transparent").each(function(){r.push(this.innerHTML)});let i=n.flags.pf2e.context.notes.map(({title:c,text:l})=>`${game.i18n.localize(c)} ${game.i18n.localize(l)}`);return[{source:n,name:n.flags.pf2e.strike?.name??e.item.name,outcome:n.flags.pf2e.context.outcome,itemTraits:n.flags.pf2e.context.options.filter(c=>c.startsWith("item:")),modifiers:r,tags:s,notes:i}]}o(Yt,"getMessageData");function nn(...e){let t=e.map(n=>`[data-message-id=${n}]`).join(", ");return ui.chat.element.find(t).remove(),ChatMessage.deleteDocuments(e)}o(nn,"removeChatMessages");function an(e){let t=deepClone(e[0].options);return e.map(n=>(n.options={},n)),{class:"Grouping",options:t,evaluated:!0,term:{class:"ArithmeticExpression",options:{},evaluated:!0,operator:"+",operands:[e.shift(),e.length>1?an(e):e[0]]}}}o(an,"createTermGroup");function Jt(e){return C(e,"merge.rolls")??JSON.parse(e._source.rolls[0]).terms[0].rolls}o(Jt,"getMessageRolls");function Qt(e){return C(e,"merge.actor")??e.actor?.uuid}o(Qt,"getActorUUID");function Xt(e){let t=C(e,"target.targets");if(t)return t;let n=C(e,"merge.targets")??e.getFlag("pf2e","target");return Array.isArray(n)?n:n?[n]:[]}o(Xt,"getTargetUUIDs");function on(e){return C(e,"merge.type")==="damage-roll"||e.getFlag("pf2e","context.type")==="damage-roll"}o(on,"isDamageRoll");var sn=Q("renderChatMessage",cn,lo);function rn(){return{settings:[{name:"modifiers",type:String,default:"disabled",choices:["disabled","enabled","traits"],onChange:e=>sn(e)}],init:e=>{!e&&v("modifiers")!=="disabled"&&sn(!0,!0)}}}o(rn,"registerHideModifiers");function lo(){if(game.user.isGM)return;let e=ui.chat?.element;if(e)for(let t of ue(20)){let n=e.find(`[data-message-id=${t.id}]`);n.length&&(n.find(".message-header").removeClass("pf2e-toolbelt-modifiers pf2e-toolbelt-modifiers-traits"),cn(t,n))}}o(lo,"updateMessages");function cn(e,t){let n=e.speaker,a=ChatMessage.getSpeakerActor(n);if(!a||a.hasPlayerOwner)return;let s=t.find(".message-header");v("modifiers")==="traits"&&s.addClass("pf2e-toolbelt-modifiers-traits"),v("modifiers")!=="disabled"&&s.addClass("pf2e-toolbelt-modifiers")}o(cn,"renderChatMessage");var fo="CONFIG.Actor.documentClass.prototype.prepareEmbeddedDocuments",uo="CONFIG.PF2E.Item.documentClasses.treasure.prototype.prepareBaseData";function ln(){return{settings:[{name:"nobulk",type:Boolean,default:!1,requiresReload:!0},{name:"nobulk-coins",type:Boolean,default:!1,requiresReload:!0}],init:()=>{v("nobulk")&&L(fo,mo,"WRAPPER"),v("nobulk-coins")&&L(uo,po,"WRAPPER")}}}o(ln,"registerNobulk");function po(e){e(),this.isCoinage&&(this.system.bulk.value=0)}o(po,"treasurePrepareBaseData");function mo(e,...t){e(...t);let n=this,a=n.inventory.bulk.constructor,s=null;Object.defineProperty(n.inventory.bulk,"value",{get(){return s||(s=a.computeTotalBulk(this.actor.inventory.filter(r=>!r.isInContainer&&r.system.equipped.carryType!=="dropped"),this.actor.size),s)}})}o(mo,"actorPrepareEmbeddedDocuments");var go="CONFIG.Actor.documentClass.prototype.prepareData",ho="DocumentSheet.prototype._renderInner";function fn(){return{settings:[{name:"share",type:String,default:"disabled",choices:["disabled","enabled","force"],requiresReload:!0}],init:()=>{v("share")!=="disabled"&&(L(go,ko,"WRAPPER"),L(ho,yo,"WRAPPER"),Hooks.on("preUpdateActor",vo),Hooks.on("deleteActor",bo),Hooks.on("updateActor",So))}}}o(fn,"registerShare");async function yo(e,...t){let n=await e(...t);if(!Ae(this,"CreatureConfig"))return n;let a=this.actor;if(!x(a)||!a.isOfType("character","npc")||ye(a).size)return n;let s=game.actors.filter(i=>i.id!==a.id&&i.isOwner&&Fe(i)).map(i=>({key:i.id,label:i.name})),r=await renderTemplate(I("share/master"),{masters:s,master:C(a,"share.master"),selectPath:`flags.${S}.share.master`,i18n:T("share.templates.master")});return n.children().last().before(r),n}o(yo,"documentSheetRenderInner");function bo(e){hn(e);let t=ye(e);Promise.all(t.map(async n=>{dn(n),await yt(n,"share.master")}))}o(bo,"deleteActor");function vo(e,t){let n=getProperty(t,`flags.${S}.share`);if(n?.master){let a=game.actors.get(n.master);if(Fe(a)){let s=deepClone(a._source.system.attributes.hp);setProperty(t,"system.attributes.hp",s)}}else{let a=$e(e),s=getProperty(t,"system.attributes.hp");a&&s&&(a.update({system:{attributes:{hp:s}}},{noHook:!0}),delete t.system.attributes.hp)}}o(vo,"preUpdateActor");function So(e,t,n,a){let s=game.user.id===a,r=Eo(t);if(r?.master!==void 0){let c=e;if(hn(c),r.master){let l=game.actors.get(r.master);Fe(l)&&(un(c,l),gn(l,c))}else dn(c)}if(!s)return;let i=ye(e);if(i.size){let c=getProperty(t,"system.attributes.hp");if(c){let l={system:{attributes:{hp:c}}};Promise.all(i.map(async u=>await u.update(l,{noHook:!0})))}else Promise.all(i.map(async l=>await Co(l,t)))}}o(So,"updateActor");async function Co(e,t){v("share")==="force"?await G(e,"toggle",!C(e,"toggle")):(e.render(!1,{action:"update"}),e._updateDependentTokens(t))}o(Co,"refreshActor");function ko(e){e();let t=this,n=C(t,"share.master"),a=n?game.actors.get(n):void 0;if(!Fe(a))return;$e(this)||(un(this,a),gn(a,this));let s=this.system.attributes.hp;Object.defineProperty(t.system.attributes,"hp",{get(){let r=a.system.attributes.hp;return wo(r,s),s},enumerable:!0})}o(ko,"prepareData");function wo(e,t){t.breakdown=e.breakdown,t.max=e.max,t.sp=deepClone(e.sp),t.temp=e.temp,t.totalModifier=e.totalModifier,t.value=e.value,t._modifiers=e._modifiers.slice()}o(wo,"transfertHpData");function Eo(e){return getProperty(e,`flags.${S}.share`)}o(Eo,"getShareFlag");function ye(e){return pn(e,"slaves")??new Collection}o(ye,"getSlaves");function un(e,t){mn(e,"master",t)}o(un,"setMaster");function dn(e){Io(e,"master")}o(dn,"unsetMaster");function $e(e){return pn(e,"master")}o($e,"getMaster");function Fe(e){return e&&e.type==="character"&&!$e(e)}o(Fe,"isValidMaster");function pn(e,t){return getProperty(e,`modules.${S}.share.${t}`)}o(pn,"getModuleProperty");function mn(e,t,n){setProperty(e,`modules.${S}.share.${t}`,n)}o(mn,"setModuleProperty");function Io(e,t){delete e.modules?.[S]?.share?.[t]}o(Io,"deleteModuleProperty");function gn(e,t){let n=ye(e);mn(e,"slaves",n.set(t.id,t))}o(gn,"addSlaveToMaster");function hn(e){let t=$e(e);if(!t)return;ye(t).delete(e.id)}o(hn,"removeSlaveFromMaster");function yn(e){return e.getFlag("core","sourceId")}o(yn,"getSourceId");function To(e,t){let n=yn(e);return n?t.includes(n):!1}o(To,"includesSourceId");function bn(e){return Array.isArray(e)?t=>To(t,e):t=>yn(t)===e}o(bn,"getItemSourceIdCondition");function vn(e,t){return t=typeof t=="string"?[t]:t,t?t.flatMap(n=>e.itemTypes[n]):e.items}o(vn,"getItems");function Sn(e,t,n){return vn(e,n).some(bn(t))}o(Sn,"hasItemWithSourceId");function Le(e,t,n){return vn(e,n).find(bn(t))}o(Le,"getItemWithSourceId");var Ao=R("renderCharacterSheetPF2e",$o),Do=R("deleteCombat",Lo),Po=R("deleteCombatant",An),Ro=R("createCombatant",Uo),Oo=["Compendium.pf2e.feats-srd.Item.yeSyGnYDkl2GUNmu","Compendium.pf2e.feats-srd.Item.LI9VtCaL5ZRk0Wo8"],Mo=new Map([["Compendium.pf2e.feats-srd.Item.nRjyyDulHnP5OewA",{replace:"Compendium.pf2e.feats-srd.Item.DqD7htz8Sd1dh3BT",effect:"Compendium.pf2e.feat-effects.Item.UZKIKLuwpQu47feK"}]]),xo=new Map([["Compendium.pf2e.classfeatures.Item.09iL38CZZEa0q0Mt",{effect:"Compendium.pf2e.feat-effects.Item.fsjO5oTKttsbpaKl",action:"Compendium.pf2e.actionspf2e.Item.HbejhIywqIufrmVM"}],["Compendium.pf2e.feats-srd.Item.xQuNswWB3eg1UM28",{effect:"Compendium.pf2e.feat-effects.Item.2Qpt0CHuOMeL48rN"}],["Compendium.pf2e.feats-srd.Item.R7c4PyTNkZb0yvoT",{effect:"Compendium.pf2e.feat-effects.Item.qX62wJzDYtNxDbFv"}],["Compendium.pf2e.feats-srd.Item.bvOsJNeI0ewvQsFa",{effect:"Compendium.pf2e.feat-effects.Item.er5tvDNvpbcnlbHQ"}]]);function kn(){return{name:"stances",settings:[{name:"stances",type:Boolean,default:!1,scope:"client",onChange:Cn},{name:"custom-stances",type:String,default:""}],conflicts:["pf2e-stances"],api:{getStances:nt,toggleStance:Tn,isValidStance:wn},ready:e=>{v("stances")&&Cn(!0)}}}o(kn,"registerStances");function Cn(e){Ao(e),Do(e),Po(e),Ro(e)}o(Cn,"setup");function wn(e){return e&&e.system.traits.value.includes("stance")&&e.system.selfEffect?.uuid}o(wn,"isValidStance");function nt(e){let t=[],n=new Set;for(let{replace:a,sourceId:s,effectUUID:r,effect:i,img:c,name:l,itemName:u,action:f}of En(e)){a&&n.add(a);let h=f?Le(e,f,"action"):Le(e,s,"feat");t.push({name:l,itemName:u,uuid:s,img:c,effectUUID:r,effectID:i?.id,actionUUID:h.sourceId,actionID:h.id})}return t.filter(({uuid:a})=>!n.has(a))}o(nt,"getStances");async function $o(e,t){let n=e.actor;if(!x(n))return;let a=nt(n);if(!a.length)return;let s=n.getActiveTokens(!0,!0).some(l=>l.inCombat),r=t.find(".sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter]"),i=r.find(".actions-options"),c=await renderTemplate(I("stances/sheet"),{stances:a,canUseStances:s&&!n.isDead,i18n:T("stances")});i.length?i.after(c):r.prepend(c),t.find(".sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance").on("click",l=>Fo(l,n))}o($o,"renderCharacterSheetPF2e");function Fo(e,t){let n=e.currentTarget,a=n.closest(".pf2e-stances")?.classList.contains("can-use-stances");if(!e.ctrlKey&&!a)return;let s=n.dataset.effectUuid;Tn(t,s)}o(Fo,"onToggleStance");function*En(e){for(let t of e.itemTypes.feat){let n=t.sourceId,a=Mo.get(n),s=xo.get(n);if(!a&&!s&&!wn(t))continue;let r=a?.effect??s?.effect??t.system.selfEffect.uuid,i=fromUuidSync(r);i&&(yield{name:(a&&fromUuidSync(a.replace)?.name)??t.name,itemName:t.name,replace:a?.replace,extra:s,sourceId:n,effectUUID:r,effect:Le(e,r,"effect"),action:s?.action,img:i.img})}}o(En,"actorStances");function In(e){let t=[];for(let{effect:n}of En(e))n&&t.push({uuid:n.sourceId,id:n.id});return t}o(In,"getStancesEffects");async function Tn(e,t){let n=In(e),a=n.findIndex(r=>r.uuid===t),s=!1;if(a===-1)s=!0;else{let r=n.filter(c=>c.uuid!==t).length,i=n.filter(c=>c.uuid===t).length>1;(r||i)&&n.splice(a,1)}n.length&&await e.deleteEmbeddedDocuments("Item",n.map(r=>r.id)),s&&at(e,t)}o(Tn,"toggleStance");async function at(e,t){let n=await fromUuid(t);if(n){let a=n.toObject();return getProperty(a,"flags.core.sourceId")||setProperty(a,"flags.core.sourceId",n.uuid),(await e.createEmbeddedDocuments("Item",[a]))[0]?.toMessage(),!0}return!1}o(at,"addStance");function Lo(e){for(let t of e.combatants)An(t)}o(Lo,"deleteCombat");function An(e){let t=Dn(e);if(t){if(!game.user.isGM&&Ve(t)){let n=In(t).map(a=>a.id);n.length&&t.deleteEmbeddedDocuments("Item",n)}V(t)}}o(An,"deleteCombatant");function Uo(e){let t=Dn(e);t&&(!game.user.isGM&&Ve(t)&&_o(t),V(t))}o(Uo,"createCombatant");function Dn(e){let t=e.actor;if(t&&!t.isToken&&t.isOfType("character"))return t}o(Dn,"getActorFromCombatant");async function _o(e){let t=nt(e);if(!(!t.length||t.filter(({effectID:s})=>s).length||!Sn(e,Oo,["feat"])))if(t.length===1){let s=t[0];await at(e,s.effectUUID)&&J("stances.useStance",{stance:s.name})}else Ho(e,t)}o(_o,"checkForSavant");async function Ho(e,t){let n=T("stances.menu");new Dialog({title:n("title"),content:await renderTemplate(I("stances/menu"),{stances:t,i18n:n}),buttons:{yes:{icon:'',label:n("accept"),callback:a=>at(e,a.find("[name=stance]:checked").val())},no:{icon:'',label:n("cancel")}}}).render(!0)}o(Ho,"openStancesMenu");var Pn=Q("renderCharacterSheetPF2e",No,()=>V());function Rn(){return{settings:[{name:"summary",type:String,default:"disabled",scope:"client",choices:["disabled","enabled","sort"],onChange:e=>Pn(e)}],conflicts:["pf2e-spells-summary"],init:e=>{v("summary")!=="disabled"&&Pn(!0,!0)}}}o(Rn,"registerSpellsSummary");async function No(e,t){let n=e.actor;if(!x(n))return;let a=be(t);me(e,"toggled")&&a.addClass("toggled"),es(t).on("click",s=>Zo(s,t,e)),await Go(t,e,n),a.hasClass("toggled")&&a.hasClass("active")&&e._restoreScrollPositions(t)}o(No,"renderCharacterSheetPF2e");async function Go(e,t,n){let a=be(e),s=await as(n),r=await renderTemplate(I("summary/sheet"),s);a.append(r),jo(e,t,n)}o(Go,"addSummaryTab");function jo(e,t,n){let a=ns(e),s=a.find(".spell-type .uses .spell-slots-input input");s.on("change",r=>Bo(r,n)),s.on("focus",zo),s.on("blur",Wo),a.find("[data-action=cast-spell]").on("click",r=>Jo(r,n)),a.find(".item-toggle-prepare").on("click",r=>qo(r,n)),a.find(".focus-pips").on("click contextmenu",r=>Vo(r,n)),a.find(".spell-slots-increment-reset").on("click",r=>Yo(r,t,n)),a.find(".item-image").on("click",r=>Xo(r,n)),a.find(".item-name > h4").on("click",r=>Qo(r,t))}o(jo,"addSummaryEvents");async function Bo(e,t){e.preventDefault();let{inputPath:n,entryId:a}=$(e.currentTarget).data(),s=e.currentTarget.valueAsNumber;t.updateEmbeddedDocuments("Item",[{_id:a,[n]:s}])}o(Bo,"onUsesInputChange");function zo(e){e.preventDefault(),e.currentTarget.closest(".item")?.classList.add("hover")}o(zo,"onUsesInputFocus");function Wo(e){e.preventDefault(),e.currentTarget.closest(".item")?.classList.remove("hover")}o(Wo,"onUsesInputBlur");function qo(e,t){e.preventDefault();let{slotLevel:n,slotId:a,entryId:s,expended:r}=$(e.currentTarget).closest(".item").data();t.spellcasting.collections.get(s)?.setSlotExpendedState(n??0,a??0,r!==!0)}o(qo,"onTogglePrepare");function Vo(e,t){e.preventDefault();let n=e.type==="click"?1:-1,a=(t.system.resources.focus?.value??0)+n;t.update({"system.resources.focus.value":a})}o(Vo,"onToggleFocusPool");function Ko(e,t){ts(e.element).find(`.item-container.spellcasting-entry[data-item-id=${t}]`).find(".spell-ability-data .statistic-values a.pf2e-staves-charge")[0]?.click()}o(Ko,"onChargeReset");function Yo(e,t,n){e.preventDefault();let{itemId:a,level:s,isCharge:r}=$(e.currentTarget).data();if(!a)return;if(r){Ko(t,a);return}let i=n.items.get(a);if(i){if(i.isOfType("spellcastingEntry")){let c=s>=0&&s<=11?`slot${s}`:"slot0",l=i.system.slots?.[c];l&&i.update({[`system.slots.${c}.value`]:l.max})}else if(i.isOfType("spell")){let c=i.system.location.uses?.max;c&&i.update({"system.location.uses.value":c})}}}o(Yo,"onSlotsReset");function Jo(e,t){e.preventDefault();let n=$(e.currentTarget);if(n.prop("disabled"))return;let{itemId:a,slotLevel:s,slotId:r,entryId:i}=n.closest(".item").data(),c=t.spellcasting.collections.get(i);if(!c)return;let l=c.get(a);l&&c.entry.cast(l,{slot:r,level:s})}o(Jo,"onCastSpell");async function Qo(e,t){let n=e.currentTarget.closest(".item");await t.itemRenderer.toggleSummary(n)}o(Qo,"onToggleSummary");async function Xo(e,t){let n=$(e.currentTarget).closest(".item").attr("data-item-id"),a=t.items.get(n);!a||a.isOfType("physical")&&!a.isIdentified||await a.toMessage(e)}o(Xo,"onItemToChat");function Zo(e,t,n){e.preventDefault();let a=be(t);a.hasClass("active")&&(a.toggleClass("toggled"),a.scrollTop(0),De(n,"toggled",a.hasClass("toggled")))}o(Zo,"onSpellcastingBtnToggle");function es(e){return e.find("nav.sheet-navigation .item[data-tab=spellcasting]")}o(es,"getSpellcastingNav");function be(e){return e.find("section.sheet-body .sheet-content > .tab[data-tab=spellcasting]")}o(be,"getSpellcastingTab");function ts(e){return be(e).find(".directory-list.spellcastingEntry-list")}o(ts,"getSpellcastingOriginalSection");function ns(e){return be(e).find(".directory-list.summary")}o(ns,"getSpellcastingSummarySection");async function as(e){let t=e.system.resources.focus??{value:0,max:0},n=game.modules.get("pf2e-staves")?.active,a=[],s=[],r=!1;if(await Promise.all(e.spellcasting.regular.map(async l=>{let u=l.id,f=l.statistic.dc.value,h=l.name,p=await l.getSheetData(),d=p.isFocusPool,g=l.system?.prepared?.value==="charge",m=getProperty(l,"flags.pf2e-staves.staveID")!==void 0,y={value:getProperty(l,"flags.pf2e-staves.charges")??0};for(let b of p.levels){if(!b.active.length||b.uses?.max===0)continue;let E=[],A=b.isCantrip,M=b.active.filter(U=>U&&U.uses?.max!==0),P=!A&&g&&!n;for(let U=0;Uu.order===f.order?Te(u.name,f.name):u.order-f.order:(u,f)=>Te(u.name,f.name);a.forEach(u=>u.sort(l))}s.length&&(s.sort((l,u)=>Te(l.name,u.name)),a[12]=s,r=!1);let c=(await e.spellcasting.ritual?.getSheetData())?.levels.flatMap((l,u)=>l.active.map(({spell:f})=>({name:f.name,img:f.img,slotId:u,itemId:f.id,level:f.level,time:f.system.time.value})).filter(Boolean));return{spells:a,rituals:c,focusPool:t,stavesActive:n,hasFocusCantrips:r,isOwner:e.isOwner,entryRank:l=>game.i18n.format("PF2E.Item.Spell.Rank.Ordinal",{rank:At(l)})}}o(as,"getData");function os(e){return Error(`PF2e System | ${e}`)}o(os,"ErrorPF2e");var Ue={LOWER_BY_TWO:-2,LOWER:-1,INCREASE:1,INCREASE_BY_TWO:2,TO_CRITICAL_FAILURE:"criticalFailure",TO_FAILURE:"failure",TO_SUCCESS:"success",TO_CRITICAL_SUCCESS:"criticalSuccess"},On=["criticalFailure","failure","success","criticalSuccess"],He,xn,ne,_e,Y,ve,Ne,$n,B=class{constructor(t,n,a=null){ie(this,He);ie(this,ne);ie(this,Y);ie(this,Ne);t instanceof Roll?(this.dieResult=(t.isDeterministic?t.terms.find(s=>s instanceof NumericTerm):t.dice.find(s=>s instanceof Die&&s.faces===20))?.total??1,this.rollTotal=t.total):(this.dieResult=t.dieValue,this.rollTotal=t.dieValue+t.modifier),this.dc=typeof n=="number"?{value:n}:n,this.unadjusted=_(this,Ne,$n).call(this),this.adjustment=_(this,He,xn).call(this,this.unadjusted,a),this.value=this.adjustment?_(this,ne,_e).call(this,this.adjustment.amount,this.unadjusted):this.unadjusted}},N=B;o(N,"DegreeOfSuccess"),He=new WeakSet,xn=o(function(t,n){if(!n)return null;for(let a of["all",...On]){let{label:s,amount:r}=n[a]??{};if(r&&s&&!(t===B.CRITICAL_SUCCESS&&r===Ue.INCREASE)&&!(t===B.CRITICAL_FAILURE&&r===Ue.LOWER)&&(a==="all"||On.indexOf(a)===t))return{label:s,amount:r}}return null},"#getDegreeAdjustment"),ne=new WeakSet,_e=o(function(t,n){switch(t){case"criticalFailure":return 0;case"failure":return 1;case"success":return 2;case"criticalSuccess":return 3;default:return Math.clamped(n+t,0,3)}},"#adjustDegreeOfSuccess"),Y=new WeakSet,ve=o(function(t){return this.dieResult===20?_(this,ne,_e).call(this,Ue.INCREASE,t):this.dieResult===1?_(this,ne,_e).call(this,Ue.LOWER,t):t},"#adjustDegreeByDieValue"),Ne=new WeakSet,$n=o(function(){let t=this.dc.value;return this.rollTotal-t>=10?_(this,Y,ve).call(this,B.CRITICAL_SUCCESS):t-this.rollTotal>=10?_(this,Y,ve).call(this,B.CRITICAL_FAILURE):this.rollTotal>=t?_(this,Y,ve).call(this,B.SUCCESS):_(this,Y,ve).call(this,B.FAILURE)},"#calculateDegreeOfSuccess"),re(N,"CRITICAL_FAILURE",0),re(N,"FAILURE",1),re(N,"SUCCESS",2),re(N,"CRITICAL_SUCCESS",3);async function ss({affects:e,origin:t,target:n,item:a,domains:s,options:r}){if(!(t&&n))return[];let[i,c]=e==="target"?[t,n]:[n,t],l=[...r,i.getRollOptions(s),c.getSelfRollOptions(e)].flat(),u=a?a.isOfType("spell")?{spell:a}:{weapon:a}:{};return(await Promise.all(s.flatMap(f=>i.synthetics.ephemeralEffects[f]?.[e]??[]).map(f=>f({test:l,resolvables:u})))).flatMap(f=>f??[])}o(ss,"extractEphemeralEffects");function rs(e,t){return t.flatMap(n=>(e[n]??[]).map(a=>a.clone()))}o(rs,"extractNotes");function is(e,t,n){return t.flatMap(a=>e[a]??[]).flatMap(a=>a(n)??[])}o(is,"extractDamageDice");async function cs(e,{message:t,multiplier:n,rollIndex:a}){let s=await renderTemplate("systems/pf2e/templates/chat/damage/adjustment-dialog.hbs"),r=o(class extends Dialog{activateListeners(c){super.activateListeners(c),c[0].querySelector("input")?.focus()}},"AdjustmentDialog"),i=n<0;new r({title:game.i18n.localize(i?"PF2E.UI.shiftModifyHealingTitle":"PF2E.UI.shiftModifyDamageTitle"),content:s,buttons:{ok:{label:game.i18n.localize("PF2E.OK"),callback:async c=>{let l=(Number(c[0].querySelector("input")?.value)||0)*Math.sign(n);ot(e,{message:t,multiplier:n,addend:l,promptModifier:!1,rollIndex:a})}},cancel:{label:"Cancel"}},default:"ok",close:()=>{Fn(t.id)}}).render(!0)}o(cs,"shiftAdjustDamage");async function ot(e,{message:t,multiplier:n=1,addend:a=0,promptModifier:s=!1,rollIndex:r=0}){if(s)return cs(e,{message:t,multiplier:n,rollIndex:r});let i=CONFIG.PF2E.chatDamageButtonShieldToggle,c=t.rolls.at(r);if(!Ae(c,"DamageRoll"))throw os("Unexpected error retrieving damage roll");let l=n<0?n*c.total+a:c.alter(n,a),u=[...t.flags.pf2e.context?.options??[]],f=u.filter(P=>P.startsWith("self:")).map(P=>P.replace(/^self/,"origin")),h=t.item;if(!e.actor)return;u.some(P=>P.startsWith("target"))||u.push(...e.actor.getSelfRollOptions("target"));let p=n>0?"damage-received":"healing-received",d=n>0?await ss({affects:"target",origin:t.actor,target:e.actor,item:t.item,domains:[p],options:u}):[],g=e.actor.getContextualClone(f,d),m=new Set([...u.filter(P=>!/^(?:self|target):/.test(P)),...f,...g.getSelfRollOptions()]),y=t.flags.pf2e.context?.outcome,b=[],E=[];if(typeof l=="number"&&l<0){let P=y==="criticalSuccess",U=(()=>h?.isOfType("spell")?{spell:h}:h?.isOfType("weapon")?{weapon:h}:{})(),H=is(g.synthetics.damageDice,[p],{resolvables:U,test:m}).filter(k=>(k.critical===null||k.critical===P)&&k.predicate.test(m));for(let k of H){let oe=`${k.diceNumber}${k.dieSize}[${k.label}]`,se=await new Roll(oe).evaluate({async:!0});se._formula=`${k.diceNumber}${k.dieSize}`,await se.toMessage({flags:{pf2e:{suppressDamageButtons:!0}},flavor:k.label,speaker:ChatMessage.getSpeaker({token:e})}),b.push(`${k.label} ${k.diceNumber}${k.dieSize}`),E.push(se)}E.length&&(l-=E.map(k=>k.total).reduce((k,oe)=>k+oe));let Ce=us(g.synthetics,[p],{resolvables:U}).filter(k=>(k.critical===null||k.critical===P)&&k.predicate.test(m));l-=ls(Ce??[]),b.push(...Ce.filter(k=>k.enabled).map(k=>`${k.label} ${signedInteger(k.modifier)}`))}let A=typeof l=="number"?l!==0:l.total!==0,M=(()=>A?rs(g.synthetics.rollNotes,[p]).filter(P=>(!y||P.outcome.length===0||P.outcome.includes(y))&&P.predicate.test(m)).map(P=>P.text):[])();await g.applyDamage({damage:l,token:e,item:t.item,skipIWR:n<=0,rollOptions:m,shieldBlockRequest:i,breakdown:b,notes:M}),Fn(t.id),_n(t,e.id,r)}o(ot,"applyDamageFromMessage");function Mn(e,t,n){let a=e[t.type];return a===void 0?(t.enabled=!0,e[t.type]=t,t.modifier):n(t,a)?(a.enabled=!1,t.enabled=!0,e[t.type]=t,t.modifier-a.modifier):(t.enabled=!1,0)}o(Mn,"applyStacking");function ls(e){let t=0,n={},a={},s=e.filter(i=>i.type==="ability"&&!i.ignored),r=s.reduce((i,c)=>i===null||c.force?c:i.force?i:c.modifier>i.modifier?c:i,null);for(let i of s)i.ignored=i!==r;for(let i of e){if(i.ignored){i.enabled=!1;continue}if(i.type==="untyped"){i.enabled=!0,t+=i.modifier;continue}i.modifier<0?t+=Mn(a,i,LOWER_PENALTY):t+=Mn(n,i,HIGHER_BONUS)}return t}o(ls,"applyStackingRules");function fs(e,t,n){return Array.from(new Set(t.flatMap(s=>e[s]??[]))).filter(s=>[n,null].includes(s.slug))}o(fs,"extractModifierAdjustments");function us(e,t,n){let{modifierAdjustments:a,modifiers:s}=e,r=Array.from(new Set(t)).flatMap(i=>s[i]??[]).flatMap(i=>i(n)??[]);for(let i of r)i.adjustments=fs(a,t,i.slug);return r}o(us,"extractModifiers");function Fn(e){for(let t of["#chat-log","#chat-popout"]){let n=`${t} > li.chat-message[data-message-id="${e}"] button[data-action=shield-block]`;Ln(document.body,n)?.classList.remove("shield-activated")}CONFIG.PF2E.chatDamageButtonShieldToggle=!1}o(Fn,"toggleOffShieldBlock");function Ln(e,t){return e instanceof Element||e instanceof Document?e.querySelector(t):null}o(Ln,"htmlQuery");function Un(e,t,n){let a=o(()=>[e],"getTokens"),s=o(r=>r[0]?.actor?.itemTypes.shield.filter(c=>c.isEquipped&&!c.isBroken&&!c.isDestroyed)??[],"getNonBrokenShields");t.classList.contains("tooltipstered")||$(t).tooltipster({animation:"fade",trigger:"click",arrow:!1,content:$(n).find("div.hover-content"),contentAsHTML:!0,contentCloning:!0,debug:!1,interactive:!0,side:["top"],theme:"crb-hover",functionBefore:()=>{let r=a();if(!r.length)return!1;let i=s(r),c=r.length===1&&i.length>1,l=t.classList.contains("shield-activated");return c&&!l?!0:c&&t.dataset.shieldId?(t.attributes.removeNamedItem("data-shield-id"),t.classList.remove("shield-activated"),CONFIG.PF2E.chatDamageButtonShieldToggle=!1,!0):(t.classList.toggle("shield-activated"),CONFIG.PF2E.chatDamageButtonShieldToggle=!CONFIG.PF2E.chatDamageButtonShieldToggle,!1)},functionFormat:(r,i,c)=>{let l=a(),u=s(l),f=l.length===1&&u.length>1,h=t.classList.contains("shield-activated");if(f&&!h){let p=c[0],d=Ln(p,"ul.shield-options");if(!d)return c;let g=[];for(let m of u){let y=document.createElement("input");y.classList.add("data"),y.type="radio",y.name="shield-id",y.value=m.id,y.addEventListener("click",()=>{t.dataset.shieldId=y.value,t.classList.add("shield-activated"),CONFIG.PF2E.chatDamageButtonShieldToggle=!0,r.close()});let b=document.createElement("span");b.classList.add("label"),b.innerHTML=m.name;let E=document.createElement("span");E.classList.add("tag");let A=game.i18n.localize("PF2E.HardnessLabel");E.innerHTML=`${A}: ${m.hardness}`;let M=document.createElement("li");M.classList.add("item"),M.append(y,b,E),g.push(M)}d.replaceChildren(...g)}return c}}).tooltipster("open")}o(Un,"onClickShieldBlock");function Hn(e,{collisionOrigin:t,collisionType:n="move"}={}){if(e=e instanceof MeasuredTemplateDocument?e.object:e,!canvas.scene)return[];let{grid:a,dimensions:s}=canvas;if(!(a&&s))return[];if(!e?.highlightId)return[];let r=a.getHighlightLayer(e.highlightId);if(!r||a.type!==CONST.GRID_TYPES.SQUARE)return[];let i=t??e.center,c=canvas.tokens.quadtree.getObjects(r.getLocalBounds(void 0,!0)),l=a.size,u=[];for(let f of c){let h=f.document,p=[];for(let d=0;d1)for(let b=1;bNumber(E)),y={x:g+s.size*.5,y:m+s.size*.5};if(y.x<0||y.y<0)continue;if(!(canvas.ready&&n&&CONFIG.Canvas.polygonBackends[n].testCollision(i,y,{type:n,mode:"any"}))){u.push(f);break}}}return u}o(Hn,"getTemplateTokens");var ds={fortitude:{icon:"fa-solid fa-chess-rook",label:"PF2E.SavesFortitude"},reflex:{icon:"fa-solid fa-person-running",label:"PF2E.SavesReflex"},will:{icon:"fa-solid fa-brain",label:"PF2E.SavesWill"}},st={hero:{icon:"fa-solid fa-hospital-symbol",reroll:"PF2E.RerollMenu.HeroPoint",rerolled:"PF2E.RerollMenu.MessageHeroPoint"},new:{icon:"fa-solid fa-dice",reroll:"PF2E.RerollMenu.KeepNew",rerolled:"PF2E.RerollMenu.MessageKeep.new"},lower:{icon:"fa-solid fa-dice-one",reroll:"PF2E.RerollMenu.KeepLower",rerolled:"PF2E.RerollMenu.MessageKeep.lower"},higher:{icon:"fa-solid fa-dice-six",reroll:"PF2E.RerollMenu.KeepHigher",rerolled:"PF2E.RerollMenu.MessageKeep.higher"}},ps=["criticalFailure","failure","success","criticalSuccess"],ms=R("preCreateChatMessage",ys),Bn=Q("renderChatMessage",bs),zn=R("createMeasuredTemplate",gs),Ge=!1;function Wn(){return{settings:[{name:"target",type:Boolean,default:!1,onChange:Nn},{name:"target-chat",type:String,default:"disabled",choices:["disabled","small","big"],scope:"client",onChange:e=>Bn(e&&v("target")),migrate:{1:e=>e==="true"?"small":e==="false"?"disabled":void 0}},{name:"target-template",type:Boolean,default:!1,scope:"client",onChange:e=>zn(e&&v("target"))}],conflicts:[],init:()=>{v("target")&&Nn(!0)}}}o(Wn,"registerTargetTokenHelper");function Nn(e){ms(e),Bn(e),zn(e&&v("target-template")),Ee()&&(e&&!Ge?(X(Gn),Ge=!0):!e&&Ge&&(Z(Gn),Ge=!1))}o(Nn,"setHooks");function Gn(e){if(ee())switch(e.type){case"target.update-save":rt(e);break;case"target.update-applied":Jn(e);break}}o(Gn,"onSocket");async function gs(e,t,n){let a=game.user;if(a.id!==n)return;let s=T("target.menu"),r=e.item,i=r?.actor,c=i?i.token??i.getActiveTokens()[0]:void 0,l={title:r?.name||s("title"),content:await renderTemplate(I("target/template-menu"),{i18n:s,noSelf:!c}),buttons:{select:{icon:'',label:s("target"),callback:m=>({targets:m.find("[name=targets]:checked").val(),self:m.find("[name=self]").prop("checked"),neutral:m.find("[name=neutral]").prop("checked")})}},close:()=>null},u=await Dialog.wait(l,void 0,{id:"pf2e-toolbelt-target-template",width:260});if(!u)return;let f=i?i.alliance:a.isGM?"opposition":"party",h=f==="party"?"opposition":f==="opposition"?"party":null,g=Hn(e).filter(m=>{if(!m.actor?.isOfType("creature","hazard","vehicle")||m.document.hidden)return!1;if(c&&m===c)return u.self;let b=m.actor?m.actor.alliance:m.alliance;return b===null?u.neutral:u.targets==="all"||u.targets==="allies"&&b===f||u.targets==="enemies"&&b===h}).map(m=>m.id);a.updateTokenTargets(g),a.broadcastActivity({targets:g})}o(gs,"createMeasuredTemplate");var hs;function qn(e){return e.rolls[0].options.evaluatePersistent?!1:!(hs??=(()=>{let n=[game.i18n.localize("PF2E.Encounter.Broadcast.FastHealing.fast-healing.ReceivedMessage"),game.i18n.localize("PF2E.Encounter.Broadcast.FastHealing.regeneration.ReceivedMessage")];return new RegExp(`^
(${n.join("|")})
`)})()).test(e.flavor)}o(qn,"isValidDamageMessage");function ys(e){let t=e.isDamageRoll;if(t){if(!qn(e))return;if(!C(e,"target.targets")){let r=game.user.targets;r.size&&q(e,"target.targets",Array.from(r.map(i=>({token:i.document.uuid,actor:i.actor.uuid}))))}if(e.rolls.length===2){let r=e.rolls.findIndex(c=>c.options?.splashOnly),i=e.rolls.findIndex(c=>!c.options?.splashOnly&&c.options?.damage?.modifiers.some(l=>l.damageCategory==="splash"));r!==-1&&i!==-1&&q(e,"target.splashIndex",r)}}if(!t&&e.getFlag("pf2e","context.type")!=="spell-cast")return;let n=e.item;if(n?.type!=="spell")return;let a=n.system.defense?.save;if(!a)return;let s=(()=>n.trickMagicEntry?$(e.content).find("[data-action=spell-save]").data()?.dc:n.spellcasting?.statistic.dc.value)();typeof s=="number"&&q(e,"target.save",{...a,dc:s})}o(ys,"preCreateChatMessage");async function bs(e,t){let n=v("target-chat")!=="disabled";if(n&&e.isDamageRoll){if(!qn(e))return;await Ss(e,t),jn(e);return}let a=e.item;if(!(!a||a.type!=="spell")){if(n&&!a.damageKinds.size){await vs(e,t,a),jn(e);return}a.trickMagicEntry&&a.system.defense?.save&&t.find("[data-action=spell-damage]").on("click",()=>{we(e)})}}o(bs,"renderChatMessage");function jn(e){Promise.all([ui.chat,ui.chat._popout].map(async t=>{let n=t?.element[0]?.querySelector("#chat-log");!n||!t.isAtBottom&&e.user._id!==game.user._id||(await t._waitForImages(),n.scrollTop=n.scrollHeight)}));for(let t of Object.values(e.apps))t instanceof ChatPopout&&t.rendered&&t.setPosition()}o(jn,"refreshMessage");async function vs(e,t,n){let a=await Yn(e);if(!a)return;let{targets:s,save:r}=a,i=t.find(".message-content"),c=i.find(".card-buttons");if(game.user.isGM||e.isAuthor){let u=c.find("[data-action=spell-save]"),f=$('
'),h=w("target.chat.targets.tooltip"),p=$(`';t.before(n)}o(lo,"addEditButton");var et=T("merge.multi"),he=class extends Application{#e;#t;constructor(t,n,a){super(a),this.#t=t,this.#e=n}get title(){return et("title",this.spell)}get template(){return I("merge/multi")}getData(t){return mergeObject(super.getData(t),{i18n:et})}activateListeners(t){t.find("[data-action=cast]").on("click",this.#n.bind(this)),t.find("[data-action=cancel]").on("click",this.#a.bind(this))}async#n(t){t.preventDefault();let n=this.element.find("[name=multi]").val();if(n<1){et.error("zero"),this.close();return}let a=this.#e;if(!a)return;let r=a.item,s=a.actor;if(!s||!r)return;let i=o((l,u)=>{for(let[f,g]of Object.entries(l))for(let m=0;me.name==="DamageRoll")}o(Jt,"getDamageRollClass");var tt=O("renderChatMessage",nn,fo);function tn(){return{settings:[{name:"merge-damage",type:Boolean,default:!1,scope:"client",onChange:e=>tt(e,"multi-cast")},{name:"multi-cast",type:Boolean,default:!1,scope:"client",onChange:e=>tt(e,"merge-damage")}],init:e=>{tt(!1,["multi-cast","merge-damage"],!0)}}}o(tn,"registerMerge");function fo(){let e=ui.chat?.element;if(e)for(let t of ue(10)){let n=e.find(`[data-message-id=${t.id}]`);n.length&&(n.find("[data-action=multi-cast]").remove(),n.find("[data-action=merge-damage]").remove(),nn(t,n))}}o(fo,"updateMessages");function nn(e,t){!game.user.isGM&&!e.isAuthor||(v("merge-damage")&&rn(e)?po(e,t):v("multi-cast")&&e.getFlag("pf2e","origin.type")==="spell"&&uo(e,t))}o(nn,"renderChatMessage");function uo(e,t){if(!e.item)return;let a=t.find(".message-content .chat-card .owner-buttons .spell-button");a.find("[data-action=spell-damage]").after(``),a.find("[data-action=multi-cast]").on("click",r=>{new he(r,e).render(!0)})}o(uo,"renderSpell");function po(e,t){let n='';if(C(e,"merge.merged")){let i=w("merge.damage.split-tooltip");n+=`',n+="";let r=Zt(e),s=en(e);t.find(".dice-result .dice-total").append(n),t.find(".pf2e-toolbelt-merge [data-action=merge-damage]").on("click",i=>{i.stopPropagation();for(let c of ue(5,e)){let l=en(c);if(!(!rn(c)||Zt(c)!==r||!Ke(s?.map(u=>u.actor).filter(Boolean),l?.map(u=>u.actor).filter(Boolean)))){go(i,e,c,{actorUUID:r,targetUUIDs:s});return}}D("merge.damage.none")}),t.find(".pf2e-toolbelt-merge [data-action=split-damage]").on("click",i=>{i.stopPropagation(),mo(i,e)})}o(po,"renderDamage");async function mo(e,t){let n=C(t,"merge.data").flatMap(a=>a.source);await an(t.id),await qe().createDocuments(n)}o(mo,"splitDamages");async function go(e,t,n,{actorUUID:a,targetUUIDs:r}){let s={},i=Qt(n).concat(Qt(t));for(let{name:d,notes:p,outcome:h,modifiers:b,tags:k}of i)s[d]??={name:d,tags:k,notes:new Set,results:[]},p.forEach(s[d].notes.add,s[d].notes),s[d].results.some(R=>R.outcome===h&&Ke(R.modifiers,b))||s[d].results.push({outcome:h,modifiers:b});let c=Object.values(s).map(d=>(d.label=d.name,d.results.forEach(p=>{p.outcome&&(p.label=game.i18n.localize(`PF2E.Check.Result.Degree.Attack.${p.outcome}`))}),d));c.at(-1).isLastGroup=!0;let l=await renderTemplate(I("merge/merged"),{groups:c,hasMultipleGroups:c.length>1}),u=Xt(t),f=Xt(n),g=[];for(let d of[].concat(f,u)){let{options:p,total:h,terms:b}=d,k=b[0],P=d.formula.replaceAll(/(\[[\w,]+\])/g,"").replace(/^\(/,"").replace(/\)$/,""),R=g.find(({options:{flavor:A,critRule:x}})=>A===p.flavor&&x===p.critRule);R?(R.terms.push(k),R.total+=h,R.formulas.push(P)):g.push({options:p,formulas:[P],total:h,terms:[k]})}let m=Jt();for(let d of g){if(d.options.flavor.includes("persistent")){let{index:p}=d.formulas.reduce((h,b,k)=>{let P=new m(b).expectedValue;return P>h.value&&(h={value:P,index:k}),h},{value:0,index:-1});d.formulas=[d.formulas[p]],d.terms=[d.terms[p]]}d.formula=`(${d.formulas.join(" + ")})[${d.options.flavor}]`,d.term=d.terms.length<2?d.terms[0]:on(d.terms)}let y={class:"DamageRoll",options:{},dice:[],formula:`{${g.map(({formula:d})=>d).join(", ")}}`,total:g.reduce((d,{total:p})=>d+p,0),evaluated:!0,terms:[{class:"InstancePool",options:{},evaluated:!0,terms:g.map(({formula:d})=>d),modifiers:[],rolls:g.map(({options:d,formula:p,total:h,term:b})=>({class:"DamageInstance",options:d,dice:[],formula:p,total:h,terms:[b],evaluated:!0})),results:g.map(({total:d})=>({result:d,active:!0}))}]};if(game.modules.get("dice-so-nice")?.active){let d=o(p=>{"results"in p?p.results.forEach(h=>h.hidden=!0):(p.term??p).operands?.forEach(h=>d(h))},"setHidden");y.terms[0].rolls.forEach(p=>p.terms.forEach(h=>d(h)))}await an(t.id,n.id),await qe().create({flavor:l,type:CONST.CHAT_MESSAGE_TYPES.ROLL,speaker:t.speaker,flags:{[S]:{merge:{actor:a,targets:r,merged:!0,type:"damage-roll",data:i},target:{targets:r}},pf2e:{context:{options:Array.from(new Set(i.flatMap(d=>d.itemTraits)))}}},rolls:[y]})}o(go,"mergeDamages");function Qt(e){let t=C(e,"merge.data");if(t)return t;let n=e.toObject();delete n._id,delete n.timestamp;let a=$(`
${e.flavor}
`),r=a.find("h4.action + .tags").prop("outerHTML"),s=[];a.find(".tag.tag_transparent").each(function(){s.push(this.innerHTML)});let i=n.flags.pf2e.context.notes.map(({title:c,text:l})=>`${game.i18n.localize(c)} ${game.i18n.localize(l)}`);return[{source:n,name:n.flags.pf2e.strike?.name??e.item.name,outcome:n.flags.pf2e.context.outcome,itemTraits:n.flags.pf2e.context.options.filter(c=>c.startsWith("item:")),modifiers:s,tags:r,notes:i}]}o(Qt,"getMessageData");function an(...e){let t=e.map(n=>`[data-message-id=${n}]`).join(", ");return ui.chat.element.find(t).remove(),ChatMessage.deleteDocuments(e)}o(an,"removeChatMessages");function on(e){let t=deepClone(e[0].options);return e.map(n=>(n.options={},n)),{class:"Grouping",options:t,evaluated:!0,term:{class:"ArithmeticExpression",options:{},evaluated:!0,operator:"+",operands:[e.shift(),e.length>1?on(e):e[0]]}}}o(on,"createTermGroup");function Xt(e){return C(e,"merge.rolls")??JSON.parse(e._source.rolls[0]).terms[0].rolls}o(Xt,"getMessageRolls");function Zt(e){return C(e,"merge.actor")??e.actor?.uuid}o(Zt,"getActorUUID");function en(e){let t=C(e,"target.targets");if(t)return t;let n=C(e,"merge.targets")??e.getFlag("pf2e","target");return Array.isArray(n)?n:n?[n]:[]}o(en,"getTargetUUIDs");function rn(e){return C(e,"merge.type")==="damage-roll"||e.getFlag("pf2e","context.type")==="damage-roll"}o(rn,"isDamageRoll");var sn=Q("renderChatMessage",ln,ho);function cn(){return{settings:[{name:"modifiers",type:String,default:"disabled",choices:["disabled","enabled","traits"],onChange:e=>sn(e)}],init:e=>{!e&&v("modifiers")!=="disabled"&&sn(!0,!0)}}}o(cn,"registerHideModifiers");function ho(){if(game.user.isGM)return;let e=ui.chat?.element;if(e)for(let t of ue(20)){let n=e.find(`[data-message-id=${t.id}]`);n.length&&(n.find(".message-header").removeClass("pf2e-toolbelt-modifiers pf2e-toolbelt-modifiers-traits"),ln(t,n))}}o(ho,"updateMessages");function ln(e,t){let n=e.speaker,a=ChatMessage.getSpeakerActor(n);if(!a||a.hasPlayerOwner)return;let r=t.find(".message-header");v("modifiers")==="traits"&&r.addClass("pf2e-toolbelt-modifiers-traits"),v("modifiers")!=="disabled"&&r.addClass("pf2e-toolbelt-modifiers")}o(ln,"renderChatMessage");var yo="CONFIG.Actor.documentClass.prototype.prepareEmbeddedDocuments",bo="CONFIG.PF2E.Item.documentClasses.treasure.prototype.prepareBaseData";function fn(){return{settings:[{name:"nobulk",type:Boolean,default:!1,requiresReload:!0},{name:"nobulk-coins",type:Boolean,default:!1,requiresReload:!0}],init:()=>{v("nobulk")&&U(yo,So,"WRAPPER"),v("nobulk-coins")&&U(bo,vo,"WRAPPER")}}}o(fn,"registerNobulk");function vo(e){e(),this.isCoinage&&(this.system.bulk.value=0)}o(vo,"treasurePrepareBaseData");function So(e,...t){e(...t);let n=this,a=n.inventory.bulk.constructor,r=null;Object.defineProperty(n.inventory.bulk,"value",{get(){return r||(r=a.computeTotalBulk(this.actor.inventory.filter(s=>!s.isInContainer&&s.system.equipped.carryType!=="dropped"),this.actor.size),r)}})}o(So,"actorPrepareEmbeddedDocuments");var Co="CONFIG.Actor.documentClass.prototype.prepareData",ko="DocumentSheet.prototype._renderInner";function un(){return{settings:[{name:"share",type:String,default:"disabled",choices:["disabled","enabled","force"],requiresReload:!0}],init:()=>{v("share")!=="disabled"&&(U(Co,Ao,"WRAPPER"),U(ko,Eo,"WRAPPER"),Hooks.on("preUpdateActor",Io),Hooks.on("deleteActor",wo),Hooks.on("updateActor",To))}}}o(un,"registerShare");async function Eo(e,...t){let n=await e(...t);if(!De(this,"CreatureConfig"))return n;let a=this.actor;if(!F(a)||!a.isOfType("character","npc")||ye(a).size)return n;let r=game.actors.filter(i=>i.id!==a.id&&i.isOwner&&Fe(i)).map(i=>({key:i.id,label:i.name})),s=await renderTemplate(I("share/master"),{masters:r,master:C(a,"share.master"),selectPath:`flags.${S}.share.master`,i18n:T("share.templates.master")});return n.children().last().before(s),n}o(Eo,"documentSheetRenderInner");function wo(e){yn(e);let t=ye(e);Promise.all(t.map(async n=>{pn(n),await bt(n,"share.master")}))}o(wo,"deleteActor");function Io(e,t){let n=getProperty(t,`flags.${S}.share`);if(n?.master){let a=game.actors.get(n.master);if(Fe(a)){let r=deepClone(a._source.system.attributes.hp);setProperty(t,"system.attributes.hp",r)}}else{let a=$e(e),r=getProperty(t,"system.attributes.hp");a&&r&&(a.update({system:{attributes:{hp:r}}},{noHook:!0}),delete t.system.attributes.hp)}}o(Io,"preUpdateActor");function To(e,t,n,a){let r=game.user.id===a,s=Ro(t);if(s?.master!==void 0){let c=e;if(yn(c),s.master){let l=game.actors.get(s.master);Fe(l)&&(dn(c,l),hn(l,c))}else pn(c)}if(!r)return;let i=ye(e);if(i.size){let c=getProperty(t,"system.attributes.hp");if(c){let l={system:{attributes:{hp:c}}};Promise.all(i.map(async u=>await u.update(l,{noHook:!0})))}else Promise.all(i.map(async l=>await Do(l,t)))}}o(To,"updateActor");async function Do(e,t){v("share")==="force"?await G(e,"toggle",!C(e,"toggle")):(e.render(!1,{action:"update"}),e._updateDependentTokens(t))}o(Do,"refreshActor");function Ao(e){e();let t=this,n=C(t,"share.master"),a=n?game.actors.get(n):void 0;if(!Fe(a))return;$e(this)||(dn(this,a),hn(a,this));let r=this.system.attributes.hp;Object.defineProperty(t.system.attributes,"hp",{get(){let s=a.system.attributes.hp;return Po(s,r),r},enumerable:!0})}o(Ao,"prepareData");function Po(e,t){t.breakdown=e.breakdown,t.max=e.max,t.sp=deepClone(e.sp),t.temp=e.temp,t.totalModifier=e.totalModifier,t.value=e.value,t._modifiers=e._modifiers.slice()}o(Po,"transfertHpData");function Ro(e){return getProperty(e,`flags.${S}.share`)}o(Ro,"getShareFlag");function ye(e){return mn(e,"slaves")??new Collection}o(ye,"getSlaves");function dn(e,t){gn(e,"master",t)}o(dn,"setMaster");function pn(e){Oo(e,"master")}o(pn,"unsetMaster");function $e(e){return mn(e,"master")}o($e,"getMaster");function Fe(e){return e&&e.type==="character"&&!$e(e)}o(Fe,"isValidMaster");function mn(e,t){return getProperty(e,`modules.${S}.share.${t}`)}o(mn,"getModuleProperty");function gn(e,t,n){setProperty(e,`modules.${S}.share.${t}`,n)}o(gn,"setModuleProperty");function Oo(e,t){delete e.modules?.[S]?.share?.[t]}o(Oo,"deleteModuleProperty");function hn(e,t){let n=ye(e);gn(e,"slaves",n.set(t.id,t))}o(hn,"addSlaveToMaster");function yn(e){let t=$e(e);if(!t)return;ye(t).delete(e.id)}o(yn,"removeSlaveFromMaster");function bn(e){return e.getFlag("core","sourceId")}o(bn,"getSourceId");function Mo(e,t){let n=bn(e);return n?t.includes(n):!1}o(Mo,"includesSourceId");function vn(e){return Array.isArray(e)?t=>Mo(t,e):t=>bn(t)===e}o(vn,"getItemSourceIdCondition");function Sn(e,t){return t=typeof t=="string"?[t]:t,t?t.flatMap(n=>e.itemTypes[n]):e.items}o(Sn,"getItems");function Cn(e,t,n){return Sn(e,n).some(vn(t))}o(Cn,"hasItemWithSourceId");function Le(e,t,n){return Sn(e,n).find(vn(t))}o(Le,"getItemWithSourceId");var xo=O("renderCharacterSheetPF2e",No),$o=O("deleteCombat",jo),Fo=O("deleteCombatant",An),Lo=O("createCombatant",Bo),Uo=["Compendium.pf2e.feats-srd.Item.yeSyGnYDkl2GUNmu","Compendium.pf2e.feats-srd.Item.LI9VtCaL5ZRk0Wo8"],_o=new Map([["Compendium.pf2e.feats-srd.Item.nRjyyDulHnP5OewA",{replace:"Compendium.pf2e.feats-srd.Item.DqD7htz8Sd1dh3BT",effect:"Compendium.pf2e.feat-effects.Item.UZKIKLuwpQu47feK"}]]),Ho=new Map([["Compendium.pf2e.classfeatures.Item.09iL38CZZEa0q0Mt",{effect:"Compendium.pf2e.feat-effects.Item.fsjO5oTKttsbpaKl",action:"Compendium.pf2e.actionspf2e.Item.HbejhIywqIufrmVM"}],["Compendium.pf2e.feats-srd.Item.xQuNswWB3eg1UM28",{effect:"Compendium.pf2e.feat-effects.Item.2Qpt0CHuOMeL48rN"}],["Compendium.pf2e.feats-srd.Item.R7c4PyTNkZb0yvoT",{effect:"Compendium.pf2e.feat-effects.Item.qX62wJzDYtNxDbFv"}],["Compendium.pf2e.feats-srd.Item.bvOsJNeI0ewvQsFa",{effect:"Compendium.pf2e.feat-effects.Item.er5tvDNvpbcnlbHQ"}]]);function En(){return{name:"stances",settings:[{name:"stances",type:Boolean,default:!1,scope:"client",onChange:kn},{name:"custom-stances",type:String,default:""}],conflicts:["pf2e-stances"],api:{getStances:nt,toggleStance:Dn,isValidStance:wn},ready:e=>{v("stances")&&kn(!0)}}}o(En,"registerStances");function kn(e){xo(e),$o(e),Fo(e),Lo(e)}o(kn,"setup");function wn(e){return e&&e.system.traits.value.includes("stance")&&e.system.selfEffect?.uuid}o(wn,"isValidStance");function nt(e){let t=[],n=new Set;for(let{replace:a,sourceId:r,effectUUID:s,effect:i,img:c,name:l,itemName:u,action:f}of In(e)){a&&n.add(a);let g=f?Le(e,f,"action"):Le(e,r,"feat");t.push({name:l,itemName:u,uuid:r,img:c,effectUUID:s,effectID:i?.id,actionUUID:g.sourceId,actionID:g.id})}return t.filter(({uuid:a})=>!n.has(a))}o(nt,"getStances");async function No(e,t){let n=e.actor;if(!F(n))return;let a=nt(n);if(!a.length)return;let r=n.getActiveTokens(!0,!0).some(l=>l.inCombat),s=t.find(".sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter]"),i=s.find(".actions-options"),c=await renderTemplate(I("stances/sheet"),{stances:a,canUseStances:r&&!n.isDead,i18n:T("stances")});i.length?i.after(c):s.prepend(c),t.find(".sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance").on("click",l=>Go(l,n))}o(No,"renderCharacterSheetPF2e");function Go(e,t){let n=e.currentTarget,a=n.closest(".pf2e-stances")?.classList.contains("can-use-stances");if(!e.ctrlKey&&!a)return;let r=n.dataset.effectUuid;Dn(t,r)}o(Go,"onToggleStance");function*In(e){for(let t of e.itemTypes.feat){let n=t.sourceId,a=_o.get(n),r=Ho.get(n);if(!a&&!r&&!wn(t))continue;let s=a?.effect??r?.effect??t.system.selfEffect.uuid,i=fromUuidSync(s);i&&(yield{name:(a&&fromUuidSync(a.replace)?.name)??t.name,itemName:t.name,replace:a?.replace,extra:r,sourceId:n,effectUUID:s,effect:Le(e,s,"effect"),action:r?.action,img:i.img})}}o(In,"actorStances");function Tn(e){let t=[];for(let{effect:n}of In(e))n&&t.push({uuid:n.sourceId,id:n.id});return t}o(Tn,"getStancesEffects");async function Dn(e,t){let n=Tn(e),a=n.findIndex(s=>s.uuid===t),r=!1;if(a===-1)r=!0;else{let s=n.filter(c=>c.uuid!==t).length,i=n.filter(c=>c.uuid===t).length>1;(s||i)&&n.splice(a,1)}n.length&&await e.deleteEmbeddedDocuments("Item",n.map(s=>s.id)),r&&at(e,t)}o(Dn,"toggleStance");async function at(e,t){let n=await fromUuid(t);if(n){let a=n.toObject();return getProperty(a,"flags.core.sourceId")||setProperty(a,"flags.core.sourceId",n.uuid),(await e.createEmbeddedDocuments("Item",[a]))[0]?.toMessage(),!0}return!1}o(at,"addStance");function jo(e){for(let t of e.combatants)An(t)}o(jo,"deleteCombat");function An(e){let t=Pn(e);if(t){if(!game.user.isGM&&Ve(t)){let n=Tn(t).map(a=>a.id);n.length&&t.deleteEmbeddedDocuments("Item",n)}V(t)}}o(An,"deleteCombatant");function Bo(e){let t=Pn(e);t&&(!game.user.isGM&&Ve(t)&&zo(t),V(t))}o(Bo,"createCombatant");function Pn(e){let t=e.actor;if(t&&!t.isToken&&t.isOfType("character"))return t}o(Pn,"getActorFromCombatant");async function zo(e){let t=nt(e);if(!(!t.length||t.filter(({effectID:r})=>r).length||!Cn(e,Uo,["feat"])))if(t.length===1){let r=t[0];await at(e,r.effectUUID)&&J("stances.useStance",{stance:r.name})}else Wo(e,t)}o(zo,"checkForSavant");async function Wo(e,t){let n=T("stances.menu");new Dialog({title:n("title"),content:await renderTemplate(I("stances/menu"),{stances:t,i18n:n}),buttons:{yes:{icon:'',label:n("accept"),callback:a=>at(e,a.find("[name=stance]:checked").val())},no:{icon:'',label:n("cancel")}}}).render(!0)}o(Wo,"openStancesMenu");var Rn=Q("renderCharacterSheetPF2e",qo,()=>V());function On(){return{settings:[{name:"summary",type:String,default:"disabled",scope:"client",choices:["disabled","enabled","sort"],onChange:e=>Rn(e)}],conflicts:["pf2e-spells-summary"],init:e=>{v("summary")!=="disabled"&&Rn(!0,!0)}}}o(On,"registerSpellsSummary");async function qo(e,t){let n=e.actor;if(!F(n))return;let a=be(t);me(e,"toggled")&&a.addClass("toggled"),sr(t).on("click",r=>rr(r,t,e)),await Vo(t,e,n),a.hasClass("toggled")&&a.hasClass("active")&&e._restoreScrollPositions(t)}o(qo,"renderCharacterSheetPF2e");async function Vo(e,t,n){let a=be(e),r=await lr(n),s=await renderTemplate(I("summary/sheet"),r);a.append(s),Ko(e,t,n)}o(Vo,"addSummaryTab");function Ko(e,t,n){let a=cr(e),r=a.find(".spell-type .uses .spell-slots-input input");r.on("change",s=>Yo(s,n)),r.on("focus",Jo),r.on("blur",Qo),a.find("[data-action=cast-spell]").on("click",s=>nr(s,n)),a.find(".item-toggle-prepare").on("click",s=>Xo(s,n)),a.find(".focus-pips").on("click contextmenu",s=>Zo(s,n)),a.find(".spell-slots-increment-reset").on("click",s=>tr(s,t,n)),a.find(".item-image").on("click",s=>or(s,n)),a.find(".item-name > h4").on("click",s=>ar(s,t))}o(Ko,"addSummaryEvents");async function Yo(e,t){e.preventDefault();let{inputPath:n,entryId:a}=$(e.currentTarget).data(),r=e.currentTarget.valueAsNumber;t.updateEmbeddedDocuments("Item",[{_id:a,[n]:r}])}o(Yo,"onUsesInputChange");function Jo(e){e.preventDefault(),e.currentTarget.closest(".item")?.classList.add("hover")}o(Jo,"onUsesInputFocus");function Qo(e){e.preventDefault(),e.currentTarget.closest(".item")?.classList.remove("hover")}o(Qo,"onUsesInputBlur");function Xo(e,t){e.preventDefault();let{slotLevel:n,slotId:a,entryId:r,expended:s}=$(e.currentTarget).closest(".item").data();t.spellcasting.collections.get(r)?.setSlotExpendedState(n??0,a??0,s!==!0)}o(Xo,"onTogglePrepare");function Zo(e,t){e.preventDefault();let n=e.type==="click"?1:-1,a=(t.system.resources.focus?.value??0)+n;t.update({"system.resources.focus.value":a})}o(Zo,"onToggleFocusPool");function er(e,t){ir(e.element).find(`.item-container.spellcasting-entry[data-item-id=${t}]`).find(".spell-ability-data .statistic-values a.pf2e-staves-charge")[0]?.click()}o(er,"onChargeReset");function tr(e,t,n){e.preventDefault();let{itemId:a,level:r,isCharge:s}=$(e.currentTarget).data();if(!a)return;if(s){er(t,a);return}let i=n.items.get(a);if(i){if(i.isOfType("spellcastingEntry")){let c=r>=0&&r<=11?`slot${r}`:"slot0",l=i.system.slots?.[c];l&&i.update({[`system.slots.${c}.value`]:l.max})}else if(i.isOfType("spell")){let c=i.system.location.uses?.max;c&&i.update({"system.location.uses.value":c})}}}o(tr,"onSlotsReset");function nr(e,t){e.preventDefault();let n=$(e.currentTarget);if(n.prop("disabled"))return;let{itemId:a,slotLevel:r,slotId:s,entryId:i}=n.closest(".item").data(),c=t.spellcasting.collections.get(i);if(!c)return;let l=c.get(a);l&&c.entry.cast(l,{slot:s,level:r})}o(nr,"onCastSpell");async function ar(e,t){let n=e.currentTarget.closest(".item");await t.itemRenderer.toggleSummary(n)}o(ar,"onToggleSummary");async function or(e,t){let n=$(e.currentTarget).closest(".item").attr("data-item-id"),a=t.items.get(n);!a||a.isOfType("physical")&&!a.isIdentified||await a.toMessage(e)}o(or,"onItemToChat");function rr(e,t,n){e.preventDefault();let a=be(t);a.hasClass("active")&&(a.toggleClass("toggled"),a.scrollTop(0),Ae(n,"toggled",a.hasClass("toggled")))}o(rr,"onSpellcastingBtnToggle");function sr(e){return e.find("nav.sheet-navigation .item[data-tab=spellcasting]")}o(sr,"getSpellcastingNav");function be(e){return e.find("section.sheet-body .sheet-content > .tab[data-tab=spellcasting]")}o(be,"getSpellcastingTab");function ir(e){return be(e).find(".directory-list.spellcastingEntry-list")}o(ir,"getSpellcastingOriginalSection");function cr(e){return be(e).find(".directory-list.summary")}o(cr,"getSpellcastingSummarySection");async function lr(e){let t=e.system.resources.focus??{value:0,max:0},n=game.modules.get("pf2e-staves")?.active,a=[],r=[],s=!1;if(await Promise.all(e.spellcasting.regular.map(async l=>{let u=l.id,f=l.statistic.dc.value,g=l.name,m=await l.getSheetData(),y=m.isFocusPool,d=l.system?.prepared?.value==="charge",p=getProperty(l,"flags.pf2e-staves.staveID")!==void 0,h={value:getProperty(l,"flags.pf2e-staves.charges")??0};for(let b of m.levels){if(!b.active.length||b.uses?.max===0)continue;let k=[],P=b.isCantrip,R=b.active.filter(x=>x&&x.uses?.max!==0),A=!P&&d&&!n;for(let x=0;xu.order===f.order?Te(u.name,f.name):u.order-f.order:(u,f)=>Te(u.name,f.name);a.forEach(u=>u.sort(l))}r.length&&(r.sort((l,u)=>Te(l.name,u.name)),a[12]=r,s=!1);let c=(await e.spellcasting.ritual?.getSheetData())?.levels.flatMap((l,u)=>l.active.map(({spell:f})=>({name:f.name,img:f.img,slotId:u,itemId:f.id,level:f.level,time:f.system.time.value})).filter(Boolean));return{spells:a,rituals:c,focusPool:t,stavesActive:n,hasFocusCantrips:s,isOwner:e.isOwner,entryRank:l=>game.i18n.format("PF2E.Item.Spell.Rank.Ordinal",{rank:At(l)})}}o(lr,"getData");function xn(e){let t=0,n={},a={},r=e.filter(i=>i.type==="ability"&&!i.ignored),s=r.reduce((i,c)=>i===null||c.force?c:i.force?i:c.modifier>i.modifier?c:i,null);for(let i of r)i.ignored=i!==s;for(let i of e){if(i.ignored){i.enabled=!1;continue}if(i.type==="untyped"){i.enabled=!0,t+=i.modifier;continue}i.modifier<0?t+=Mn(a,i,LOWER_PENALTY):t+=Mn(n,i,HIGHER_BONUS)}return t}o(xn,"applyStackingRules");function Mn(e,t,n){let a=e[t.type];return a===void 0?(t.enabled=!0,e[t.type]=t,t.modifier):n(t,a)?(a.enabled=!1,t.enabled=!0,e[t.type]=t,t.modifier-a.modifier):(t.enabled=!1,0)}o(Mn,"applyStacking");function ot(e,t){return e instanceof Element||e instanceof Document?e.querySelector(t):null}o(ot,"htmlQuery");function $n(e){return Error(`PF2e System | ${e}`)}o($n,"ErrorPF2e");async function Fn({affects:e,origin:t,target:n,item:a,domains:r,options:s}){if(!(t&&n))return[];let[i,c]=e==="target"?[t,n]:[n,t],l=[...s,i.getRollOptions(r),c.getSelfRollOptions(e)].flat(),u=a?a.isOfType("spell")?{spell:a}:{weapon:a}:{};return(await Promise.all(r.flatMap(f=>i.synthetics.ephemeralEffects[f]?.[e]??[]).map(f=>f({test:l,resolvables:u})))).flatMap(f=>f??[])}o(Fn,"extractEphemeralEffects");function Ln(e,t){return t.flatMap(n=>(e[n]??[]).map(a=>a.clone()))}o(Ln,"extractNotes");function Un(e,t,n){return t.flatMap(a=>e[a]??[]).flatMap(a=>a(n)??[])}o(Un,"extractDamageDice");function _n(e,t,n){let{modifierAdjustments:a,modifiers:r}=e,s=Array.from(new Set(t)).flatMap(i=>r[i]??[]).flatMap(i=>i(n)??[]);for(let i of s)i.adjustments=fr(a,t,i.slug);return s}o(_n,"extractModifiers");function fr(e,t,n){return Array.from(new Set(t.flatMap(r=>e[r]??[]))).filter(r=>[n,null].includes(r.slug))}o(fr,"extractModifierAdjustments");async function rt(e,{message:t,multiplier:n=1,addend:a=0,promptModifier:r=!1,rollIndex:s=0}){if(r)return ur(e,{message:t,multiplier:n,rollIndex:s});let i=CONFIG.PF2E.chatDamageButtonShieldToggle,c=t.rolls.at(s);if(!De(c,"DamageRoll"))throw $n("Unexpected error retrieving damage roll");let l=n<0?n*c.total+a:c.alter(n,a),u=[...t.flags.pf2e.context?.options??[]],f=u.filter(A=>A.startsWith("self:")).map(A=>A.replace(/^self/,"origin")),g=t.item;if(!e.actor)return;u.some(A=>A.startsWith("target"))||u.push(...e.actor.getSelfRollOptions("target"));let m=n>0?"damage-received":"healing-received",y=n>0?await Fn({affects:"target",origin:t.actor,target:e.actor,item:t.item,domains:[m],options:u}):[],d=e.actor.getContextualClone(f,y),p=new Set([...u.filter(A=>!/^(?:self|target):/.test(A)),...f,...d.getSelfRollOptions()]),h=t.flags.pf2e.context?.outcome,b=[],k=[];if(typeof l=="number"&&l<0){let A=h==="criticalSuccess",x=(()=>g?.isOfType("spell")?{spell:g}:g?.isOfType("weapon")?{weapon:g}:{})(),H=Un(d.synthetics.damageDice,[m],{resolvables:x,test:p}).filter(E=>(E.critical===null||E.critical===A)&&E.predicate.test(p));for(let E of H){let oe=`${E.diceNumber}${E.dieSize}[${E.label}]`,re=await new Roll(oe).evaluate({async:!0});re._formula=`${E.diceNumber}${E.dieSize}`,await re.toMessage({flags:{pf2e:{suppressDamageButtons:!0}},flavor:E.label,speaker:ChatMessage.getSpeaker({token:e})}),b.push(`${E.label} ${E.diceNumber}${E.dieSize}`),k.push(re)}k.length&&(l-=k.map(E=>E.total).reduce((E,oe)=>E+oe));let Ce=_n(d.synthetics,[m],{resolvables:x}).filter(E=>(E.critical===null||E.critical===A)&&E.predicate.test(p));l-=xn(Ce??[]),b.push(...Ce.filter(E=>E.enabled).map(E=>`${E.label} ${signedInteger(E.modifier)}`))}let P=typeof l=="number"?l!==0:l.total!==0,R=(()=>P?Ln(d.synthetics.rollNotes,[m]).filter(A=>(!h||A.outcome.length===0||A.outcome.includes(h))&&A.predicate.test(p)).map(A=>A.text):[])();await d.applyDamage({damage:l,token:e,item:t.item,skipIWR:n<=0,rollOptions:p,shieldBlockRequest:i,breakdown:b,notes:R}),Nn(t.id),Gn(t,e.id,s)}o(rt,"applyDamageFromMessage");function Hn(e,t,n){let a=o(()=>[e],"getTokens"),r=o(s=>s[0]?.actor?.itemTypes.shield.filter(c=>c.isEquipped&&!c.isBroken&&!c.isDestroyed)??[],"getNonBrokenShields");t.classList.contains("tooltipstered")||$(t).tooltipster({animation:"fade",trigger:"click",arrow:!1,content:$(n).find("div.hover-content"),contentAsHTML:!0,contentCloning:!0,debug:!1,interactive:!0,side:["top"],theme:"crb-hover",functionBefore:()=>{let s=a();if(!s.length)return!1;let i=r(s),c=s.length===1&&i.length>1,l=t.classList.contains("shield-activated");return c&&!l?!0:c&&t.dataset.shieldId?(t.attributes.removeNamedItem("data-shield-id"),t.classList.remove("shield-activated"),CONFIG.PF2E.chatDamageButtonShieldToggle=!1,!0):(t.classList.toggle("shield-activated"),CONFIG.PF2E.chatDamageButtonShieldToggle=!CONFIG.PF2E.chatDamageButtonShieldToggle,!1)},functionFormat:(s,i,c)=>{let l=a(),u=r(l),f=l.length===1&&u.length>1,g=t.classList.contains("shield-activated");if(f&&!g){let m=c[0],y=ot(m,"ul.shield-options");if(!y)return c;let d=[];for(let p of u){let h=document.createElement("input");h.classList.add("data"),h.type="radio",h.name="shield-id",h.value=p.id,h.addEventListener("click",()=>{t.dataset.shieldId=h.value,t.classList.add("shield-activated"),CONFIG.PF2E.chatDamageButtonShieldToggle=!0,s.close()});let b=document.createElement("span");b.classList.add("label"),b.innerHTML=p.name;let k=document.createElement("span");k.classList.add("tag");let P=game.i18n.localize("PF2E.HardnessLabel");k.innerHTML=`${P}: ${p.hardness}`;let R=document.createElement("li");R.classList.add("item"),R.append(h,b,k),d.push(R)}y.replaceChildren(...d)}return c}}).tooltipster("open")}o(Hn,"onClickShieldBlock");function Nn(e){for(let t of["#chat-log","#chat-popout"]){let n=`${t} > li.chat-message[data-message-id="${e}"] button[data-action=shield-block]`;ot(document.body,n)?.classList.remove("shield-activated")}CONFIG.PF2E.chatDamageButtonShieldToggle=!1}o(Nn,"toggleOffShieldBlock");async function ur(e,{message:t,multiplier:n,rollIndex:a}){let r=await renderTemplate("systems/pf2e/templates/chat/damage/adjustment-dialog.hbs"),s=o(class extends Dialog{activateListeners(c){super.activateListeners(c),c[0].querySelector("input")?.focus()}},"AdjustmentDialog"),i=n<0;new s({title:game.i18n.localize(i?"PF2E.UI.shiftModifyHealingTitle":"PF2E.UI.shiftModifyDamageTitle"),content:r,buttons:{ok:{label:game.i18n.localize("PF2E.OK"),callback:async c=>{let l=(Number(c[0].querySelector("input")?.value)||0)*Math.sign(n);rt(e,{message:t,multiplier:n,addend:l,promptModifier:!1,rollIndex:a})}},cancel:{label:"Cancel"}},default:"ok",close:()=>{Nn(t.id)}}).render(!0)}o(ur,"shiftAdjustDamage");var Ue={LOWER_BY_TWO:-2,LOWER:-1,INCREASE:1,INCREASE_BY_TWO:2,TO_CRITICAL_FAILURE:"criticalFailure",TO_FAILURE:"failure",TO_SUCCESS:"success",TO_CRITICAL_SUCCESS:"criticalSuccess"},jn=["criticalFailure","failure","success","criticalSuccess"],He,Bn,ne,_e,Y,ve,Ne,zn,B=class{constructor(t,n,a=null){ie(this,He);ie(this,ne);ie(this,Y);ie(this,Ne);t instanceof Roll?(this.dieResult=(t.isDeterministic?t.terms.find(r=>r instanceof NumericTerm):t.dice.find(r=>r instanceof Die&&r.faces===20))?.total??1,this.rollTotal=t.total):(this.dieResult=t.dieValue,this.rollTotal=t.dieValue+t.modifier),this.dc=typeof n=="number"?{value:n}:n,this.unadjusted=_(this,Ne,zn).call(this),this.adjustment=_(this,He,Bn).call(this,this.unadjusted,a),this.value=this.adjustment?_(this,ne,_e).call(this,this.adjustment.amount,this.unadjusted):this.unadjusted}},N=B;o(N,"DegreeOfSuccess"),He=new WeakSet,Bn=o(function(t,n){if(!n)return null;for(let a of["all",...jn]){let{label:r,amount:s}=n[a]??{};if(s&&r&&!(t===B.CRITICAL_SUCCESS&&s===Ue.INCREASE)&&!(t===B.CRITICAL_FAILURE&&s===Ue.LOWER)&&(a==="all"||jn.indexOf(a)===t))return{label:r,amount:s}}return null},"#getDegreeAdjustment"),ne=new WeakSet,_e=o(function(t,n){switch(t){case"criticalFailure":return 0;case"failure":return 1;case"success":return 2;case"criticalSuccess":return 3;default:return Math.clamped(n+t,0,3)}},"#adjustDegreeOfSuccess"),Y=new WeakSet,ve=o(function(t){return this.dieResult===20?_(this,ne,_e).call(this,Ue.INCREASE,t):this.dieResult===1?_(this,ne,_e).call(this,Ue.LOWER,t):t},"#adjustDegreeByDieValue"),Ne=new WeakSet,zn=o(function(){let t=this.dc.value;return this.rollTotal-t>=10?_(this,Y,ve).call(this,B.CRITICAL_SUCCESS):t-this.rollTotal>=10?_(this,Y,ve).call(this,B.CRITICAL_FAILURE):this.rollTotal>=t?_(this,Y,ve).call(this,B.SUCCESS):_(this,Y,ve).call(this,B.FAILURE)},"#calculateDegreeOfSuccess"),se(N,"CRITICAL_FAILURE",0),se(N,"FAILURE",1),se(N,"SUCCESS",2),se(N,"CRITICAL_SUCCESS",3);function Wn(e,{collisionOrigin:t,collisionType:n="move"}={}){if(e=e instanceof MeasuredTemplateDocument?e.object:e,!canvas.scene)return[];let{grid:a,dimensions:r}=canvas;if(!(a&&r))return[];if(!e?.highlightId)return[];let s=a.getHighlightLayer(e.highlightId);if(!s||a.type!==CONST.GRID_TYPES.SQUARE)return[];let i=t??e.center,c=canvas.tokens.quadtree.getObjects(s.getLocalBounds(void 0,!0)),l=a.size,u=[];for(let f of c){let g=f.document,m=[];for(let y=0;y1)for(let b=1;bNumber(k)),h={x:d+r.size*.5,y:p+r.size*.5};if(h.x<0||h.y<0)continue;if(!(canvas.ready&&n&&CONFIG.Canvas.polygonBackends[n].testCollision(i,h,{type:n,mode:"any"}))){u.push(f);break}}}return u}o(Wn,"getTemplateTokens");var dr={fortitude:{icon:"fa-solid fa-chess-rook",label:"PF2E.SavesFortitude"},reflex:{icon:"fa-solid fa-person-running",label:"PF2E.SavesReflex"},will:{icon:"fa-solid fa-brain",label:"PF2E.SavesWill"}},st={hero:{icon:"fa-solid fa-hospital-symbol",reroll:"PF2E.RerollMenu.HeroPoint",rerolled:"PF2E.RerollMenu.MessageHeroPoint"},new:{icon:"fa-solid fa-dice",reroll:"PF2E.RerollMenu.KeepNew",rerolled:"PF2E.RerollMenu.MessageKeep.new"},lower:{icon:"fa-solid fa-dice-one",reroll:"PF2E.RerollMenu.KeepLower",rerolled:"PF2E.RerollMenu.MessageKeep.lower"},higher:{icon:"fa-solid fa-dice-six",reroll:"PF2E.RerollMenu.KeepHigher",rerolled:"PF2E.RerollMenu.MessageKeep.higher"}},pr=["criticalFailure","failure","success","criticalSuccess"],mr=O("preCreateChatMessage",yr),Yn=Q("renderChatMessage",br),Jn=O("createMeasuredTemplate",gr),Ge=!1;function Qn(){return{settings:[{name:"target",type:Boolean,default:!1,onChange:qn},{name:"target-chat",type:String,default:"disabled",choices:["disabled","small","big"],scope:"client",onChange:e=>Yn(e&&v("target")),migrate:{1:e=>e==="true"?"small":e==="false"?"disabled":void 0}},{name:"target-template",type:Boolean,default:!1,scope:"client",onChange:e=>Jn(e&&v("target"))}],conflicts:[],init:()=>{v("target")&&qn(!0)}}}o(Qn,"registerTargetTokenHelper");function qn(e){mr(e),Yn(e),Jn(e&&v("target-template")),we()&&(e&&!Ge?(X(Vn),Ge=!0):!e&&Ge&&(Z(Vn),Ge=!1))}o(qn,"setHooks");function Vn(e){if(ee())switch(e.type){case"target.update-save":it(e);break;case"target.update-applied":na(e);break}}o(Vn,"onSocket");async function gr(e,t,n){let a=game.user;if(a.id!==n)return;let r=T("target.menu"),s=e.item,i=s?.actor,c=i?i.token??i.getActiveTokens()[0]:void 0,l={title:s?.name||r("title"),content:await renderTemplate(I("target/template-menu"),{i18n:r,noSelf:!c}),buttons:{select:{icon:'',label:r("target"),callback:p=>({targets:p.find("[name=targets]:checked").val(),self:p.find("[name=self]").prop("checked"),neutral:p.find("[name=neutral]").prop("checked")})}},close:()=>null},u=await Dialog.wait(l,void 0,{id:"pf2e-toolbelt-target-template",width:260});if(!u)return;let f=i?i.alliance:a.isGM?"opposition":"party",g=f==="party"?"opposition":f==="opposition"?"party":null,d=Wn(e).filter(p=>{if(!p.actor?.isOfType("creature","hazard","vehicle")||p.document.hidden)return!1;if(c&&p===c)return u.self;let b=p.actor?p.actor.alliance:p.alliance;return b===null?u.neutral:u.targets==="all"||u.targets==="allies"&&b===f||u.targets==="enemies"&&b===g}).map(p=>p.id);a.updateTokenTargets(d),a.broadcastActivity({targets:d})}o(gr,"createMeasuredTemplate");var hr;function Xn(e){return e.rolls[0].options.evaluatePersistent?!1:!(hr??=(()=>{let n=[game.i18n.localize("PF2E.Encounter.Broadcast.FastHealing.fast-healing.ReceivedMessage"),game.i18n.localize("PF2E.Encounter.Broadcast.FastHealing.regeneration.ReceivedMessage")];return new RegExp(`^
(${n.join("|")})
`)})()).test(e.flavor)}o(Xn,"isValidDamageMessage");function yr(e){let t=e.isDamageRoll;if(t){if(!Xn(e))return;if(!C(e,"target.targets")){let s=game.user.targets;s.size&&q(e,"target.targets",Array.from(s.map(i=>({token:i.document.uuid,actor:i.actor.uuid}))))}if(e.rolls.length===2){let s=e.rolls.findIndex(c=>c.options?.splashOnly),i=e.rolls.findIndex(c=>!c.options?.splashOnly&&c.options?.damage?.modifiers.some(l=>l.damageCategory==="splash"));s!==-1&&i!==-1&&q(e,"target.splashIndex",s)}}if(!t&&e.getFlag("pf2e","context.type")!=="spell-cast")return;let n=e.item;if(n?.type!=="spell")return;let a=n.system.defense?.save;if(!a)return;let r=(()=>n.trickMagicEntry?$(e.content).find("[data-action=spell-save]").data()?.dc:n.spellcasting?.statistic.dc.value)();typeof r=="number"&&q(e,"target.save",{...a,dc:r})}o(yr,"preCreateChatMessage");async function br(e,t){let n=v("target-chat")!=="disabled";if(n&&e.isDamageRoll){if(!Xn(e))return;await Sr(e,t),Kn(e);return}let a=e.item;if(!(!a||a.type!=="spell")){if(n&&!a.damageKinds.size){await vr(e,t,a),Kn(e);return}a.trickMagicEntry&&a.system.defense?.save&&t.find("[data-action=spell-damage]").on("click",()=>{Ee(e)})}}o(br,"renderChatMessage");function Kn(e){Promise.all([ui.chat,ui.chat._popout].map(async t=>{let n=t?.element[0]?.querySelector("#chat-log");!n||!t.isAtBottom&&e.user._id!==game.user._id||(await t._waitForImages(),n.scrollTop=n.scrollHeight)}));for(let t of Object.values(e.apps))t instanceof ChatPopout&&t.rendered&&t.setPosition()}o(Kn,"refreshMessage");async function vr(e,t,n){let a=await ta(e);if(!a)return;let{targets:r,save:s}=a,i=t.find(".message-content"),c=i.find(".card-buttons");if(game.user.isGM||e.isAuthor){let u=c.find("[data-action=spell-save]"),f=$('
'),g=w("target.chat.targets.tooltip"),m=$(``);p.on("click",d=>Vn(d,e)),f.append(p),f.append(u),c.prepend(f)}if(n&&n.area&&!n.traits.has("aura")&&canvas.scene?.templates.some(f=>f.message===e&&f.isOwner)&&c.find(".owner-buttons .hidden.small").removeClass("hidden"),!s.length)return;let l=$('
');s.forEach(({template:u})=>{l.append("
"),l.append(u)}),i.after(l),Kn(e,l,r)}o(vs,"renderSpellChatMessage");function Vn(e,t){e.stopPropagation();let n=game.user.targets;G(t,"target.targets",Array.from(n.map(a=>({token:a.document.uuid,actor:a.actor.uuid}))))}o(Vn,"addTargets");async function Ss(e,t){let n=await Yn(e),a=t.find(".message-content"),s=a.find(".damage-application"),r=s.clone(),i=$('
');if(n?.targets.length&&s.length){let f=o(()=>{let d=!!me(e,"target.expanded");p.toggleClass("collapse",d),s.toggleClass("hidden",!d)},"toggleDamageRow"),h=w("target.chat.toggle.tooltip"),p=$(``);m.on("click",y=>Zn(y,e)),f.append(m),f.append(u),c.prepend(f)}if(n&&n.area&&!n.traits.has("aura")&&canvas.scene?.templates.some(f=>f.message===e&&f.isOwner)&&c.find(".owner-buttons .hidden.small").removeClass("hidden"),!r.length)return;let l=$('
');r.forEach(({template:u})=>{l.append("
"),l.append(u)}),i.after(l),ea(e,l,s)}o(vr,"renderSpellChatMessage");function Zn(e,t){e.stopPropagation();let n=game.user.targets;G(t,"target.targets",Array.from(n.map(a=>({token:a.document.uuid,actor:a.actor.uuid}))))}o(Zn,"addTargets");async function Sr(e,t){let n=await ta(e),a=t.find(".message-content"),r=a.find(".damage-application"),s=r.clone(),i=$('
');if(n?.targets.length&&r.length){let f=o(()=>{let y=!!me(e,"target.expanded");m.toggleClass("collapse",y),r.toggleClass("hidden",!y)},"toggleDamageRow"),g=w("target.chat.toggle.tooltip"),m=$(``);f(),p.on("click",d=>{d.stopPropagation(),De(e,"target.expanded",!me(e,"target.expanded")),f()}),i.append(p)}if(game.user.isGM||e.isAuthor){let f=w("target.chat.targets.tooltip"),h=$(``);f(),m.on("click",y=>{y.stopPropagation(),Ae(e,"target.expanded",!me(e,"target.expanded")),f()}),i.append(m)}if(game.user.isGM||e.isAuthor){let f=w("target.chat.targets.tooltip"),g=$(``);h.on("click",p=>Vn(p,e)),i.append(h)}if(t.find(".dice-result .dice-total").append(i),!n?.targets.length)return;let{targets:c,save:l}=n;if(!r.length)return;r.removeClass("damage-application").addClass("target-damage-application"),v("target-chat")!=="big"&&r.find("button").addClass("small"),r.find("[data-action]").each(function(){let f=this.dataset.action;this.dataset.action=`target-${f}`});let u=$('
');c.forEach(({uuid:f,template:h,save:p,applied:d={}})=>{let g=!!(p&&p.result&&p.basic),m=r.clone();u.append("
"),u.append(h),m.each((y,b)=>{b.dataset.rollIndex=y,b.dataset.targetUuid=f,b.classList.toggle("applied",!!d[y]||g&&p.result.success==="criticalSuccess"),g&&b.classList.add(p.result.success)}),u.append(m)}),a.after(u),Kn(e,u,l),u.find("button[data-action^=target-]").on("click",f=>Is(f,e))}o(Ss,"renderDamageChatMessage");function Kn(e,t,n){t.find("[data-action=ping-target]").on("click",Es),t.find("[data-action=open-target-sheet]").on("click",ws),t.find("[data-action=roll-save]").on("click",a=>ks(a,e,n)),t.find("[data-action=reroll-save]").on("click",a=>Cs(a,e,n))}o(Kn,"addHeaderListeners");async function Yn(e){let t=C(e,"target.targets")??[],n=game.user.isGM||game.settings.get("pf2e","metagame_showDC"),a=(()=>{let r=C(e,"target.save");if(r)return{...r,...ds[r.statistic]}})();if(!t.length&&!a)return;if(a){let r=game.i18n.format("PF2E.SavingThrowWithName",{saveName:game.i18n.localize(a.label)}),i=n?w("target.chat.save.dcWithValue",{dc:a.dc}):"";a.tooltipLabel=`${r} ${i}`,a.tooltip=await renderTemplate(I("target/save-tooltip"),{check:a.tooltipLabel})}return{targets:(await Promise.all(t.map(async({token:r})=>{let i=await fromUuid(r);if(!i?.isOwner)return;let c=i.id,l=i.actor,u=a&&!!l?.saves[a.statistic],f=await(async()=>{if(!u)return;let p=C(e,`target.saves.${c}`);if(!p)return;let d=p.rerolled,g=u&&!d,m=game.i18n.localize(`PF2E.Check.Result.Degree.Check.${p.success}`),y=p.value-a.dc;return{...p,canReroll:g,tooltip:await renderTemplate(I("target/save-tooltip"),{i18n:T("target.chat.save"),check:a.tooltipLabel,result:w(`target.chat.save.result.${n?"withOffset":"withoutOffset"}`,{success:m,offset:y>=0?`+${y}`:y,die:` ${p.die}`}),modifiers:p.modifiers,canReroll:g,rerolled:st[d]})}})(),h=a&&{...a,result:f};return{uuid:r,target:i,save:h,applied:C(e,`target.applied.${c}`),template:await renderTemplate(I("target/row-header"),{name:i.name,uuid:r,save:u&&h,canReroll:f?.canReroll,rerolled:st[f?.rerolled]})}}))).filter(Boolean),save:a}}o(Yn,"getMessageData");async function je(e){let{targetUuid:t}=e.currentTarget.closest("[data-target-uuid]").dataset;return fromUuid(t)}o(je,"getTargetFromEvent");async function Cs(e,t,{dc:n}){let a=await je(e),s=a?.actor;if(!s)return;let r=C(t,`target.saves.${a.id}`);if(!r?.roll||r.rerolled)return;let i=s.isOfType("character")?s.heroPoints.value:0,c=Object.entries(st).map(([b,{icon:E,reroll:A}])=>{if(b==="hero"&&!i)return;let M=game.i18n.localize(A);return``}).filter(Boolean).join(""),l={yes:{icon:'',label:"reroll",callback:b=>b.find("[name=reroll]:checked").val()??null},no:{icon:'',label:"cancel",callback:()=>null}},u=await Dialog.wait({title:`${a.name} - ${w("target.chat.save.reroll.confirm.title")}`,content:c,buttons:l,close:()=>null},{id:`pf2e-toolbelt-target-save-reroll-dialog-${a.id}`});if(!u)return;let f=u==="hero",h=f?"new":u;if(f){let{value:b,max:E}=s.heroPoints;if(b<1){D("target.chat.save.reroll.noPoints");return}await s.update({"system.resources.heroPoints.value":Math.clamped(b-1,0,E)})}let p=Roll.fromJSON(r.roll),d=p.clone();d.options.isReroll=!0,Hooks.callAll("pf2e.preReroll",Roll.fromJSON(r.roll),d,f,h);let g=await d.evaluate({async:!0});Hooks.callAll("pf2e.reroll",Roll.fromJSON(r.roll),g,f,h);let m=h==="higher"&&p.total>g.total||h==="lower"&&p.total{let f=t.item;if(f)return f;let h=C(t,"target.messageId");if(!h)return;let p=game.messages.get(h);if(p)return p.item})(),l=!game.user.settings.showCheckDialogs,u={type:"target.update-save",target:s.id};i.check.roll({dc:{value:n},item:c,origin:r,skipDialog:e.shiftKey?!l:l,createMessage:!1,callback:(f,h,p)=>{u.data={value:f.total,die:f.dice[0].total,success:f.degreeOfSuccess,roll:JSON.stringify(f.toJSON()),dosAdjustments:p.getFlag("pf2e","context.dosAdjustments"),modifiers:p.getFlag("pf2e","modifiers").filter(d=>d.enabled).map(({label:d,modifier:g})=>({label:d,modifier:g}))},game.user.isGM||t.isAuthor?(u.message=t,rt(u)):(u.message=t.id,O(u))}})}o(ks,"rollSave");function rt({message:e,target:t,data:n}){typeof e=="string"&&(e=game.messages.get(e),!e)||(typeof n.success=="number"&&(n.success=ps[n.success]),G(e,`target.saves.${t}`,deepClone(n)))}o(rt,"updateMessageSave");async function ws(e){let t=await je(e);t&&t.actor?.sheet.render(!0)}o(ws,"openTargetSheet");async function Es(e){if(!canvas.ready)return;let t=await je(e);t&&canvas.ping(t.center)}o(Es,"pingTarget");async function Is(e,t){let n=e.currentTarget,{rollIndex:a,targetUuid:s}=n.closest("[data-target-uuid]").dataset,r=await fromUuid(s);if(!r)return;let i=n.dataset.action;if(i==="target-shield-block"){Un(r,n,t.element);return}ot(r,{message:t,multiplier:i==="target-apply-healing"?-1:i==="target-half-damage"?.5:i==="target-apply-damage"?1:i==="target-double-damage"?2:3,addend:0,promptModifier:e.shiftKey,rollIndex:Number(a)})}o(Is,"onTargetButton");function _n(e,t,n){let a={};fe(a,`target.applied.${t}.${n}`,!0);let s=C(e,"target.splashIndex");if(s!==void 0){let r=s===0?1:0;if(n===s)fe(a,`target.applied.${t}.${r}`,!0);else{fe(a,`target.applied.${t}.${s}`,!0);let i=C(e,"target.targets")??[];for(let c of i){let l=c.token?.split(".").at(-1);l!==t&&fe(a,`target.applied.${l}.${r}`,!0)}}}game.user.isGM||e.isAuthor?Jn({message:e,updates:a}):O({type:"target.update-applied",message:e.id,updates:a})}o(_n,"onDamageApplied");function Jn({message:e,updates:t}){typeof e=="string"&&(e=game.messages.get(e),!e)||e.update(t)}o(Jn,"updateMessageApplied");var Se=null,z=null;function Xn(){return{settings:[{name:"unided",type:String,default:"disabled",choices:["disabled","create","all"],onChange:Qn}],conflicts:["pf2e-unided"],init:()=>{Qn()}}}o(Xn,"registerUnided");function Qn(e){e??=v("unided"),e==="disabled"?(Se&&(Hooks.off("preCreateItem",Se),Se=null),z&&(Hooks.off("preUpdateItem",z),z=null)):(Se||(Se=Hooks.on("preCreateItem",Ts)),e==="all"&&!z?z=Hooks.on("preUpdateItem",As):e!=="all"&&z&&(Hooks.off("preUpdateItem",z),z=null))}o(Qn,"setHooks");function Ts(e){!e.img||!e.isOfType("physical")||(e._source.system.identification.unidentified.img=e.img)}o(Ts,"preCreateItem");function As(e,t){!e.isOfType("physical")||!("img"in t)||setProperty(t,"system.identification.unidentified.img",t.img)}o(As,"preUpdateItem");var ae=T("macros.condition");async function Zn(e){let t=o((f,h)=>{let p=f.find("[name=condition]"),{name:d,slug:g,img:m}=p.find(":selected").data();return{type:h,slug:g,img:m,name:f.find("[name=name]").val().trim()||ae("effect-name",{condition:d}),uuid:p.val(),badge:Number(f.find("[name=badge]").val()||1),unidentified:f.find("[name=unidentified]").prop("checked")}},"callback"),n={generate:{icon:'',label:ae("generate"),callback:f=>t(f,"generate")},add:{icon:'',label:ae("add"),callback:f=>t(f,"add")}},a=Array.from(game.pf2e.ConditionManager.conditions.values()),s=new Set(a.filter(f=>!!f.badge).map(f=>f.slug)),r=await renderTemplate(I("macros/condition"),{i18n:ae,conditions:Array.from(new Set(a.sort((f,h)=>f.name.localeCompare(h.name))))}),i=o(f=>{let{name:h,slug:p}=f.find("[name=condition] :selected").data();f.find("[name=name]").prop("placeholder",ae("effect-name",{condition:h}));let d=s.has(p),g=f.find("[name=badge]");g.prop("disabled",!d),d||g.val(1)},"setInputs"),c=await Dialog.wait({buttons:n,content:r,title:ae("title"),close:()=>null,render:f=>{i(f),f.find("[name=condition]").on("change",()=>i(f))}},{id:"pf2e-toolbelt-macros-condition",width:320});if(!c)return;let l={inMemoryOnly:!0,key:"GrantItem",uuid:c.uuid};c.badge>1&&s.has(c.slug)&&(l.alterations=[{mode:"override",property:"badge-value",value:c.badge}]);let u={name:c.name,type:"effect",img:c.img,system:{rules:[l],unidentified:c.unidentified}};c.type==="generate"||!e?await Item.create(u):await e.createEmbeddedDocuments("Item",[u])}o(Zn,"permaConditionEffect");var Be=[ut(),ln(),Et(),Kt(),Xn(),Zt(),gt(),Rn(),kn(),Rt(),rn(),fn(),Wn()],ea=new Set,it=1,lt=null;Hooks.once("init",()=>{let e=Ee();game.settings.register(S,"settings-min-migration-version",{scope:"world",config:!1,key:"settings-min-migration-version",type:Number,default:0});let t=Be.flatMap(({settings:r=[]})=>r.map(i=>{let c=i.name;return i.choices&&(i.choices=i.choices.reduce((l,u)=>(l[u]=ct(c,`choices.${u}`),l),{})),i.key=c,i.scope??="world",i.config??=!0,i.name=ct(c,"name"),i.hint=ct(c,"hint"),i})),[n,a]=["world","client"].map(r=>t.filter(i=>i.scope===r));[n,a].forEach(r=>r.forEach(i=>game.settings.register(S,i.key,i))),e&&(lt=a[0].key,Hooks.on("renderSettingsConfig",Ds));let s=game.modules.get(S);s.api={macros:{permaConditionEffect:Zn}},Be.forEach(r=>{let{init:i,conflicts:c=[],api:l,name:u}=r;if(e)for(let f of c){let h=game.modules.get(f);h?.active&&(r.conflicting=!0,ea.add(h.title))}l&&u&&(s.api[u]=l),!r.conflicting&&i&&i(e)})});Hooks.once("ready",()=>{let e=game.user.isGM;for(let{conflicting:n,ready:a}of Be)!n&&a&&a(e);if(!e)return;for(let n of ea)D("module-conflict",{name:n},!0);let t=v("settings-min-migration-version");t{n.forEach(({migrate:a,key:s})=>{if(!a)return;let r=v(s),i=r;for(let c=t+1;c<=it;c++){let l=a[c];typeof l=="function"&&(i=l(i))}i!=null&&i!==r&&ce(s,i)})}),ce("settings-min-migration-version",it))});function ct(e,t){return`${S}.settings.${e}.${t}`}o(ct,"settingPath");function Ds(e,t){if(!lt)return;t.find(`.tab[data-tab=${S}] [data-setting-id="${S}.${lt}"]`).before(`

${w("settings.client")}

`)}o(Ds,"renderSettingsConfig");})(); +`);g.on("click",m=>Zn(m,e)),i.append(g)}if(t.find(".dice-result .dice-total").append(i),!n?.targets.length)return;let{targets:c,save:l}=n;if(!s.length)return;s.removeClass("damage-application").addClass("target-damage-application"),v("target-chat")!=="big"&&s.find("button").addClass("small"),s.find("[data-action]").each(function(){let f=this.dataset.action;this.dataset.action=`target-${f}`});let u=$('
');c.forEach(({uuid:f,template:g,save:m,applied:y={}})=>{let d=!!(m&&m.result&&m.basic),p=s.clone();u.append("
"),u.append(g),p.each((h,b)=>{b.dataset.rollIndex=h,b.dataset.targetUuid=f,b.classList.toggle("applied",!!y[h]||d&&m.result.success==="criticalSuccess"),d&&b.classList.add(m.result.success)}),u.append(p)}),a.after(u),ea(e,u,l),u.find("button[data-action^=target-]").on("click",f=>Ir(f,e))}o(Sr,"renderDamageChatMessage");function ea(e,t,n){t.find("[data-action=ping-target]").on("click",wr),t.find("[data-action=open-target-sheet]").on("click",Er),t.find("[data-action=roll-save]").on("click",a=>kr(a,e,n)),t.find("[data-action=reroll-save]").on("click",a=>Cr(a,e,n))}o(ea,"addHeaderListeners");async function ta(e){let t=C(e,"target.targets")??[],n=game.user.isGM||game.settings.get("pf2e","metagame_showDC"),a=(()=>{let s=C(e,"target.save");if(s)return{...s,...dr[s.statistic]}})();if(!t.length&&!a)return;if(a){let s=game.i18n.format("PF2E.SavingThrowWithName",{saveName:game.i18n.localize(a.label)}),i=n?w("target.chat.save.dcWithValue",{dc:a.dc}):"";a.tooltipLabel=`${s} ${i}`,a.tooltip=await renderTemplate(I("target/save-tooltip"),{check:a.tooltipLabel})}return{targets:(await Promise.all(t.map(async({token:s})=>{let i=await fromUuid(s);if(!i?.isOwner)return;let c=i.id,l=i.actor,u=a&&!!l?.saves[a.statistic],f=await(async()=>{if(!u)return;let m=C(e,`target.saves.${c}`);if(!m)return;let y=m.rerolled,d=u&&!y,p=game.i18n.localize(`PF2E.Check.Result.Degree.Check.${m.success}`),h=m.value-a.dc;return{...m,canReroll:d,tooltip:await renderTemplate(I("target/save-tooltip"),{i18n:T("target.chat.save"),check:a.tooltipLabel,result:w(`target.chat.save.result.${n?"withOffset":"withoutOffset"}`,{success:p,offset:h>=0?`+${h}`:h,die:` ${m.die}`}),modifiers:m.modifiers,canReroll:d,rerolled:st[y]})}})(),g=a&&{...a,result:f};return{uuid:s,target:i,save:g,applied:C(e,`target.applied.${c}`),template:await renderTemplate(I("target/row-header"),{name:i.name,uuid:s,save:u&&g,canReroll:f?.canReroll,rerolled:st[f?.rerolled]})}}))).filter(Boolean),save:a}}o(ta,"getMessageData");async function je(e){let{targetUuid:t}=e.currentTarget.closest("[data-target-uuid]").dataset;return fromUuid(t)}o(je,"getTargetFromEvent");async function Cr(e,t,{dc:n}){let a=await je(e),r=a?.actor;if(!r)return;let s=C(t,`target.saves.${a.id}`);if(!s?.roll||s.rerolled)return;let i=r.isOfType("character")?r.heroPoints.value:0,c=Object.entries(st).map(([b,{icon:k,reroll:P}])=>{if(b==="hero"&&!i)return;let R=game.i18n.localize(P);return``}).filter(Boolean).join(""),l={yes:{icon:'',label:"reroll",callback:b=>b.find("[name=reroll]:checked").val()??null},no:{icon:'',label:"cancel",callback:()=>null}},u=await Dialog.wait({title:`${a.name} - ${w("target.chat.save.reroll.confirm.title")}`,content:c,buttons:l,close:()=>null},{id:`pf2e-toolbelt-target-save-reroll-dialog-${a.id}`});if(!u)return;let f=u==="hero",g=f?"new":u;if(f){let{value:b,max:k}=r.heroPoints;if(b<1){D("target.chat.save.reroll.noPoints");return}await r.update({"system.resources.heroPoints.value":Math.clamped(b-1,0,k)})}let m=Roll.fromJSON(s.roll),y=m.clone();y.options.isReroll=!0,Hooks.callAll("pf2e.preReroll",Roll.fromJSON(s.roll),y,f,g);let d=await y.evaluate({async:!0});Hooks.callAll("pf2e.reroll",Roll.fromJSON(s.roll),d,f,g);let p=g==="higher"&&m.total>d.total||g==="lower"&&m.total{let f=t.item;if(f)return f;let g=C(t,"target.messageId");if(!g)return;let m=game.messages.get(g);if(m)return m.item})(),l=!game.user.settings.showCheckDialogs,u={type:"target.update-save",target:r.id};i.check.roll({dc:{value:n},item:c,origin:s,skipDialog:e.shiftKey?!l:l,createMessage:!1,callback:(f,g,m)=>{u.data={value:f.total,die:f.dice[0].total,success:f.degreeOfSuccess,roll:JSON.stringify(f.toJSON()),dosAdjustments:m.getFlag("pf2e","context.dosAdjustments"),modifiers:m.getFlag("pf2e","modifiers").filter(y=>y.enabled).map(({label:y,modifier:d})=>({label:y,modifier:d}))},game.user.isGM||t.isAuthor?(u.message=t,it(u)):(u.message=t.id,M(u))}})}o(kr,"rollSave");function it({message:e,target:t,data:n}){typeof e=="string"&&(e=game.messages.get(e),!e)||(typeof n.success=="number"&&(n.success=pr[n.success]),G(e,`target.saves.${t}`,deepClone(n)))}o(it,"updateMessageSave");async function Er(e){let t=await je(e);t&&t.actor?.sheet.render(!0)}o(Er,"openTargetSheet");async function wr(e){if(!canvas.ready)return;let t=await je(e);t&&canvas.ping(t.center)}o(wr,"pingTarget");async function Ir(e,t){let n=e.currentTarget,{rollIndex:a,targetUuid:r}=n.closest("[data-target-uuid]").dataset,s=await fromUuid(r);if(!s)return;let i=n.dataset.action;if(i==="target-shield-block"){Hn(s,n,t.element);return}rt(s,{message:t,multiplier:i==="target-apply-healing"?-1:i==="target-half-damage"?.5:i==="target-apply-damage"?1:i==="target-double-damage"?2:3,addend:0,promptModifier:e.shiftKey,rollIndex:Number(a)})}o(Ir,"onTargetButton");function Gn(e,t,n){let a={};fe(a,`target.applied.${t}.${n}`,!0);let r=C(e,"target.splashIndex");if(r!==void 0){let s=r===0?1:0;if(n===r)fe(a,`target.applied.${t}.${s}`,!0);else{fe(a,`target.applied.${t}.${r}`,!0);let i=C(e,"target.targets")??[];for(let c of i){let l=c.token?.split(".").at(-1);l!==t&&fe(a,`target.applied.${l}.${s}`,!0)}}}game.user.isGM||e.isAuthor?na({message:e,updates:a}):M({type:"target.update-applied",message:e.id,updates:a})}o(Gn,"onDamageApplied");function na({message:e,updates:t}){typeof e=="string"&&(e=game.messages.get(e),!e)||e.update(t)}o(na,"updateMessageApplied");var Se=null,z=null;function oa(){return{settings:[{name:"unided",type:String,default:"disabled",choices:["disabled","create","all"],onChange:aa}],conflicts:["pf2e-unided"],init:()=>{aa()}}}o(oa,"registerUnided");function aa(e){e??=v("unided"),e==="disabled"?(Se&&(Hooks.off("preCreateItem",Se),Se=null),z&&(Hooks.off("preUpdateItem",z),z=null)):(Se||(Se=Hooks.on("preCreateItem",Tr)),e==="all"&&!z?z=Hooks.on("preUpdateItem",Dr):e!=="all"&&z&&(Hooks.off("preUpdateItem",z),z=null))}o(aa,"setHooks");function Tr(e){!e.img||!e.isOfType("physical")||(e._source.system.identification.unidentified.img=e.img)}o(Tr,"preCreateItem");function Dr(e,t){!e.isOfType("physical")||!("img"in t)||setProperty(t,"system.identification.unidentified.img",t.img)}o(Dr,"preUpdateItem");var ae=T("macros.condition");async function ra(e){let t=o((f,g)=>{let m=f.find("[name=condition]"),{name:y,slug:d,img:p}=m.find(":selected").data();return{type:g,slug:d,img:p,name:f.find("[name=name]").val().trim()||ae("effect-name",{condition:y}),uuid:m.val(),badge:Number(f.find("[name=badge]").val()||1),unidentified:f.find("[name=unidentified]").prop("checked")}},"callback"),n={generate:{icon:'',label:ae("generate"),callback:f=>t(f,"generate")},add:{icon:'',label:ae("add"),callback:f=>t(f,"add")}},a=Array.from(game.pf2e.ConditionManager.conditions.values()),r=new Set(a.filter(f=>!!f.badge).map(f=>f.slug)),s=await renderTemplate(I("macros/condition"),{i18n:ae,conditions:Array.from(new Set(a.sort((f,g)=>f.name.localeCompare(g.name))))}),i=o(f=>{let{name:g,slug:m}=f.find("[name=condition] :selected").data();f.find("[name=name]").prop("placeholder",ae("effect-name",{condition:g}));let y=r.has(m),d=f.find("[name=badge]");d.prop("disabled",!y),y||d.val(1)},"setInputs"),c=await Dialog.wait({buttons:n,content:s,title:ae("title"),close:()=>null,render:f=>{i(f),f.find("[name=condition]").on("change",()=>i(f))}},{id:"pf2e-toolbelt-macros-condition",width:320});if(!c)return;let l={inMemoryOnly:!0,key:"GrantItem",uuid:c.uuid};c.badge>1&&r.has(c.slug)&&(l.alterations=[{mode:"override",property:"badge-value",value:c.badge}]);let u={name:c.name,type:"effect",img:c.img,system:{rules:[l],unidentified:c.unidentified}};c.type==="generate"||!e?await Item.create(u):await e.createEmbeddedDocuments("Item",[u])}o(ra,"permaConditionEffect");var Be=[dt(),fn(),It(),Yt(),oa(),tn(),ht(),On(),En(),Ot(),cn(),un(),Qn()],sa=new Set,ct=1,ft=null;Hooks.once("init",()=>{let e=we();game.settings.register(S,"settings-min-migration-version",{scope:"world",config:!1,key:"settings-min-migration-version",type:Number,default:0});let t=Be.flatMap(({settings:s=[]})=>s.map(i=>{let c=i.name;return i.choices&&(i.choices=i.choices.reduce((l,u)=>(l[u]=lt(c,`choices.${u}`),l),{})),i.key=c,i.scope??="world",i.config??=!0,i.name=lt(c,"name"),i.hint=lt(c,"hint"),i})),[n,a]=["world","client"].map(s=>t.filter(i=>i.scope===s));[n,a].forEach(s=>s.forEach(i=>game.settings.register(S,i.key,i))),e&&(ft=a[0].key,Hooks.on("renderSettingsConfig",Ar));let r=game.modules.get(S);r.api={macros:{permaConditionEffect:ra}},Be.forEach(s=>{let{init:i,conflicts:c=[],api:l,name:u}=s;if(e)for(let f of c){let g=game.modules.get(f);g?.active&&(s.conflicting=!0,sa.add(g.title))}l&&u&&(r.api[u]=l),!s.conflicting&&i&&i(e)})});Hooks.once("ready",()=>{let e=game.user.isGM;for(let{conflicting:n,ready:a}of Be)!n&&a&&a(e);if(!e)return;for(let n of sa)D("module-conflict",{name:n},!0);let t=v("settings-min-migration-version");t{n.forEach(({migrate:a,key:r})=>{if(!a)return;let s=v(r),i=s;for(let c=t+1;c<=ct;c++){let l=a[c];typeof l=="function"&&(i=l(i))}i!=null&&i!==s&&ce(r,i)})}),ce("settings-min-migration-version",ct))});function lt(e,t){return`${S}.settings.${e}.${t}`}o(lt,"settingPath");function Ar(e,t){if(!ft)return;t.find(`.tab[data-tab=${S}] [data-setting-id="${S}.${ft}"]`).before(`

${w("settings.client")}

`)}o(Ar,"renderSettingsConfig");})(); //# sourceMappingURL=main.js.map diff --git a/scripts/main.js.map b/scripts/main.js.map index 0289891..bda090d 100644 --- a/scripts/main.js.map +++ b/scripts/main.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../src/module.js", "../src/shared/libwrapper.js", "../src/shared/localize.js", "../src/shared/notification.js", "../src/shared/settings.js", "../src/features/arp.js", "../src/shared/hook.js", "../src/features/effects.js", "../src/apps/giveth/popup.js", "../src/shared/actor.js", "../src/shared/flags.js", "../src/shared/chat.js", "../src/shared/socket.js", "../src/shared/user.js", "../src/features/giveth.js", "../src/shared/path.js", "../src/apps/hero/trade.js", "../src/shared/misc.js", "../src/features/hero.js", "../src/apps/knowledges/lores.js", "../src/features/knowledges.js", "../src/apps/merge/multi.js", "../src/features/merge.js", "../src/features/modifiers.js", "../src/features/nobulk.js", "../src/features/share.js", "../src/shared/item.js", "../src/features/stances.js", "../src/features/summary.js", "../src/shared/pf2e.js", "../src/shared/template.js", "../src/features/target.js", "../src/features/unided.js", "../src/macros/condition.js", "../src/main.js"], - "sourcesContent": ["export const MODULE_ID = 'pf2e-toolbelt'\r\n\r\n", "import { MODULE_ID } from '../module'\r\n\r\nexport function registerWrapper(path, callback, type = 'WRAPPER') {\r\n return libWrapper.register(MODULE_ID, path, callback, type)\r\n}\r\n\r\nexport function unregisterWrapper(id) {\r\n libWrapper.unregister(MODULE_ID, id)\r\n}\r\n", "import { MODULE_ID } from '../module'\r\nimport { error, info, warn } from './notification'\r\n\r\nexport function localize(...args) {\r\n let [key, data] = args\r\n key = `${MODULE_ID}.${key}`\r\n if (data) return game.i18n.format(key, data)\r\n return game.i18n.localize(key)\r\n}\r\n\r\nexport function hasLocalization(key) {\r\n return game.i18n.has(`${MODULE_ID}.${key}`, false)\r\n}\r\n\r\nexport function localizePath(key) {\r\n return `${MODULE_ID}.${key}`\r\n}\r\n\r\nexport function subLocalize(subKey) {\r\n const fn = (...args) => localize(`${subKey}.${args[0]}`, args[1])\r\n\r\n Object.defineProperties(fn, {\r\n warn: {\r\n value: (...args) => warn(`${subKey}.${args[0]}`, args[1], args[2]),\r\n enumerable: false,\r\n configurable: false,\r\n },\r\n info: {\r\n value: (...args) => info(`${subKey}.${args[0]}`, args[1], args[2]),\r\n enumerable: false,\r\n configurable: false,\r\n },\r\n error: {\r\n value: (...args) => error(`${subKey}.${args[0]}`, args[1], args[2]),\r\n enumerable: false,\r\n configurable: false,\r\n },\r\n has: {\r\n value: key => hasLocalization(`${subKey}.${key}`),\r\n enumerable: false,\r\n configurable: false,\r\n },\r\n path: {\r\n value: key => localizePath(`${subKey}.${key}`),\r\n enumerable: false,\r\n configurable: false,\r\n },\r\n template: {\r\n value: (key, { hash }) => fn(key, hash),\r\n enumerable: false,\r\n configurable: false,\r\n },\r\n })\r\n\r\n return fn\r\n}\r\n", "import { localize } from './localize'\r\n\r\nfunction notify(str, arg1, arg2, arg3) {\r\n const type = typeof arg1 === 'string' ? arg1 : 'info'\r\n const data = typeof arg1 === 'object' ? arg1 : typeof arg2 === 'object' ? arg2 : undefined\r\n const permanent = typeof arg1 === 'boolean' ? arg1 : typeof arg2 === 'boolean' ? arg2 : arg3 ?? false\r\n\r\n ui.notifications.notify(localize(str, data), type, { permanent })\r\n}\r\n\r\nexport function warn(...args) {\r\n const [str, arg1, arg2] = args\r\n notify(str, 'warning', arg1, arg2)\r\n}\r\n\r\nexport function info(...args) {\r\n const [str, arg1, arg2] = args\r\n notify(str, 'info', arg1, arg2)\r\n}\r\n\r\nexport function error(...args) {\r\n const [str, arg1, arg2] = args\r\n notify(str, 'error', arg1, arg2)\r\n}\r\n", "import { MODULE_ID } from '../module'\r\n\r\nexport function getSetting(setting) {\r\n return game.settings.get(MODULE_ID, setting)\r\n}\r\n\r\nexport function setSetting(key, value) {\r\n return game.settings.set(MODULE_ID, key, value)\r\n}\r\n", "import { registerWrapper } from '../shared/libwrapper'\r\nimport { info } from '../shared/notification'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst PREPARE_WEAPON_DATA = 'CONFIG.PF2E.Item.documentClasses.weapon.prototype.prepareBaseData'\r\nconst PREPARE_WEAPON_DERIVED_DATA = 'CONFIG.PF2E.Item.documentClasses.weapon.prototype.prepareDerivedData'\r\n\r\nconst PREPARE_SHIELD_DATA = 'CONFIG.PF2E.Item.documentClasses.shield.prototype.prepareBaseData'\r\nconst PREPARE_SHIELD_DERIVED_DATA = 'CONFIG.PF2E.Item.documentClasses.shield.prototype.prepareDerivedData'\r\n\r\nconst PREPARE_ARMOR_DATA = 'CONFIG.PF2E.Item.documentClasses.armor.prototype.prepareBaseData'\r\nconst PREPARE_ARMOR_DERIVED_DATA = 'CONFIG.PF2E.Item.documentClasses.armor.prototype.prepareDerivedData'\r\n\r\nexport function registerArp() {\r\n return {\r\n settings: [\r\n {\r\n name: 'arp',\r\n type: Boolean,\r\n default: false,\r\n requiresReload: true,\r\n },\r\n ],\r\n conflicts: ['pf2e-arp'],\r\n init: () => {\r\n const setting = getSetting('arp')\r\n if (!setting) return\r\n\r\n registerWrapper(PREPARE_WEAPON_DATA, onPrepareWeaponData, 'WRAPPER')\r\n registerWrapper(PREPARE_WEAPON_DERIVED_DATA, onPrepareWeaponDerivedData, 'WRAPPER')\r\n\r\n registerWrapper(PREPARE_ARMOR_DATA, onPrepareArmorData, 'WRAPPER')\r\n registerWrapper(PREPARE_ARMOR_DERIVED_DATA, onPrepareArmorDerivedData, 'WRAPPER')\r\n\r\n // if (setting === 'with-shield') {\r\n // registerWrapper(PREPARE_SHIELD_DATA, onPrepareShieldData, 'WRAPPER')\r\n // registerWrapper(PREPARE_SHIELD_DERIVED_DATA, onPrepareShieldDerivedData, 'WRAPPER')\r\n // }\r\n },\r\n ready: isGM => {\r\n if (isGM && getSetting('arp') && game.settings.get('pf2e', 'automaticBonusVariant') !== 'noABP') {\r\n game.settings.set('pf2e', 'automaticBonusVariant', 'noABP')\r\n info('arp.forceVariant')\r\n }\r\n },\r\n }\r\n}\r\n\r\nfunction isValidActor(actor, isCharacter = false) {\r\n return actor && !actor.getFlag('pf2e', 'disableABP') && (!isCharacter || actor.isOfType('character'))\r\n}\r\n\r\n/**\r\n * weapon\r\n */\r\n\r\nconst WEAPON_POTENCY_PRICE = {\r\n 1: 35,\r\n 2: 935,\r\n 3: 8935,\r\n 4: 8935,\r\n}\r\n\r\nconst WEAPON_STRIKING_PRICE = {\r\n striking: 65,\r\n greaterStriking: 1065,\r\n majorStriking: 31065,\r\n}\r\n\r\nfunction isValidWeapon(weapon) {\r\n const traits = weapon._source.system.traits.value\r\n const group = weapon._source.system.group\r\n const category = weapon._source.system.category\r\n const slug = weapon._source.system.slug\r\n return (\r\n group !== 'shield' &&\r\n (slug === 'handwraps-of-mighty-blows' || category !== 'unarmed') &&\r\n !traits.includes('alchemical') &&\r\n !traits.includes('bomb')\r\n )\r\n}\r\n\r\nfunction onPrepareWeaponData(wrapped) {\r\n const actor = this.actor\r\n if (!isValidActor(actor, true) || !isValidWeapon(this)) return wrapped()\r\n\r\n const level = actor.level\r\n\r\n const traits = this._source.system.traits.value\r\n if (traits.includes('alchemical') && traits.includes('bomb')) return wrapped()\r\n\r\n this.system.potencyRune.value = level < 2 ? null : level < 10 ? 1 : level < 16 ? 2 : 3\r\n this.system.strikingRune.value = level < 4 ? null : level < 12 ? 'striking' : level < 19 ? 'greaterStriking' : 'majorStriking'\r\n\r\n wrapped()\r\n}\r\n\r\nfunction onPrepareWeaponDerivedData(wrapped) {\r\n wrapped()\r\n\r\n if (!isValidActor(this.actor) || this.isSpecific || !isValidWeapon(this)) return\r\n\r\n let coins = this.price.value.toObject()\r\n if (!coins.gp) return\r\n\r\n const potency = this.system.potencyRune.value\r\n if (potency) coins.gp -= WEAPON_POTENCY_PRICE[potency]\r\n\r\n const striking = this.system.strikingRune.value\r\n if (striking) coins.gp -= WEAPON_STRIKING_PRICE[striking]\r\n\r\n coins = new game.pf2e.Coins(coins)\r\n\r\n if ((potency || striking) && !this.system.runes.property.length) {\r\n coins = coins.add(this._source.system.price.value)\r\n }\r\n\r\n this.system.price.value = coins\r\n}\r\n\r\n/**\r\n * shield\r\n */\r\n\r\nconst SHIELD_REINFORCING = {\r\n 1: { price: 75, increase: 44 }, // level 4\r\n 2: { price: 300, increase: 52 }, // level 7\r\n 3: { price: 900, increase: 64 }, // level 10\r\n 4: { price: 2500, increase: 80 }, // level 13\r\n 5: { price: 8000, increase: 84 }, // level 16\r\n 6: { price: 32000, increase: 108 }, // level 19\r\n}\r\n\r\nfunction isValidShield(shield) {\r\n return true\r\n}\r\n\r\nfunction onPrepareShieldData(wrapped) {\r\n const actor = this.actor\r\n if (!isValidActor(actor, true) || !isValidShield(this)) return wrapped()\r\n\r\n const level = actor.level\r\n\r\n this.system.runes.reinforcing =\r\n level < 4 ? null : level < 7 ? 1 : level < 10 ? 2 : level < 13 ? 3 : level < 16 ? 4 : level < 19 ? 5 : 6\r\n\r\n wrapped()\r\n}\r\n\r\nfunction onPrepareShieldDerivedData(wrapped) {\r\n wrapped()\r\n\r\n if (!isValidActor(this.actor) || this.isSpecific || !isValidShield(this)) return\r\n\r\n let coins = this.price.value.toObject()\r\n if (!coins.gp) return\r\n\r\n const reinforcing = this.system.runes.reinforcing\r\n if (reinforcing) coins.gp -= SHIELD_REINFORCING[reinforcing].price\r\n\r\n coins = new game.pf2e.Coins(coins)\r\n\r\n this.system.price.value = coins\r\n}\r\n\r\n/**\r\n * amor\r\n */\r\n\r\nconst ARMOR_POTENCY_PRICE = {\r\n 1: 160,\r\n 2: 1060,\r\n 3: 20560,\r\n 4: 20560,\r\n}\r\n\r\nconst ARMOR_RESILIENCY_PRICE = {\r\n resilient: 340,\r\n greaterResilient: 3440,\r\n majorResilient: 49440,\r\n}\r\n\r\nfunction isValidArmor(armor) {\r\n return true\r\n}\r\n\r\nfunction onPrepareArmorData(wrapped) {\r\n const actor = this.actor\r\n if (!isValidActor(actor, true) || !isValidArmor(this)) return wrapped()\r\n\r\n const level = actor.level\r\n\r\n this.system.potencyRune.value = level < 5 ? null : level < 11 ? 1 : level < 18 ? 2 : 3\r\n this.system.resiliencyRune.value =\r\n level < 8 ? null : level < 14 ? 'resilient' : level < 20 ? 'greaterResilient' : 'majorResilient'\r\n\r\n wrapped()\r\n}\r\n\r\nfunction onPrepareArmorDerivedData(wrapped) {\r\n wrapped()\r\n\r\n if (!isValidActor(this.actor) || this.isSpecific || !isValidArmor(this)) return\r\n\r\n let coins = this.price.value.toObject()\r\n if (!coins.gp) return\r\n\r\n const potency = this.system.potencyRune.value\r\n if (potency) coins.gp -= ARMOR_POTENCY_PRICE[potency]\r\n\r\n const resiliency = this.system.resiliencyRune.value\r\n if (resiliency) coins.gp -= ARMOR_RESILIENCY_PRICE[resiliency]\r\n\r\n coins = new game.pf2e.Coins(coins)\r\n\r\n if ((potency || resiliency) && !this.system.runes.property.length) {\r\n coins = coins.add(this._source.system.price.value)\r\n }\r\n\r\n this.system.price.value = coins\r\n}\r\n", "import { getSetting } from './settings'\r\n\r\nexport function createHook(event, listener, callback = () => {}) {\r\n let HOOK = null\r\n\r\n return function (value, otherSettings = [], skipCallback = false) {\r\n if (typeof otherSettings === 'string') otherSettings = [otherSettings]\r\n\r\n value ||= otherSettings.some(s => getSetting(s))\r\n\r\n if (value && !HOOK) {\r\n HOOK = Hooks.on(event, listener)\r\n } else if (!value && HOOK) {\r\n Hooks.off(event, HOOK)\r\n HOOK = null\r\n }\r\n\r\n if (!skipCallback) callback(value)\r\n }\r\n}\r\n\r\nexport function createChoicesHook(event, listener, callback = () => {}) {\r\n let HOOK = null\r\n\r\n return function (value, skipCallback = false) {\r\n if (value === false) value = 'disabled'\r\n\r\n if (value === 'disabled' && HOOK) {\r\n Hooks.off(event, HOOK)\r\n HOOK = null\r\n } else if (value !== 'disabled' && !HOOK) {\r\n HOOK = Hooks.on(event, listener)\r\n }\r\n\r\n if (!skipCallback) callback(value)\r\n }\r\n}\r\n\r\nexport function registerUpstreamHook(hook, fn) {\r\n const id = Hooks.on(hook, fn)\r\n const index = Hooks.events[hook].findIndex(x => x.id === id)\r\n\r\n if (index !== 0) {\r\n const [hooked] = Hooks.events[hook].splice(index, 1)\r\n Hooks.events[hook].unshift(hooked)\r\n }\r\n\r\n return id\r\n}\r\n", "import { createHook } from '../shared/hook'\r\nimport { localize } from '../shared/localize'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst setHook = createHook('renderEffectsPanel', renderEffectsPanel, refreshEffectsPanel)\r\n\r\nexport function registerEffectsPanelHelper() {\r\n return {\r\n settings: [\r\n {\r\n name: 'effect-remove',\r\n type: Boolean,\r\n default: false,\r\n scope: 'client',\r\n onChange: value => setHook(value, 'condition-sheet'),\r\n },\r\n {\r\n name: 'condition-sheet',\r\n type: Boolean,\r\n default: false,\r\n scope: 'client',\r\n onChange: value => setHook(value, 'effect-remove'),\r\n },\r\n ],\r\n conflicts: ['pf2e-effect-description'],\r\n init: () => {\r\n setHook(false, ['effect-remove', 'condition-sheet'])\r\n },\r\n }\r\n}\r\n\r\nfunction refreshEffectsPanel() {\r\n game.pf2e.effectPanel?.render()\r\n}\r\n\r\nfunction renderEffectsPanel(panel, html) {\r\n const removeRow = `
${localize('effects.remove')}
`\r\n const editIcon = ``\r\n\r\n const effectPanels = html.find('.effect-item[data-item-id]').toArray()\r\n for (const effectPanel of effectPanels) {\r\n const id = effectPanel.dataset.itemId\r\n const effect = panel.actor?.items.get(id)\r\n if (!effect) continue\r\n\r\n if (getSetting('effect-remove') && !effect.isLocked && effect.badge && effect.badge.type === 'counter') {\r\n effectPanel.querySelector('.effect-info .instructions').insertAdjacentHTML('beforeend', removeRow)\r\n effectPanel.querySelector('.icon').addEventListener('contextmenu', event => onRemoveEffect(event, panel), true)\r\n }\r\n\r\n if (getSetting('condition-sheet') && effect.isOfType('condition')) {\r\n const h1 = effectPanel.querySelector('.effect-info > h1')\r\n h1.insertAdjacentHTML('beforeend', editIcon)\r\n h1.querySelector('[data-action=\"edit\"]').addEventListener('click', event => onConditionSheet(event, panel))\r\n }\r\n }\r\n}\r\n\r\nfunction onConditionSheet(event, panel) {\r\n const effect = getEffect(event, panel)\r\n if (!effect?.isOfType('condition')) return\r\n event.preventDefault()\r\n effect.sheet.render(true)\r\n}\r\n\r\nfunction onRemoveEffect(event, panel) {\r\n if (!event.shiftKey) return\r\n\r\n const effect = getEffect(event, panel)\r\n if (!effect || effect.isLocked || !effect.badge || effect.badge.type !== 'counter') return\r\n\r\n event.preventDefault()\r\n event.stopPropagation()\r\n event.stopImmediatePropagation()\r\n\r\n effect.delete()\r\n}\r\n\r\nfunction getEffect(event, panel) {\r\n const target = event.currentTarget\r\n const effect = target.closest('.effect-item[data-item-id]')\r\n const id = effect.dataset.itemId\r\n return panel.actor?.items.get(id)\r\n}\r\n", "export class MoveLootPopup extends FormApplication {\r\n constructor(object, options, callback) {\r\n super(object, options)\r\n this.onSubmitCallback = callback\r\n }\r\n\r\n async getData() {\r\n const [prompt, buttonLabel] = this.options.isPurchase\r\n ? ['PF2E.loot.PurchaseLootMessage', 'PF2E.loot.PurchaseLoot']\r\n : ['PF2E.loot.MoveLootMessage', 'PF2E.loot.MoveLoot']\r\n\r\n return {\r\n ...(await super.getData()),\r\n maxQuantity: this.options.maxQuantity,\r\n newStack: this.options.newStack,\r\n lockStack: this.options.lockStack,\r\n prompt,\r\n buttonLabel,\r\n }\r\n }\r\n\r\n static get defaultOptions() {\r\n return {\r\n ...super.defaultOptions,\r\n id: 'MoveLootPopup',\r\n classes: [],\r\n title: game.i18n.localize('PF2E.loot.MoveLootPopupTitle'),\r\n template: 'systems/pf2e/templates/popups/loot/move-loot-popup.hbs',\r\n width: 'auto',\r\n maxQuantity: 1,\r\n newStack: false,\r\n lockStack: false,\r\n isPurchase: false,\r\n }\r\n }\r\n\r\n async _updateObject(_event, formData) {\r\n this.onSubmitCallback(formData.quantity, formData.newStack)\r\n }\r\n}\r\n", "export function isPlayedActor(actor) {\r\n return actor && !actor.pack && actor.id && game.actors.has(actor.id)\r\n}\r\n", "import { MODULE_ID } from '../module'\r\n\r\nexport function getFlag(doc, key, fallback) {\r\n return doc.getFlag(MODULE_ID, key) ?? fallback\r\n}\r\n\r\nexport function setFlag(doc, key, value) {\r\n return doc.setFlag(MODULE_ID, key, value)\r\n}\r\n\r\nexport function unsetFlag(doc, key) {\r\n return doc.unsetFlag(MODULE_ID, key)\r\n}\r\n\r\nexport function containsFlag(doc, key) {\r\n return getProperty(doc, `flags.${MODULE_ID}.${key}`) !== undefined\r\n}\r\n\r\nexport function updateSourceFlag(doc, key, value) {\r\n return doc.updateSource({\r\n [`flags.${MODULE_ID}.${key}`]: value,\r\n })\r\n}\r\n\r\nexport function moduleFlagUpdate(update, key, value) {\r\n update[`flags.${MODULE_ID}.${key}`] = value\r\n}\r\n", "import { getFlag, updateSourceFlag } from './flags'\r\n\r\nexport function getChatMessageClass() {\r\n return CONFIG.ChatMessage.documentClass\r\n}\r\n\r\nexport function* latestChatMessages(nb, fromMessage) {\r\n const messages = game.messages.contents\r\n const start = (fromMessage ? messages.findLastIndex(m => m === fromMessage) : messages.length) - 1\r\n\r\n for (let i = start; i >= start - nb; i--) {\r\n const message = messages[i]\r\n if (!message) return\r\n yield message\r\n }\r\n}\r\n\r\nexport function chatUUID(uuid, label, fake = false) {\r\n if (fake) {\r\n return `${label}`\r\n } else {\r\n if (label) return `@UUID[${uuid}]{${label}}`\r\n return `@UUID[${uuid}]`\r\n }\r\n}\r\n\r\nexport function bindOnPreCreateSpellDamageChatMessage(originalMessage) {\r\n const messageId = originalMessage.id\r\n const save = getFlag(originalMessage, 'target.save')\r\n if (!save) return\r\n\r\n Hooks.once('preCreateChatMessage', message => {\r\n updateSourceFlag(message, 'target.messageId', messageId)\r\n updateSourceFlag(message, 'target.save', save)\r\n })\r\n}\r\n", "import { MODULE_ID } from '../module'\r\n\r\nexport function socketOn(callback) {\r\n game.socket.on(`module.${MODULE_ID}`, callback)\r\n}\r\n\r\nexport function socketOff(callback) {\r\n game.socket.off(`module.${MODULE_ID}`, callback)\r\n}\r\n\r\nexport function socketEmit(packet) {\r\n game.socket.emit(`module.${MODULE_ID}`, packet)\r\n}\r\n", "export function isActiveGM() {\r\n return game.user === game.users.activeGM\r\n}\r\n\r\nexport function isUserGM() {\r\n const user = game.data.users.find(x => x._id === game.data.userId)\r\n return user && user.role >= CONST.USER_ROLES.GAMEMASTER\r\n}\r\n\r\nexport function isGMOnline() {\r\n return game.users.some(user => user.active && user.isGM)\r\n}\r\n\r\nexport function getCharacterOwner(actor, connected = false) {\r\n if (connected) return game.users.find(x => x.active && x.character === actor)\r\n return game.users.find(x => x.character === actor)\r\n}\r\n\r\nexport function getActiveOwner(doc) {\r\n const activeOwners = game.users.filter(user => user.active && !user.isGM && doc.testUserPermission(user, 'OWNER'))\r\n activeOwners.sort((a, b) => (a.id > b.id ? 1 : -1))\r\n return activeOwners[0] || null\r\n}\r\n\r\nexport function isActiveOwner(doc) {\r\n return getActiveOwner(doc) === game.user\r\n}\r\n\r\nexport function getOwner(doc, connected = false) {\r\n if (connected) return game.users.find(x => x.active && doc.testUserPermission(x, 'OWNER'))\r\n return game.users.find(x => doc.testUserPermission(x, 'OWNER'))\r\n}\r\n", "import { MoveLootPopup } from '../apps/giveth/popup'\r\nimport { isPlayedActor } from '../shared/actor'\r\nimport { chatUUID } from '../shared/chat'\r\nimport { registerUpstreamHook } from '../shared/hook'\r\nimport { localize } from '../shared/localize'\r\nimport { warn } from '../shared/notification'\r\nimport { getSetting } from '../shared/settings'\r\nimport { socketOff, socketOn, socketEmit } from '../shared/socket'\r\nimport { isActiveGM, isGMOnline } from '../shared/user'\r\n\r\nlet enabled = false\r\nlet CANVAS_HOOK = null\r\n\r\nexport function registerGiveth() {\r\n return {\r\n settings: [\r\n {\r\n name: 'giveth',\r\n type: String,\r\n default: 'disabled',\r\n choices: ['disabled', 'enabled', 'no-message'],\r\n onChange: setup,\r\n },\r\n ],\r\n conflicts: ['pf2e-giveth'],\r\n ready: isGM => {\r\n if (getSetting('giveth') !== 'disabled') setup(true)\r\n },\r\n }\r\n}\r\n\r\nfunction setup(value) {\r\n const isGM = game.user.isGM\r\n\r\n if (value === 'disabled' && enabled) {\r\n if (isGM) socketOff(onSocket)\r\n else if (CANVAS_HOOK) {\r\n Hooks.off('dropCanvasData', CANVAS_HOOK)\r\n CANVAS_HOOK = null\r\n }\r\n enabled = false\r\n } else if (value !== 'disabled' && !enabled) {\r\n if (isGM) socketOn(onSocket)\r\n else if (!CANVAS_HOOK) CANVAS_HOOK = registerUpstreamHook('dropCanvasData', onDropCanvasData)\r\n enabled = true\r\n }\r\n}\r\n\r\nfunction onSocket(packet) {\r\n if (!isActiveGM()) return\r\n if (packet.type === 'giveth-condition') takethCondition(packet)\r\n else if (packet.type === 'giveth-effect') takethEffect(packet)\r\n else takethPhysical(packet)\r\n}\r\n\r\nfunction onDropCanvasData(canvas, data) {\r\n if (!isGMOnline()) return true\r\n\r\n const details = getDetailsFromData(data)\r\n if (!details) return true\r\n\r\n const target = canvas.tokens.placeables\r\n .slice()\r\n .filter(token => {\r\n if (!token.document.actorLink) return false\r\n const target = token.actor\r\n if (!isValidActor(target, data.actorId) || target.isOwner) return false\r\n const maximumX = token.x + (token.hitArea?.right ?? 0)\r\n const maximumY = token.y + (token.hitArea?.bottom ?? 0)\r\n return data.x >= token.x && data.y >= token.y && data.x <= maximumX && data.y <= maximumY\r\n })\r\n .sort((a, b) => b.document.sort - a.document.sort)\r\n .at(0)?.actor\r\n\r\n if (!target) return true\r\n\r\n giveth(details.actor, target, details.item, details.value)\r\n return false\r\n}\r\n\r\nfunction giveth(origin, target, item, value) {\r\n const ownerId = origin.id\r\n const targetId = target.id\r\n const isIndex = !(item instanceof Item)\r\n\r\n if (!isIndex && item.isOfType('physical')) {\r\n const qty = item.quantity\r\n if (qty < 1) return warn('giveth.notification.zero')\r\n\r\n if (qty === 1) return sendPhysicalRequest(ownerId, targetId, item.id, 1, false)\r\n\r\n new MoveLootPopup(origin, { maxQuantity: qty, lockStack: false, isPurchase: false }, (qty, stack) => {\r\n sendPhysicalRequest(ownerId, targetId, item.id, qty, stack)\r\n }).render(true)\r\n } else {\r\n const uuid = isIndex ? `Compendium.${item.pack}.${item._id}` : item.uuid\r\n if (item.type === 'condition') {\r\n socketEmit({\r\n type: 'giveth-condition',\r\n targetId,\r\n value: value ?? 1,\r\n uuid,\r\n })\r\n } else {\r\n socketEmit({\r\n type: 'giveth-effect',\r\n targetId,\r\n uuid,\r\n })\r\n }\r\n }\r\n}\r\n\r\nfunction sendPhysicalRequest(ownerId, targetId, itemId, qty, stack) {\r\n socketEmit({\r\n type: 'giveth-physical',\r\n ownerId,\r\n targetId,\r\n itemId,\r\n qty,\r\n stack,\r\n })\r\n}\r\n\r\nfunction isValidActor(actor, id) {\r\n if (!isPlayedActor(actor) || (id && actor.id === id)) return false\r\n return actor.hasPlayerOwner && !actor.isToken && actor.isOfType('character', 'npc', 'vehicle')\r\n}\r\n\r\nfunction getDetailsFromData(data) {\r\n if (data.tokenId || data.type !== 'Item' || !data.uuid) return\r\n\r\n const item = fromUuidSync(data.uuid)\r\n if (!item) return\r\n\r\n let actor = item.actor\r\n if (!actor) {\r\n const actorUUID = data.context?.origin.actor\r\n actor = actorUUID ? fromUuidSync(actorUUID) : null\r\n }\r\n\r\n if (!isValidActor(actor) || !actor.isOwner) return\r\n\r\n const isIndex = !(item instanceof Item)\r\n if (isIndex && item.pack && ['effect', 'condition'].includes(item.type)) return { actor, item, value: data.value }\r\n if (!isIndex && item.isOfType('physical', 'effect')) return { actor, item, value: data.value }\r\n}\r\n\r\nasync function takethCondition({ targetId, uuid, value }) {\r\n const target = game.actors.get(targetId)\r\n if (!target) return\r\n\r\n const item = await fromUuid(uuid)\r\n if (!item) return\r\n\r\n target.increaseCondition(item.slug, { min: value })\r\n}\r\n\r\nasync function takethEffect({ targetId, uuid }) {\r\n const target = game.actors.get(targetId)\r\n if (!target) return\r\n\r\n const item = await fromUuid(uuid)\r\n if (!item) return\r\n\r\n const source = item.clone({ 'system.tokenIcon.show': true, 'system.unidentified': false }).toObject()\r\n target.createEmbeddedDocuments('Item', [source])\r\n}\r\n\r\nasync function takethPhysical({ itemId, ownerId, qty, stack, targetId }) {\r\n const owner = game.actors.get(ownerId)\r\n const target = game.actors.get(targetId)\r\n if (!owner || !target) return\r\n\r\n const item = owner.items.get(itemId)\r\n if (!item) return\r\n\r\n qty = Math.min(qty, item.quantity)\r\n const newQty = item.quantity - qty\r\n\r\n const source = item.toObject()\r\n source.system.quantity = qty\r\n source.system.equipped.carryType = 'worn'\r\n if (item.isOfType('physical') && 'invested' in source.system.equipped) {\r\n source.system.equipped.invested = item.traits.has('invested') ? false : null\r\n }\r\n\r\n const newItem = await target.addToInventory(source, undefined, stack)\r\n if (!newItem) return\r\n\r\n if (newQty < 1) item.delete()\r\n else item.update({ 'system.quantity': newQty })\r\n\r\n if (getSetting('giveth') === 'no-message') return\r\n\r\n let content = chatUUID(newItem.uuid, newItem.name, !newItem.isIdentified)\r\n if (qty > 1) content += ` x${qty}`\r\n\r\n ChatMessage.create({\r\n flavor: `

${localize('giveth.giveth', { target: target.name })}

`,\r\n content,\r\n speaker: ChatMessage.getSpeaker({ actor: owner }),\r\n })\r\n}\r\n", "import { MODULE_ID } from '../module'\r\n\r\nexport function templatePath(...path) {\r\n path = path.filter(x => typeof x === 'string')\r\n return `modules/${MODULE_ID}/templates/${path.join('/')}.hbs`\r\n}\r\n", "import { getHeroActions, sendTradeRequest } from '../../features/hero'\r\nimport { subLocalize } from '../../shared/localize'\r\nimport { templatePath } from '../../shared/path'\r\nimport { getCharacterOwner, getOwner } from '../../shared/user'\r\n\r\nconst localize = subLocalize('hero.templates.trade')\r\n\r\nexport class Trade extends Application {\r\n constructor(actor) {\r\n super({ id: `pf2e-hero-actions-trade-${actor.id}` })\r\n this._actor = actor\r\n }\r\n\r\n static get defaultOptions() {\r\n return mergeObject(super.defaultOptions, {\r\n title: localize('title'),\r\n template: templatePath('hero/trade'),\r\n width: 600,\r\n height: 'auto',\r\n })\r\n }\r\n\r\n get actor() {\r\n return this._actor\r\n }\r\n\r\n get target() {\r\n return this._target\r\n }\r\n\r\n set target(value) {\r\n if (!value) {\r\n localize.error('no-target')\r\n return\r\n }\r\n if (value === this._target) return\r\n delete this.target?.apps?.[this.appId]\r\n this._target = value\r\n this.render()\r\n }\r\n\r\n getData(options) {\r\n return mergeObject(super.getData(), {\r\n actor: this.actor,\r\n target: this.target,\r\n targets: game.actors.filter(x => x.type === 'character' && x.id !== this.actor.id && x.hasPlayerOwner),\r\n actions: getHeroActions(this.actor),\r\n targetActions: this.target ? getHeroActions(this.target) : [],\r\n i18n: localize,\r\n })\r\n }\r\n\r\n activateListeners(html) {\r\n super.activateListeners(html)\r\n html.find('select[name=\"target\"]').on('change', this.#onChangeTarget.bind(this))\r\n html.find('[data-action=\"description\"]').on('click', this.#onDescription.bind(this))\r\n html.find('[data-action=\"trade\"]').on('click', this.#onSendTrade.bind(this))\r\n html.find('[data-action=\"cancel\"]').on('click', () => this.close())\r\n }\r\n\r\n render(force, options) {\r\n this.actor.apps[this.appId] = this\r\n if (this.target) this.target.apps[this.appId] = this\r\n return super.render(force, options)\r\n }\r\n\r\n async close(options) {\r\n await super.close(options)\r\n delete this.actor.apps?.[this.appId]\r\n delete this.target?.apps?.[this.appId]\r\n }\r\n\r\n #onSendTrade() {\r\n if (!this.target) {\r\n localize.warn('no-target')\r\n return\r\n }\r\n\r\n const action = this.element.find('[name=\"action\"]:checked').val()\r\n const target = this.element.find('[name=\"targetAction\"]:checked').val()\r\n\r\n if (typeof action !== 'string' || typeof target !== 'string') {\r\n localize.warn('no-select')\r\n return\r\n }\r\n\r\n let user = getCharacterOwner(this.target, true) ?? getOwner(this.target, true) ?? game.users.activeGM\r\n if (!user) {\r\n localize.warn('no-user')\r\n return\r\n }\r\n\r\n sendTradeRequest({\r\n sender: {\r\n id: game.user.id,\r\n cid: this.actor.id,\r\n uuid: action,\r\n },\r\n receiver: {\r\n id: user.id,\r\n cid: this.target.id,\r\n uuid: target,\r\n },\r\n })\r\n\r\n this.close()\r\n }\r\n\r\n async #onDescription(event) {\r\n const uuid = $(event.currentTarget).siblings('input').val()\r\n const entry = await fromUuid(uuid)\r\n entry?.sheet.render(true)\r\n }\r\n\r\n #onChangeTarget(event) {\r\n const id = event.currentTarget.value\r\n this.target = game.actors.get(id)\r\n }\r\n}\r\n", "import { MODULE_ID } from '../module'\r\n\r\nexport function localeCompare(a, b) {\r\n return a.localeCompare(b, game.i18n.lang)\r\n}\r\n\r\nexport function refreshCharacterSheets(actor) {\r\n for (const win of Object.values(ui.windows)) {\r\n const winActor = win.actor\r\n if (!(win instanceof ActorSheet) || !winActor.isOfType('character')) continue\r\n if (!actor || actor === winActor) win.render()\r\n }\r\n}\r\n\r\nexport function compareArrays(arr1, arr2) {\r\n if (arr1.length !== arr2.length) return false\r\n\r\n const clonedArr2 = arr2.slice()\r\n\r\n for (const arr1Value of arr1) {\r\n const index = clonedArr2.findIndex(arr2Value => arr1Value === arr2Value)\r\n if (index === -1) return false\r\n clonedArr2.splice(index, 1)\r\n }\r\n\r\n return true\r\n}\r\n\r\nexport function ordinalString(value) {\r\n const pluralRules = new Intl.PluralRules(game.i18n.lang, { type: 'ordinal' })\r\n const suffix = game.i18n.localize(`PF2E.OrdinalSuffixes.${pluralRules.select(value)}`)\r\n return game.i18n.format('PF2E.OrdinalNumber', { value, suffix })\r\n}\r\n\r\nexport function isInstanceOf(obj, name) {\r\n if (typeof obj !== 'object') return false\r\n\r\n while ((obj = Reflect.getPrototypeOf(obj))) {\r\n if (obj.constructor.name === name) return true\r\n }\r\n\r\n return false\r\n}\r\n\r\nexport function setInMemory(doc, key, value) {\r\n return setProperty(doc, `modules.${MODULE_ID}.${key}`, value)\r\n}\r\n\r\nexport function getInMemory(doc, key) {\r\n return getProperty(doc, `modules.${MODULE_ID}.${key}`)\r\n}\r\n\r\nexport function deleteInMemory(doc, key) {\r\n const split = `modules.${MODULE_ID}.${key}`.split('.')\r\n const last = split.pop()\r\n let cursor = doc\r\n for (const key of split) {\r\n cursor = cursor[key]\r\n if (!cursor) return true\r\n }\r\n return delete cursor[last]\r\n}\r\n", "import { Trade } from '../apps/hero/trade'\r\nimport { isPlayedActor } from '../shared/actor'\r\nimport { chatUUID } from '../shared/chat'\r\nimport { createHook } from '../shared/hook'\r\nimport { localize, subLocalize } from '../shared/localize'\r\nimport { refreshCharacterSheets } from '../shared/misc'\r\nimport { error, warn } from '../shared/notification'\r\nimport { templatePath } from '../shared/path'\r\nimport { getSetting, setSetting } from '../shared/settings'\r\nimport { socketEmit, socketOff, socketOn } from '../shared/socket'\r\nimport { isActiveGM } from '../shared/user'\r\n\r\nconst MODULE_ID = 'pf2e-hero-actions'\r\n\r\nconst setHook = createHook('renderCharacterSheetPF2e', renderCharacterSheetPF2e, setupSocket)\r\n\r\nconst JOURNAL_UUID = 'Compendium.pf2e.journals.JournalEntry.BSp4LUSaOmUyjBko'\r\nconst TABLE_UUID = 'Compendium.pf2e.rollable-tables.RollTable.zgZoI7h0XjjJrrNK'\r\n\r\nconst TABLE_ICON = 'systems/pf2e/icons/features/feats/heroic-recovery.webp'\r\n\r\nlet SOCKET = false\r\n\r\nexport function registerHeroActions() {\r\n return {\r\n name: 'heroActions',\r\n settings: [\r\n {\r\n name: 'hero',\r\n type: Boolean,\r\n default: false,\r\n onChange: value => setHook(value),\r\n },\r\n {\r\n name: 'hero-table',\r\n type: String,\r\n default: '',\r\n },\r\n {\r\n name: 'hero-trade',\r\n type: Boolean,\r\n default: false,\r\n onChange: () => refreshCharacterSheets(),\r\n },\r\n {\r\n name: 'hero-private',\r\n type: Boolean,\r\n default: false,\r\n },\r\n ],\r\n conflicts: [MODULE_ID],\r\n api: {\r\n createTable,\r\n removeHeroActions,\r\n getHeroActions,\r\n useHeroAction,\r\n getHeroActionDetails,\r\n drawHeroAction,\r\n drawHeroActions,\r\n sendActionToChat,\r\n discardHeroActions,\r\n tradeHeroAction,\r\n getDeckTable,\r\n giveHeroActions,\r\n createChatMessage,\r\n },\r\n ready: () => {\r\n setHook(false, 'hero')\r\n },\r\n }\r\n}\r\n\r\nfunction setupSocket(value) {\r\n if (value && !SOCKET) {\r\n socketOn(onSocket)\r\n SOCKET = true\r\n } else if (!value && SOCKET) {\r\n socketOff(onSocket)\r\n SOCKET = false\r\n }\r\n}\r\n\r\nfunction onSocket(packet) {\r\n switch (packet.type) {\r\n case 'hero.trade-reject':\r\n if (packet.sender.id !== game.user.id) return\r\n onTradeRejected(packet)\r\n break\r\n case 'hero.trade-accept':\r\n if (!isActiveGM()) return\r\n onTradeAccepted(packet)\r\n break\r\n case 'hero.trade-request':\r\n if (packet.receiver.id !== game.user.id) return\r\n onTradeRequest(packet)\r\n break\r\n case 'hero.trade-error':\r\n if (!packet.users.includes(game.user.id)) return\r\n onTradeError(packet.error)\r\n break\r\n }\r\n}\r\n\r\nasync function renderCharacterSheetPF2e(sheet, html) {\r\n const actor = sheet.actor\r\n if (!isPlayedActor(actor)) return\r\n\r\n await addActionsToSheet(html, actor)\r\n addSheetEvents(html, actor)\r\n}\r\n\r\nasync function addActionsToSheet(html, actor) {\r\n const actions = getHeroActions(actor)\r\n const diff = actor.heroPoints.value - actions.length\r\n const isOwner = actor.isOwner\r\n const localize = subLocalize('hero.templates.heroActions')\r\n\r\n const template = await renderTemplate(templatePath('hero/sheet'), {\r\n owner: isOwner,\r\n list: actions,\r\n canUse: diff >= 0 && isOwner,\r\n canDraw: diff > 0 && isOwner,\r\n canTrade: getSetting('hero-trade'),\r\n mustDiscard: diff < 0,\r\n diff: Math.abs(diff),\r\n i18n: (key, { hash }) => localize(key, hash),\r\n })\r\n\r\n html.find(\r\n '.sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] > .strikes-list:not(.skill-action-list)'\r\n )\r\n .first()\r\n .after(template)\r\n}\r\n\r\nfunction addSheetEvents(html, actor) {\r\n const list = html.find('.tab.actions .heroActions-list')\r\n list.find('[data-action=draw]').on('click', event => onClickHeroActionsDraw(actor, event))\r\n list.find('[data-action=expand]').on('click', onClickHeroActionExpand)\r\n list.find('[data-action=use]').on('click', event => onClickHeroActionUse(actor, event))\r\n list.find('[data-action=display]').on('click', event => onClickHeroActionDisplay(actor, event))\r\n list.find('[data-action=discard]').on('click', onClickHeroActionDiscard)\r\n list.find('[data-action=discard-selected]').on('click', () => onClickHeroActionsDiscard(actor, html))\r\n html.find('[data-action=hero-actions-trade]').on('click', () => tradeHeroAction(actor))\r\n}\r\n\r\nasync function onClickHeroActionsDiscard(actor, html) {\r\n const discarded = html.find('.tab.actions .heroActions-list .action.discarded')\r\n const uuids = discarded.toArray().map(x => x.dataset.uuid)\r\n discardHeroActions(actor, uuids)\r\n}\r\n\r\nfunction onClickHeroActionDiscard(event) {\r\n event.preventDefault()\r\n\r\n const action = $(event.currentTarget).closest('.action')\r\n const list = action.closest('.heroActions-list')\r\n\r\n action.toggleClass('discarded')\r\n\r\n const toDiscard = Number(list.attr('data-discard') ?? '0')\r\n const $discarded = list.find('.action.discarded')\r\n\r\n list.toggleClass('discardable', $discarded.length === toDiscard)\r\n}\r\n\r\nasync function onClickHeroActionDisplay(actor, event) {\r\n event.preventDefault()\r\n const uuid = $(event.currentTarget).closest('.action').attr('data-uuid')\r\n sendActionToChat(actor, uuid)\r\n}\r\n\r\nasync function onClickHeroActionUse(actor, event) {\r\n event.preventDefault()\r\n const uuid = $(event.currentTarget).closest('.action').attr('data-uuid')\r\n useHeroAction(actor, uuid)\r\n}\r\n\r\nasync function onClickHeroActionsDraw(actor, event) {\r\n event.preventDefault()\r\n drawHeroActions(actor)\r\n}\r\n\r\nexport function getHeroActions(actor) {\r\n return getProperty(actor, `flags.${MODULE_ID}.heroActions`) ?? []\r\n}\r\n\r\nasync function setHeroActions(actor, actions) {\r\n return actor.update({ [`flags.${MODULE_ID}.heroActions`]: actions })\r\n}\r\n\r\nasync function onClickHeroActionExpand(event) {\r\n event.preventDefault()\r\n\r\n const action = $(event.currentTarget).closest('.action')\r\n const summary = action.find('.item-summary')\r\n\r\n if (!summary.hasClass('loaded')) {\r\n const uuid = action.attr('data-uuid')\r\n const details = await getHeroActionDetails(uuid)\r\n if (!details) return\r\n\r\n const text = await TextEditor.enrichHTML(details.description, { async: true })\r\n\r\n summary.find('.item-description').html(text)\r\n summary.addClass('loaded')\r\n }\r\n\r\n action.toggleClass('expanded')\r\n}\r\n\r\nasync function getHeroActionDetails(uuid) {\r\n let document = await fromUuid(uuid)\r\n if (!document) return undefined\r\n\r\n const parent = document instanceof JournalEntry ? document : document.parent\r\n const page = document instanceof JournalEntry ? document.pages.contents[0] : document\r\n\r\n let text = page?.text.content\r\n if (!text) return undefined\r\n\r\n if (parent.uuid === JOURNAL_UUID) text = text.replace(/^

/, '

Trigger ')\r\n return { name: page.name, description: text }\r\n}\r\n\r\nexport async function drawHeroActions(actor) {\r\n if (!actor?.isOfType('character')) {\r\n warn('hero.onlyCharacter')\r\n return\r\n }\r\n\r\n const actions = getHeroActions(actor)\r\n const nb = actor.heroPoints.value - actions.length\r\n\r\n const drawn = []\r\n for (let i = 0; i < nb; i++) {\r\n const action = await drawHeroAction()\r\n\r\n if (action === undefined) continue\r\n else if (action === null) return\r\n\r\n actions.push(action)\r\n drawn.push(action)\r\n }\r\n\r\n if (!drawn.length) return\r\n\r\n setHeroActions(actor, actions)\r\n createChatMessage({ actor, actions: drawn, label: nb => localize('hero.actions-draw.header', { nb }), secret: true })\r\n}\r\n\r\nfunction createChatMessage({ actor, actions, label, secret = false }) {\r\n const { content, size } = chatActions(actions)\r\n\r\n label = typeof label === 'function' ? label(size) : label\r\n\r\n const data = {\r\n flavor: `

${label}

`,\r\n content,\r\n speaker: ChatMessage.getSpeaker({ actor: actor }),\r\n }\r\n\r\n if (secret && getSetting('hero-private')) {\r\n data.type = CONST.CHAT_MESSAGE_TYPES.ROLL\r\n data.rollMode = CONST.DICE_ROLL_MODES.PRIVATE\r\n }\r\n\r\n ChatMessage.create(data)\r\n}\r\n\r\nfunction chatActions(actions) {\r\n const links = actions.map(({ uuid, name }) => chatUUID(uuid, name))\r\n return {\r\n content: links.map(x => `
${x}
`).join(''),\r\n size: links.length,\r\n }\r\n}\r\n\r\nfunction tradeHeroAction(actor) {\r\n if (!actor?.isOfType('character')) {\r\n warn('hero.onlyCharacter')\r\n return\r\n }\r\n\r\n const actions = getHeroActions(actor)\r\n if (!actions || !actions.length) {\r\n warn('hero.no-action')\r\n return\r\n }\r\n\r\n const diff = actions.length - actor.heroPoints.value\r\n if (diff > 0) {\r\n warn('hero.no-points', { nb: diff.toString() })\r\n return\r\n }\r\n\r\n new Trade(actor).render(true)\r\n}\r\n\r\nasync function drawHeroAction() {\r\n const table = await getDeckTable()\r\n const localize = subLocalize('hero.table')\r\n\r\n if (!table) {\r\n localize.error('drawError', true)\r\n return null\r\n }\r\n\r\n if (!table.formula) {\r\n if (game.user.isGM) {\r\n if (table.compendium) {\r\n localize.error('noFormulaCompendium', true)\r\n return null\r\n }\r\n await table.normalize()\r\n } else {\r\n localize.error('noFormula', true)\r\n return null\r\n }\r\n }\r\n\r\n if (table.replacement === false) {\r\n const notDrawn = table.results.some(r => !r.drawn)\r\n if (!notDrawn) await table.resetResults()\r\n }\r\n\r\n const draw = (await table.draw({ displayChat: false })).results[0]\r\n if (!draw) return\r\n\r\n const uuid = documentUuidFromTableResult(draw)\r\n if (uuid) return { uuid, name: await getLabelfromTableResult(draw, uuid) }\r\n}\r\n\r\nasync function useHeroAction(actor, uuid) {\r\n if (!actor?.isOfType('character')) {\r\n warn('hero.onlyCharacter')\r\n return\r\n }\r\n\r\n const points = actor.heroPoints.value\r\n if (points < 1) return warn('hero.use.noPoints')\r\n\r\n const actions = getHeroActions(actor)\r\n\r\n const index = actions.findIndex(x => x.uuid === uuid)\r\n if (index === -1) return\r\n\r\n const details = await getHeroActionDetails(uuid)\r\n if (!details) error('hero.use.noDetails')\r\n\r\n actions.splice(index, 1)\r\n\r\n if (details) {\r\n actor.update({\r\n ['system.resources.heroPoints.value']: points - 1,\r\n [`flags.${MODULE_ID}.heroActions`]: actions,\r\n })\r\n\r\n ChatMessage.create({\r\n flavor: `

${localize('hero.actions-use.header')}

`,\r\n content: `

${details.name}

${details.description}`,\r\n speaker: ChatMessage.getSpeaker({ actor }),\r\n })\r\n } else {\r\n setHeroActions(actor, actions)\r\n }\r\n}\r\n\r\nasync function discardHeroActions(actor, uuids) {\r\n if (!actor?.isOfType('character')) {\r\n warn('hero.onlyCharacter')\r\n return\r\n }\r\n\r\n uuids = typeof uuids === 'string' ? [uuids] : uuids\r\n\r\n const actions = getHeroActions(actor)\r\n const removed = []\r\n\r\n for (const uuid of uuids) {\r\n const index = actions.findIndex(x => x.uuid === uuid)\r\n if (index === -1) continue\r\n removed.push(actions[index])\r\n actions.splice(index, 1)\r\n }\r\n\r\n setHeroActions(actor, actions)\r\n createChatMessage({ actor, actions: removed, label: nb => localize('hero.actions-discard.header', { nb }) })\r\n}\r\n\r\nasync function getLabelfromTableResult(result, uuid) {\r\n if (result.type !== CONST.TABLE_RESULT_TYPES.TEXT) return result.text\r\n const label = /@UUID\\[[\\w\\.]+\\]{([\\w -]+)}/.exec(result.text)?.[1]\r\n return label ?? (uuid && (await fromUuid(uuid))?.name)\r\n}\r\n\r\nasync function getTableFromUuid(uuid) {\r\n if (!uuid) return undefined\r\n const table = await fromUuid(uuid)\r\n return table && table instanceof RollTable ? table : undefined\r\n}\r\n\r\nasync function getDefaultCompendiumTable() {\r\n return getTableFromUuid(TABLE_UUID)\r\n}\r\n\r\nfunction getDefaultWorldTable() {\r\n return game.tables.find(x => x.getFlag('core', 'sourceId') === TABLE_UUID)\r\n}\r\n\r\nasync function getCustomTable() {\r\n return getTableFromUuid(getSetting('hero-table'))\r\n}\r\n\r\nasync function getDeckTable() {\r\n return (await getCustomTable()) ?? getDefaultWorldTable() ?? (await getDefaultCompendiumTable())\r\n}\r\n\r\nasync function sendActionToChat(actor, uuid) {\r\n const details = await getHeroActionDetails(uuid)\r\n if (!details) return error('hero.details.missing')\r\n\r\n ChatMessage.create({\r\n content: `

${details.name}

${details.description}`,\r\n speaker: ChatMessage.getSpeaker({ actor: actor }),\r\n })\r\n}\r\n\r\nexport function sendTradeRequest(trade) {\r\n if (trade.receiver.id === game.user.id) {\r\n acceptRequest(trade)\r\n return\r\n }\r\n\r\n socketEmit({\r\n ...trade,\r\n type: 'hero.trade-request',\r\n })\r\n}\r\n\r\nfunction acceptRequest(trade) {\r\n if (game.user.isGM) {\r\n onTradeAccepted(trade)\r\n return\r\n }\r\n\r\n socketEmit({\r\n ...trade,\r\n type: 'hero.trade-accept',\r\n })\r\n}\r\n\r\nasync function onTradeAccepted(trade) {\r\n const { sender, receiver } = trade\r\n const senderActor = game.actors.get(sender.cid)\r\n const receiverActor = game.actors.get(receiver.cid)\r\n\r\n if (!senderActor || !receiverActor) {\r\n sendTradeError(trade)\r\n return\r\n }\r\n\r\n const senderActions = getHeroActions(senderActor)\r\n const receiverActions = getHeroActions(receiverActor)\r\n\r\n const senderActionIndex = senderActions.findIndex(x => x.uuid === sender.uuid)\r\n const receiverActionIndex = receiverActions.findIndex(x => x.uuid === receiver.uuid)\r\n\r\n if (senderActionIndex === -1 || receiverActionIndex === -1) {\r\n sendTradeError(trade)\r\n return\r\n }\r\n\r\n const senderAction = senderActions.splice(senderActionIndex, 1)[0]\r\n const receiverAction = receiverActions.splice(receiverActionIndex, 1)[0]\r\n\r\n senderActions.push(receiverAction)\r\n receiverActions.push(senderAction)\r\n\r\n setHeroActions(senderActor, senderActions)\r\n setHeroActions(receiverActor, receiverActions)\r\n\r\n const sentLink = chatUUID(senderAction.uuid)\r\n const receivedLink = chatUUID(receiverAction.uuid)\r\n\r\n const localize = subLocalize('hero.trade-success')\r\n\r\n let content = `
${localize('offer', { offer: sentLink })}
`\r\n content += `
${localize('receive', { receive: receivedLink })}
`\r\n\r\n ChatMessage.create({\r\n flavor: `

${localize('header', { name: receiverActor.name })}

`,\r\n content,\r\n speaker: ChatMessage.getSpeaker({ actor: senderActor }),\r\n })\r\n}\r\n\r\nfunction sendTradeError({ sender, receiver }, error = 'trade-error') {\r\n const users = new Set([sender.id, receiver.id])\r\n\r\n if (users.has(game.user.id)) {\r\n users.delete(game.user.id)\r\n onTradeError(error)\r\n }\r\n\r\n if (!users.size) return\r\n\r\n socketEmit({\r\n type: 'hero.trade-error',\r\n users: Array.from(users),\r\n error,\r\n })\r\n}\r\n\r\nfunction onTradeError(err) {\r\n error('hero.trade-error')\r\n}\r\n\r\nasync function onTradeRequest(trade) {\r\n const { sender, receiver } = trade\r\n const senderActor = game.actors.get(sender.cid)\r\n const receiverActor = game.actors.get(receiver.cid)\r\n\r\n if (!senderActor || !receiverActor) {\r\n sendTradeError(trade)\r\n return\r\n }\r\n\r\n const localize = subLocalize('hero.trade-request')\r\n\r\n let content = `

${localize('header', { sender: senderActor.name, receiver: receiverActor.name })}

`\r\n content += `

${localize('give', { give: chatUUID(sender.uuid) })}

`\r\n content += `

${localize('want', { want: chatUUID(receiver.uuid) })}

`\r\n content += `

${localize('accept')}

`\r\n\r\n const accept = await Dialog.confirm({\r\n title: localize('title'),\r\n content: await TextEditor.enrichHTML(content, { async: true }),\r\n })\r\n\r\n if (accept) acceptRequest(trade)\r\n else rejectRequest(trade)\r\n}\r\n\r\nfunction rejectRequest(trade) {\r\n if (trade.sender.id === game.user.id) {\r\n onTradeRejected(trade)\r\n return\r\n }\r\n\r\n socketEmit({\r\n ...trade,\r\n type: 'hero.trade-reject',\r\n })\r\n}\r\n\r\nasync function onTradeRejected({ receiver }) {\r\n const actor = game.actors.get(receiver.cid)\r\n warn('hero.trade-rejected', { name: actor.name }, true)\r\n}\r\n\r\nasync function createTable() {\r\n if (!game.user.isGM) {\r\n warn('hero.notGM')\r\n return\r\n }\r\n\r\n const localize = subLocalize('hero.templates.createTable.choice')\r\n const template = templatePath('hero/dialogs/create-table')\r\n\r\n const buttons = {\r\n yes: {\r\n label: localize('create'),\r\n icon: '',\r\n callback: html => {\r\n const type = html.find('.window-content input[name=\"type\"]:checked').val()\r\n const unique = html.find('.window-content input[name=\"draw\"]:checked').val() === 'unique'\r\n return { type, unique }\r\n },\r\n },\r\n no: {\r\n label: localize('cancel'),\r\n icon: '',\r\n callback: () => null,\r\n },\r\n }\r\n\r\n const data = {\r\n content: await renderTemplate(template, { i18n: localize }),\r\n title: localize('title'),\r\n buttons,\r\n default: 'yes',\r\n close: () => null,\r\n }\r\n\r\n const result = await Dialog.wait(data, undefined, { id: 'pf2e-hero-actions-create-table' })\r\n if (!result) return\r\n\r\n if (result.type === 'default') createDefaultTable(result.unique)\r\n else createCustomTable(result.unique)\r\n}\r\n\r\nasync function createCustomTable(unique) {\r\n const table = await createCustomActionsTable(unique)\r\n await setTable(table)\r\n table.sheet?.render(true)\r\n}\r\n\r\nfunction createCustomActionsTable(unique = true) {\r\n const source = getTableSource(unique)\r\n return RollTable.create(source, { temporary: false })\r\n}\r\n\r\nasync function createDefaultTable(unique) {\r\n const localize = subLocalize('templates.createTable.default.confirm')\r\n let table = await getDefaultWorldTable()\r\n\r\n if (table) {\r\n const override = await Dialog.confirm({\r\n title: localize('title'),\r\n content: localize('content'),\r\n })\r\n\r\n if (override) {\r\n const update = getTableSource(unique)\r\n await table.update(update)\r\n return setTable(table, true)\r\n }\r\n }\r\n\r\n table = await createDefautActionsTable(unique)\r\n await setTable(table)\r\n}\r\n\r\nasync function createDefautActionsTable(unique = true) {\r\n const table = await fromUuid(TABLE_UUID)\r\n const source = getTableSource(unique, table)\r\n return RollTable.create(source, { temporary: false })\r\n}\r\n\r\nasync function setTable(table, normalize = false) {\r\n if (normalize) await table.normalize()\r\n await setSetting('hero-table', table.uuid)\r\n}\r\n\r\nfunction getTableSource(unique = true, table) {\r\n const source = {\r\n name: localize('hero.table.name'),\r\n replacement: !unique,\r\n img: TABLE_ICON,\r\n description: localize('hero.table.description'),\r\n flags: {\r\n core: {\r\n sourceId: TABLE_UUID,\r\n },\r\n },\r\n }\r\n if (!table) return source\r\n return mergeObject(deepClone(table._source), source)\r\n}\r\n\r\nasync function removeHeroActions() {\r\n if (!game.user.isGM) {\r\n warn('hero.notGM')\r\n return\r\n }\r\n\r\n const localize = subLocalize('hero.templates.removeActions')\r\n const template = templatePath('hero/dialogs/remove-actions')\r\n\r\n const buttons = {\r\n yes: {\r\n label: localize('remove'),\r\n icon: '',\r\n callback: html =>\r\n html\r\n .find('input[name=\"actor\"]:checked')\r\n .toArray()\r\n .map(x => game.actors.get(x.value))\r\n .filter(x => x),\r\n },\r\n no: {\r\n label: localize('cancel'),\r\n icon: '',\r\n callback: () => null,\r\n },\r\n }\r\n\r\n const data = {\r\n content: await renderTemplate(template, {\r\n actors: game.actors.filter(x => x.type === 'character'),\r\n i18n: localize,\r\n }),\r\n title: localize('title'),\r\n buttons,\r\n default: 'yes',\r\n render: html => {\r\n html.on('change', 'input[name=\"all\"]', () => removeActionsToggleAll(html))\r\n html.on('change', 'input[name=\"actor\"]', () => removeActionsToggleActor(html))\r\n },\r\n close: () => null,\r\n }\r\n\r\n const actors = await Dialog.wait(data, undefined, { id: 'pf2e-hero-actions-remove-actions' })\r\n\r\n if (!actors) return\r\n\r\n if (!actors.length) {\r\n localize.warn('noSelection')\r\n return\r\n }\r\n\r\n for (const actor of actors) {\r\n setHeroActions(actor, [])\r\n }\r\n\r\n localize.info('removed')\r\n}\r\n\r\nfunction removeActionsToggleAll(html) {\r\n const state = html.find('input[name=\"all\"]')[0].checked\r\n html.find('input[name=\"actor\"]').prop('checked', state)\r\n}\r\n\r\nfunction removeActionsToggleActor(html) {\r\n const actors = html.find('input[name=\"actor\"]')\r\n const checked = actors.filter(':checked')\r\n const all = html.find('input[name=\"all\"]')\r\n\r\n if (actors.length === checked.length) {\r\n all.prop('checked', true).prop('indeterminate', false)\r\n actors.prop('checked', true)\r\n } else if (!checked.length) {\r\n all.prop('checked', false).prop('indeterminate', false)\r\n actors.prop('checked', false)\r\n } else {\r\n all.prop('checked', false).prop('indeterminate', true)\r\n }\r\n}\r\n\r\nfunction documentUuidFromTableResult(result) {\r\n if (result.type === CONST.TABLE_RESULT_TYPES.TEXT) return /@UUID\\[([\\w\\.]+)\\]/.exec(result.text)?.[1]\r\n if (result.type === CONST.TABLE_RESULT_TYPES.DOCUMENT) return `${result.documentCollection}.${result.documentId}`\r\n if (result.type === CONST.TABLE_RESULT_TYPES.COMPENDIUM) return `Compendium.${result.documentCollection}.${result.documentId}`\r\n return undefined\r\n}\r\n\r\nasync function giveHeroActions(actor) {\r\n if (!game.user.isGM) {\r\n warn('hero.notGM')\r\n return\r\n }\r\n\r\n const templateLocalize = subLocalize('hero.templates.giveAction')\r\n\r\n if (!actor?.isOfType('character')) {\r\n templateLocalize.warn('noCharacter')\r\n return null\r\n }\r\n\r\n const table = await getDeckTable()\r\n if (!table) {\r\n error('hero.table.drawError', true)\r\n return null\r\n }\r\n\r\n const isUnique = table.replacement === false\r\n\r\n const actionsList = (\r\n await Promise.all(\r\n table.results.map(async result => {\r\n const uuid = documentUuidFromTableResult(result)\r\n if (!uuid) return\r\n\r\n return {\r\n key: result.id,\r\n uuid,\r\n name: await getLabelfromTableResult(result, uuid),\r\n drawn: result.drawn,\r\n }\r\n })\r\n )\r\n ).filter(Boolean)\r\n\r\n const template = templatePath('hero/dialogs/give-action')\r\n const content = await renderTemplate(template, {\r\n actions: actionsList,\r\n isUnique,\r\n i18n: templateLocalize,\r\n })\r\n\r\n const buttons = {\r\n yes: {\r\n label: templateLocalize('give'),\r\n icon: '',\r\n callback: html => ({\r\n selected: html\r\n .find('[name=action]:checked')\r\n .closest('.action')\r\n .toArray()\r\n .map(el => el.dataset),\r\n asDrawn: html.find('[name=drawn]').prop('checked') ?? false,\r\n withMessage: html.find('[name=message]').prop('checked'),\r\n }),\r\n },\r\n no: {\r\n label: templateLocalize('cancel'),\r\n icon: '',\r\n callback: () => null,\r\n },\r\n }\r\n\r\n const data = {\r\n title: templateLocalize('title'),\r\n content,\r\n buttons,\r\n render: html => {\r\n html.find('[data-action=expand]').on('click', onClickHeroActionExpand)\r\n },\r\n close: () => null,\r\n }\r\n\r\n const result = await Dialog.wait(data, undefined, { id: 'pf2e-hero-actions-give-action' })\r\n if (!result) return\r\n\r\n const { selected, asDrawn, withMessage } = result\r\n const actions = getHeroActions(actor)\r\n const tableUpdates = []\r\n\r\n for (const { uuid, name, key } of selected) {\r\n actions.push({ uuid, name })\r\n if (!asDrawn) continue\r\n\r\n const result = table.results.get(key)\r\n if (result && !result.drawn) tableUpdates.push(key)\r\n }\r\n\r\n if (tableUpdates.length) {\r\n await table.updateEmbeddedDocuments(\r\n 'TableResult',\r\n tableUpdates.map(key => ({ _id: key, drawn: true }))\r\n )\r\n }\r\n\r\n setHeroActions(actor, actions)\r\n\r\n if (withMessage) {\r\n createChatMessage({ actor, actions: selected, label: nb => localize('hero.actions-give.header', { nb }), secret: true })\r\n }\r\n}\r\n", "import { getFlag, setFlag } from '../../shared/flags'\r\nimport { subLocalize } from '../../shared/localize'\r\nimport { templatePath } from '../../shared/path'\r\n\r\nconst localize = subLocalize('knowledges.editLore')\r\n\r\nexport class EditLores extends FormApplication {\r\n get actor() {\r\n return this.object\r\n }\r\n\r\n get id() {\r\n return `npc-edit-lores-${this.actor.id}`\r\n }\r\n\r\n get title() {\r\n return localize('title', this.actor)\r\n }\r\n\r\n get template() {\r\n return templatePath('knowledges/lores')\r\n }\r\n\r\n getData(options) {\r\n const actor = this.actor\r\n\r\n return mergeObject(super.getData(options), {\r\n unspecified: getFlag(actor, 'knowledges.unspecified') ?? '',\r\n specific: getFlag(actor, 'knowledges.specific') ?? '',\r\n i18n: localize,\r\n })\r\n }\r\n\r\n async _updateObject(event, { unspecified, specific }) {\r\n const actor = this.object\r\n setFlag(actor, 'knowledges.unspecified', unspecified.trim())\r\n setFlag(actor, 'knowledges.specific', specific.trim())\r\n }\r\n\r\n activateListeners(html) {\r\n html.find('button.cancel').on('click', this.#onCancel.bind(this))\r\n }\r\n\r\n #onCancel(event) {\r\n event.preventDefault()\r\n this.close()\r\n }\r\n}\r\n", "import { EditLores } from '../apps/knowledges/lores'\r\nimport { isPlayedActor } from '../shared/actor'\r\nimport { getFlag } from '../shared/flags'\r\nimport { createHook } from '../shared/hook'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst setHook = createHook('renderNPCSheetPF2e', renderNPCSheetPF2e)\r\n\r\nexport function registerKnowledges() {\r\n return {\r\n settings: [\r\n {\r\n name: 'knowledges',\r\n type: Boolean,\r\n default: false,\r\n onChange: value => setHook(value),\r\n },\r\n ],\r\n conflicts: ['pf2e-npc-knowledges'],\r\n ready: isGM => {\r\n if (isGM && getSetting('knowledges')) setHook(true)\r\n },\r\n }\r\n}\r\n\r\nfunction renderNPCSheetPF2e(sheet, $html) {\r\n const actor = sheet.actor\r\n if (!isPlayedActor(actor)) return\r\n\r\n replaceLores(actor, $html)\r\n addEditButton($html)\r\n addEvents(actor, $html)\r\n}\r\n\r\nfunction knowledgeSelector(html, section, selector) {\r\n return html.find(\r\n `[data-tab=\"main\"] .recall-knowledge ${section === 'header' ? '.section-header' : '.section-body'} ${selector}`\r\n )\r\n}\r\n\r\nfunction editLores(actor) {\r\n new EditLores(actor).render(true)\r\n}\r\n\r\nfunction replaceLores(actor, html) {\r\n const unspecifics = getFlag(actor, 'knowledges.unspecified')\r\n const specifics = getFlag(actor, 'knowledges.specific')\r\n if (!unspecifics && !specifics) return\r\n\r\n const lores = actor.identificationDCs.lore\r\n const body = knowledgeSelector(html, 'body', '')\r\n body.find('.identification-skills').last().remove()\r\n\r\n function tag(skills, dc, adjustment) {\r\n const content = game.i18n.format('PF2E.Actor.NPC.Identification.Skills.Label', { skills, dc, adjustment })\r\n return `
${content}
`\r\n }\r\n\r\n function addTags(lores, { dc, start }) {\r\n const tags = lores\r\n .split(',')\r\n .filter(lore => lore.trim())\r\n .map(lore => tag(lore, dc, start))\r\n .join('')\r\n body.append(tags)\r\n }\r\n\r\n addTags(unspecifics || 'Unspecific', lores[0])\r\n addTags(specifics || 'Specific', lores[1])\r\n}\r\n\r\nfunction addEvents(actor, html) {\r\n const edit = knowledgeSelector(html, 'header', 'button.edit')\r\n edit.on('click', () => editLores(actor))\r\n}\r\n\r\nfunction addEditButton(html) {\r\n const attempts = knowledgeSelector(html, 'header', 'button')\r\n const edit = ''\r\n attempts.before(edit)\r\n}\r\n", "import { bindOnPreCreateSpellDamageChatMessage } from '../../shared/chat'\r\nimport { subLocalize } from '../../shared/localize'\r\nimport { templatePath } from '../../shared/path'\r\n\r\nconst localize = subLocalize('merge.multi')\r\n\r\nexport class MultiCast extends Application {\r\n #message\r\n #event\r\n\r\n constructor(event, message, options) {\r\n super(options)\r\n this.#event = event\r\n this.#message = message\r\n }\r\n\r\n get title() {\r\n return localize('title', this.spell)\r\n }\r\n\r\n get template() {\r\n return templatePath('merge/multi')\r\n }\r\n\r\n getData(options) {\r\n return mergeObject(super.getData(options), {\r\n i18n: localize,\r\n })\r\n }\r\n\r\n activateListeners(html) {\r\n html.find('[data-action=cast]').on('click', this.#onCast.bind(this))\r\n html.find('[data-action=cancel]').on('click', this.#onCancel.bind(this))\r\n }\r\n\r\n async #onCast(event) {\r\n event.preventDefault()\r\n\r\n const nb = this.element.find('[name=multi]').val()\r\n if (nb < 1) {\r\n localize.error('zero')\r\n this.close()\r\n return\r\n }\r\n\r\n const message = this.#message\r\n if (!message) return\r\n\r\n const spell = message.item\r\n const actor = message.actor\r\n if (!actor || !spell) return\r\n\r\n const updateSource = (damages, heightening) => {\r\n for (const [id, damage] of Object.entries(damages)) {\r\n for (let i = 0; i < nb - 1; i++) {\r\n const newId = randomID()\r\n\r\n damages[newId] = damage\r\n\r\n if (heightening.type === 'interval') {\r\n const damage = heightening.damage[id]\r\n if (damage) heightening.damage[newId] = damage\r\n } else if (heightening.type === 'fixed') {\r\n for (const [level, data] of Object.entries(heightening.levels)) {\r\n const damage = data.damage.value[id]\r\n if (damage) heightening.levels[level].damage.value[newId] = damage\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n const embeddedSource = deepClone(message.flags.pf2e.casting?.embeddedSpell)\r\n\r\n if (embeddedSource) {\r\n const damages = embeddedSource.system.damage\r\n const heightening = (embeddedSource.system.heightening ??= {})\r\n\r\n updateSource(damages, heightening)\r\n\r\n const newSpell = new CONFIG.Item.documentClass(embeddedSource, { parent: actor })\r\n newSpell.trickMagicEntry = spell.trickMagicEntry\r\n\r\n const overlayIds = message.getFlag('pf2e', 'origin.variant.overlays')\r\n const castLevel = message.getFlag('pf2e', 'origin.castLevel') ?? spell.rank\r\n const modifiedSpell = newSpell.loadVariant({ overlayIds, castLevel })\r\n const castSpell = modifiedSpell ?? newSpell\r\n\r\n castSpell.rollDamage(this.#event)\r\n } else {\r\n const spellSource = spell.toObject()\r\n const damages = spellSource.system.damage\r\n const heightening = spellSource.system.heightening ?? {}\r\n\r\n updateSource(damages, heightening)\r\n const newSpell = spell.clone({ 'system.damage': damages, 'system.heightening': heightening })\r\n newSpell.rollDamage(this.#event)\r\n }\r\n\r\n if (spell.damageKinds.size) {\r\n bindOnPreCreateSpellDamageChatMessage(message)\r\n }\r\n\r\n this.close()\r\n }\r\n\r\n #onCancel(event) {\r\n event.preventDefault()\r\n this.close()\r\n }\r\n}\r\n", "import { MultiCast } from '../apps/merge/multi'\r\nimport { MODULE_ID } from '../module'\r\nimport { getChatMessageClass, latestChatMessages } from '../shared/chat'\r\nimport { getFlag } from '../shared/flags'\r\nimport { createHook } from '../shared/hook'\r\nimport { localize } from '../shared/localize'\r\nimport { compareArrays } from '../shared/misc'\r\nimport { warn } from '../shared/notification'\r\nimport { templatePath } from '../shared/path'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst setHook = createHook('renderChatMessage', renderChatMessage, updateMessages)\r\n\r\nexport function registerMerge() {\r\n return {\r\n settings: [\r\n {\r\n name: 'merge-damage',\r\n type: Boolean,\r\n default: false,\r\n scope: 'client',\r\n onChange: value => setHook(value, 'multi-cast'),\r\n },\r\n {\r\n name: 'multi-cast',\r\n type: Boolean,\r\n default: false,\r\n scope: 'client',\r\n onChange: value => setHook(value, 'merge-damage'),\r\n },\r\n ],\r\n init: isGm => {\r\n setHook(false, ['multi-cast', 'merge-damage'], true)\r\n },\r\n }\r\n}\r\n\r\nfunction updateMessages() {\r\n const chat = ui.chat?.element\r\n if (!chat) return\r\n\r\n for (const message of latestChatMessages(10)) {\r\n const html = chat.find(`[data-message-id=${message.id}]`)\r\n if (!html.length) continue\r\n\r\n html.find('[data-action=multi-cast]').remove()\r\n html.find('[data-action=merge-damage]').remove()\r\n\r\n renderChatMessage(message, html)\r\n }\r\n}\r\n\r\nfunction renderChatMessage(message, html) {\r\n if (!game.user.isGM && !message.isAuthor) return\r\n if (getSetting('merge-damage') && isDamageRoll(message)) renderDamage(message, html)\r\n else if (getSetting('multi-cast') && message.getFlag('pf2e', 'origin.type') === 'spell') renderSpell(message, html)\r\n}\r\n\r\nfunction renderSpell(message, html) {\r\n const item = message.item\r\n if (!item) return\r\n\r\n const spellBtn = html.find('.message-content .chat-card .owner-buttons .spell-button')\r\n\r\n spellBtn\r\n .find('[data-action=spell-damage]')\r\n .after(``)\r\n\r\n spellBtn.find('[data-action=multi-cast]').on('click', event => {\r\n new MultiCast(event, message).render(true)\r\n })\r\n}\r\n\r\nfunction renderDamage(message, html) {\r\n let buttons = ''\r\n\r\n if (getFlag(message, 'merge.merged')) {\r\n const tooltip = localize('merge.damage.split-tooltip')\r\n buttons += `'\r\n\r\n buttons += ''\r\n\r\n const actorUUID = getActorUUID(message)\r\n const targetUUIDs = getTargetUUIDs(message)\r\n\r\n html.find('.dice-result .dice-total').append(buttons)\r\n html.find('.pf2e-toolbelt-merge [data-action=merge-damage]').on('click', event => {\r\n event.stopPropagation()\r\n\r\n for (const otherMessage of latestChatMessages(5, message)) {\r\n const otherTargetsUUIDS = getTargetUUIDs(otherMessage)\r\n\r\n if (\r\n !isDamageRoll(otherMessage) ||\r\n getActorUUID(otherMessage) !== actorUUID ||\r\n !compareArrays(\r\n targetUUIDs?.map(t => t.actor).filter(Boolean),\r\n otherTargetsUUIDS?.map(t => t.actor).filter(Boolean)\r\n )\r\n )\r\n continue\r\n\r\n mergeDamages(event, message, otherMessage, { actorUUID, targetUUIDs })\r\n return\r\n }\r\n\r\n warn('merge.damage.none')\r\n })\r\n\r\n html.find('.pf2e-toolbelt-merge [data-action=split-damage]').on('click', event => {\r\n event.stopPropagation()\r\n splitDamages(event, message)\r\n })\r\n}\r\n\r\nasync function splitDamages(event, message) {\r\n const sources = getFlag(message, 'merge.data').flatMap(data => data.source)\r\n await removeChatMessages(message.id)\r\n await getChatMessageClass().createDocuments(sources)\r\n}\r\n\r\nasync function mergeDamages(event, origin, other, { actorUUID, targetUUIDs }) {\r\n const dataGroups = {}\r\n\r\n const data = getMessageData(other).concat(getMessageData(origin))\r\n for (const { name, notes, outcome, modifiers, tags } of data) {\r\n dataGroups[name] ??= {\r\n name,\r\n tags,\r\n notes: new Set(),\r\n results: [],\r\n }\r\n\r\n notes.forEach(dataGroups[name].notes.add, dataGroups[name].notes)\r\n\r\n const exists = dataGroups[name].results.some(\r\n result => result.outcome === outcome && compareArrays(result.modifiers, modifiers)\r\n )\r\n\r\n if (!exists) dataGroups[name].results.push({ outcome, modifiers })\r\n }\r\n\r\n const groups = Object.values(dataGroups).map(group => {\r\n group.label = group.name\r\n group.results.forEach(result => {\r\n if (!result.outcome) return\r\n result.label = game.i18n.localize(`PF2E.Check.Result.Degree.Attack.${result.outcome}`)\r\n })\r\n return group\r\n })\r\n\r\n groups.at(-1).isLastGroup = true\r\n\r\n const flavor = await renderTemplate(templatePath('merge/merged'), {\r\n groups,\r\n hasMultipleGroups: groups.length > 1,\r\n })\r\n\r\n const originRolls = getMessageRolls(origin)\r\n const otherRolls = getMessageRolls(other)\r\n const groupedRolls = []\r\n\r\n for (const roll of [].concat(otherRolls, originRolls)) {\r\n const { options, total, terms } = roll\r\n const term = terms[0]\r\n const formula = roll.formula\r\n .replaceAll(/(\\[[\\w,]+\\])/g, '')\r\n .replace(/^\\(/, '')\r\n .replace(/\\)$/, '')\r\n const group = groupedRolls.find(\r\n ({ options: { flavor, critRule } }) => flavor === options.flavor && critRule === options.critRule\r\n )\r\n\r\n if (group) {\r\n group.terms.push(term)\r\n group.total += total\r\n group.formulas.push(formula)\r\n } else {\r\n groupedRolls.push({\r\n options,\r\n formulas: [formula],\r\n total,\r\n terms: [term],\r\n })\r\n }\r\n }\r\n\r\n for (const group of groupedRolls) {\r\n if (group.options.flavor.includes('persistent')) {\r\n const { index } = group.formulas.reduce(\r\n (acc, curr, index) => {\r\n const formula = getMeansFormula(curr)\r\n const value = new Roll(formula).evaluate({ async: false }).total\r\n if (value > acc.value) acc = { value, index }\r\n return acc\r\n },\r\n { value: 0, index: -1 }\r\n )\r\n\r\n group.formulas = [group.formulas[index]]\r\n group.terms = [group.terms[index]]\r\n }\r\n\r\n group.formula = `(${group.formulas.join(' + ')})[${group.options.flavor}]`\r\n group.term = group.terms.length < 2 ? group.terms[0] : createTermGroup(group.terms)\r\n }\r\n\r\n const roll = {\r\n class: 'DamageRoll',\r\n options: {},\r\n dice: [],\r\n formula: `{${groupedRolls.map(({ formula }) => formula).join(', ')}}`,\r\n total: groupedRolls.reduce((acc, { total }) => acc + total, 0),\r\n evaluated: true,\r\n terms: [\r\n {\r\n class: 'InstancePool',\r\n options: {},\r\n evaluated: true,\r\n terms: groupedRolls.map(({ formula }) => formula),\r\n modifiers: [],\r\n rolls: groupedRolls.map(({ options, formula, total, term }) => ({\r\n class: 'DamageInstance',\r\n options,\r\n dice: [],\r\n formula,\r\n total,\r\n terms: [term],\r\n evaluated: true,\r\n })),\r\n results: groupedRolls.map(({ total }) => ({ result: total, active: true })),\r\n },\r\n ],\r\n }\r\n\r\n if (game.modules.get('dice-so-nice')?.active) {\r\n const setHidden = term => {\r\n if ('results' in term) {\r\n term.results.forEach(result => (result.hidden = true))\r\n } else {\r\n ;(term.term ?? term).operands?.forEach(operand => setHidden(operand))\r\n }\r\n }\r\n\r\n roll.terms[0].rolls.forEach(roll => roll.terms.forEach(term => setHidden(term)))\r\n }\r\n\r\n await removeChatMessages(origin.id, other.id)\r\n\r\n await getChatMessageClass().create({\r\n flavor,\r\n type: CONST.CHAT_MESSAGE_TYPES.ROLL,\r\n speaker: origin.speaker,\r\n flags: {\r\n [MODULE_ID]: {\r\n merge: {\r\n actor: actorUUID,\r\n targets: targetUUIDs,\r\n merged: true,\r\n type: 'damage-roll',\r\n data,\r\n },\r\n target: {\r\n targets: targetUUIDs,\r\n },\r\n },\r\n pf2e: {\r\n context: {\r\n options: Array.from(new Set(data.flatMap(entry => entry.itemTraits))),\r\n },\r\n },\r\n },\r\n rolls: [roll],\r\n })\r\n}\r\n\r\nfunction getMeansFormula(formula) {\r\n const roll = new Roll(formula)\r\n\r\n const formulaTerms = roll.terms.reduce((acc, curr) => {\r\n if (curr instanceof Die) {\r\n const mean = (curr.number * (curr.faces + 1)) / 2\r\n acc.push(mean)\r\n } else if (curr instanceof OperatorTerm) {\r\n acc.push(curr.operator)\r\n } else if (curr instanceof NumericTerm) {\r\n acc.push(curr.number)\r\n } else if (curr instanceof ParentheticalTerm) {\r\n const deepFormula = getMeansFormula(curr.term)\r\n acc.push(`(${deepFormula})`)\r\n }\r\n\r\n return acc\r\n }, [])\r\n\r\n return formulaTerms.join(' ')\r\n}\r\n\r\nfunction getMessageData(message) {\r\n const flags = getFlag(message, 'merge.data')\r\n if (flags) return flags\r\n\r\n const source = message.toObject()\r\n delete source._id\r\n delete source.timestamp\r\n\r\n const html = $(`
${message.flavor}
`)\r\n const tags = html.find('h4.action + .tags').prop('outerHTML')\r\n\r\n const modifiers = []\r\n html.find('.tag.tag_transparent').each(function () {\r\n modifiers.push(this.innerHTML)\r\n })\r\n\r\n const notes = source.flags.pf2e.context.notes.map(\r\n ({ title, text }) => `${game.i18n.localize(title)} ${game.i18n.localize(text)}`\r\n )\r\n\r\n return [\r\n {\r\n source,\r\n name: source.flags.pf2e.strike?.name ?? message.item.name,\r\n outcome: source.flags.pf2e.context.outcome,\r\n itemTraits: source.flags.pf2e.context.options.filter(option => option.startsWith('item:')),\r\n modifiers,\r\n tags,\r\n notes,\r\n },\r\n ]\r\n}\r\n\r\nfunction removeChatMessages(...ids) {\r\n const joinedIds = ids.map(id => `[data-message-id=${id}]`).join(', ')\r\n ui.chat.element.find(joinedIds).remove()\r\n return ChatMessage.deleteDocuments(ids)\r\n}\r\n\r\nfunction createTermGroup(terms) {\r\n const options = deepClone(terms[0].options)\r\n terms.map(term => ((term.options = {}), term))\r\n\r\n return {\r\n class: 'Grouping',\r\n options,\r\n evaluated: true,\r\n term: {\r\n class: 'ArithmeticExpression',\r\n options: {},\r\n evaluated: true,\r\n operator: '+',\r\n operands: [terms.shift(), terms.length > 1 ? createTermGroup(terms) : terms[0]],\r\n },\r\n }\r\n}\r\n\r\nfunction getMessageRolls(message) {\r\n return getFlag(message, 'merge.rolls') ?? JSON.parse(message._source.rolls[0]).terms[0].rolls\r\n}\r\n\r\nfunction getActorUUID(message) {\r\n return getFlag(message, 'merge.actor') ?? message.actor?.uuid\r\n}\r\n\r\nfunction getTargetUUIDs(message) {\r\n const targetTargets = getFlag(message, 'target.targets')\r\n if (targetTargets) return targetTargets\r\n\r\n const mergeTargets = getFlag(message, 'merge.targets') ?? message.getFlag('pf2e', 'target')\r\n if (Array.isArray(mergeTargets)) return mergeTargets\r\n return mergeTargets ? [mergeTargets] : []\r\n}\r\n\r\nfunction isDamageRoll(message) {\r\n return getFlag(message, 'merge.type') === 'damage-roll' || message.getFlag('pf2e', 'context.type') === 'damage-roll'\r\n}\r\n", "import { latestChatMessages } from '../shared/chat'\r\nimport { createChoicesHook } from '../shared/hook'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst setHook = createChoicesHook('renderChatMessage', renderChatMessage, updateMessages)\r\n\r\nexport function registerHideModifiers() {\r\n return {\r\n settings: [\r\n {\r\n name: 'modifiers',\r\n type: String,\r\n default: 'disabled',\r\n choices: ['disabled', 'enabled', 'traits'],\r\n onChange: value => setHook(value),\r\n },\r\n ],\r\n init: isGM => {\r\n if (!isGM && getSetting('modifiers') !== 'disabled') setHook(true, true)\r\n },\r\n }\r\n}\r\n\r\nfunction updateMessages() {\r\n if (game.user.isGM) return\r\n\r\n const chat = ui.chat?.element\r\n if (!chat) return\r\n\r\n for (const message of latestChatMessages(20)) {\r\n const html = chat.find(`[data-message-id=${message.id}]`)\r\n if (!html.length) continue\r\n\r\n html.find('.message-header').removeClass('pf2e-toolbelt-modifiers pf2e-toolbelt-modifiers-traits')\r\n renderChatMessage(message, html)\r\n }\r\n}\r\n\r\nfunction renderChatMessage(message, html) {\r\n const speaker = message.speaker\r\n const actor = ChatMessage.getSpeakerActor(speaker)\r\n if (!actor || actor.hasPlayerOwner) return\r\n\r\n const header = html.find('.message-header')\r\n\r\n if (getSetting('modifiers') === 'traits') {\r\n header.addClass('pf2e-toolbelt-modifiers-traits')\r\n }\r\n\r\n if (getSetting('modifiers') !== 'disabled') {\r\n header.addClass('pf2e-toolbelt-modifiers')\r\n }\r\n}\r\n", "import { registerWrapper } from '../shared/libwrapper'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst ACTOR_PREPARE_EMBEDDED_DOCUMENTS = 'CONFIG.Actor.documentClass.prototype.prepareEmbeddedDocuments'\r\nconst TREASURE_PREPARE_BASE_DATA = 'CONFIG.PF2E.Item.documentClasses.treasure.prototype.prepareBaseData'\r\n\r\nexport function registerNobulk() {\r\n return {\r\n settings: [\r\n {\r\n name: 'nobulk',\r\n type: Boolean,\r\n default: false,\r\n requiresReload: true,\r\n },\r\n {\r\n name: 'nobulk-coins',\r\n type: Boolean,\r\n default: false,\r\n requiresReload: true,\r\n },\r\n ],\r\n init: () => {\r\n if (getSetting('nobulk')) registerWrapper(ACTOR_PREPARE_EMBEDDED_DOCUMENTS, actorPrepareEmbeddedDocuments, 'WRAPPER')\r\n if (getSetting('nobulk-coins')) registerWrapper(TREASURE_PREPARE_BASE_DATA, treasurePrepareBaseData, 'WRAPPER')\r\n },\r\n }\r\n}\r\n\r\nfunction treasurePrepareBaseData(wrapped) {\r\n wrapped()\r\n if (this.isCoinage) this.system.bulk.value = 0\r\n}\r\n\r\nfunction actorPrepareEmbeddedDocuments(wrapped, ...args) {\r\n wrapped(...args)\r\n\r\n const actor = this\r\n const InventoryBulk = actor.inventory.bulk.constructor\r\n\r\n let _value = null\r\n\r\n Object.defineProperty(actor.inventory.bulk, 'value', {\r\n get() {\r\n if (_value) return _value\r\n _value = InventoryBulk.computeTotalBulk(\r\n this.actor.inventory.filter(item => !item.isInContainer && item.system.equipped.carryType !== 'dropped'),\r\n this.actor.size\r\n )\r\n return _value\r\n },\r\n })\r\n}\r\n", "import { MODULE_ID } from '../module'\r\nimport { isPlayedActor } from '../shared/actor'\r\nimport { getFlag, setFlag, unsetFlag } from '../shared/flags'\r\nimport { registerWrapper } from '../shared/libwrapper'\r\nimport { subLocalize } from '../shared/localize'\r\nimport { isInstanceOf } from '../shared/misc'\r\nimport { templatePath } from '../shared/path'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst ACTOR_PREPARE_DATA = 'CONFIG.Actor.documentClass.prototype.prepareData'\r\nconst DOCUMENT_SHEET_RENDER_INNER = 'DocumentSheet.prototype._renderInner'\r\n\r\nexport function registerShare() {\r\n return {\r\n settings: [\r\n {\r\n name: 'share',\r\n type: String,\r\n default: 'disabled',\r\n choices: ['disabled', 'enabled', 'force'],\r\n requiresReload: true,\r\n },\r\n ],\r\n init: () => {\r\n const share = getSetting('share')\r\n if (share === 'disabled') return\r\n\r\n registerWrapper(ACTOR_PREPARE_DATA, prepareData, 'WRAPPER')\r\n registerWrapper(DOCUMENT_SHEET_RENDER_INNER, documentSheetRenderInner, 'WRAPPER')\r\n\r\n Hooks.on('preUpdateActor', preUpdateActor)\r\n Hooks.on('deleteActor', deleteActor)\r\n Hooks.on('updateActor', updateActor)\r\n },\r\n }\r\n}\r\n\r\nasync function documentSheetRenderInner(wrapped, ...args) {\r\n const inner = await wrapped(...args)\r\n if (!isInstanceOf(this, 'CreatureConfig')) return inner\r\n\r\n const actor = this.actor\r\n if (!isPlayedActor(actor) || !actor.isOfType('character', 'npc') || getSlaves(actor).size) return inner\r\n\r\n const masters = game.actors\r\n .filter(a => a.id !== actor.id && a.isOwner && isValidMaster(a))\r\n .map(actor => ({\r\n key: actor.id,\r\n label: actor.name,\r\n }))\r\n\r\n const group = await renderTemplate(templatePath('share/master'), {\r\n masters,\r\n master: getFlag(actor, 'share.master'),\r\n selectPath: `flags.${MODULE_ID}.share.master`,\r\n i18n: subLocalize('share.templates.master'),\r\n })\r\n\r\n inner.children().last().before(group)\r\n\r\n return inner\r\n}\r\n\r\nfunction deleteActor(actor) {\r\n removeSlaveFromMaster(actor)\r\n\r\n const slaves = getSlaves(actor)\r\n Promise.all(\r\n slaves.map(async slave => {\r\n unsetMaster(slave)\r\n await unsetFlag(slave, 'share.master')\r\n })\r\n )\r\n}\r\n\r\nfunction preUpdateActor(actor, updates) {\r\n const shareFlag = getProperty(updates, `flags.${MODULE_ID}.share`)\r\n if (shareFlag?.master) {\r\n const master = game.actors.get(shareFlag.master)\r\n if (isValidMaster(master)) {\r\n const hpSource = deepClone(master._source.system.attributes.hp)\r\n setProperty(updates, 'system.attributes.hp', hpSource)\r\n }\r\n } else {\r\n const master = getMaster(actor)\r\n const hpUpdate = getProperty(updates, 'system.attributes.hp')\r\n if (master && hpUpdate) {\r\n master.update({ system: { attributes: { hp: hpUpdate } } }, { noHook: true })\r\n delete updates.system.attributes.hp\r\n }\r\n }\r\n}\r\n\r\nfunction updateActor(actor, updates, options, userId) {\r\n const isOriginalUser = game.user.id === userId\r\n\r\n const shareFlag = getShareFlag(updates)\r\n if (shareFlag?.master !== undefined) {\r\n const slave = actor\r\n\r\n removeSlaveFromMaster(slave)\r\n\r\n if (shareFlag.master) {\r\n const master = game.actors.get(shareFlag.master)\r\n if (isValidMaster(master)) {\r\n setMaster(slave, master)\r\n addSlaveToMaster(master, slave)\r\n }\r\n } else {\r\n unsetMaster(slave)\r\n }\r\n }\r\n\r\n if (!isOriginalUser) return\r\n\r\n const slaves = getSlaves(actor)\r\n if (slaves.size) {\r\n const hpUpdate = getProperty(updates, 'system.attributes.hp')\r\n if (hpUpdate) {\r\n const data = { system: { attributes: { hp: hpUpdate } } }\r\n Promise.all(slaves.map(async slave => await slave.update(data, { noHook: true })))\r\n } else {\r\n Promise.all(slaves.map(async slave => await refreshActor(slave, updates)))\r\n }\r\n }\r\n}\r\n\r\nasync function refreshActor(actor, data) {\r\n const share = getSetting('share')\r\n if (share === 'force') {\r\n await setFlag(actor, 'toggle', !getFlag(actor, 'toggle'))\r\n } else {\r\n actor.render(false, { action: 'update' })\r\n actor._updateDependentTokens(data)\r\n }\r\n}\r\n\r\nfunction prepareData(wrapped) {\r\n wrapped()\r\n\r\n const actor = this\r\n const masterId = getFlag(actor, 'share.master')\r\n const master = masterId ? game.actors.get(masterId) : undefined\r\n\r\n if (!isValidMaster(master)) return\r\n\r\n if (!getMaster(this)) {\r\n setMaster(this, master)\r\n addSlaveToMaster(master, this)\r\n }\r\n\r\n const hp = this.system.attributes.hp\r\n Object.defineProperty(actor.system.attributes, 'hp', {\r\n get() {\r\n const masterHp = master.system.attributes.hp\r\n transfertHpData(masterHp, hp)\r\n return hp\r\n },\r\n enumerable: true,\r\n })\r\n}\r\n\r\nfunction transfertHpData(from, to) {\r\n to.breakdown = from.breakdown\r\n to.max = from.max\r\n to.sp = deepClone(from.sp)\r\n to.temp = from.temp\r\n to.totalModifier = from.totalModifier\r\n to.value = from.value\r\n to._modifiers = from._modifiers.slice()\r\n}\r\n\r\nfunction getShareFlag(doc) {\r\n return getProperty(doc, `flags.${MODULE_ID}.share`)\r\n}\r\n\r\nfunction getSlaves(actor) {\r\n return getModuleProperty(actor, 'slaves') ?? new Collection()\r\n}\r\n\r\nfunction setMaster(actor, master) {\r\n setModuleProperty(actor, 'master', master)\r\n}\r\n\r\nfunction unsetMaster(actor) {\r\n deleteModuleProperty(actor, 'master')\r\n}\r\n\r\nfunction getMaster(actor) {\r\n return getModuleProperty(actor, 'master')\r\n}\r\n\r\nfunction isValidMaster(actor) {\r\n return actor && actor.type === 'character' && !getMaster(actor)\r\n}\r\n\r\nfunction getModuleProperty(doc, path) {\r\n return getProperty(doc, `modules.${MODULE_ID}.share.${path}`)\r\n}\r\n\r\nfunction setModuleProperty(doc, path, value) {\r\n setProperty(doc, `modules.${MODULE_ID}.share.${path}`, value)\r\n}\r\n\r\nfunction deleteModuleProperty(doc, path) {\r\n delete doc.modules?.[MODULE_ID]?.share?.[path]\r\n}\r\n\r\nfunction addSlaveToMaster(master, slave) {\r\n const slaves = getSlaves(master)\r\n setModuleProperty(master, 'slaves', slaves.set(slave.id, slave))\r\n}\r\n\r\nfunction removeSlaveFromMaster(slave) {\r\n const master = getMaster(slave)\r\n if (!master) return\r\n\r\n const slaves = getSlaves(master)\r\n slaves.delete(slave.id)\r\n}\r\n", "function getSourceId(doc) {\r\n return doc.getFlag('core', 'sourceId')\r\n}\r\n\r\nfunction includesSourceId(doc, list) {\r\n const sourceId = getSourceId(doc)\r\n return sourceId ? list.includes(sourceId) : false\r\n}\r\n\r\nfunction getItemSourceIdCondition(sourceId) {\r\n return Array.isArray(sourceId) ? item => includesSourceId(item, sourceId) : item => getSourceId(item) === sourceId\r\n}\r\n\r\nexport function getItems(actor, itemTypes) {\r\n itemTypes = typeof itemTypes === 'string' ? [itemTypes] : itemTypes\r\n return itemTypes ? itemTypes.flatMap(type => actor.itemTypes[type]) : actor.items\r\n}\r\n\r\nexport function hasItemWithSourceId(actor, sourceId, itemTypes) {\r\n return getItems(actor, itemTypes).some(getItemSourceIdCondition(sourceId))\r\n}\r\n\r\nexport function getItemWithSourceId(actor, sourceId, itemTypes) {\r\n return getItems(actor, itemTypes).find(getItemSourceIdCondition(sourceId))\r\n}\r\n", "import { isPlayedActor } from '../shared/actor'\r\nimport { createHook } from '../shared/hook'\r\nimport { getItemWithSourceId, hasItemWithSourceId } from '../shared/item'\r\nimport { subLocalize } from '../shared/localize'\r\nimport { refreshCharacterSheets } from '../shared/misc'\r\nimport { info } from '../shared/notification'\r\nimport { templatePath } from '../shared/path'\r\nimport { getSetting } from '../shared/settings'\r\nimport { isActiveOwner } from '../shared/user'\r\n\r\nconst setSheetHook = createHook('renderCharacterSheetPF2e', renderCharacterSheetPF2e)\r\nconst setDeleteCombatHook = createHook('deleteCombat', deleteCombat)\r\nconst setDeleteCombatantHook = createHook('deleteCombatant', deleteCombatant)\r\nconst setCreateCombatantHook = createHook('createCombatant', createCombatant)\r\n\r\nconst STANCE_SAVANT = ['Compendium.pf2e.feats-srd.Item.yeSyGnYDkl2GUNmu', 'Compendium.pf2e.feats-srd.Item.LI9VtCaL5ZRk0Wo8']\r\n\r\nconst REPLACERS = new Map([\r\n [\r\n 'Compendium.pf2e.feats-srd.Item.nRjyyDulHnP5OewA', // gorilla pound\r\n\r\n {\r\n replace: 'Compendium.pf2e.feats-srd.Item.DqD7htz8Sd1dh3BT', // gorilla stance\r\n effect: 'Compendium.pf2e.feat-effects.Item.UZKIKLuwpQu47feK',\r\n },\r\n ],\r\n])\r\n\r\nconst EXTRAS = new Map([\r\n [\r\n 'Compendium.pf2e.classfeatures.Item.09iL38CZZEa0q0Mt', // arcane cascade\r\n {\r\n effect: 'Compendium.pf2e.feat-effects.Item.fsjO5oTKttsbpaKl',\r\n action: 'Compendium.pf2e.actionspf2e.Item.HbejhIywqIufrmVM',\r\n },\r\n ],\r\n [\r\n 'Compendium.pf2e.feats-srd.Item.xQuNswWB3eg1UM28', // cobra envenom\r\n {\r\n effect: 'Compendium.pf2e.feat-effects.Item.2Qpt0CHuOMeL48rN',\r\n },\r\n ],\r\n [\r\n 'Compendium.pf2e.feats-srd.Item.R7c4PyTNkZb0yvoT', // dread marshal\r\n {\r\n effect: 'Compendium.pf2e.feat-effects.Item.qX62wJzDYtNxDbFv', // the stance aura\r\n },\r\n ],\r\n [\r\n 'Compendium.pf2e.feats-srd.Item.bvOsJNeI0ewvQsFa', // inspiring marshal\r\n {\r\n effect: 'Compendium.pf2e.feat-effects.Item.er5tvDNvpbcnlbHQ', // the stance aura\r\n },\r\n ],\r\n])\r\n\r\nexport function registerStances() {\r\n return {\r\n name: 'stances',\r\n settings: [\r\n {\r\n name: 'stances',\r\n type: Boolean,\r\n default: false,\r\n scope: 'client',\r\n onChange: setup,\r\n },\r\n {\r\n name: 'custom-stances',\r\n type: String,\r\n default: '',\r\n },\r\n ],\r\n conflicts: ['pf2e-stances'],\r\n api: {\r\n getStances,\r\n toggleStance,\r\n isValidStance,\r\n },\r\n ready: isGm => {\r\n if (getSetting('stances')) setup(true)\r\n },\r\n }\r\n}\r\n\r\nfunction setup(value) {\r\n setSheetHook(value)\r\n setDeleteCombatHook(value)\r\n setDeleteCombatantHook(value)\r\n setCreateCombatantHook(value)\r\n}\r\n\r\nfunction isValidStance(stance) {\r\n return stance && stance.system.traits.value.includes('stance') && stance.system.selfEffect?.uuid\r\n}\r\n\r\nfunction getStances(actor) {\r\n const stances = []\r\n const replaced = new Set()\r\n\r\n for (const { replace, sourceId, effectUUID, effect, img, name, itemName, action } of actorStances(actor)) {\r\n if (replace) replaced.add(replace)\r\n\r\n const foundAction = action ? getItemWithSourceId(actor, action, 'action') : getItemWithSourceId(actor, sourceId, 'feat')\r\n\r\n stances.push({\r\n name,\r\n itemName,\r\n uuid: sourceId,\r\n img,\r\n effectUUID,\r\n effectID: effect?.id,\r\n actionUUID: foundAction.sourceId,\r\n actionID: foundAction.id,\r\n })\r\n }\r\n\r\n return stances.filter(({ uuid }) => !replaced.has(uuid))\r\n}\r\n\r\nasync function renderCharacterSheetPF2e(sheet, html) {\r\n const actor = sheet.actor\r\n if (!isPlayedActor(actor)) return\r\n\r\n const stances = getStances(actor)\r\n if (!stances.length) return\r\n\r\n const inCombat = actor.getActiveTokens(true, true).some(token => token.inCombat)\r\n const tab = html.find('.sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter]')\r\n const options = tab.find('.actions-options')\r\n const template = await renderTemplate(templatePath('stances/sheet'), {\r\n stances,\r\n canUseStances: inCombat && !actor.isDead,\r\n i18n: subLocalize('stances'),\r\n })\r\n\r\n if (options.length) options.after(template)\r\n else tab.prepend(template)\r\n\r\n html.find(\r\n '.sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance'\r\n ).on('click', event => onToggleStance(event, actor))\r\n}\r\n\r\nfunction onToggleStance(event, actor) {\r\n const target = event.currentTarget\r\n const canUseStances = target.closest('.pf2e-stances')?.classList.contains('can-use-stances')\r\n if (!event.ctrlKey && !canUseStances) return\r\n\r\n const effectUUID = target.dataset.effectUuid\r\n toggleStance(actor, effectUUID)\r\n}\r\n\r\nfunction* actorStances(actor) {\r\n for (const feat of actor.itemTypes.feat) {\r\n const sourceId = feat.sourceId\r\n\r\n const replacer = REPLACERS.get(sourceId)\r\n const extra = EXTRAS.get(sourceId)\r\n if (!replacer && !extra && !isValidStance(feat)) continue\r\n\r\n const effectUUID = replacer?.effect ?? extra?.effect ?? feat.system.selfEffect.uuid\r\n const effect = fromUuidSync(effectUUID)\r\n if (!effect) continue\r\n\r\n yield {\r\n name: (replacer && fromUuidSync(replacer.replace)?.name) ?? feat.name,\r\n itemName: feat.name,\r\n replace: replacer?.replace,\r\n extra,\r\n sourceId,\r\n effectUUID,\r\n effect: getItemWithSourceId(actor, effectUUID, 'effect'),\r\n action: extra?.action,\r\n img: effect.img,\r\n }\r\n }\r\n}\r\n\r\nfunction getStancesEffects(actor) {\r\n const effects = []\r\n\r\n for (const { effect } of actorStances(actor)) {\r\n if (!effect) continue\r\n effects.push({\r\n uuid: effect.sourceId,\r\n id: effect.id,\r\n })\r\n }\r\n\r\n return effects\r\n}\r\n\r\nasync function toggleStance(actor, effectUUID) {\r\n const effects = getStancesEffects(actor)\r\n const already = effects.findIndex(effect => effect.uuid === effectUUID)\r\n\r\n let create = false\r\n\r\n if (already === -1) {\r\n create = true\r\n } else {\r\n const other = effects.filter(effect => effect.uuid !== effectUUID).length\r\n const more = effects.filter(effect => effect.uuid === effectUUID).length > 1\r\n if (other || more) effects.splice(already, 1)\r\n }\r\n\r\n if (effects.length) {\r\n await actor.deleteEmbeddedDocuments(\r\n 'Item',\r\n effects.map(x => x.id)\r\n )\r\n }\r\n\r\n if (create) addStance(actor, effectUUID)\r\n}\r\n\r\nasync function addStance(actor, uuid) {\r\n const effect = await fromUuid(uuid)\r\n\r\n if (effect) {\r\n const obj = effect.toObject()\r\n if (!getProperty(obj, 'flags.core.sourceId')) setProperty(obj, 'flags.core.sourceId', effect.uuid)\r\n\r\n const items = await actor.createEmbeddedDocuments('Item', [obj])\r\n items[0]?.toMessage()\r\n\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\nfunction deleteCombat(combat) {\r\n for (const combatant of combat.combatants) {\r\n deleteCombatant(combatant)\r\n }\r\n}\r\n\r\nfunction deleteCombatant(combatant) {\r\n const actor = getActorFromCombatant(combatant)\r\n if (!actor) return\r\n\r\n if (!game.user.isGM && isActiveOwner(actor)) {\r\n const effects = getStancesEffects(actor).map(effect => effect.id)\r\n if (effects.length) actor.deleteEmbeddedDocuments('Item', effects)\r\n }\r\n\r\n refreshCharacterSheets(actor)\r\n}\r\n\r\nfunction createCombatant(combatant) {\r\n const actor = getActorFromCombatant(combatant)\r\n if (!actor) return\r\n\r\n if (!game.user.isGM && isActiveOwner(actor)) checkForSavant(actor)\r\n\r\n refreshCharacterSheets(actor)\r\n}\r\n\r\nfunction getActorFromCombatant(combatant) {\r\n const actor = combatant.actor\r\n if (actor && !actor.isToken && actor.isOfType('character')) return actor\r\n}\r\n\r\nasync function checkForSavant(actor) {\r\n const stances = getStances(actor)\r\n if (!stances.length) return\r\n\r\n const hasStancesEffects = stances.filter(({ effectID }) => effectID).length\r\n if (hasStancesEffects) return\r\n\r\n const hasSavantFeat = hasItemWithSourceId(actor, STANCE_SAVANT, ['feat'])\r\n if (!hasSavantFeat) return\r\n\r\n if (stances.length === 1) {\r\n const stance = stances[0]\r\n if (await addStance(actor, stance.effectUUID)) info('stances.useStance', { stance: stance.name })\r\n } else {\r\n openStancesMenu(actor, stances)\r\n }\r\n}\r\n\r\nasync function openStancesMenu(actor, stances) {\r\n const localize = subLocalize('stances.menu')\r\n\r\n new Dialog({\r\n title: localize('title'),\r\n content: await renderTemplate(templatePath('stances/menu'), { stances, i18n: localize }),\r\n buttons: {\r\n yes: {\r\n icon: '',\r\n label: localize('accept'),\r\n callback: html => addStance(actor, html.find('[name=stance]:checked').val()),\r\n },\r\n no: {\r\n icon: '',\r\n label: localize('cancel'),\r\n },\r\n },\r\n }).render(true)\r\n}\r\n", "import { MODULE_ID } from '../module'\r\nimport { isPlayedActor } from '../shared/actor'\r\nimport { createChoicesHook } from '../shared/hook'\r\nimport { setInMemory, localeCompare, ordinalString, refreshCharacterSheets, getInMemory } from '../shared/misc'\r\nimport { templatePath } from '../shared/path'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst setHook = createChoicesHook('renderCharacterSheetPF2e', renderCharacterSheetPF2e, () => refreshCharacterSheets())\r\n\r\nexport function registerSpellsSummary() {\r\n return {\r\n settings: [\r\n {\r\n name: 'summary',\r\n type: String,\r\n default: 'disabled',\r\n scope: 'client',\r\n choices: ['disabled', 'enabled', 'sort'],\r\n onChange: value => setHook(value),\r\n },\r\n ],\r\n conflicts: ['pf2e-spells-summary'],\r\n init: isGm => {\r\n if (getSetting('summary') !== 'disabled') setHook(true, true)\r\n },\r\n }\r\n}\r\n\r\nasync function renderCharacterSheetPF2e(sheet, html) {\r\n const actor = sheet.actor\r\n if (!isPlayedActor(actor)) return\r\n\r\n const tab = getSpellcastingTab(html)\r\n\r\n if (getInMemory(sheet, 'toggled')) tab.addClass('toggled')\r\n\r\n getSpellcastingNav(html).on('click', event => onSpellcastingBtnToggle(event, html, sheet))\r\n await addSummaryTab(html, sheet, actor)\r\n\r\n if (tab.hasClass('toggled') && tab.hasClass('active')) {\r\n sheet._restoreScrollPositions(html)\r\n }\r\n}\r\n\r\nasync function addSummaryTab(html, sheet, actor) {\r\n const tab = getSpellcastingTab(html)\r\n const data = await getData(actor)\r\n\r\n const template = await renderTemplate(templatePath('summary/sheet'), data)\r\n\r\n tab.append(template)\r\n addSummaryEvents(html, sheet, actor)\r\n}\r\n\r\nfunction addSummaryEvents(html, sheet, actor) {\r\n const summary = getSpellcastingSummarySection(html)\r\n\r\n const inputs = summary.find('.spell-type .uses .spell-slots-input input')\r\n inputs.on('change', event => onUsesInputChange(event, actor))\r\n inputs.on('focus', onUsesInputFocus)\r\n inputs.on('blur', onUsesInputBlur)\r\n\r\n summary.find('[data-action=cast-spell]').on('click', event => onCastSpell(event, actor))\r\n summary.find('.item-toggle-prepare').on('click', event => onTogglePrepare(event, actor))\r\n summary.find('.focus-pips').on('click contextmenu', event => onToggleFocusPool(event, actor))\r\n summary.find('.spell-slots-increment-reset').on('click', event => onSlotsReset(event, sheet, actor))\r\n summary.find('.item-image').on('click', event => onItemToChat(event, actor))\r\n summary.find('.item-name > h4').on('click', event => onToggleSummary(event, sheet))\r\n}\r\n\r\nasync function onUsesInputChange(event, actor) {\r\n event.preventDefault()\r\n\r\n const { inputPath, entryId } = $(event.currentTarget).data()\r\n const value = event.currentTarget.valueAsNumber\r\n actor.updateEmbeddedDocuments('Item', [{ _id: entryId, [inputPath]: value }])\r\n}\r\n\r\nfunction onUsesInputFocus(event) {\r\n event.preventDefault()\r\n event.currentTarget.closest('.item')?.classList.add('hover')\r\n}\r\n\r\nfunction onUsesInputBlur(event) {\r\n event.preventDefault()\r\n event.currentTarget.closest('.item')?.classList.remove('hover')\r\n}\r\n\r\nfunction onTogglePrepare(event, actor) {\r\n event.preventDefault()\r\n const { slotLevel, slotId, entryId, expended } = $(event.currentTarget).closest('.item').data()\r\n const collection = actor.spellcasting.collections.get(entryId)\r\n collection?.setSlotExpendedState(slotLevel ?? 0, slotId ?? 0, expended !== true)\r\n}\r\n\r\nfunction onToggleFocusPool(event, actor) {\r\n event.preventDefault()\r\n const change = event.type === 'click' ? 1 : -1\r\n const points = (actor.system.resources.focus?.value ?? 0) + change\r\n actor.update({ 'system.resources.focus.value': points })\r\n}\r\n\r\nfunction onChargeReset(sheet, entryId) {\r\n const original = getSpellcastingOriginalSection(sheet.element)\r\n const entry = original.find(`.item-container.spellcasting-entry[data-item-id=${entryId}]`)\r\n const btn = entry.find('.spell-ability-data .statistic-values a.pf2e-staves-charge')\r\n btn[0]?.click()\r\n}\r\n\r\nfunction onSlotsReset(event, sheet, actor) {\r\n event.preventDefault()\r\n\r\n const { itemId, level, isCharge } = $(event.currentTarget).data()\r\n if (!itemId) return\r\n\r\n if (isCharge) {\r\n onChargeReset(sheet, itemId)\r\n return\r\n }\r\n\r\n const item = actor.items.get(itemId)\r\n if (!item) return\r\n\r\n if (item.isOfType('spellcastingEntry')) {\r\n const slotLevel = level >= 0 && level <= 11 ? `slot${level}` : 'slot0'\r\n const slot = item.system.slots?.[slotLevel]\r\n if (slot) item.update({ [`system.slots.${slotLevel}.value`]: slot.max })\r\n } else if (item.isOfType('spell')) {\r\n const max = item.system.location.uses?.max\r\n if (max) item.update({ 'system.location.uses.value': max })\r\n }\r\n}\r\n\r\nfunction onCastSpell(event, actor) {\r\n event.preventDefault()\r\n\r\n const target = $(event.currentTarget)\r\n if (target.prop('disabled')) return\r\n\r\n const { itemId, slotLevel, slotId, entryId } = target.closest('.item').data()\r\n const collection = actor.spellcasting.collections.get(entryId)\r\n if (!collection) return\r\n\r\n const spell = collection.get(itemId)\r\n if (!spell) return\r\n\r\n collection.entry.cast(spell, { slot: slotId, level: slotLevel })\r\n}\r\n\r\nasync function onToggleSummary(event, sheet) {\r\n const item = event.currentTarget.closest('.item')\r\n await sheet.itemRenderer.toggleSummary(item)\r\n}\r\n\r\nasync function onItemToChat(event, actor) {\r\n const itemId = $(event.currentTarget).closest('.item').attr('data-item-id')\r\n const item = actor.items.get(itemId)\r\n if (!item || (item.isOfType('physical') && !item.isIdentified)) return\r\n await item.toMessage(event)\r\n}\r\n\r\nfunction onSpellcastingBtnToggle(event, html, sheet) {\r\n event.preventDefault()\r\n\r\n const tab = getSpellcastingTab(html)\r\n\r\n if (tab.hasClass('active')) {\r\n tab.toggleClass('toggled')\r\n tab.scrollTop(0)\r\n setInMemory(sheet, 'toggled', tab.hasClass('toggled'))\r\n }\r\n}\r\n\r\nfunction getSpellcastingNav(html) {\r\n return html.find('nav.sheet-navigation .item[data-tab=spellcasting]')\r\n}\r\n\r\nfunction getSpellcastingTab(html) {\r\n return html.find('section.sheet-body .sheet-content > .tab[data-tab=spellcasting]')\r\n}\r\n\r\nfunction getSpellcastingOriginalSection(html) {\r\n return getSpellcastingTab(html).find('.directory-list.spellcastingEntry-list')\r\n}\r\n\r\nfunction getSpellcastingSummarySection(html) {\r\n return getSpellcastingTab(html).find('.directory-list.summary')\r\n}\r\n\r\nasync function getData(actor) {\r\n const focusPool = actor.system.resources.focus ?? { value: 0, max: 0 }\r\n const stavesActive = game.modules.get('pf2e-staves')?.active\r\n const spells = []\r\n const focuses = []\r\n\r\n let hasFocusCantrips = false\r\n\r\n await Promise.all(\r\n actor.spellcasting.regular.map(async entry => {\r\n const entryId = entry.id\r\n const entryDc = entry.statistic.dc.value\r\n const entryName = entry.name\r\n const data = await entry.getSheetData()\r\n const isFocus = data.isFocusPool\r\n const isCharge = entry.system?.prepared?.value === 'charge'\r\n const isStaff = getProperty(entry, 'flags.pf2e-staves.staveID') !== undefined\r\n const charges = { value: getProperty(entry, 'flags.pf2e-staves.charges') ?? 0 }\r\n\r\n for (const slot of data.levels) {\r\n if (!slot.active.length || slot.uses?.max === 0) continue\r\n\r\n const slotSpells = []\r\n const isCantrip = slot.isCantrip\r\n const actives = slot.active.filter(x => x && x.uses?.max !== 0)\r\n const isBroken = !isCantrip && isCharge && !stavesActive\r\n\r\n for (let slotId = 0; slotId < actives.length; slotId++) {\r\n const { spell, expended, virtual, uses, castLevel } = actives[slotId]\r\n\r\n slotSpells.push({\r\n name: spell.name,\r\n img: spell.img,\r\n range: spell.system.range.value || '-',\r\n castLevel: castLevel ?? spell.level,\r\n slotId,\r\n entryId,\r\n entryDc,\r\n entryName,\r\n itemId: spell.id,\r\n inputId: data.isInnate ? spell.id : data.id,\r\n inputPath: isCharge\r\n ? 'flags.pf2e-staves.charges'\r\n : data.isInnate\r\n ? 'system.location.uses.value'\r\n : `system.slots.slot${slot.level}.value`,\r\n isCharge,\r\n isActiveCharge: isCharge && stavesActive,\r\n isBroken,\r\n isVirtual: virtual,\r\n isInnate: data.isInnate,\r\n isCantrip: isCantrip,\r\n isFocus,\r\n isPrepared: data.isPrepared,\r\n isSpontaneous: data.isSpontaneous || data.isFlexible,\r\n slotLevel: slot.level,\r\n uses: uses ?? (isCharge ? charges : slot.uses),\r\n expended: expended ?? (isFocus && !isCantrip ? focusPool.value <= 0 : false),\r\n action: spell.system.time.value,\r\n type: isCharge\r\n ? isStaff\r\n ? `${MODULE_ID}.summary.staff`\r\n : `${MODULE_ID}.summary.charges`\r\n : data.isInnate\r\n ? 'PF2E.PreparationTypeInnate'\r\n : data.isSpontaneous\r\n ? 'PF2E.PreparationTypeSpontaneous'\r\n : data.isFlexible\r\n ? 'PF2E.SpellFlexibleLabel'\r\n : isFocus\r\n ? 'PF2E.SpellFocusLabel'\r\n : 'PF2E.SpellPreparedLabel',\r\n order: isCharge ? 0 : data.isPrepared ? 1 : isFocus ? 2 : data.isInnate ? 3 : data.isSpontaneous ? 4 : 5,\r\n noHover: data.isPrepared || isCantrip || isBroken || isFocus,\r\n })\r\n }\r\n\r\n if (slotSpells.length) {\r\n if (isFocus) {\r\n if (isCantrip) hasFocusCantrips = true\r\n else {\r\n focuses.push(...slotSpells)\r\n continue\r\n }\r\n }\r\n\r\n spells[slot.level] ??= []\r\n spells[slot.level].push(...slotSpells)\r\n }\r\n }\r\n })\r\n )\r\n\r\n if (spells.length) {\r\n const sort =\r\n getSetting('summary') === 'sort'\r\n ? (a, b) => (a.order === b.order ? localeCompare(a.name, b.name) : a.order - b.order)\r\n : (a, b) => localeCompare(a.name, b.name)\r\n spells.forEach(entry => entry.sort(sort))\r\n }\r\n\r\n if (focuses.length) {\r\n focuses.sort((a, b) => localeCompare(a.name, b.name))\r\n spells[12] = focuses\r\n hasFocusCantrips = false\r\n }\r\n\r\n const ritualData = await actor.spellcasting.ritual?.getSheetData()\r\n const rituals = ritualData?.levels.flatMap((slot, slotId) =>\r\n slot.active\r\n .map(({ spell }) => ({\r\n name: spell.name,\r\n img: spell.img,\r\n slotId,\r\n itemId: spell.id,\r\n level: spell.level,\r\n time: spell.system.time.value,\r\n }))\r\n .filter(Boolean)\r\n )\r\n\r\n return {\r\n spells,\r\n rituals,\r\n focusPool,\r\n stavesActive,\r\n hasFocusCantrips,\r\n isOwner: actor.isOwner,\r\n entryRank: rank => game.i18n.format('PF2E.Item.Spell.Rank.Ordinal', { rank: ordinalString(rank) }),\r\n }\r\n}\r\n", "import { onDamageApplied } from '../features/target'\r\nimport { isInstanceOf } from './misc'\r\n\r\nexport function ErrorPF2e(message) {\r\n return Error(`PF2e System | ${message}`)\r\n}\r\n\r\n/**\r\n * DegreeOfSuccess\r\n */\r\n\r\nconst DEGREE_ADJUSTMENT_AMOUNTS = {\r\n LOWER_BY_TWO: -2,\r\n LOWER: -1,\r\n INCREASE: 1,\r\n INCREASE_BY_TWO: 2,\r\n TO_CRITICAL_FAILURE: 'criticalFailure',\r\n TO_FAILURE: 'failure',\r\n TO_SUCCESS: 'success',\r\n TO_CRITICAL_SUCCESS: 'criticalSuccess',\r\n}\r\n\r\nconst DEGREE_OF_SUCCESS_STRINGS = ['criticalFailure', 'failure', 'success', 'criticalSuccess']\r\n\r\nexport class DegreeOfSuccess {\r\n constructor(roll, dc, dosAdjustments = null) {\r\n if (roll instanceof Roll) {\r\n this.dieResult =\r\n (roll.isDeterministic\r\n ? roll.terms.find(t => t instanceof NumericTerm)\r\n : roll.dice.find(d => d instanceof Die && d.faces === 20)\r\n )?.total ?? 1\r\n this.rollTotal = roll.total\r\n } else {\r\n this.dieResult = roll.dieValue\r\n this.rollTotal = roll.dieValue + roll.modifier\r\n }\r\n\r\n this.dc = typeof dc === 'number' ? { value: dc } : dc\r\n\r\n this.unadjusted = this.#calculateDegreeOfSuccess()\r\n this.adjustment = this.#getDegreeAdjustment(this.unadjusted, dosAdjustments)\r\n this.value = this.adjustment ? this.#adjustDegreeOfSuccess(this.adjustment.amount, this.unadjusted) : this.unadjusted\r\n }\r\n\r\n static CRITICAL_FAILURE = 0\r\n static FAILURE = 1\r\n static SUCCESS = 2\r\n static CRITICAL_SUCCESS = 3\r\n\r\n #getDegreeAdjustment(degree, adjustments) {\r\n if (!adjustments) return null\r\n\r\n for (const outcome of ['all', ...DEGREE_OF_SUCCESS_STRINGS]) {\r\n const { label, amount } = adjustments[outcome] ?? {}\r\n if (\r\n amount &&\r\n label &&\r\n !(degree === DegreeOfSuccess.CRITICAL_SUCCESS && amount === DEGREE_ADJUSTMENT_AMOUNTS.INCREASE) &&\r\n !(degree === DegreeOfSuccess.CRITICAL_FAILURE && amount === DEGREE_ADJUSTMENT_AMOUNTS.LOWER) &&\r\n (outcome === 'all' || DEGREE_OF_SUCCESS_STRINGS.indexOf(outcome) === degree)\r\n ) {\r\n return { label, amount }\r\n }\r\n }\r\n\r\n return null\r\n }\r\n\r\n #adjustDegreeOfSuccess(amount, degreeOfSuccess) {\r\n switch (amount) {\r\n case 'criticalFailure':\r\n return 0\r\n case 'failure':\r\n return 1\r\n case 'success':\r\n return 2\r\n case 'criticalSuccess':\r\n return 3\r\n default:\r\n return Math.clamped(degreeOfSuccess + amount, 0, 3)\r\n }\r\n }\r\n\r\n /**\r\n * @param degree The current success value\r\n * @return The new success value\r\n */\r\n #adjustDegreeByDieValue(degree) {\r\n if (this.dieResult === 20) {\r\n return this.#adjustDegreeOfSuccess(DEGREE_ADJUSTMENT_AMOUNTS.INCREASE, degree)\r\n } else if (this.dieResult === 1) {\r\n return this.#adjustDegreeOfSuccess(DEGREE_ADJUSTMENT_AMOUNTS.LOWER, degree)\r\n }\r\n\r\n return degree\r\n }\r\n\r\n #calculateDegreeOfSuccess() {\r\n const dc = this.dc.value\r\n\r\n if (this.rollTotal - dc >= 10) {\r\n return this.#adjustDegreeByDieValue(DegreeOfSuccess.CRITICAL_SUCCESS)\r\n } else if (dc - this.rollTotal >= 10) {\r\n return this.#adjustDegreeByDieValue(DegreeOfSuccess.CRITICAL_FAILURE)\r\n } else if (this.rollTotal >= dc) {\r\n return this.#adjustDegreeByDieValue(DegreeOfSuccess.SUCCESS)\r\n }\r\n\r\n return this.#adjustDegreeByDieValue(DegreeOfSuccess.FAILURE)\r\n }\r\n}\r\n\r\n/**\r\n * applyDamageFromMessage\r\n */\r\n\r\nasync function extractEphemeralEffects({ affects, origin, target, item, domains, options }) {\r\n if (!(origin && target)) return []\r\n\r\n const [effectsFrom, effectsTo] = affects === 'target' ? [origin, target] : [target, origin]\r\n const fullOptions = [...options, effectsFrom.getRollOptions(domains), effectsTo.getSelfRollOptions(affects)].flat()\r\n const resolvables = item ? (item.isOfType('spell') ? { spell: item } : { weapon: item }) : {}\r\n return (\r\n await Promise.all(\r\n domains\r\n .flatMap(s => effectsFrom.synthetics.ephemeralEffects[s]?.[affects] ?? [])\r\n .map(d => d({ test: fullOptions, resolvables }))\r\n )\r\n ).flatMap(e => e ?? [])\r\n}\r\n\r\nfunction extractNotes(rollNotes, selectors) {\r\n return selectors.flatMap(s => (rollNotes[s] ?? []).map(n => n.clone()))\r\n}\r\n\r\nfunction extractDamageDice(deferredDice, selectors, options) {\r\n return selectors.flatMap(s => deferredDice[s] ?? []).flatMap(d => d(options) ?? [])\r\n}\r\n\r\nasync function shiftAdjustDamage(token, { message, multiplier, rollIndex }) {\r\n const content = await renderTemplate('systems/pf2e/templates/chat/damage/adjustment-dialog.hbs')\r\n const AdjustmentDialog = class extends Dialog {\r\n activateListeners($html) {\r\n super.activateListeners($html)\r\n $html[0].querySelector('input')?.focus()\r\n }\r\n }\r\n const isHealing = multiplier < 0\r\n new AdjustmentDialog({\r\n title: game.i18n.localize(isHealing ? 'PF2E.UI.shiftModifyHealingTitle' : 'PF2E.UI.shiftModifyDamageTitle'),\r\n content,\r\n buttons: {\r\n ok: {\r\n label: game.i18n.localize('PF2E.OK'),\r\n callback: async $dialog => {\r\n // In case of healing, multipler will have negative sign. The user will expect that positive\r\n // modifier would increase healing value, while negative would decrease.\r\n const adjustment = (Number($dialog[0].querySelector('input')?.value) || 0) * Math.sign(multiplier)\r\n applyDamageFromMessage(token, {\r\n message,\r\n multiplier,\r\n addend: adjustment,\r\n promptModifier: false,\r\n rollIndex,\r\n })\r\n },\r\n },\r\n cancel: {\r\n label: 'Cancel',\r\n },\r\n },\r\n default: 'ok',\r\n close: () => {\r\n toggleOffShieldBlock(message.id)\r\n },\r\n }).render(true)\r\n}\r\n\r\nexport async function applyDamageFromMessage(\r\n token,\r\n { message, multiplier = 1, addend = 0, promptModifier = false, rollIndex = 0 }\r\n) {\r\n if (promptModifier) return shiftAdjustDamage(token, { message, multiplier, rollIndex })\r\n\r\n const shieldBlockRequest = CONFIG.PF2E.chatDamageButtonShieldToggle\r\n const roll = message.rolls.at(rollIndex)\r\n if (!isInstanceOf(roll, 'DamageRoll')) throw ErrorPF2e('Unexpected error retrieving damage roll')\r\n\r\n let damage = multiplier < 0 ? multiplier * roll.total + addend : roll.alter(multiplier, addend)\r\n\r\n // Get origin roll options and apply damage to a contextual clone: this may influence condition IWR, for example\r\n const messageRollOptions = [...(message.flags.pf2e.context?.options ?? [])]\r\n const originRollOptions = messageRollOptions.filter(o => o.startsWith('self:')).map(o => o.replace(/^self/, 'origin'))\r\n const messageItem = message.item\r\n\r\n if (!token.actor) return\r\n\r\n // If no target was acquired during a roll, set roll options for it during damage application\r\n if (!messageRollOptions.some(o => o.startsWith('target'))) {\r\n messageRollOptions.push(...token.actor.getSelfRollOptions('target'))\r\n }\r\n const domain = multiplier > 0 ? 'damage-received' : 'healing-received'\r\n const ephemeralEffects =\r\n multiplier > 0\r\n ? await extractEphemeralEffects({\r\n affects: 'target',\r\n origin: message.actor,\r\n target: token.actor,\r\n item: message.item,\r\n domains: [domain],\r\n options: messageRollOptions,\r\n })\r\n : []\r\n const contextClone = token.actor.getContextualClone(originRollOptions, ephemeralEffects)\r\n const applicationRollOptions = new Set([\r\n ...messageRollOptions.filter(o => !/^(?:self|target):/.test(o)),\r\n ...originRollOptions,\r\n ...contextClone.getSelfRollOptions(),\r\n ])\r\n\r\n // Target-specific damage/healing adjustments\r\n const outcome = message.flags.pf2e.context?.outcome\r\n const breakdown = []\r\n const rolls = []\r\n if (typeof damage === 'number' && damage < 0) {\r\n const critical = outcome === 'criticalSuccess'\r\n\r\n const resolvables = (() => {\r\n if (messageItem?.isOfType('spell')) return { spell: messageItem }\r\n if (messageItem?.isOfType('weapon')) return { weapon: messageItem }\r\n return {}\r\n })()\r\n\r\n const damageDice = extractDamageDice(contextClone.synthetics.damageDice, [domain], {\r\n resolvables,\r\n test: applicationRollOptions,\r\n }).filter(d => (d.critical === null || d.critical === critical) && d.predicate.test(applicationRollOptions))\r\n\r\n for (const dice of damageDice) {\r\n const formula = `${dice.diceNumber}${dice.dieSize}[${dice.label}]`\r\n const roll = await new Roll(formula).evaluate({ async: true })\r\n roll._formula = `${dice.diceNumber}${dice.dieSize}` // remove the label from the main formula\r\n await roll.toMessage({\r\n flags: { pf2e: { suppressDamageButtons: true } },\r\n flavor: dice.label,\r\n speaker: ChatMessage.getSpeaker({ token }),\r\n })\r\n breakdown.push(`${dice.label} ${dice.diceNumber}${dice.dieSize}`)\r\n rolls.push(roll)\r\n }\r\n if (rolls.length) {\r\n damage -= rolls.map(roll => roll.total).reduce((previous, current) => previous + current)\r\n }\r\n\r\n const modifiers = extractModifiers(contextClone.synthetics, [domain], { resolvables }).filter(\r\n m => (m.critical === null || m.critical === critical) && m.predicate.test(applicationRollOptions)\r\n )\r\n\r\n // unlikely to have any typed modifiers, but apply stacking rules just in case even though the context of\r\n // previously applied modifiers has been lost\r\n damage -= applyStackingRules(modifiers ?? [])\r\n\r\n // target-specific modifiers breakdown\r\n breakdown.push(...modifiers.filter(m => m.enabled).map(m => `${m.label} ${signedInteger(m.modifier)}`))\r\n }\r\n\r\n const hasDamage = typeof damage === 'number' ? damage !== 0 : damage.total !== 0\r\n const notes = (() => {\r\n if (!hasDamage) return []\r\n return extractNotes(contextClone.synthetics.rollNotes, [domain])\r\n .filter(\r\n n =>\r\n (!outcome || n.outcome.length === 0 || n.outcome.includes(outcome)) &&\r\n n.predicate.test(applicationRollOptions)\r\n )\r\n .map(note => note.text)\r\n })()\r\n\r\n await contextClone.applyDamage({\r\n damage,\r\n token,\r\n item: message.item,\r\n skipIWR: multiplier <= 0,\r\n rollOptions: applicationRollOptions,\r\n shieldBlockRequest,\r\n breakdown,\r\n notes,\r\n })\r\n\r\n toggleOffShieldBlock(message.id)\r\n\r\n /**\r\n * added stuff HERE\r\n */\r\n onDamageApplied(message, token.id, rollIndex)\r\n}\r\n\r\nfunction applyStacking(best, modifier, isBetter) {\r\n // If there is no existing bonus of this type, then add ourselves.\r\n const existing = best[modifier.type]\r\n if (existing === undefined) {\r\n modifier.enabled = true\r\n best[modifier.type] = modifier\r\n return modifier.modifier\r\n }\r\n\r\n if (isBetter(modifier, existing)) {\r\n // If we are a better modifier according to the comparison, then we become the new 'best'.\r\n existing.enabled = false\r\n modifier.enabled = true\r\n best[modifier.type] = modifier\r\n return modifier.modifier - existing.modifier\r\n } else {\r\n // Otherwise, the existing modifier is better, so do nothing.\r\n modifier.enabled = false\r\n return 0\r\n }\r\n}\r\n\r\nfunction applyStackingRules(modifiers) {\r\n let total = 0\r\n const highestBonus = {}\r\n const lowestPenalty = {}\r\n\r\n // There are no ability bonuses or penalties, so always take the highest ability modifier.\r\n const abilityModifiers = modifiers.filter(m => m.type === 'ability' && !m.ignored)\r\n const bestAbility = abilityModifiers.reduce((best, modifier) => {\r\n if (best === null) {\r\n return modifier\r\n } else {\r\n return modifier.force ? modifier : best.force ? best : modifier.modifier > best.modifier ? modifier : best\r\n }\r\n }, null)\r\n for (const modifier of abilityModifiers) {\r\n modifier.ignored = modifier !== bestAbility\r\n }\r\n\r\n for (const modifier of modifiers) {\r\n // Always disable ignored modifiers and don't do anything further with them.\r\n if (modifier.ignored) {\r\n modifier.enabled = false\r\n continue\r\n }\r\n\r\n // Untyped modifiers always stack, so enable them and add their modifier.\r\n if (modifier.type === 'untyped') {\r\n modifier.enabled = true\r\n total += modifier.modifier\r\n continue\r\n }\r\n\r\n // Otherwise, apply stacking rules to positive modifiers and negative modifiers separately.\r\n if (modifier.modifier < 0) {\r\n total += applyStacking(lowestPenalty, modifier, LOWER_PENALTY)\r\n } else {\r\n total += applyStacking(highestBonus, modifier, HIGHER_BONUS)\r\n }\r\n }\r\n\r\n return total\r\n}\r\n\r\nfunction extractModifierAdjustments(adjustmentsRecord, selectors, slug) {\r\n const adjustments = Array.from(new Set(selectors.flatMap(s => adjustmentsRecord[s] ?? [])))\r\n return adjustments.filter(a => [slug, null].includes(a.slug))\r\n}\r\n\r\nfunction extractModifiers(synthetics, selectors, options) {\r\n const { modifierAdjustments, modifiers: syntheticModifiers } = synthetics\r\n const modifiers = Array.from(new Set(selectors))\r\n .flatMap(s => syntheticModifiers[s] ?? [])\r\n .flatMap(d => d(options) ?? [])\r\n for (const modifier of modifiers) {\r\n modifier.adjustments = extractModifierAdjustments(modifierAdjustments, selectors, modifier.slug)\r\n }\r\n\r\n return modifiers\r\n}\r\n\r\nfunction toggleOffShieldBlock(messageId) {\r\n for (const app of ['#chat-log', '#chat-popout']) {\r\n const selector = `${app} > li.chat-message[data-message-id=\"${messageId}\"] button[data-action=shield-block]`\r\n const button = htmlQuery(document.body, selector)\r\n button?.classList.remove('shield-activated')\r\n }\r\n CONFIG.PF2E.chatDamageButtonShieldToggle = false\r\n}\r\n\r\nfunction htmlQuery(parent, selectors) {\r\n if (!(parent instanceof Element || parent instanceof Document)) return null\r\n return parent.querySelector(selectors)\r\n}\r\n\r\nexport function onClickShieldBlock(target, shieldButton, messageEl) {\r\n const getTokens = () => {\r\n return [target]\r\n }\r\n\r\n const getNonBrokenShields = tokens => {\r\n const actor = tokens[0]?.actor\r\n return actor?.itemTypes.shield.filter(s => s.isEquipped && !s.isBroken && !s.isDestroyed) ?? []\r\n }\r\n\r\n // Add a tooltipster instance to the shield button if needed.\r\n if (!shieldButton.classList.contains('tooltipstered')) {\r\n $(shieldButton)\r\n .tooltipster({\r\n animation: 'fade',\r\n trigger: 'click',\r\n arrow: false,\r\n content: $(messageEl).find('div.hover-content'),\r\n contentAsHTML: true,\r\n contentCloning: true,\r\n debug: false,\r\n interactive: true,\r\n side: ['top'],\r\n theme: 'crb-hover',\r\n functionBefore: () => {\r\n const tokens = getTokens()\r\n if (!tokens.length) return false\r\n\r\n const nonBrokenShields = getNonBrokenShields(tokens)\r\n const hasMultipleShields = tokens.length === 1 && nonBrokenShields.length > 1\r\n const shieldActivated = shieldButton.classList.contains('shield-activated')\r\n\r\n // More than one shield and no selection. Show tooltip.\r\n if (hasMultipleShields && !shieldActivated) {\r\n return true\r\n }\r\n\r\n // More than one shield and one was previously selected. Remove selection and show tooltip.\r\n if (hasMultipleShields && shieldButton.dataset.shieldId) {\r\n shieldButton.attributes.removeNamedItem('data-shield-id')\r\n shieldButton.classList.remove('shield-activated')\r\n CONFIG.PF2E.chatDamageButtonShieldToggle = false\r\n return true\r\n }\r\n\r\n // Normal toggle behaviour. Tooltip is suppressed.\r\n shieldButton.classList.toggle('shield-activated')\r\n CONFIG.PF2E.chatDamageButtonShieldToggle = !CONFIG.PF2E.chatDamageButtonShieldToggle\r\n return false\r\n },\r\n functionFormat: (instance, _helper, $content) => {\r\n const tokens = getTokens()\r\n const nonBrokenShields = getNonBrokenShields(tokens)\r\n const multipleShields = tokens.length === 1 && nonBrokenShields.length > 1\r\n const shieldActivated = shieldButton.classList.contains('shield-activated')\r\n\r\n // If the actor is wielding more than one shield, have the user pick which shield to use for blocking.\r\n if (multipleShields && !shieldActivated) {\r\n const content = $content[0]\r\n // Populate the list with the shield options\r\n const listEl = htmlQuery(content, 'ul.shield-options')\r\n if (!listEl) return $content\r\n const shieldList = []\r\n for (const shield of nonBrokenShields) {\r\n const input = document.createElement('input')\r\n input.classList.add('data')\r\n input.type = 'radio'\r\n input.name = 'shield-id'\r\n input.value = shield.id\r\n input.addEventListener('click', () => {\r\n shieldButton.dataset.shieldId = input.value\r\n shieldButton.classList.add('shield-activated')\r\n CONFIG.PF2E.chatDamageButtonShieldToggle = true\r\n instance.close()\r\n })\r\n const shieldName = document.createElement('span')\r\n shieldName.classList.add('label')\r\n shieldName.innerHTML = shield.name\r\n\r\n const hardness = document.createElement('span')\r\n hardness.classList.add('tag')\r\n const hardnessLabel = game.i18n.localize('PF2E.HardnessLabel')\r\n hardness.innerHTML = `${hardnessLabel}: ${shield.hardness}`\r\n const itemLi = document.createElement('li')\r\n itemLi.classList.add('item')\r\n itemLi.append(input, shieldName, hardness)\r\n shieldList.push(itemLi)\r\n }\r\n listEl.replaceChildren(...shieldList)\r\n }\r\n return $content\r\n },\r\n })\r\n .tooltipster('open')\r\n }\r\n}\r\n", "export function getTemplateTokens(template, { collisionOrigin, collisionType = 'move' } = {}) {\r\n template = template instanceof MeasuredTemplateDocument ? template.object : template\r\n\r\n if (!canvas.scene) return []\r\n const { grid, dimensions } = canvas\r\n if (!(grid && dimensions)) return []\r\n\r\n if (!template?.highlightId) return []\r\n\r\n const gridHighlight = grid.getHighlightLayer(template.highlightId)\r\n if (!gridHighlight || grid.type !== CONST.GRID_TYPES.SQUARE) return []\r\n const origin = collisionOrigin ?? template.center\r\n\r\n // Get all the tokens that are inside the highlight bounds\r\n const tokens = canvas.tokens.quadtree.getObjects(gridHighlight.getLocalBounds(undefined, true))\r\n\r\n const gridSize = grid.size\r\n\r\n const containedTokens = []\r\n for (const token of tokens) {\r\n const tokenDoc = token.document\r\n\r\n // Collect the position of all grid squares that this token occupies as \"x.y\"\r\n const tokenPositions = []\r\n for (let h = 0; h < tokenDoc.height; h++) {\r\n const tokenX = Math.floor(token.x / gridSize) * gridSize\r\n const tokenY = Math.floor(token.y / gridSize) * gridSize\r\n\r\n const y = tokenY + h * gridSize\r\n tokenPositions.push(`${tokenX}.${y}`)\r\n if (tokenDoc.width > 1) {\r\n for (let w = 1; w < tokenDoc.width; w++) {\r\n tokenPositions.push(`${tokenX + w * gridSize}.${y}`)\r\n }\r\n }\r\n }\r\n\r\n for (const position of tokenPositions) {\r\n // Check if a position exists within this GridHiglight\r\n if (!gridHighlight.positions.has(position)) {\r\n continue\r\n }\r\n // Position of cell's top-left corner, in pixels\r\n const [gx, gy] = position.split('.').map(s => Number(s))\r\n // Position of cell's center in pixels\r\n const destination = {\r\n x: gx + dimensions.size * 0.5,\r\n y: gy + dimensions.size * 0.5,\r\n }\r\n if (destination.x < 0 || destination.y < 0) continue\r\n\r\n const hasCollision =\r\n canvas.ready &&\r\n collisionType &&\r\n CONFIG.Canvas.polygonBackends[collisionType].testCollision(origin, destination, {\r\n type: collisionType,\r\n mode: 'any',\r\n })\r\n\r\n if (!hasCollision) {\r\n containedTokens.push(token)\r\n break\r\n }\r\n }\r\n }\r\n return containedTokens\r\n}\r\n", "import { bindOnPreCreateSpellDamageChatMessage } from '../shared/chat'\r\nimport { getFlag, moduleFlagUpdate, setFlag, updateSourceFlag } from '../shared/flags'\r\nimport { createChoicesHook, createHook } from '../shared/hook'\r\nimport { localize, subLocalize } from '../shared/localize'\r\nimport { getInMemory, setInMemory } from '../shared/misc'\r\nimport { warn } from '../shared/notification'\r\nimport { templatePath } from '../shared/path'\r\nimport { DegreeOfSuccess, applyDamageFromMessage, onClickShieldBlock } from '../shared/pf2e'\r\nimport { getSetting } from '../shared/settings'\r\nimport { socketEmit, socketOff, socketOn } from '../shared/socket'\r\nimport { getTemplateTokens } from '../shared/template'\r\nimport { isActiveGM, isUserGM } from '../shared/user'\r\n\r\nconst SAVES = {\r\n fortitude: { icon: 'fa-solid fa-chess-rook', label: 'PF2E.SavesFortitude' },\r\n reflex: { icon: 'fa-solid fa-person-running', label: 'PF2E.SavesReflex' },\r\n will: { icon: 'fa-solid fa-brain', label: 'PF2E.SavesWill' },\r\n}\r\n\r\nconst REROLL = {\r\n hero: {\r\n icon: 'fa-solid fa-hospital-symbol',\r\n reroll: 'PF2E.RerollMenu.HeroPoint',\r\n rerolled: 'PF2E.RerollMenu.MessageHeroPoint',\r\n },\r\n new: {\r\n icon: 'fa-solid fa-dice',\r\n reroll: 'PF2E.RerollMenu.KeepNew',\r\n rerolled: 'PF2E.RerollMenu.MessageKeep.new',\r\n },\r\n lower: {\r\n icon: 'fa-solid fa-dice-one',\r\n reroll: 'PF2E.RerollMenu.KeepLower',\r\n rerolled: 'PF2E.RerollMenu.MessageKeep.lower',\r\n },\r\n higher: {\r\n icon: 'fa-solid fa-dice-six',\r\n reroll: 'PF2E.RerollMenu.KeepHigher',\r\n rerolled: 'PF2E.RerollMenu.MessageKeep.higher',\r\n },\r\n}\r\n\r\nconst DEGREE_OF_SUCCESS = ['criticalFailure', 'failure', 'success', 'criticalSuccess']\r\n\r\nconst setPrecreateMessageHook = createHook('preCreateChatMessage', preCreateChatMessage)\r\nconst setRenderMessageHook = createChoicesHook('renderChatMessage', renderChatMessage)\r\nconst setCreateTemplateHook = createHook('createMeasuredTemplate', createMeasuredTemplate)\r\n\r\nlet SOCKET = false\r\n\r\nexport function registerTargetTokenHelper() {\r\n return {\r\n settings: [\r\n {\r\n name: 'target',\r\n type: Boolean,\r\n default: false,\r\n onChange: setHooks,\r\n },\r\n {\r\n name: 'target-chat',\r\n type: String,\r\n default: 'disabled',\r\n choices: ['disabled', 'small', 'big'],\r\n scope: 'client',\r\n onChange: value => setRenderMessageHook(value && getSetting('target')),\r\n migrate: {\r\n 1: value => (value === 'true' ? 'small' : value === 'false' ? 'disabled' : undefined),\r\n },\r\n },\r\n {\r\n name: 'target-template',\r\n type: Boolean,\r\n default: false,\r\n scope: 'client',\r\n onChange: value => setCreateTemplateHook(value && getSetting('target')),\r\n },\r\n ],\r\n conflicts: [],\r\n init: () => {\r\n if (getSetting('target')) setHooks(true)\r\n },\r\n }\r\n}\r\n\r\nfunction setHooks(value) {\r\n setPrecreateMessageHook(value)\r\n setRenderMessageHook(value)\r\n setCreateTemplateHook(value && getSetting('target-template'))\r\n\r\n if (isUserGM()) {\r\n if (value && !SOCKET) {\r\n socketOn(onSocket)\r\n SOCKET = true\r\n } else if (!value && SOCKET) {\r\n socketOff(onSocket)\r\n SOCKET = false\r\n }\r\n }\r\n}\r\n\r\nfunction onSocket(packet) {\r\n if (!isActiveGM()) return\r\n switch (packet.type) {\r\n case 'target.update-save':\r\n updateMessageSave(packet)\r\n break\r\n case 'target.update-applied':\r\n updateMessageApplied(packet)\r\n break\r\n }\r\n}\r\n\r\nasync function createMeasuredTemplate(template, _, userId) {\r\n const user = game.user\r\n if (user.id !== userId) return\r\n\r\n const localize = subLocalize('target.menu')\r\n const item = template.item\r\n const actor = item?.actor\r\n const self = !actor ? undefined : actor.token ?? actor.getActiveTokens()[0]\r\n\r\n const data = {\r\n title: item?.name || localize('title'),\r\n content: await renderTemplate(templatePath('target/template-menu'), { i18n: localize, noSelf: !self }),\r\n buttons: {\r\n select: {\r\n icon: '',\r\n label: localize('target'),\r\n callback: html => ({\r\n targets: html.find('[name=targets]:checked').val(),\r\n self: html.find('[name=self]').prop('checked'),\r\n neutral: html.find('[name=neutral]').prop('checked'),\r\n }),\r\n },\r\n },\r\n close: () => null,\r\n }\r\n\r\n const result = await Dialog.wait(data, undefined, { id: `pf2e-toolbelt-target-template`, width: 260 })\r\n if (!result) return\r\n\r\n const alliance = actor ? actor.alliance : user.isGM ? 'opposition' : 'party'\r\n const opposition = alliance === 'party' ? 'opposition' : alliance === 'opposition' ? 'party' : null\r\n\r\n const tokens = getTemplateTokens(template)\r\n const targets = tokens.filter(token => {\r\n const validActor = token.actor?.isOfType('creature', 'hazard', 'vehicle')\r\n if (!validActor) return false\r\n\r\n if (token.document.hidden) return false\r\n\r\n if (self && token === self) return result.self\r\n\r\n const targetAlliance = token.actor ? token.actor.alliance : token.alliance\r\n\r\n if (targetAlliance === null) return result.neutral\r\n\r\n return (\r\n result.targets === 'all' ||\r\n (result.targets === 'allies' && targetAlliance === alliance) ||\r\n (result.targets === 'enemies' && targetAlliance === opposition)\r\n )\r\n })\r\n\r\n const targetsIds = targets.map(token => token.id)\r\n user.updateTokenTargets(targetsIds)\r\n user.broadcastActivity({ targets: targetsIds })\r\n}\r\n\r\nlet HEALINGS_REGEX\r\nfunction isValidDamageMessage(message) {\r\n if (message.rolls[0].options.evaluatePersistent) return false\r\n\r\n const healingsRegex = (HEALINGS_REGEX ??= (() => {\r\n const healings = [\r\n game.i18n.localize('PF2E.Encounter.Broadcast.FastHealing.fast-healing.ReceivedMessage'),\r\n game.i18n.localize('PF2E.Encounter.Broadcast.FastHealing.regeneration.ReceivedMessage'),\r\n ]\r\n return new RegExp(`^
(${healings.join('|')})
`)\r\n })())\r\n\r\n return !healingsRegex.test(message.flavor)\r\n}\r\n\r\nfunction preCreateChatMessage(message) {\r\n const isDamageRoll = message.isDamageRoll\r\n\r\n if (isDamageRoll) {\r\n if (!isValidDamageMessage(message)) return\r\n\r\n if (!getFlag(message, 'target.targets')) {\r\n const targets = game.user.targets\r\n if (targets.size) {\r\n updateSourceFlag(\r\n message,\r\n 'target.targets',\r\n Array.from(targets.map(target => ({ token: target.document.uuid, actor: target.actor.uuid })))\r\n )\r\n }\r\n }\r\n\r\n if (message.rolls.length === 2) {\r\n const splashRollIndex = message.rolls.findIndex(roll => roll.options?.splashOnly)\r\n const regularRollIndex = message.rolls.findIndex(\r\n roll =>\r\n !roll.options?.splashOnly &&\r\n roll.options?.damage?.modifiers.some(modifier => modifier.damageCategory === 'splash')\r\n )\r\n\r\n if (splashRollIndex !== -1 && regularRollIndex !== -1) {\r\n updateSourceFlag(message, 'target.splashIndex', splashRollIndex)\r\n }\r\n }\r\n }\r\n\r\n if (!isDamageRoll && message.getFlag('pf2e', 'context.type') !== 'spell-cast') return\r\n\r\n const item = message.item\r\n if (item?.type !== 'spell') return\r\n\r\n const save = item.system.defense?.save\r\n if (!save) return\r\n\r\n const dc = (() => {\r\n if (!item.trickMagicEntry) return item.spellcasting?.statistic.dc.value\r\n return $(message.content).find('[data-action=spell-save]').data()?.dc\r\n })()\r\n if (typeof dc !== 'number') return\r\n\r\n updateSourceFlag(message, 'target.save', {\r\n ...save,\r\n dc,\r\n })\r\n}\r\n\r\nasync function renderChatMessage(message, html) {\r\n const clientEnabled = getSetting('target-chat') !== 'disabled'\r\n\r\n if (clientEnabled && message.isDamageRoll) {\r\n if (!isValidDamageMessage(message)) return\r\n await renderDamageChatMessage(message, html)\r\n refreshMessage(message)\r\n return\r\n }\r\n\r\n const item = message.item\r\n if (!item || item.type !== 'spell') return\r\n\r\n if (clientEnabled && !item.damageKinds.size) {\r\n await renderSpellChatMessage(message, html, item)\r\n refreshMessage(message)\r\n return\r\n }\r\n\r\n if (item.trickMagicEntry && item.system.defense?.save) {\r\n html.find('[data-action=spell-damage]').on('click', () => {\r\n bindOnPreCreateSpellDamageChatMessage(message)\r\n })\r\n }\r\n}\r\n\r\nfunction refreshMessage(message) {\r\n Promise.all(\r\n [ui.chat, ui.chat._popout].map(async chat => {\r\n const el = chat?.element[0]?.querySelector('#chat-log')\r\n if (!el || (!chat.isAtBottom && message.user._id !== game.user._id)) return\r\n\r\n await chat._waitForImages()\r\n el.scrollTop = el.scrollHeight\r\n })\r\n )\r\n\r\n for (const app of Object.values(message.apps)) {\r\n if (!(app instanceof ChatPopout)) continue\r\n if (!app.rendered) continue\r\n\r\n app.setPosition()\r\n }\r\n}\r\n\r\nasync function renderSpellChatMessage(message, html, spell) {\r\n const data = await getMessageData(message)\r\n if (!data) return\r\n\r\n const { targets, save } = data\r\n const msgContent = html.find('.message-content')\r\n const cardBtns = msgContent.find('.card-buttons')\r\n\r\n if (game.user.isGM || message.isAuthor) {\r\n const saveBtn = cardBtns.find('[data-action=spell-save]')\r\n const wrapper = $('
')\r\n const targetsTooltip = localize('target.chat.targets.tooltip')\r\n\r\n const targetsBtn = $(``)\r\n\r\n targetsBtn.on('click', event => addTargets(event, message))\r\n\r\n wrapper.append(targetsBtn)\r\n wrapper.append(saveBtn)\r\n cardBtns.prepend(wrapper)\r\n }\r\n\r\n if (spell && spell.area && !spell.traits.has('aura')) {\r\n const template = canvas.scene?.templates.some(template => template.message === message && template.isOwner)\r\n if (template) cardBtns.find('.owner-buttons .hidden.small').removeClass('hidden')\r\n }\r\n\r\n if (!targets.length) return\r\n\r\n const rowsTemplate = $('
')\r\n\r\n targets.forEach(({ template }) => {\r\n rowsTemplate.append('
')\r\n rowsTemplate.append(template)\r\n })\r\n\r\n msgContent.after(rowsTemplate)\r\n\r\n addHeaderListeners(message, rowsTemplate, save)\r\n}\r\n\r\nfunction addTargets(event, message) {\r\n event.stopPropagation()\r\n const targets = game.user.targets\r\n\r\n setFlag(\r\n message,\r\n 'target.targets',\r\n Array.from(targets.map(target => ({ token: target.document.uuid, actor: target.actor.uuid })))\r\n )\r\n}\r\n\r\nasync function renderDamageChatMessage(message, html) {\r\n const data = await getMessageData(message)\r\n const msgContent = html.find('.message-content')\r\n const damageRows = msgContent.find('.damage-application')\r\n const clonedRows = damageRows.clone()\r\n\r\n const buttons = $('
')\r\n\r\n if (data?.targets.length && damageRows.length) {\r\n const toggleDamageRow = () => {\r\n const expanded = !!getInMemory(message, 'target.expanded')\r\n toggleBtn.toggleClass('collapse', expanded)\r\n damageRows.toggleClass('hidden', !expanded)\r\n }\r\n\r\n const toggleTooltip = localize('target.chat.toggle.tooltip')\r\n const toggleBtn = $(``)\r\n\r\n toggleDamageRow()\r\n\r\n toggleBtn.on('click', event => {\r\n event.stopPropagation()\r\n setInMemory(message, 'target.expanded', !getInMemory(message, 'target.expanded'))\r\n toggleDamageRow()\r\n })\r\n\r\n buttons.append(toggleBtn)\r\n }\r\n\r\n if (game.user.isGM || message.isAuthor) {\r\n const targetsTooltip = localize('target.chat.targets.tooltip')\r\n const targetsBtn = $(``)\r\n\r\n targetsBtn.on('click', event => addTargets(event, message))\r\n\r\n buttons.append(targetsBtn)\r\n }\r\n\r\n html.find('.dice-result .dice-total').append(buttons)\r\n\r\n if (!data?.targets.length) return\r\n\r\n const { targets, save } = data\r\n if (!clonedRows.length) return\r\n\r\n clonedRows.removeClass('damage-application').addClass('target-damage-application')\r\n\r\n if (getSetting('target-chat') !== 'big') clonedRows.find('button').addClass('small')\r\n\r\n clonedRows.find('[data-action]').each(function () {\r\n const action = this.dataset.action\r\n this.dataset.action = `target-${action}`\r\n })\r\n\r\n const rowsTemplate = $('
')\r\n\r\n targets.forEach(({ uuid, template, save, applied = {} }) => {\r\n const isBasicSave = !!(save && save.result && save.basic)\r\n const clones = clonedRows.clone()\r\n\r\n rowsTemplate.append('
')\r\n rowsTemplate.append(template)\r\n\r\n clones.each((index, el) => {\r\n el.dataset.rollIndex = index\r\n el.dataset.targetUuid = uuid\r\n\r\n el.classList.toggle('applied', !!applied[index] || (isBasicSave && save.result.success === 'criticalSuccess'))\r\n if (isBasicSave) el.classList.add(save.result.success)\r\n })\r\n\r\n rowsTemplate.append(clones)\r\n })\r\n\r\n msgContent.after(rowsTemplate)\r\n\r\n addHeaderListeners(message, rowsTemplate, save)\r\n rowsTemplate.find('button[data-action^=target-]').on('click', event => onTargetButton(event, message))\r\n}\r\n\r\nfunction addHeaderListeners(message, html, save) {\r\n html.find('[data-action=ping-target]').on('click', pingTarget)\r\n html.find('[data-action=open-target-sheet]').on('click', openTargetSheet)\r\n html.find('[data-action=roll-save]').on('click', event => rollSave(event, message, save))\r\n html.find('[data-action=reroll-save]').on('click', event => rerollSave(event, message, save))\r\n}\r\n\r\nasync function getMessageData(message) {\r\n const targetsFlag = getFlag(message, 'target.targets') ?? []\r\n const showDC = game.user.isGM || game.settings.get('pf2e', 'metagame_showDC')\r\n\r\n const save = (() => {\r\n const flag = getFlag(message, 'target.save')\r\n if (!flag) return\r\n return {\r\n ...flag,\r\n ...SAVES[flag.statistic],\r\n }\r\n })()\r\n\r\n if (!targetsFlag.length && !save) return\r\n\r\n if (save) {\r\n const saveLabel = game.i18n.format('PF2E.SavingThrowWithName', { saveName: game.i18n.localize(save.label) })\r\n const saveDC = showDC ? localize('target.chat.save.dcWithValue', { dc: save.dc }) : ''\r\n save.tooltipLabel = `${saveLabel} ${saveDC}`\r\n save.tooltip = await renderTemplate(templatePath('target/save-tooltip'), {\r\n check: save.tooltipLabel,\r\n })\r\n }\r\n\r\n const targets = (\r\n await Promise.all(\r\n targetsFlag.map(async ({ token }) => {\r\n const target = await fromUuid(token)\r\n if (!target?.isOwner) return\r\n\r\n const targetId = target.id\r\n const actor = target.actor\r\n const hasSave = save && !!actor?.saves[save.statistic]\r\n\r\n const targetSave = await (async () => {\r\n if (!hasSave) return\r\n\r\n const flag = getFlag(message, `target.saves.${targetId}`)\r\n if (!flag) return\r\n\r\n const rerolled = flag.rerolled\r\n const canReroll = hasSave && !rerolled\r\n const successLabel = game.i18n.localize(`PF2E.Check.Result.Degree.Check.${flag.success}`)\r\n const offset = flag.value - save.dc\r\n\r\n return {\r\n ...flag,\r\n canReroll,\r\n tooltip: await renderTemplate(templatePath('target/save-tooltip'), {\r\n i18n: subLocalize('target.chat.save'),\r\n check: save.tooltipLabel,\r\n result: localize(`target.chat.save.result.${showDC ? 'withOffset' : 'withoutOffset'}`, {\r\n success: successLabel,\r\n offset: offset >= 0 ? `+${offset}` : offset,\r\n die: ` ${flag.die}`,\r\n }),\r\n modifiers: flag.modifiers,\r\n canReroll,\r\n rerolled: REROLL[rerolled],\r\n }),\r\n }\r\n })()\r\n\r\n const templateSave = save && {\r\n ...save,\r\n result: targetSave,\r\n }\r\n\r\n return {\r\n uuid: token,\r\n target: target,\r\n save: templateSave,\r\n applied: getFlag(message, `target.applied.${targetId}`),\r\n template: await renderTemplate(templatePath('target/row-header'), {\r\n name: target.name,\r\n uuid: token,\r\n save: hasSave && templateSave,\r\n canReroll: targetSave?.canReroll,\r\n rerolled: REROLL[targetSave?.rerolled],\r\n }),\r\n }\r\n })\r\n )\r\n ).filter(Boolean)\r\n\r\n return { targets, save }\r\n}\r\n\r\nasync function getTargetFromEvent(event) {\r\n const { targetUuid } = event.currentTarget.closest('[data-target-uuid]').dataset\r\n return fromUuid(targetUuid)\r\n}\r\n\r\nasync function rerollSave(event, message, { dc }) {\r\n const target = await getTargetFromEvent(event)\r\n const actor = target?.actor\r\n if (!actor) return\r\n\r\n const flag = getFlag(message, `target.saves.${target.id}`)\r\n if (!flag?.roll || flag.rerolled) return\r\n\r\n const heroPoints = actor.isOfType('character') ? actor.heroPoints.value : 0\r\n\r\n const template = Object.entries(REROLL)\r\n .map(([type, { icon, reroll }]) => {\r\n if (type === 'hero' && !heroPoints) return\r\n const label = game.i18n.localize(reroll)\r\n return ``\r\n })\r\n .filter(Boolean)\r\n .join('')\r\n\r\n const buttons = {\r\n yes: {\r\n icon: '',\r\n label: 'reroll',\r\n callback: html => html.find('[name=reroll]:checked').val() ?? null,\r\n },\r\n no: {\r\n icon: '',\r\n label: 'cancel',\r\n callback: () => null,\r\n },\r\n }\r\n\r\n const reroll = await Dialog.wait(\r\n {\r\n title: `${target.name} - ${localize('target.chat.save.reroll.confirm.title')}`,\r\n content: template,\r\n buttons,\r\n close: () => null,\r\n },\r\n {\r\n id: `pf2e-toolbelt-target-save-reroll-dialog-${target.id}`,\r\n }\r\n )\r\n\r\n if (!reroll) return\r\n\r\n const isHeroReroll = reroll === 'hero'\r\n const keep = isHeroReroll ? 'new' : reroll\r\n\r\n if (isHeroReroll) {\r\n const { value, max } = actor.heroPoints\r\n\r\n if (value < 1) {\r\n warn('target.chat.save.reroll.noPoints')\r\n return\r\n }\r\n\r\n await actor.update({\r\n 'system.resources.heroPoints.value': Math.clamped(value - 1, 0, max),\r\n })\r\n }\r\n\r\n const oldRoll = Roll.fromJSON(flag.roll)\r\n const unevaluatedNewRoll = oldRoll.clone()\r\n unevaluatedNewRoll.options.isReroll = true\r\n Hooks.callAll('pf2e.preReroll', Roll.fromJSON(flag.roll), unevaluatedNewRoll, isHeroReroll, keep)\r\n\r\n const newRoll = await unevaluatedNewRoll.evaluate({ async: true })\r\n Hooks.callAll('pf2e.reroll', Roll.fromJSON(flag.roll), newRoll, isHeroReroll, keep)\r\n\r\n const keptRoll =\r\n (keep === 'higher' && oldRoll.total > newRoll.total) || (keep === 'lower' && oldRoll.total < newRoll.total)\r\n ? oldRoll\r\n : newRoll\r\n\r\n if (keptRoll === newRoll) {\r\n const success = new DegreeOfSuccess(newRoll, dc, flag.dosAdjustments)\r\n keptRoll.options.degreeOfSuccess = success.value\r\n }\r\n\r\n const packet = {\r\n type: 'target.update-save',\r\n target: target.id,\r\n data: {\r\n value: keptRoll.total,\r\n die: keptRoll.dice[0].total,\r\n success: keptRoll.degreeOfSuccess,\r\n roll: JSON.stringify(keptRoll.toJSON()),\r\n dosAdjustments: deepClone(flag.dosAdjustments),\r\n modifiers: deepClone(flag.modifiers),\r\n rerolled: reroll,\r\n },\r\n }\r\n\r\n if (keptRoll.options.keeleyAdd10) {\r\n packet.data.modifiers.push({\r\n label: localize('target.chat.save.reroll.keeley'),\r\n modifier: 10,\r\n })\r\n }\r\n\r\n if (game.user.isGM || message.isAuthor) {\r\n packet.message = message\r\n updateMessageSave(packet)\r\n } else {\r\n packet.message = message.id\r\n socketEmit(packet)\r\n }\r\n}\r\n\r\nasync function rollSave(event, message, { dc, statistic }) {\r\n const target = await getTargetFromEvent(event)\r\n const actor = target?.actor\r\n if (!actor) return\r\n\r\n const save = actor.saves[statistic]\r\n if (!save) return\r\n\r\n const item = (() => {\r\n const item = message.item\r\n if (item) return item\r\n\r\n const messageId = getFlag(message, 'target.messageId')\r\n if (!messageId) return\r\n\r\n const otherMessage = game.messages.get(messageId)\r\n if (!otherMessage) return\r\n\r\n return otherMessage.item\r\n })()\r\n\r\n const skipDefault = !game.user.settings.showCheckDialogs\r\n\r\n const packet = {\r\n type: 'target.update-save',\r\n target: target.id,\r\n }\r\n\r\n save.check.roll({\r\n dc: { value: dc },\r\n item,\r\n origin: actor,\r\n skipDialog: event.shiftKey ? !skipDefault : skipDefault,\r\n createMessage: false,\r\n callback: (roll, __, msg) => {\r\n packet.data = {\r\n value: roll.total,\r\n die: roll.dice[0].total,\r\n success: roll.degreeOfSuccess,\r\n roll: JSON.stringify(roll.toJSON()),\r\n dosAdjustments: msg.getFlag('pf2e', 'context.dosAdjustments'),\r\n modifiers: msg\r\n .getFlag('pf2e', 'modifiers')\r\n .filter(modifier => modifier.enabled)\r\n .map(({ label, modifier }) => ({ label, modifier })),\r\n }\r\n\r\n if (game.user.isGM || message.isAuthor) {\r\n packet.message = message\r\n updateMessageSave(packet)\r\n } else {\r\n packet.message = message.id\r\n socketEmit(packet)\r\n }\r\n },\r\n })\r\n}\r\n\r\nfunction updateMessageSave({ message, target, data }) {\r\n if (typeof message === 'string') {\r\n message = game.messages.get(message)\r\n if (!message) return\r\n }\r\n\r\n if (typeof data.success === 'number') data.success = DEGREE_OF_SUCCESS[data.success]\r\n\r\n setFlag(message, `target.saves.${target}`, deepClone(data))\r\n}\r\n\r\nasync function openTargetSheet(event) {\r\n const target = await getTargetFromEvent(event)\r\n if (!target) return\r\n\r\n target.actor?.sheet.render(true)\r\n}\r\n\r\nasync function pingTarget(event) {\r\n if (!canvas.ready) return\r\n\r\n const target = await getTargetFromEvent(event)\r\n if (!target) return\r\n\r\n canvas.ping(target.center)\r\n}\r\n\r\nasync function onTargetButton(event, message) {\r\n const btn = event.currentTarget\r\n const { rollIndex, targetUuid } = btn.closest('[data-target-uuid]').dataset\r\n const target = await fromUuid(targetUuid)\r\n if (!target) return\r\n\r\n const type = btn.dataset.action\r\n\r\n if (type === 'target-shield-block') {\r\n onClickShieldBlock(target, btn, message.element)\r\n return\r\n }\r\n\r\n const multiplier =\r\n type === 'target-apply-healing'\r\n ? -1\r\n : type === 'target-half-damage'\r\n ? 0.5\r\n : type === 'target-apply-damage'\r\n ? 1\r\n : type === 'target-double-damage'\r\n ? 2\r\n : 3\r\n\r\n applyDamageFromMessage(target, {\r\n message,\r\n multiplier,\r\n addend: 0,\r\n promptModifier: event.shiftKey,\r\n rollIndex: Number(rollIndex),\r\n })\r\n}\r\n\r\nexport function onDamageApplied(message, tokenId, rollIndex) {\r\n let updates = {}\r\n moduleFlagUpdate(updates, `target.applied.${tokenId}.${rollIndex}`, true)\r\n\r\n const splashRollIndex = getFlag(message, 'target.splashIndex')\r\n if (splashRollIndex !== undefined) {\r\n const regularRollIndex = splashRollIndex === 0 ? 1 : 0\r\n\r\n if (rollIndex === splashRollIndex) {\r\n moduleFlagUpdate(updates, `target.applied.${tokenId}.${regularRollIndex}`, true)\r\n } else {\r\n moduleFlagUpdate(updates, `target.applied.${tokenId}.${splashRollIndex}`, true)\r\n\r\n const targetsFlag = getFlag(message, 'target.targets') ?? []\r\n for (const target of targetsFlag) {\r\n const targetId = target.token?.split('.').at(-1)\r\n if (targetId === tokenId) continue\r\n\r\n moduleFlagUpdate(updates, `target.applied.${targetId}.${regularRollIndex}`, true)\r\n }\r\n }\r\n }\r\n\r\n if (game.user.isGM || message.isAuthor) {\r\n updateMessageApplied({ message, updates })\r\n } else {\r\n socketEmit({\r\n type: 'target.update-applied',\r\n message: message.id,\r\n updates,\r\n })\r\n }\r\n}\r\n\r\nfunction updateMessageApplied({ message, updates }) {\r\n if (typeof message === 'string') {\r\n message = game.messages.get(message)\r\n if (!message) return\r\n }\r\n message.update(updates)\r\n}\r\n", "import { getSetting } from '../shared/settings'\r\n\r\nlet CREATE_HOOK = null\r\nlet UPDATE_HOOK = null\r\n\r\nexport function registerUnided() {\r\n return {\r\n settings: [\r\n {\r\n name: 'unided',\r\n type: String,\r\n default: 'disabled',\r\n choices: ['disabled', 'create', 'all'],\r\n onChange: setHooks,\r\n },\r\n ],\r\n conflicts: ['pf2e-unided'],\r\n init: () => {\r\n setHooks()\r\n },\r\n }\r\n}\r\n\r\nfunction setHooks(value) {\r\n value ??= getSetting('unided')\r\n\r\n if (value === 'disabled') {\r\n if (CREATE_HOOK) {\r\n Hooks.off('preCreateItem', CREATE_HOOK)\r\n CREATE_HOOK = null\r\n }\r\n if (UPDATE_HOOK) {\r\n Hooks.off('preUpdateItem', UPDATE_HOOK)\r\n UPDATE_HOOK = null\r\n }\r\n } else {\r\n if (!CREATE_HOOK) {\r\n CREATE_HOOK = Hooks.on('preCreateItem', preCreateItem)\r\n }\r\n if (value === 'all' && !UPDATE_HOOK) {\r\n UPDATE_HOOK = Hooks.on('preUpdateItem', preUpdateItem)\r\n } else if (value !== 'all' && UPDATE_HOOK) {\r\n Hooks.off('preUpdateItem', UPDATE_HOOK)\r\n UPDATE_HOOK = null\r\n }\r\n }\r\n}\r\n\r\nfunction preCreateItem(item) {\r\n if (!item.img || !item.isOfType('physical')) return\r\n item._source.system.identification.unidentified.img = item.img\r\n}\r\n\r\nfunction preUpdateItem(item, changes) {\r\n if (!item.isOfType('physical') || !('img' in changes)) return\r\n setProperty(changes, 'system.identification.unidentified.img', changes.img)\r\n}\r\n", "import { subLocalize } from '../shared/localize'\r\nimport { templatePath } from '../shared/path'\r\n\r\nconst localize = subLocalize('macros.condition')\r\n\r\nexport async function permaConditionEffect(actor) {\r\n const callback = (html, type) => {\r\n const condition = html.find('[name=condition]')\r\n const { name, slug, img } = condition.find(':selected').data()\r\n\r\n return {\r\n type,\r\n slug,\r\n img,\r\n name: html.find('[name=name]').val().trim() || localize('effect-name', { condition: name }),\r\n uuid: condition.val(),\r\n badge: Number(html.find('[name=badge]').val() || 1),\r\n unidentified: html.find('[name=unidentified]').prop('checked'),\r\n }\r\n }\r\n\r\n const buttons = {\r\n generate: {\r\n icon: '',\r\n label: localize('generate'),\r\n callback: html => callback(html, 'generate'),\r\n },\r\n add: {\r\n icon: '',\r\n label: localize('add'),\r\n callback: html => callback(html, 'add'),\r\n },\r\n }\r\n\r\n const conditions = Array.from(game.pf2e.ConditionManager.conditions.values())\r\n const withBadge = new Set(conditions.filter(condition => !!condition.badge).map(condition => condition.slug))\r\n\r\n const content = await renderTemplate(templatePath('macros/condition'), {\r\n i18n: localize,\r\n conditions: Array.from(new Set(conditions.sort((a, b) => a.name.localeCompare(b.name)))),\r\n })\r\n\r\n const setInputs = html => {\r\n const { name, slug } = html.find('[name=condition] :selected').data()\r\n html.find('[name=name]').prop('placeholder', localize('effect-name', { condition: name }))\r\n\r\n const hasBadge = withBadge.has(slug)\r\n const badge = html.find('[name=badge]')\r\n badge.prop('disabled', !hasBadge)\r\n if (!hasBadge) badge.val(1)\r\n }\r\n\r\n const result = await Dialog.wait(\r\n {\r\n buttons,\r\n content,\r\n title: localize('title'),\r\n close: () => null,\r\n render: html => {\r\n setInputs(html)\r\n html.find('[name=condition]').on('change', () => setInputs(html))\r\n },\r\n },\r\n {\r\n id: 'pf2e-toolbelt-macros-condition',\r\n width: 320,\r\n }\r\n )\r\n\r\n if (!result) return\r\n\r\n const rule = {\r\n inMemoryOnly: true,\r\n key: 'GrantItem',\r\n uuid: result.uuid,\r\n }\r\n\r\n if (result.badge > 1 && withBadge.has(result.slug)) {\r\n rule.alterations = [\r\n {\r\n mode: 'override',\r\n property: 'badge-value',\r\n value: result.badge,\r\n },\r\n ]\r\n }\r\n\r\n const source = {\r\n name: result.name,\r\n type: 'effect',\r\n img: result.img,\r\n system: {\r\n rules: [rule],\r\n unidentified: result.unidentified,\r\n },\r\n }\r\n\r\n if (result.type === 'generate' || !actor) await Item.create(source)\r\n else await actor.createEmbeddedDocuments('Item', [source])\r\n}\r\n", "import { registerArp } from './features/arp'\r\nimport { registerEffectsPanelHelper } from './features/effects'\r\nimport { registerGiveth } from './features/giveth'\r\nimport { registerHeroActions } from './features/hero'\r\nimport { registerKnowledges } from './features/knowledges'\r\nimport { registerMerge } from './features/merge'\r\nimport { registerHideModifiers } from './features/modifiers'\r\nimport { registerNobulk } from './features/nobulk'\r\nimport { registerShare } from './features/share'\r\nimport { registerStances } from './features/stances'\r\nimport { registerSpellsSummary } from './features/summary'\r\nimport { registerTargetTokenHelper } from './features/target'\r\nimport { registerUnided } from './features/unided'\r\nimport { permaConditionEffect } from './macros/condition'\r\nimport { MODULE_ID } from './module'\r\nimport { localize } from './shared/localize'\r\nimport { warn } from './shared/notification'\r\nimport { getSetting, setSetting } from './shared/settings'\r\nimport { isUserGM } from './shared/user'\r\n\r\nconst FEATURES = [\r\n registerArp(),\r\n registerNobulk(),\r\n registerGiveth(),\r\n registerKnowledges(),\r\n registerUnided(),\r\n registerMerge(),\r\n registerEffectsPanelHelper(),\r\n registerSpellsSummary(),\r\n registerStances(),\r\n registerHeroActions(),\r\n registerHideModifiers(),\r\n registerShare(),\r\n registerTargetTokenHelper(),\r\n]\r\n\r\nconst CONFLICTS = new Set()\r\n\r\nconst SETTINGS_MIGRATION_VERSION = 1\r\n\r\nlet firstClientSetting = null\r\n\r\nHooks.once('init', () => {\r\n const isGM = isUserGM()\r\n\r\n game.settings.register(MODULE_ID, 'settings-min-migration-version', {\r\n scope: 'world',\r\n config: false,\r\n key: 'settings-min-migration-version',\r\n type: Number,\r\n default: 0,\r\n })\r\n\r\n const settings = FEATURES.flatMap(({ settings = [] }) =>\r\n settings.map(setting => {\r\n const key = setting.name\r\n\r\n if (setting.choices) {\r\n setting.choices = setting.choices.reduce((choices, choice) => {\r\n choices[choice] = settingPath(key, `choices.${choice}`)\r\n return choices\r\n }, {})\r\n }\r\n\r\n setting.key = key\r\n setting.scope ??= 'world'\r\n setting.config ??= true\r\n setting.name = settingPath(key, 'name')\r\n setting.hint = settingPath(key, 'hint')\r\n\r\n return setting\r\n })\r\n )\r\n\r\n const [worldSettings, clientSettings] = ['world', 'client'].map(scope =>\r\n settings.filter(settings => settings.scope === scope)\r\n )\r\n\r\n ;[worldSettings, clientSettings].forEach(settings =>\r\n settings.forEach(setting => game.settings.register(MODULE_ID, setting.key, setting))\r\n )\r\n\r\n if (isGM) {\r\n firstClientSetting = clientSettings[0].key\r\n Hooks.on('renderSettingsConfig', renderSettingsConfig)\r\n }\r\n\r\n const module = game.modules.get(MODULE_ID)\r\n module.api = {\r\n macros: {\r\n permaConditionEffect,\r\n },\r\n }\r\n\r\n FEATURES.forEach(feature => {\r\n const { init, conflicts = [], api, name } = feature\r\n\r\n if (isGM) {\r\n for (const id of conflicts) {\r\n const conflictingModule = game.modules.get(id)\r\n if (conflictingModule?.active) {\r\n feature.conflicting = true\r\n CONFLICTS.add(conflictingModule.title)\r\n }\r\n }\r\n }\r\n\r\n if (api && name) module.api[name] = api\r\n\r\n if (!feature.conflicting && init) init(isGM)\r\n })\r\n})\r\n\r\nHooks.once('ready', () => {\r\n const isGM = game.user.isGM\r\n\r\n for (const { conflicting, ready } of FEATURES) {\r\n if (!conflicting && ready) ready(isGM)\r\n }\r\n\r\n if (!isGM) return\r\n\r\n for (const conflict of CONFLICTS) {\r\n warn('module-conflict', { name: conflict }, true)\r\n }\r\n\r\n const settingsMinMigrationVersion = getSetting('settings-min-migration-version')\r\n if (settingsMinMigrationVersion < SETTINGS_MIGRATION_VERSION) {\r\n FEATURES.forEach(({ settings }) => {\r\n settings.forEach(({ migrate, key }) => {\r\n if (!migrate) return\r\n\r\n const originalValue = getSetting(key)\r\n let migratedValue = originalValue\r\n\r\n for (let version = settingsMinMigrationVersion + 1; version <= SETTINGS_MIGRATION_VERSION; version++) {\r\n const migration = migrate[version]\r\n if (typeof migration !== 'function') continue\r\n\r\n migratedValue = migration(migratedValue)\r\n }\r\n\r\n if (migratedValue != null && migratedValue !== originalValue) setSetting(key, migratedValue)\r\n })\r\n })\r\n\r\n setSetting('settings-min-migration-version', SETTINGS_MIGRATION_VERSION)\r\n }\r\n})\r\n\r\nfunction settingPath(setting, key) {\r\n return `${MODULE_ID}.settings.${setting}.${key}`\r\n}\r\n\r\nfunction renderSettingsConfig(_, html) {\r\n if (!firstClientSetting) return\r\n\r\n const group = html.find(`.tab[data-tab=${MODULE_ID}] [data-setting-id=\"${MODULE_ID}.${firstClientSetting}\"]`)\r\n group.before(`

${localize('settings.client')}

`)\r\n}\r\n"], - "mappings": "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", - "names": ["MODULE_ID", "registerWrapper", "path", "callback", "type", "MODULE_ID", "__name", "localize", "args", "key", "data", "MODULE_ID", "__name", "hasLocalization", "localizePath", "subLocalize", "subKey", "fn", "warn", "info", "error", "hash", "notify", "str", "arg1", "arg2", "arg3", "type", "data", "permanent", "localize", "__name", "warn", "args", "info", "error", "getSetting", "setting", "MODULE_ID", "__name", "setSetting", "key", "value", "PREPARE_WEAPON_DATA", "PREPARE_WEAPON_DERIVED_DATA", "PREPARE_ARMOR_DATA", "PREPARE_ARMOR_DERIVED_DATA", "registerArp", "getSetting", "registerWrapper", "PREPARE_WEAPON_DATA", "onPrepareWeaponData", "PREPARE_WEAPON_DERIVED_DATA", "onPrepareWeaponDerivedData", "onPrepareArmorData", "onPrepareArmorDerivedData", "isGM", "info", "__name", "isValidActor", "actor", "isCharacter", "WEAPON_POTENCY_PRICE", "WEAPON_STRIKING_PRICE", "isValidWeapon", "weapon", "traits", "group", "category", "slug", "wrapped", "level", "coins", "potency", "striking", "ARMOR_POTENCY_PRICE", "ARMOR_RESILIENCY_PRICE", "isValidArmor", "armor", "__name", "onPrepareArmorData", "wrapped", "actor", "isValidActor", "level", "onPrepareArmorDerivedData", "coins", "potency", "resiliency", "createHook", "event", "listener", "callback", "HOOK", "value", "otherSettings", "skipCallback", "s", "getSetting", "__name", "createChoicesHook", "registerUpstreamHook", "hook", "fn", "id", "index", "x", "hooked", "setHook", "createHook", "renderEffectsPanel", "refreshEffectsPanel", "registerEffectsPanelHelper", "value", "__name", "panel", "html", "removeRow", "localize", "editIcon", "effectPanels", "effectPanel", "id", "effect", "getSetting", "event", "onRemoveEffect", "h1", "onConditionSheet", "getEffect", "MoveLootPopup", "object", "options", "callback", "prompt", "buttonLabel", "_event", "formData", "__name", "isPlayedActor", "actor", "__name", "getFlag", "doc", "key", "fallback", "MODULE_ID", "__name", "setFlag", "value", "unsetFlag", "updateSourceFlag", "doc", "key", "value", "MODULE_ID", "__name", "moduleFlagUpdate", "update", "getChatMessageClass", "__name", "latestChatMessages", "nb", "fromMessage", "messages", "start", "m", "i", "message", "chatUUID", "uuid", "label", "fake", "bindOnPreCreateSpellDamageChatMessage", "originalMessage", "messageId", "save", "getFlag", "updateSourceFlag", "socketOn", "callback", "MODULE_ID", "__name", "socketOff", "socketEmit", "packet", "isActiveGM", "__name", "isUserGM", "user", "x", "isGMOnline", "getCharacterOwner", "actor", "connected", "getActiveOwner", "doc", "activeOwners", "a", "b", "isActiveOwner", "getOwner", "enabled", "CANVAS_HOOK", "registerGiveth", "setup", "isGM", "getSetting", "__name", "value", "socketOff", "onSocket", "socketOn", "registerUpstreamHook", "onDropCanvasData", "packet", "isActiveGM", "takethCondition", "takethEffect", "takethPhysical", "canvas", "data", "isGMOnline", "details", "getDetailsFromData", "target", "token", "isValidActor", "maximumX", "maximumY", "a", "b", "giveth", "origin", "item", "ownerId", "targetId", "isIndex", "qty", "warn", "sendPhysicalRequest", "MoveLootPopup", "stack", "uuid", "socketEmit", "itemId", "actor", "id", "isPlayedActor", "actorUUID", "source", "owner", "newQty", "newItem", "content", "chatUUID", "localize", "templatePath", "path", "x", "MODULE_ID", "__name", "localize", "subLocalize", "Trade", "actor", "templatePath", "value", "options", "x", "getHeroActions", "html", "#onChangeTarget", "#onDescription", "#onSendTrade", "force", "action", "target", "user", "getCharacterOwner", "getOwner", "sendTradeRequest", "event", "uuid", "id", "__name", "localeCompare", "a", "b", "__name", "refreshCharacterSheets", "actor", "win", "winActor", "compareArrays", "arr1", "arr2", "clonedArr2", "arr1Value", "index", "arr2Value", "ordinalString", "value", "pluralRules", "suffix", "isInstanceOf", "obj", "name", "setInMemory", "doc", "key", "MODULE_ID", "getInMemory", "MODULE_ID", "setHook", "createHook", "renderCharacterSheetPF2e", "setupSocket", "JOURNAL_UUID", "TABLE_UUID", "TABLE_ICON", "SOCKET", "registerHeroActions", "value", "refreshCharacterSheets", "createTable", "removeHeroActions", "getHeroActions", "useHeroAction", "getHeroActionDetails", "drawHeroAction", "drawHeroActions", "sendActionToChat", "discardHeroActions", "tradeHeroAction", "getDeckTable", "giveHeroActions", "createChatMessage", "__name", "socketOn", "onSocket", "socketOff", "packet", "onTradeRejected", "isActiveGM", "onTradeAccepted", "onTradeRequest", "onTradeError", "sheet", "html", "actor", "isPlayedActor", "addActionsToSheet", "addSheetEvents", "actions", "diff", "isOwner", "localize", "subLocalize", "template", "templatePath", "getSetting", "key", "hash", "list", "event", "onClickHeroActionsDraw", "onClickHeroActionExpand", "onClickHeroActionUse", "onClickHeroActionDisplay", "onClickHeroActionDiscard", "onClickHeroActionsDiscard", "uuids", "x", "action", "toDiscard", "$discarded", "uuid", "setHeroActions", "summary", "details", "text", "document", "parent", "page", "warn", "nb", "drawn", "i", "label", "secret", "content", "size", "chatActions", "data", "links", "name", "chatUUID", "Trade", "table", "draw", "documentUuidFromTableResult", "getLabelfromTableResult", "points", "index", "error", "removed", "result", "getTableFromUuid", "getDefaultCompendiumTable", "getDefaultWorldTable", "getCustomTable", "sendTradeRequest", "trade", "acceptRequest", "socketEmit", "sender", "receiver", "senderActor", "receiverActor", "sendTradeError", "senderActions", "receiverActions", "senderActionIndex", "receiverActionIndex", "senderAction", "receiverAction", "sentLink", "receivedLink", "users", "err", "rejectRequest", "buttons", "type", "unique", "createDefaultTable", "createCustomTable", "createCustomActionsTable", "setTable", "source", "getTableSource", "update", "createDefautActionsTable", "normalize", "setSetting", "removeActionsToggleAll", "removeActionsToggleActor", "actors", "state", "checked", "all", "templateLocalize", "isUnique", "actionsList", "el", "selected", "asDrawn", "withMessage", "tableUpdates", "localize", "subLocalize", "EditLores", "templatePath", "options", "actor", "getFlag", "event", "unspecified", "specific", "setFlag", "html", "#onCancel", "__name", "setHook", "createHook", "renderNPCSheetPF2e", "registerKnowledges", "value", "isGM", "getSetting", "__name", "sheet", "$html", "actor", "isPlayedActor", "replaceLores", "addEditButton", "addEvents", "knowledgeSelector", "html", "section", "selector", "editLores", "EditLores", "unspecifics", "getFlag", "specifics", "lores", "body", "tag", "skills", "dc", "adjustment", "addTags", "start", "tags", "lore", "attempts", "edit", "localize", "subLocalize", "MultiCast", "#message", "#event", "event", "message", "options", "templatePath", "html", "#onCast", "#onCancel", "nb", "spell", "actor", "updateSource", "__name", "damages", "heightening", "id", "damage", "i", "newId", "level", "data", "embeddedSource", "newSpell", "overlayIds", "castLevel", "spellSource", "bindOnPreCreateSpellDamageChatMessage", "setHook", "createHook", "renderChatMessage", "updateMessages", "registerMerge", "value", "isGm", "__name", "chat", "message", "latestChatMessages", "html", "getSetting", "isDamageRoll", "renderDamage", "renderSpell", "spellBtn", "localize", "event", "MultiCast", "buttons", "getFlag", "tooltip", "actorUUID", "getActorUUID", "targetUUIDs", "getTargetUUIDs", "otherMessage", "otherTargetsUUIDS", "compareArrays", "t", "mergeDamages", "warn", "splitDamages", "sources", "data", "removeChatMessages", "getChatMessageClass", "origin", "other", "dataGroups", "getMessageData", "name", "notes", "outcome", "modifiers", "tags", "result", "groups", "group", "flavor", "templatePath", "originRolls", "getMessageRolls", "otherRolls", "groupedRolls", "roll", "options", "total", "terms", "term", "formula", "critRule", "index", "acc", "curr", "getMeansFormula", "createTermGroup", "setHidden", "operand", "MODULE_ID", "entry", "mean", "deepFormula", "flags", "source", "title", "text", "option", "ids", "joinedIds", "id", "targetTargets", "mergeTargets", "setHook", "createChoicesHook", "renderChatMessage", "updateMessages", "registerHideModifiers", "value", "isGM", "getSetting", "__name", "chat", "message", "latestChatMessages", "html", "speaker", "actor", "header", "ACTOR_PREPARE_EMBEDDED_DOCUMENTS", "TREASURE_PREPARE_BASE_DATA", "registerNobulk", "getSetting", "registerWrapper", "actorPrepareEmbeddedDocuments", "treasurePrepareBaseData", "__name", "wrapped", "args", "actor", "InventoryBulk", "_value", "item", "ACTOR_PREPARE_DATA", "DOCUMENT_SHEET_RENDER_INNER", "registerShare", "getSetting", "registerWrapper", "prepareData", "documentSheetRenderInner", "preUpdateActor", "deleteActor", "updateActor", "__name", "wrapped", "args", "inner", "isInstanceOf", "actor", "isPlayedActor", "getSlaves", "masters", "a", "isValidMaster", "group", "templatePath", "getFlag", "MODULE_ID", "subLocalize", "removeSlaveFromMaster", "slaves", "slave", "unsetMaster", "unsetFlag", "updates", "shareFlag", "master", "hpSource", "getMaster", "hpUpdate", "options", "userId", "isOriginalUser", "getShareFlag", "setMaster", "addSlaveToMaster", "data", "refreshActor", "setFlag", "masterId", "hp", "masterHp", "transfertHpData", "from", "to", "doc", "getModuleProperty", "setModuleProperty", "deleteModuleProperty", "path", "value", "getSourceId", "doc", "__name", "includesSourceId", "list", "sourceId", "getItemSourceIdCondition", "item", "getItems", "actor", "itemTypes", "type", "hasItemWithSourceId", "getItemWithSourceId", "setSheetHook", "createHook", "renderCharacterSheetPF2e", "setDeleteCombatHook", "deleteCombat", "setDeleteCombatantHook", "deleteCombatant", "setCreateCombatantHook", "createCombatant", "STANCE_SAVANT", "REPLACERS", "EXTRAS", "registerStances", "setup", "getStances", "toggleStance", "isValidStance", "isGm", "getSetting", "__name", "value", "stance", "actor", "stances", "replaced", "replace", "sourceId", "effectUUID", "effect", "img", "name", "itemName", "action", "actorStances", "foundAction", "getItemWithSourceId", "uuid", "sheet", "html", "isPlayedActor", "inCombat", "token", "tab", "options", "template", "templatePath", "subLocalize", "event", "onToggleStance", "target", "canUseStances", "feat", "replacer", "extra", "getStancesEffects", "effects", "already", "create", "other", "more", "x", "addStance", "obj", "combat", "combatant", "getActorFromCombatant", "isActiveOwner", "refreshCharacterSheets", "checkForSavant", "effectID", "hasItemWithSourceId", "info", "openStancesMenu", "localize", "setHook", "createChoicesHook", "renderCharacterSheetPF2e", "refreshCharacterSheets", "registerSpellsSummary", "value", "isGm", "getSetting", "__name", "sheet", "html", "actor", "isPlayedActor", "tab", "getSpellcastingTab", "getInMemory", "getSpellcastingNav", "event", "onSpellcastingBtnToggle", "addSummaryTab", "data", "getData", "template", "templatePath", "addSummaryEvents", "summary", "getSpellcastingSummarySection", "inputs", "onUsesInputChange", "onUsesInputFocus", "onUsesInputBlur", "onCastSpell", "onTogglePrepare", "onToggleFocusPool", "onSlotsReset", "onItemToChat", "onToggleSummary", "inputPath", "entryId", "slotLevel", "slotId", "expended", "change", "points", "onChargeReset", "getSpellcastingOriginalSection", "itemId", "level", "isCharge", "item", "slot", "max", "target", "collection", "spell", "setInMemory", "focusPool", "stavesActive", "spells", "focuses", "hasFocusCantrips", "entry", "entryDc", "entryName", "isFocus", "isStaff", "charges", "slotSpells", "isCantrip", "actives", "x", "isBroken", "virtual", "uses", "castLevel", "MODULE_ID", "sort", "a", "b", "localeCompare", "rituals", "rank", "ordinalString", "ErrorPF2e", "message", "__name", "DEGREE_ADJUSTMENT_AMOUNTS", "DEGREE_OF_SUCCESS_STRINGS", "_getDegreeAdjustment", "getDegreeAdjustment_fn", "_adjustDegreeOfSuccess", "adjustDegreeOfSuccess_fn", "_adjustDegreeByDieValue", "adjustDegreeByDieValue_fn", "_calculateDegreeOfSuccess", "calculateDegreeOfSuccess_fn", "_DegreeOfSuccess", "roll", "dc", "dosAdjustments", "__privateAdd", "t", "d", "__privateMethod", "DegreeOfSuccess", "degree", "adjustments", "outcome", "label", "amount", "degreeOfSuccess", "__publicField", "extractEphemeralEffects", "affects", "origin", "target", "item", "domains", "options", "effectsFrom", "effectsTo", "fullOptions", "resolvables", "s", "e", "extractNotes", "rollNotes", "selectors", "n", "extractDamageDice", "deferredDice", "shiftAdjustDamage", "token", "multiplier", "rollIndex", "content", "AdjustmentDialog", "$html", "isHealing", "$dialog", "adjustment", "applyDamageFromMessage", "toggleOffShieldBlock", "addend", "promptModifier", "shieldBlockRequest", "isInstanceOf", "damage", "messageRollOptions", "originRollOptions", "o", "messageItem", "domain", "ephemeralEffects", "contextClone", "applicationRollOptions", "breakdown", "rolls", "critical", "damageDice", "dice", "formula", "previous", "current", "modifiers", "extractModifiers", "m", "applyStackingRules", "hasDamage", "notes", "note", "onDamageApplied", "applyStacking", "best", "modifier", "isBetter", "existing", "total", "highestBonus", "lowestPenalty", "abilityModifiers", "bestAbility", "extractModifierAdjustments", "adjustmentsRecord", "slug", "a", "synthetics", "modifierAdjustments", "syntheticModifiers", "messageId", "app", "selector", "htmlQuery", "parent", "onClickShieldBlock", "shieldButton", "messageEl", "getTokens", "getNonBrokenShields", "tokens", "nonBrokenShields", "hasMultipleShields", "shieldActivated", "instance", "_helper", "$content", "multipleShields", "listEl", "shieldList", "shield", "input", "shieldName", "hardness", "hardnessLabel", "itemLi", "getTemplateTokens", "template", "collisionOrigin", "collisionType", "grid", "dimensions", "gridHighlight", "origin", "tokens", "gridSize", "containedTokens", "token", "tokenDoc", "tokenPositions", "h", "tokenX", "w", "position", "gx", "gy", "s", "destination", "__name", "SAVES", "REROLL", "DEGREE_OF_SUCCESS", "setPrecreateMessageHook", "createHook", "preCreateChatMessage", "setRenderMessageHook", "createChoicesHook", "renderChatMessage", "setCreateTemplateHook", "createMeasuredTemplate", "SOCKET", "registerTargetTokenHelper", "setHooks", "value", "getSetting", "__name", "isUserGM", "socketOn", "onSocket", "socketOff", "packet", "isActiveGM", "updateMessageSave", "updateMessageApplied", "template", "_", "userId", "user", "localize", "subLocalize", "item", "actor", "self", "data", "templatePath", "html", "result", "alliance", "opposition", "targetsIds", "getTemplateTokens", "token", "targetAlliance", "HEALINGS_REGEX", "isValidDamageMessage", "message", "healings", "isDamageRoll", "getFlag", "targets", "updateSourceFlag", "target", "splashRollIndex", "roll", "regularRollIndex", "modifier", "save", "dc", "clientEnabled", "renderDamageChatMessage", "refreshMessage", "renderSpellChatMessage", "bindOnPreCreateSpellDamageChatMessage", "chat", "el", "app", "spell", "getMessageData", "msgContent", "cardBtns", "saveBtn", "wrapper", "targetsTooltip", "targetsBtn", "event", "addTargets", "rowsTemplate", "addHeaderListeners", "setFlag", "damageRows", "clonedRows", "buttons", "toggleDamageRow", "expanded", "getInMemory", "toggleBtn", "toggleTooltip", "setInMemory", "action", "uuid", "applied", "isBasicSave", "clones", "index", "onTargetButton", "pingTarget", "openTargetSheet", "rollSave", "rerollSave", "targetsFlag", "showDC", "flag", "saveLabel", "saveDC", "targetId", "hasSave", "targetSave", "rerolled", "canReroll", "successLabel", "offset", "templateSave", "getTargetFromEvent", "targetUuid", "heroPoints", "type", "icon", "reroll", "label", "isHeroReroll", "keep", "max", "warn", "oldRoll", "unevaluatedNewRoll", "newRoll", "keptRoll", "success", "DegreeOfSuccess", "socketEmit", "statistic", "messageId", "otherMessage", "skipDefault", "__", "msg", "btn", "rollIndex", "onClickShieldBlock", "applyDamageFromMessage", "onDamageApplied", "tokenId", "updates", "moduleFlagUpdate", "CREATE_HOOK", "UPDATE_HOOK", "registerUnided", "setHooks", "__name", "value", "getSetting", "preCreateItem", "preUpdateItem", "item", "changes", "localize", "subLocalize", "permaConditionEffect", "actor", "callback", "__name", "html", "type", "condition", "name", "slug", "img", "buttons", "conditions", "withBadge", "content", "templatePath", "a", "b", "setInputs", "hasBadge", "badge", "result", "rule", "source", "FEATURES", "registerArp", "registerNobulk", "registerGiveth", "registerKnowledges", "registerUnided", "registerMerge", "registerEffectsPanelHelper", "registerSpellsSummary", "registerStances", "registerHeroActions", "registerHideModifiers", "registerShare", "registerTargetTokenHelper", "CONFLICTS", "SETTINGS_MIGRATION_VERSION", "firstClientSetting", "isGM", "isUserGM", "MODULE_ID", "settings", "setting", "key", "choices", "choice", "settingPath", "worldSettings", "clientSettings", "scope", "renderSettingsConfig", "module", "permaConditionEffect", "feature", "init", "conflicts", "api", "name", "id", "conflictingModule", "conflicting", "ready", "conflict", "warn", "settingsMinMigrationVersion", "getSetting", "migrate", "originalValue", "migratedValue", "version", "migration", "setSetting", "__name", "_", "html", "localize"] + "sources": ["../src/module.js", "../src/shared/libwrapper.js", "../src/shared/localize.js", "../src/shared/notification.js", "../src/shared/settings.js", "../src/features/arp.js", "../src/shared/hook.js", "../src/features/effects.js", "../src/apps/giveth/popup.js", "../src/shared/actor.js", "../src/shared/flags.js", "../src/shared/chat.js", "../src/shared/socket.js", "../src/shared/user.js", "../src/features/giveth.js", "../src/shared/path.js", "../src/apps/hero/trade.js", "../src/shared/misc.js", "../src/features/hero.js", "../src/apps/knowledges/lores.js", "../src/features/knowledges.js", "../src/apps/merge/multi.js", "../src/shared/pf2e/classes.js", "../src/features/merge.js", "../src/features/modifiers.js", "../src/features/nobulk.js", "../src/features/share.js", "../src/shared/item.js", "../src/features/stances.js", "../src/features/summary.js", "../src/shared/pf2e/actor.js", "../src/shared/pf2e/dom.js", "../src/shared/pf2e/misc.js", "../src/shared/pf2e/rules.js", "../src/shared/pf2e/chat.js", "../src/shared/pf2e/success.js", "../src/shared/template.js", "../src/features/target.js", "../src/features/unided.js", "../src/macros/condition.js", "../src/main.js"], + "sourcesContent": ["export const MODULE_ID = 'pf2e-toolbelt'\r\n\r\n", "import { MODULE_ID } from '../module'\r\n\r\nexport function registerWrapper(path, callback, type = 'WRAPPER') {\r\n return libWrapper.register(MODULE_ID, path, callback, type)\r\n}\r\n\r\nexport function unregisterWrapper(id) {\r\n libWrapper.unregister(MODULE_ID, id)\r\n}\r\n", "import { MODULE_ID } from '../module'\r\nimport { error, info, warn } from './notification'\r\n\r\nexport function localize(...args) {\r\n let [key, data] = args\r\n key = `${MODULE_ID}.${key}`\r\n if (data) return game.i18n.format(key, data)\r\n return game.i18n.localize(key)\r\n}\r\n\r\nexport function hasLocalization(key) {\r\n return game.i18n.has(`${MODULE_ID}.${key}`, false)\r\n}\r\n\r\nexport function localizePath(key) {\r\n return `${MODULE_ID}.${key}`\r\n}\r\n\r\nexport function subLocalize(subKey) {\r\n const fn = (...args) => localize(`${subKey}.${args[0]}`, args[1])\r\n\r\n Object.defineProperties(fn, {\r\n warn: {\r\n value: (...args) => warn(`${subKey}.${args[0]}`, args[1], args[2]),\r\n enumerable: false,\r\n configurable: false,\r\n },\r\n info: {\r\n value: (...args) => info(`${subKey}.${args[0]}`, args[1], args[2]),\r\n enumerable: false,\r\n configurable: false,\r\n },\r\n error: {\r\n value: (...args) => error(`${subKey}.${args[0]}`, args[1], args[2]),\r\n enumerable: false,\r\n configurable: false,\r\n },\r\n has: {\r\n value: key => hasLocalization(`${subKey}.${key}`),\r\n enumerable: false,\r\n configurable: false,\r\n },\r\n path: {\r\n value: key => localizePath(`${subKey}.${key}`),\r\n enumerable: false,\r\n configurable: false,\r\n },\r\n template: {\r\n value: (key, { hash }) => fn(key, hash),\r\n enumerable: false,\r\n configurable: false,\r\n },\r\n })\r\n\r\n return fn\r\n}\r\n", "import { localize } from './localize'\r\n\r\nfunction notify(str, arg1, arg2, arg3) {\r\n const type = typeof arg1 === 'string' ? arg1 : 'info'\r\n const data = typeof arg1 === 'object' ? arg1 : typeof arg2 === 'object' ? arg2 : undefined\r\n const permanent = typeof arg1 === 'boolean' ? arg1 : typeof arg2 === 'boolean' ? arg2 : arg3 ?? false\r\n\r\n ui.notifications.notify(localize(str, data), type, { permanent })\r\n}\r\n\r\nexport function warn(...args) {\r\n const [str, arg1, arg2] = args\r\n notify(str, 'warning', arg1, arg2)\r\n}\r\n\r\nexport function info(...args) {\r\n const [str, arg1, arg2] = args\r\n notify(str, 'info', arg1, arg2)\r\n}\r\n\r\nexport function error(...args) {\r\n const [str, arg1, arg2] = args\r\n notify(str, 'error', arg1, arg2)\r\n}\r\n", "import { MODULE_ID } from '../module'\r\n\r\nexport function getSetting(setting) {\r\n return game.settings.get(MODULE_ID, setting)\r\n}\r\n\r\nexport function setSetting(key, value) {\r\n return game.settings.set(MODULE_ID, key, value)\r\n}\r\n", "import { registerWrapper } from '../shared/libwrapper'\r\nimport { info } from '../shared/notification'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst PREPARE_WEAPON_DATA = 'CONFIG.PF2E.Item.documentClasses.weapon.prototype.prepareBaseData'\r\nconst PREPARE_WEAPON_DERIVED_DATA = 'CONFIG.PF2E.Item.documentClasses.weapon.prototype.prepareDerivedData'\r\n\r\nconst PREPARE_SHIELD_DATA = 'CONFIG.PF2E.Item.documentClasses.shield.prototype.prepareBaseData'\r\nconst PREPARE_SHIELD_DERIVED_DATA = 'CONFIG.PF2E.Item.documentClasses.shield.prototype.prepareDerivedData'\r\n\r\nconst PREPARE_ARMOR_DATA = 'CONFIG.PF2E.Item.documentClasses.armor.prototype.prepareBaseData'\r\nconst PREPARE_ARMOR_DERIVED_DATA = 'CONFIG.PF2E.Item.documentClasses.armor.prototype.prepareDerivedData'\r\n\r\nexport function registerArp() {\r\n return {\r\n settings: [\r\n {\r\n name: 'arp',\r\n type: Boolean,\r\n default: false,\r\n requiresReload: true,\r\n },\r\n ],\r\n conflicts: ['pf2e-arp'],\r\n init: () => {\r\n const setting = getSetting('arp')\r\n if (!setting) return\r\n\r\n registerWrapper(PREPARE_WEAPON_DATA, onPrepareWeaponData, 'WRAPPER')\r\n registerWrapper(PREPARE_WEAPON_DERIVED_DATA, onPrepareWeaponDerivedData, 'WRAPPER')\r\n\r\n registerWrapper(PREPARE_ARMOR_DATA, onPrepareArmorData, 'WRAPPER')\r\n registerWrapper(PREPARE_ARMOR_DERIVED_DATA, onPrepareArmorDerivedData, 'WRAPPER')\r\n\r\n // if (setting === 'with-shield') {\r\n // registerWrapper(PREPARE_SHIELD_DATA, onPrepareShieldData, 'WRAPPER')\r\n // registerWrapper(PREPARE_SHIELD_DERIVED_DATA, onPrepareShieldDerivedData, 'WRAPPER')\r\n // }\r\n },\r\n ready: isGM => {\r\n if (isGM && getSetting('arp') && game.settings.get('pf2e', 'automaticBonusVariant') !== 'noABP') {\r\n game.settings.set('pf2e', 'automaticBonusVariant', 'noABP')\r\n info('arp.forceVariant')\r\n }\r\n },\r\n }\r\n}\r\n\r\nfunction isValidActor(actor, isCharacter = false) {\r\n return actor && !actor.getFlag('pf2e', 'disableABP') && (!isCharacter || actor.isOfType('character'))\r\n}\r\n\r\n/**\r\n * weapon\r\n */\r\n\r\nconst WEAPON_POTENCY_PRICE = {\r\n 1: 35,\r\n 2: 935,\r\n 3: 8935,\r\n 4: 8935,\r\n}\r\n\r\nconst WEAPON_STRIKING_PRICE = {\r\n striking: 65,\r\n greaterStriking: 1065,\r\n majorStriking: 31065,\r\n}\r\n\r\nfunction isValidWeapon(weapon) {\r\n const traits = weapon._source.system.traits.value\r\n const group = weapon._source.system.group\r\n const category = weapon._source.system.category\r\n const slug = weapon._source.system.slug\r\n return (\r\n group !== 'shield' &&\r\n (slug === 'handwraps-of-mighty-blows' || category !== 'unarmed') &&\r\n !traits.includes('alchemical') &&\r\n !traits.includes('bomb')\r\n )\r\n}\r\n\r\nfunction onPrepareWeaponData(wrapped) {\r\n const actor = this.actor\r\n if (!isValidActor(actor, true) || !isValidWeapon(this)) return wrapped()\r\n\r\n const level = actor.level\r\n\r\n const traits = this._source.system.traits.value\r\n if (traits.includes('alchemical') && traits.includes('bomb')) return wrapped()\r\n\r\n this.system.potencyRune.value = level < 2 ? null : level < 10 ? 1 : level < 16 ? 2 : 3\r\n this.system.strikingRune.value = level < 4 ? null : level < 12 ? 'striking' : level < 19 ? 'greaterStriking' : 'majorStriking'\r\n\r\n wrapped()\r\n}\r\n\r\nfunction onPrepareWeaponDerivedData(wrapped) {\r\n wrapped()\r\n\r\n if (!isValidActor(this.actor) || this.isSpecific || !isValidWeapon(this)) return\r\n\r\n let coins = this.price.value.toObject()\r\n if (!coins.gp) return\r\n\r\n const potency = this.system.potencyRune.value\r\n if (potency) coins.gp -= WEAPON_POTENCY_PRICE[potency]\r\n\r\n const striking = this.system.strikingRune.value\r\n if (striking) coins.gp -= WEAPON_STRIKING_PRICE[striking]\r\n\r\n coins = new game.pf2e.Coins(coins)\r\n\r\n if ((potency || striking) && !this.system.runes.property.length) {\r\n coins = coins.add(this._source.system.price.value)\r\n }\r\n\r\n this.system.price.value = coins\r\n}\r\n\r\n/**\r\n * shield\r\n */\r\n\r\nconst SHIELD_REINFORCING = {\r\n 1: { price: 75, increase: 44 }, // level 4\r\n 2: { price: 300, increase: 52 }, // level 7\r\n 3: { price: 900, increase: 64 }, // level 10\r\n 4: { price: 2500, increase: 80 }, // level 13\r\n 5: { price: 8000, increase: 84 }, // level 16\r\n 6: { price: 32000, increase: 108 }, // level 19\r\n}\r\n\r\nfunction isValidShield(shield) {\r\n return true\r\n}\r\n\r\nfunction onPrepareShieldData(wrapped) {\r\n const actor = this.actor\r\n if (!isValidActor(actor, true) || !isValidShield(this)) return wrapped()\r\n\r\n const level = actor.level\r\n\r\n this.system.runes.reinforcing =\r\n level < 4 ? null : level < 7 ? 1 : level < 10 ? 2 : level < 13 ? 3 : level < 16 ? 4 : level < 19 ? 5 : 6\r\n\r\n wrapped()\r\n}\r\n\r\nfunction onPrepareShieldDerivedData(wrapped) {\r\n wrapped()\r\n\r\n if (!isValidActor(this.actor) || this.isSpecific || !isValidShield(this)) return\r\n\r\n let coins = this.price.value.toObject()\r\n if (!coins.gp) return\r\n\r\n const reinforcing = this.system.runes.reinforcing\r\n if (reinforcing) coins.gp -= SHIELD_REINFORCING[reinforcing].price\r\n\r\n coins = new game.pf2e.Coins(coins)\r\n\r\n this.system.price.value = coins\r\n}\r\n\r\n/**\r\n * amor\r\n */\r\n\r\nconst ARMOR_POTENCY_PRICE = {\r\n 1: 160,\r\n 2: 1060,\r\n 3: 20560,\r\n 4: 20560,\r\n}\r\n\r\nconst ARMOR_RESILIENCY_PRICE = {\r\n resilient: 340,\r\n greaterResilient: 3440,\r\n majorResilient: 49440,\r\n}\r\n\r\nfunction isValidArmor(armor) {\r\n return true\r\n}\r\n\r\nfunction onPrepareArmorData(wrapped) {\r\n const actor = this.actor\r\n if (!isValidActor(actor, true) || !isValidArmor(this)) return wrapped()\r\n\r\n const level = actor.level\r\n\r\n this.system.potencyRune.value = level < 5 ? null : level < 11 ? 1 : level < 18 ? 2 : 3\r\n this.system.resiliencyRune.value =\r\n level < 8 ? null : level < 14 ? 'resilient' : level < 20 ? 'greaterResilient' : 'majorResilient'\r\n\r\n wrapped()\r\n}\r\n\r\nfunction onPrepareArmorDerivedData(wrapped) {\r\n wrapped()\r\n\r\n if (!isValidActor(this.actor) || this.isSpecific || !isValidArmor(this)) return\r\n\r\n let coins = this.price.value.toObject()\r\n if (!coins.gp) return\r\n\r\n const potency = this.system.potencyRune.value\r\n if (potency) coins.gp -= ARMOR_POTENCY_PRICE[potency]\r\n\r\n const resiliency = this.system.resiliencyRune.value\r\n if (resiliency) coins.gp -= ARMOR_RESILIENCY_PRICE[resiliency]\r\n\r\n coins = new game.pf2e.Coins(coins)\r\n\r\n if ((potency || resiliency) && !this.system.runes.property.length) {\r\n coins = coins.add(this._source.system.price.value)\r\n }\r\n\r\n this.system.price.value = coins\r\n}\r\n", "import { getSetting } from './settings'\r\n\r\nexport function createHook(event, listener, callback = () => {}) {\r\n let HOOK = null\r\n\r\n return function (value, otherSettings = [], skipCallback = false) {\r\n if (typeof otherSettings === 'string') otherSettings = [otherSettings]\r\n\r\n value ||= otherSettings.some(s => getSetting(s))\r\n\r\n if (value && !HOOK) {\r\n HOOK = Hooks.on(event, listener)\r\n } else if (!value && HOOK) {\r\n Hooks.off(event, HOOK)\r\n HOOK = null\r\n }\r\n\r\n if (!skipCallback) callback(value)\r\n }\r\n}\r\n\r\nexport function createChoicesHook(event, listener, callback = () => {}) {\r\n let HOOK = null\r\n\r\n return function (value, skipCallback = false) {\r\n if (value === false) value = 'disabled'\r\n\r\n if (value === 'disabled' && HOOK) {\r\n Hooks.off(event, HOOK)\r\n HOOK = null\r\n } else if (value !== 'disabled' && !HOOK) {\r\n HOOK = Hooks.on(event, listener)\r\n }\r\n\r\n if (!skipCallback) callback(value)\r\n }\r\n}\r\n\r\nexport function registerUpstreamHook(hook, fn) {\r\n const id = Hooks.on(hook, fn)\r\n const index = Hooks.events[hook].findIndex(x => x.id === id)\r\n\r\n if (index !== 0) {\r\n const [hooked] = Hooks.events[hook].splice(index, 1)\r\n Hooks.events[hook].unshift(hooked)\r\n }\r\n\r\n return id\r\n}\r\n", "import { createHook } from '../shared/hook'\r\nimport { localize } from '../shared/localize'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst setHook = createHook('renderEffectsPanel', renderEffectsPanel, refreshEffectsPanel)\r\n\r\nexport function registerEffectsPanelHelper() {\r\n return {\r\n settings: [\r\n {\r\n name: 'effect-remove',\r\n type: Boolean,\r\n default: false,\r\n scope: 'client',\r\n onChange: value => setHook(value, 'condition-sheet'),\r\n },\r\n {\r\n name: 'condition-sheet',\r\n type: Boolean,\r\n default: false,\r\n scope: 'client',\r\n onChange: value => setHook(value, 'effect-remove'),\r\n },\r\n ],\r\n conflicts: ['pf2e-effect-description'],\r\n init: () => {\r\n setHook(false, ['effect-remove', 'condition-sheet'])\r\n },\r\n }\r\n}\r\n\r\nfunction refreshEffectsPanel() {\r\n game.pf2e.effectPanel?.render()\r\n}\r\n\r\nfunction renderEffectsPanel(panel, html) {\r\n const removeRow = `
${localize('effects.remove')}
`\r\n const editIcon = ``\r\n\r\n const effectPanels = html.find('.effect-item[data-item-id]').toArray()\r\n for (const effectPanel of effectPanels) {\r\n const id = effectPanel.dataset.itemId\r\n const effect = panel.actor?.items.get(id)\r\n if (!effect) continue\r\n\r\n if (getSetting('effect-remove') && !effect.isLocked && effect.badge && effect.badge.type === 'counter') {\r\n effectPanel.querySelector('.effect-info .instructions').insertAdjacentHTML('beforeend', removeRow)\r\n effectPanel.querySelector('.icon').addEventListener('contextmenu', event => onRemoveEffect(event, panel), true)\r\n }\r\n\r\n if (getSetting('condition-sheet') && effect.isOfType('condition')) {\r\n const h1 = effectPanel.querySelector('.effect-info > h1')\r\n h1.insertAdjacentHTML('beforeend', editIcon)\r\n h1.querySelector('[data-action=\"edit\"]').addEventListener('click', event => onConditionSheet(event, panel))\r\n }\r\n }\r\n}\r\n\r\nfunction onConditionSheet(event, panel) {\r\n const effect = getEffect(event, panel)\r\n if (!effect?.isOfType('condition')) return\r\n event.preventDefault()\r\n effect.sheet.render(true)\r\n}\r\n\r\nfunction onRemoveEffect(event, panel) {\r\n if (!event.shiftKey) return\r\n\r\n const effect = getEffect(event, panel)\r\n if (!effect || effect.isLocked || !effect.badge || effect.badge.type !== 'counter') return\r\n\r\n event.preventDefault()\r\n event.stopPropagation()\r\n event.stopImmediatePropagation()\r\n\r\n effect.delete()\r\n}\r\n\r\nfunction getEffect(event, panel) {\r\n const target = event.currentTarget\r\n const effect = target.closest('.effect-item[data-item-id]')\r\n const id = effect.dataset.itemId\r\n return panel.actor?.items.get(id)\r\n}\r\n", "export class MoveLootPopup extends FormApplication {\r\n constructor(object, options, callback) {\r\n super(object, options)\r\n this.onSubmitCallback = callback\r\n }\r\n\r\n async getData() {\r\n const [prompt, buttonLabel] = this.options.isPurchase\r\n ? ['PF2E.loot.PurchaseLootMessage', 'PF2E.loot.PurchaseLoot']\r\n : ['PF2E.loot.MoveLootMessage', 'PF2E.loot.MoveLoot']\r\n\r\n return {\r\n ...(await super.getData()),\r\n maxQuantity: this.options.maxQuantity,\r\n newStack: this.options.newStack,\r\n lockStack: this.options.lockStack,\r\n prompt,\r\n buttonLabel,\r\n }\r\n }\r\n\r\n static get defaultOptions() {\r\n return {\r\n ...super.defaultOptions,\r\n id: 'MoveLootPopup',\r\n classes: [],\r\n title: game.i18n.localize('PF2E.loot.MoveLootPopupTitle'),\r\n template: 'systems/pf2e/templates/popups/loot/move-loot-popup.hbs',\r\n width: 'auto',\r\n maxQuantity: 1,\r\n newStack: false,\r\n lockStack: false,\r\n isPurchase: false,\r\n }\r\n }\r\n\r\n async _updateObject(_event, formData) {\r\n this.onSubmitCallback(formData.quantity, formData.newStack)\r\n }\r\n}\r\n", "export function isPlayedActor(actor) {\r\n return actor && !actor.pack && actor.id && game.actors.has(actor.id)\r\n}\r\n", "import { MODULE_ID } from '../module'\r\n\r\nexport function getFlag(doc, key, fallback) {\r\n return doc.getFlag(MODULE_ID, key) ?? fallback\r\n}\r\n\r\nexport function setFlag(doc, key, value) {\r\n return doc.setFlag(MODULE_ID, key, value)\r\n}\r\n\r\nexport function unsetFlag(doc, key) {\r\n return doc.unsetFlag(MODULE_ID, key)\r\n}\r\n\r\nexport function containsFlag(doc, key) {\r\n return getProperty(doc, `flags.${MODULE_ID}.${key}`) !== undefined\r\n}\r\n\r\nexport function updateSourceFlag(doc, key, value) {\r\n return doc.updateSource({\r\n [`flags.${MODULE_ID}.${key}`]: value,\r\n })\r\n}\r\n\r\nexport function moduleFlagUpdate(update, key, value) {\r\n update[`flags.${MODULE_ID}.${key}`] = value\r\n}\r\n", "import { getFlag, updateSourceFlag } from './flags'\r\n\r\nexport function getChatMessageClass() {\r\n return CONFIG.ChatMessage.documentClass\r\n}\r\n\r\nexport function* latestChatMessages(nb, fromMessage) {\r\n const messages = game.messages.contents\r\n const start = (fromMessage ? messages.findLastIndex(m => m === fromMessage) : messages.length) - 1\r\n\r\n for (let i = start; i >= start - nb; i--) {\r\n const message = messages[i]\r\n if (!message) return\r\n yield message\r\n }\r\n}\r\n\r\nexport function chatUUID(uuid, label, fake = false) {\r\n if (fake) {\r\n return `${label}`\r\n } else {\r\n if (label) return `@UUID[${uuid}]{${label}}`\r\n return `@UUID[${uuid}]`\r\n }\r\n}\r\n\r\nexport function bindOnPreCreateSpellDamageChatMessage(originalMessage) {\r\n const messageId = originalMessage.id\r\n const save = getFlag(originalMessage, 'target.save')\r\n if (!save) return\r\n\r\n Hooks.once('preCreateChatMessage', message => {\r\n updateSourceFlag(message, 'target.messageId', messageId)\r\n updateSourceFlag(message, 'target.save', save)\r\n })\r\n}\r\n", "import { MODULE_ID } from '../module'\r\n\r\nexport function socketOn(callback) {\r\n game.socket.on(`module.${MODULE_ID}`, callback)\r\n}\r\n\r\nexport function socketOff(callback) {\r\n game.socket.off(`module.${MODULE_ID}`, callback)\r\n}\r\n\r\nexport function socketEmit(packet) {\r\n game.socket.emit(`module.${MODULE_ID}`, packet)\r\n}\r\n", "export function isActiveGM() {\r\n return game.user === game.users.activeGM\r\n}\r\n\r\nexport function isUserGM() {\r\n const user = game.data.users.find(x => x._id === game.data.userId)\r\n return user && user.role >= CONST.USER_ROLES.GAMEMASTER\r\n}\r\n\r\nexport function isGMOnline() {\r\n return game.users.some(user => user.active && user.isGM)\r\n}\r\n\r\nexport function getCharacterOwner(actor, connected = false) {\r\n if (connected) return game.users.find(x => x.active && x.character === actor)\r\n return game.users.find(x => x.character === actor)\r\n}\r\n\r\nexport function getActiveOwner(doc) {\r\n const activeOwners = game.users.filter(user => user.active && !user.isGM && doc.testUserPermission(user, 'OWNER'))\r\n activeOwners.sort((a, b) => (a.id > b.id ? 1 : -1))\r\n return activeOwners[0] || null\r\n}\r\n\r\nexport function isActiveOwner(doc) {\r\n return getActiveOwner(doc) === game.user\r\n}\r\n\r\nexport function getOwner(doc, connected = false) {\r\n if (connected) return game.users.find(x => x.active && doc.testUserPermission(x, 'OWNER'))\r\n return game.users.find(x => doc.testUserPermission(x, 'OWNER'))\r\n}\r\n", "import { MoveLootPopup } from '../apps/giveth/popup'\r\nimport { isPlayedActor } from '../shared/actor'\r\nimport { chatUUID } from '../shared/chat'\r\nimport { registerUpstreamHook } from '../shared/hook'\r\nimport { localize } from '../shared/localize'\r\nimport { warn } from '../shared/notification'\r\nimport { getSetting } from '../shared/settings'\r\nimport { socketOff, socketOn, socketEmit } from '../shared/socket'\r\nimport { isActiveGM, isGMOnline } from '../shared/user'\r\n\r\nlet enabled = false\r\nlet CANVAS_HOOK = null\r\n\r\nexport function registerGiveth() {\r\n return {\r\n settings: [\r\n {\r\n name: 'giveth',\r\n type: String,\r\n default: 'disabled',\r\n choices: ['disabled', 'enabled', 'no-message'],\r\n onChange: setup,\r\n },\r\n ],\r\n conflicts: ['pf2e-giveth'],\r\n ready: isGM => {\r\n if (getSetting('giveth') !== 'disabled') setup(true)\r\n },\r\n }\r\n}\r\n\r\nfunction setup(value) {\r\n const isGM = game.user.isGM\r\n\r\n if (value === 'disabled' && enabled) {\r\n if (isGM) socketOff(onSocket)\r\n else if (CANVAS_HOOK) {\r\n Hooks.off('dropCanvasData', CANVAS_HOOK)\r\n CANVAS_HOOK = null\r\n }\r\n enabled = false\r\n } else if (value !== 'disabled' && !enabled) {\r\n if (isGM) socketOn(onSocket)\r\n else if (!CANVAS_HOOK) CANVAS_HOOK = registerUpstreamHook('dropCanvasData', onDropCanvasData)\r\n enabled = true\r\n }\r\n}\r\n\r\nfunction onSocket(packet) {\r\n if (!isActiveGM()) return\r\n if (packet.type === 'giveth-condition') takethCondition(packet)\r\n else if (packet.type === 'giveth-effect') takethEffect(packet)\r\n else takethPhysical(packet)\r\n}\r\n\r\nfunction onDropCanvasData(canvas, data) {\r\n if (!isGMOnline()) return true\r\n\r\n const details = getDetailsFromData(data)\r\n if (!details) return true\r\n\r\n const target = canvas.tokens.placeables\r\n .slice()\r\n .filter(token => {\r\n if (!token.document.actorLink) return false\r\n const target = token.actor\r\n if (!isValidActor(target, data.actorId) || target.isOwner) return false\r\n const maximumX = token.x + (token.hitArea?.right ?? 0)\r\n const maximumY = token.y + (token.hitArea?.bottom ?? 0)\r\n return data.x >= token.x && data.y >= token.y && data.x <= maximumX && data.y <= maximumY\r\n })\r\n .sort((a, b) => b.document.sort - a.document.sort)\r\n .at(0)?.actor\r\n\r\n if (!target) return true\r\n\r\n giveth(details.actor, target, details.item, details.value)\r\n return false\r\n}\r\n\r\nfunction giveth(origin, target, item, value) {\r\n const ownerId = origin.id\r\n const targetId = target.id\r\n const isIndex = !(item instanceof Item)\r\n\r\n if (!isIndex && item.isOfType('physical')) {\r\n const qty = item.quantity\r\n if (qty < 1) return warn('giveth.notification.zero')\r\n\r\n if (qty === 1) return sendPhysicalRequest(ownerId, targetId, item.id, 1, false)\r\n\r\n new MoveLootPopup(origin, { maxQuantity: qty, lockStack: false, isPurchase: false }, (qty, stack) => {\r\n sendPhysicalRequest(ownerId, targetId, item.id, qty, stack)\r\n }).render(true)\r\n } else {\r\n const uuid = isIndex ? `Compendium.${item.pack}.${item._id}` : item.uuid\r\n if (item.type === 'condition') {\r\n socketEmit({\r\n type: 'giveth-condition',\r\n targetId,\r\n value: value ?? 1,\r\n uuid,\r\n })\r\n } else {\r\n socketEmit({\r\n type: 'giveth-effect',\r\n targetId,\r\n uuid,\r\n })\r\n }\r\n }\r\n}\r\n\r\nfunction sendPhysicalRequest(ownerId, targetId, itemId, qty, stack) {\r\n socketEmit({\r\n type: 'giveth-physical',\r\n ownerId,\r\n targetId,\r\n itemId,\r\n qty,\r\n stack,\r\n })\r\n}\r\n\r\nfunction isValidActor(actor, id) {\r\n if (!isPlayedActor(actor) || (id && actor.id === id)) return false\r\n return actor.hasPlayerOwner && !actor.isToken && actor.isOfType('character', 'npc', 'vehicle')\r\n}\r\n\r\nfunction getDetailsFromData(data) {\r\n if (data.tokenId || data.type !== 'Item' || !data.uuid) return\r\n\r\n const item = fromUuidSync(data.uuid)\r\n if (!item) return\r\n\r\n let actor = item.actor\r\n if (!actor) {\r\n const actorUUID = data.context?.origin.actor\r\n actor = actorUUID ? fromUuidSync(actorUUID) : null\r\n }\r\n\r\n if (!isValidActor(actor) || !actor.isOwner) return\r\n\r\n const isIndex = !(item instanceof Item)\r\n if (isIndex && item.pack && ['effect', 'condition'].includes(item.type)) return { actor, item, value: data.value }\r\n if (!isIndex && item.isOfType('physical', 'effect')) return { actor, item, value: data.value }\r\n}\r\n\r\nasync function takethCondition({ targetId, uuid, value }) {\r\n const target = game.actors.get(targetId)\r\n if (!target) return\r\n\r\n const item = await fromUuid(uuid)\r\n if (!item) return\r\n\r\n target.increaseCondition(item.slug, { min: value })\r\n}\r\n\r\nasync function takethEffect({ targetId, uuid }) {\r\n const target = game.actors.get(targetId)\r\n if (!target) return\r\n\r\n const item = await fromUuid(uuid)\r\n if (!item) return\r\n\r\n const source = item.clone({ 'system.tokenIcon.show': true, 'system.unidentified': false }).toObject()\r\n target.createEmbeddedDocuments('Item', [source])\r\n}\r\n\r\nasync function takethPhysical({ itemId, ownerId, qty, stack, targetId }) {\r\n const owner = game.actors.get(ownerId)\r\n const target = game.actors.get(targetId)\r\n if (!owner || !target) return\r\n\r\n const item = owner.items.get(itemId)\r\n if (!item) return\r\n\r\n qty = Math.min(qty, item.quantity)\r\n const newQty = item.quantity - qty\r\n\r\n const source = item.toObject()\r\n source.system.quantity = qty\r\n source.system.equipped.carryType = 'worn'\r\n if (item.isOfType('physical') && 'invested' in source.system.equipped) {\r\n source.system.equipped.invested = item.traits.has('invested') ? false : null\r\n }\r\n\r\n const newItem = await target.addToInventory(source, undefined, stack)\r\n if (!newItem) return\r\n\r\n if (newQty < 1) item.delete()\r\n else item.update({ 'system.quantity': newQty })\r\n\r\n if (getSetting('giveth') === 'no-message') return\r\n\r\n let content = chatUUID(newItem.uuid, newItem.name, !newItem.isIdentified)\r\n if (qty > 1) content += ` x${qty}`\r\n\r\n ChatMessage.create({\r\n flavor: `

${localize('giveth.giveth', { target: target.name })}

`,\r\n content,\r\n speaker: ChatMessage.getSpeaker({ actor: owner }),\r\n })\r\n}\r\n", "import { MODULE_ID } from '../module'\r\n\r\nexport function templatePath(...path) {\r\n path = path.filter(x => typeof x === 'string')\r\n return `modules/${MODULE_ID}/templates/${path.join('/')}.hbs`\r\n}\r\n", "import { getHeroActions, sendTradeRequest } from '../../features/hero'\r\nimport { subLocalize } from '../../shared/localize'\r\nimport { templatePath } from '../../shared/path'\r\nimport { getCharacterOwner, getOwner } from '../../shared/user'\r\n\r\nconst localize = subLocalize('hero.templates.trade')\r\n\r\nexport class Trade extends Application {\r\n constructor(actor) {\r\n super({ id: `pf2e-hero-actions-trade-${actor.id}` })\r\n this._actor = actor\r\n }\r\n\r\n static get defaultOptions() {\r\n return mergeObject(super.defaultOptions, {\r\n title: localize('title'),\r\n template: templatePath('hero/trade'),\r\n width: 600,\r\n height: 'auto',\r\n })\r\n }\r\n\r\n get actor() {\r\n return this._actor\r\n }\r\n\r\n get target() {\r\n return this._target\r\n }\r\n\r\n set target(value) {\r\n if (!value) {\r\n localize.error('no-target')\r\n return\r\n }\r\n if (value === this._target) return\r\n delete this.target?.apps?.[this.appId]\r\n this._target = value\r\n this.render()\r\n }\r\n\r\n getData(options) {\r\n return mergeObject(super.getData(), {\r\n actor: this.actor,\r\n target: this.target,\r\n targets: game.actors.filter(x => x.type === 'character' && x.id !== this.actor.id && x.hasPlayerOwner),\r\n actions: getHeroActions(this.actor),\r\n targetActions: this.target ? getHeroActions(this.target) : [],\r\n i18n: localize,\r\n })\r\n }\r\n\r\n activateListeners(html) {\r\n super.activateListeners(html)\r\n html.find('select[name=\"target\"]').on('change', this.#onChangeTarget.bind(this))\r\n html.find('[data-action=\"description\"]').on('click', this.#onDescription.bind(this))\r\n html.find('[data-action=\"trade\"]').on('click', this.#onSendTrade.bind(this))\r\n html.find('[data-action=\"cancel\"]').on('click', () => this.close())\r\n }\r\n\r\n render(force, options) {\r\n this.actor.apps[this.appId] = this\r\n if (this.target) this.target.apps[this.appId] = this\r\n return super.render(force, options)\r\n }\r\n\r\n async close(options) {\r\n await super.close(options)\r\n delete this.actor.apps?.[this.appId]\r\n delete this.target?.apps?.[this.appId]\r\n }\r\n\r\n #onSendTrade() {\r\n if (!this.target) {\r\n localize.warn('no-target')\r\n return\r\n }\r\n\r\n const action = this.element.find('[name=\"action\"]:checked').val()\r\n const target = this.element.find('[name=\"targetAction\"]:checked').val()\r\n\r\n if (typeof action !== 'string' || typeof target !== 'string') {\r\n localize.warn('no-select')\r\n return\r\n }\r\n\r\n let user = getCharacterOwner(this.target, true) ?? getOwner(this.target, true) ?? game.users.activeGM\r\n if (!user) {\r\n localize.warn('no-user')\r\n return\r\n }\r\n\r\n sendTradeRequest({\r\n sender: {\r\n id: game.user.id,\r\n cid: this.actor.id,\r\n uuid: action,\r\n },\r\n receiver: {\r\n id: user.id,\r\n cid: this.target.id,\r\n uuid: target,\r\n },\r\n })\r\n\r\n this.close()\r\n }\r\n\r\n async #onDescription(event) {\r\n const uuid = $(event.currentTarget).siblings('input').val()\r\n const entry = await fromUuid(uuid)\r\n entry?.sheet.render(true)\r\n }\r\n\r\n #onChangeTarget(event) {\r\n const id = event.currentTarget.value\r\n this.target = game.actors.get(id)\r\n }\r\n}\r\n", "import { MODULE_ID } from '../module'\r\n\r\nexport function localeCompare(a, b) {\r\n return a.localeCompare(b, game.i18n.lang)\r\n}\r\n\r\nexport function refreshCharacterSheets(actor) {\r\n for (const win of Object.values(ui.windows)) {\r\n const winActor = win.actor\r\n if (!(win instanceof ActorSheet) || !winActor.isOfType('character')) continue\r\n if (!actor || actor === winActor) win.render()\r\n }\r\n}\r\n\r\nexport function compareArrays(arr1, arr2) {\r\n if (arr1.length !== arr2.length) return false\r\n\r\n const clonedArr2 = arr2.slice()\r\n\r\n for (const arr1Value of arr1) {\r\n const index = clonedArr2.findIndex(arr2Value => arr1Value === arr2Value)\r\n if (index === -1) return false\r\n clonedArr2.splice(index, 1)\r\n }\r\n\r\n return true\r\n}\r\n\r\nexport function ordinalString(value) {\r\n const pluralRules = new Intl.PluralRules(game.i18n.lang, { type: 'ordinal' })\r\n const suffix = game.i18n.localize(`PF2E.OrdinalSuffixes.${pluralRules.select(value)}`)\r\n return game.i18n.format('PF2E.OrdinalNumber', { value, suffix })\r\n}\r\n\r\nexport function isInstanceOf(obj, name) {\r\n if (typeof obj !== 'object') return false\r\n\r\n while ((obj = Reflect.getPrototypeOf(obj))) {\r\n if (obj.constructor.name === name) return true\r\n }\r\n\r\n return false\r\n}\r\n\r\nexport function setInMemory(doc, key, value) {\r\n return setProperty(doc, `modules.${MODULE_ID}.${key}`, value)\r\n}\r\n\r\nexport function getInMemory(doc, key) {\r\n return getProperty(doc, `modules.${MODULE_ID}.${key}`)\r\n}\r\n\r\nexport function deleteInMemory(doc, key) {\r\n const split = `modules.${MODULE_ID}.${key}`.split('.')\r\n const last = split.pop()\r\n let cursor = doc\r\n for (const key of split) {\r\n cursor = cursor[key]\r\n if (!cursor) return true\r\n }\r\n return delete cursor[last]\r\n}\r\n", "import { Trade } from '../apps/hero/trade'\r\nimport { isPlayedActor } from '../shared/actor'\r\nimport { chatUUID } from '../shared/chat'\r\nimport { createHook } from '../shared/hook'\r\nimport { localize, subLocalize } from '../shared/localize'\r\nimport { refreshCharacterSheets } from '../shared/misc'\r\nimport { error, warn } from '../shared/notification'\r\nimport { templatePath } from '../shared/path'\r\nimport { getSetting, setSetting } from '../shared/settings'\r\nimport { socketEmit, socketOff, socketOn } from '../shared/socket'\r\nimport { isActiveGM } from '../shared/user'\r\n\r\nconst MODULE_ID = 'pf2e-hero-actions'\r\n\r\nconst setHook = createHook('renderCharacterSheetPF2e', renderCharacterSheetPF2e, setupSocket)\r\n\r\nconst JOURNAL_UUID = 'Compendium.pf2e.journals.JournalEntry.BSp4LUSaOmUyjBko'\r\nconst TABLE_UUID = 'Compendium.pf2e.rollable-tables.RollTable.zgZoI7h0XjjJrrNK'\r\n\r\nconst TABLE_ICON = 'systems/pf2e/icons/features/feats/heroic-recovery.webp'\r\n\r\nlet SOCKET = false\r\n\r\nexport function registerHeroActions() {\r\n return {\r\n name: 'heroActions',\r\n settings: [\r\n {\r\n name: 'hero',\r\n type: Boolean,\r\n default: false,\r\n onChange: value => setHook(value),\r\n },\r\n {\r\n name: 'hero-table',\r\n type: String,\r\n default: '',\r\n },\r\n {\r\n name: 'hero-trade',\r\n type: Boolean,\r\n default: false,\r\n onChange: () => refreshCharacterSheets(),\r\n },\r\n {\r\n name: 'hero-private',\r\n type: Boolean,\r\n default: false,\r\n },\r\n ],\r\n conflicts: [MODULE_ID],\r\n api: {\r\n createTable,\r\n removeHeroActions,\r\n getHeroActions,\r\n useHeroAction,\r\n getHeroActionDetails,\r\n drawHeroAction,\r\n drawHeroActions,\r\n sendActionToChat,\r\n discardHeroActions,\r\n tradeHeroAction,\r\n getDeckTable,\r\n giveHeroActions,\r\n createChatMessage,\r\n },\r\n ready: () => {\r\n setHook(false, 'hero')\r\n },\r\n }\r\n}\r\n\r\nfunction setupSocket(value) {\r\n if (value && !SOCKET) {\r\n socketOn(onSocket)\r\n SOCKET = true\r\n } else if (!value && SOCKET) {\r\n socketOff(onSocket)\r\n SOCKET = false\r\n }\r\n}\r\n\r\nfunction onSocket(packet) {\r\n switch (packet.type) {\r\n case 'hero.trade-reject':\r\n if (packet.sender.id !== game.user.id) return\r\n onTradeRejected(packet)\r\n break\r\n case 'hero.trade-accept':\r\n if (!isActiveGM()) return\r\n onTradeAccepted(packet)\r\n break\r\n case 'hero.trade-request':\r\n if (packet.receiver.id !== game.user.id) return\r\n onTradeRequest(packet)\r\n break\r\n case 'hero.trade-error':\r\n if (!packet.users.includes(game.user.id)) return\r\n onTradeError(packet.error)\r\n break\r\n }\r\n}\r\n\r\nasync function renderCharacterSheetPF2e(sheet, html) {\r\n const actor = sheet.actor\r\n if (!isPlayedActor(actor)) return\r\n\r\n await addActionsToSheet(html, actor)\r\n addSheetEvents(html, actor)\r\n}\r\n\r\nasync function addActionsToSheet(html, actor) {\r\n const actions = getHeroActions(actor)\r\n const diff = actor.heroPoints.value - actions.length\r\n const isOwner = actor.isOwner\r\n const localize = subLocalize('hero.templates.heroActions')\r\n\r\n const template = await renderTemplate(templatePath('hero/sheet'), {\r\n owner: isOwner,\r\n list: actions,\r\n canUse: diff >= 0 && isOwner,\r\n canDraw: diff > 0 && isOwner,\r\n canTrade: getSetting('hero-trade'),\r\n mustDiscard: diff < 0,\r\n diff: Math.abs(diff),\r\n i18n: (key, { hash }) => localize(key, hash),\r\n })\r\n\r\n html.find(\r\n '.sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] > .strikes-list:not(.skill-action-list)'\r\n )\r\n .first()\r\n .after(template)\r\n}\r\n\r\nfunction addSheetEvents(html, actor) {\r\n const list = html.find('.tab.actions .heroActions-list')\r\n list.find('[data-action=draw]').on('click', event => onClickHeroActionsDraw(actor, event))\r\n list.find('[data-action=expand]').on('click', onClickHeroActionExpand)\r\n list.find('[data-action=use]').on('click', event => onClickHeroActionUse(actor, event))\r\n list.find('[data-action=display]').on('click', event => onClickHeroActionDisplay(actor, event))\r\n list.find('[data-action=discard]').on('click', onClickHeroActionDiscard)\r\n list.find('[data-action=discard-selected]').on('click', () => onClickHeroActionsDiscard(actor, html))\r\n html.find('[data-action=hero-actions-trade]').on('click', () => tradeHeroAction(actor))\r\n}\r\n\r\nasync function onClickHeroActionsDiscard(actor, html) {\r\n const discarded = html.find('.tab.actions .heroActions-list .action.discarded')\r\n const uuids = discarded.toArray().map(x => x.dataset.uuid)\r\n discardHeroActions(actor, uuids)\r\n}\r\n\r\nfunction onClickHeroActionDiscard(event) {\r\n event.preventDefault()\r\n\r\n const action = $(event.currentTarget).closest('.action')\r\n const list = action.closest('.heroActions-list')\r\n\r\n action.toggleClass('discarded')\r\n\r\n const toDiscard = Number(list.attr('data-discard') ?? '0')\r\n const $discarded = list.find('.action.discarded')\r\n\r\n list.toggleClass('discardable', $discarded.length === toDiscard)\r\n}\r\n\r\nasync function onClickHeroActionDisplay(actor, event) {\r\n event.preventDefault()\r\n const uuid = $(event.currentTarget).closest('.action').attr('data-uuid')\r\n sendActionToChat(actor, uuid)\r\n}\r\n\r\nasync function onClickHeroActionUse(actor, event) {\r\n event.preventDefault()\r\n const uuid = $(event.currentTarget).closest('.action').attr('data-uuid')\r\n useHeroAction(actor, uuid)\r\n}\r\n\r\nasync function onClickHeroActionsDraw(actor, event) {\r\n event.preventDefault()\r\n drawHeroActions(actor)\r\n}\r\n\r\nexport function getHeroActions(actor) {\r\n return getProperty(actor, `flags.${MODULE_ID}.heroActions`) ?? []\r\n}\r\n\r\nasync function setHeroActions(actor, actions) {\r\n return actor.update({ [`flags.${MODULE_ID}.heroActions`]: actions })\r\n}\r\n\r\nasync function onClickHeroActionExpand(event) {\r\n event.preventDefault()\r\n\r\n const action = $(event.currentTarget).closest('.action')\r\n const summary = action.find('.item-summary')\r\n\r\n if (!summary.hasClass('loaded')) {\r\n const uuid = action.attr('data-uuid')\r\n const details = await getHeroActionDetails(uuid)\r\n if (!details) return\r\n\r\n const text = await TextEditor.enrichHTML(details.description, { async: true })\r\n\r\n summary.find('.item-description').html(text)\r\n summary.addClass('loaded')\r\n }\r\n\r\n action.toggleClass('expanded')\r\n}\r\n\r\nasync function getHeroActionDetails(uuid) {\r\n let document = await fromUuid(uuid)\r\n if (!document) return undefined\r\n\r\n const parent = document instanceof JournalEntry ? document : document.parent\r\n const page = document instanceof JournalEntry ? document.pages.contents[0] : document\r\n\r\n let text = page?.text.content\r\n if (!text) return undefined\r\n\r\n if (parent.uuid === JOURNAL_UUID) text = text.replace(/^

/, '

Trigger ')\r\n return { name: page.name, description: text }\r\n}\r\n\r\nexport async function drawHeroActions(actor) {\r\n if (!actor?.isOfType('character')) {\r\n warn('hero.onlyCharacter')\r\n return\r\n }\r\n\r\n const actions = getHeroActions(actor)\r\n const nb = actor.heroPoints.value - actions.length\r\n\r\n const drawn = []\r\n for (let i = 0; i < nb; i++) {\r\n const action = await drawHeroAction()\r\n\r\n if (action === undefined) continue\r\n else if (action === null) return\r\n\r\n actions.push(action)\r\n drawn.push(action)\r\n }\r\n\r\n if (!drawn.length) return\r\n\r\n setHeroActions(actor, actions)\r\n createChatMessage({ actor, actions: drawn, label: nb => localize('hero.actions-draw.header', { nb }), secret: true })\r\n}\r\n\r\nfunction createChatMessage({ actor, actions, label, secret = false }) {\r\n const { content, size } = chatActions(actions)\r\n\r\n label = typeof label === 'function' ? label(size) : label\r\n\r\n const data = {\r\n flavor: `

${label}

`,\r\n content,\r\n speaker: ChatMessage.getSpeaker({ actor: actor }),\r\n }\r\n\r\n if (secret && getSetting('hero-private')) {\r\n data.type = CONST.CHAT_MESSAGE_TYPES.ROLL\r\n data.rollMode = CONST.DICE_ROLL_MODES.PRIVATE\r\n }\r\n\r\n ChatMessage.create(data)\r\n}\r\n\r\nfunction chatActions(actions) {\r\n const links = actions.map(({ uuid, name }) => chatUUID(uuid, name))\r\n return {\r\n content: links.map(x => `
${x}
`).join(''),\r\n size: links.length,\r\n }\r\n}\r\n\r\nfunction tradeHeroAction(actor) {\r\n if (!actor?.isOfType('character')) {\r\n warn('hero.onlyCharacter')\r\n return\r\n }\r\n\r\n const actions = getHeroActions(actor)\r\n if (!actions || !actions.length) {\r\n warn('hero.no-action')\r\n return\r\n }\r\n\r\n const diff = actions.length - actor.heroPoints.value\r\n if (diff > 0) {\r\n warn('hero.no-points', { nb: diff.toString() })\r\n return\r\n }\r\n\r\n new Trade(actor).render(true)\r\n}\r\n\r\nasync function drawHeroAction() {\r\n const table = await getDeckTable()\r\n const localize = subLocalize('hero.table')\r\n\r\n if (!table) {\r\n localize.error('drawError', true)\r\n return null\r\n }\r\n\r\n if (!table.formula) {\r\n if (game.user.isGM) {\r\n if (table.compendium) {\r\n localize.error('noFormulaCompendium', true)\r\n return null\r\n }\r\n await table.normalize()\r\n } else {\r\n localize.error('noFormula', true)\r\n return null\r\n }\r\n }\r\n\r\n if (table.replacement === false) {\r\n const notDrawn = table.results.some(r => !r.drawn)\r\n if (!notDrawn) await table.resetResults()\r\n }\r\n\r\n const draw = (await table.draw({ displayChat: false })).results[0]\r\n if (!draw) return\r\n\r\n const uuid = documentUuidFromTableResult(draw)\r\n if (uuid) return { uuid, name: await getLabelfromTableResult(draw, uuid) }\r\n}\r\n\r\nasync function useHeroAction(actor, uuid) {\r\n if (!actor?.isOfType('character')) {\r\n warn('hero.onlyCharacter')\r\n return\r\n }\r\n\r\n const points = actor.heroPoints.value\r\n if (points < 1) return warn('hero.use.noPoints')\r\n\r\n const actions = getHeroActions(actor)\r\n\r\n const index = actions.findIndex(x => x.uuid === uuid)\r\n if (index === -1) return\r\n\r\n const details = await getHeroActionDetails(uuid)\r\n if (!details) error('hero.use.noDetails')\r\n\r\n actions.splice(index, 1)\r\n\r\n if (details) {\r\n actor.update({\r\n ['system.resources.heroPoints.value']: points - 1,\r\n [`flags.${MODULE_ID}.heroActions`]: actions,\r\n })\r\n\r\n ChatMessage.create({\r\n flavor: `

${localize('hero.actions-use.header')}

`,\r\n content: `

${details.name}

${details.description}`,\r\n speaker: ChatMessage.getSpeaker({ actor }),\r\n })\r\n } else {\r\n setHeroActions(actor, actions)\r\n }\r\n}\r\n\r\nasync function discardHeroActions(actor, uuids) {\r\n if (!actor?.isOfType('character')) {\r\n warn('hero.onlyCharacter')\r\n return\r\n }\r\n\r\n uuids = typeof uuids === 'string' ? [uuids] : uuids\r\n\r\n const actions = getHeroActions(actor)\r\n const removed = []\r\n\r\n for (const uuid of uuids) {\r\n const index = actions.findIndex(x => x.uuid === uuid)\r\n if (index === -1) continue\r\n removed.push(actions[index])\r\n actions.splice(index, 1)\r\n }\r\n\r\n setHeroActions(actor, actions)\r\n createChatMessage({ actor, actions: removed, label: nb => localize('hero.actions-discard.header', { nb }) })\r\n}\r\n\r\nasync function getLabelfromTableResult(result, uuid) {\r\n if (result.type !== CONST.TABLE_RESULT_TYPES.TEXT) return result.text\r\n const label = /@UUID\\[[\\w\\.]+\\]{([\\w -]+)}/.exec(result.text)?.[1]\r\n return label ?? (uuid && (await fromUuid(uuid))?.name)\r\n}\r\n\r\nasync function getTableFromUuid(uuid) {\r\n if (!uuid) return undefined\r\n const table = await fromUuid(uuid)\r\n return table && table instanceof RollTable ? table : undefined\r\n}\r\n\r\nasync function getDefaultCompendiumTable() {\r\n return getTableFromUuid(TABLE_UUID)\r\n}\r\n\r\nfunction getDefaultWorldTable() {\r\n return game.tables.find(x => x.getFlag('core', 'sourceId') === TABLE_UUID)\r\n}\r\n\r\nasync function getCustomTable() {\r\n return getTableFromUuid(getSetting('hero-table'))\r\n}\r\n\r\nasync function getDeckTable() {\r\n return (await getCustomTable()) ?? getDefaultWorldTable() ?? (await getDefaultCompendiumTable())\r\n}\r\n\r\nasync function sendActionToChat(actor, uuid) {\r\n const details = await getHeroActionDetails(uuid)\r\n if (!details) return error('hero.details.missing')\r\n\r\n ChatMessage.create({\r\n content: `

${details.name}

${details.description}`,\r\n speaker: ChatMessage.getSpeaker({ actor: actor }),\r\n })\r\n}\r\n\r\nexport function sendTradeRequest(trade) {\r\n if (trade.receiver.id === game.user.id) {\r\n acceptRequest(trade)\r\n return\r\n }\r\n\r\n socketEmit({\r\n ...trade,\r\n type: 'hero.trade-request',\r\n })\r\n}\r\n\r\nfunction acceptRequest(trade) {\r\n if (game.user.isGM) {\r\n onTradeAccepted(trade)\r\n return\r\n }\r\n\r\n socketEmit({\r\n ...trade,\r\n type: 'hero.trade-accept',\r\n })\r\n}\r\n\r\nasync function onTradeAccepted(trade) {\r\n const { sender, receiver } = trade\r\n const senderActor = game.actors.get(sender.cid)\r\n const receiverActor = game.actors.get(receiver.cid)\r\n\r\n if (!senderActor || !receiverActor) {\r\n sendTradeError(trade)\r\n return\r\n }\r\n\r\n const senderActions = getHeroActions(senderActor)\r\n const receiverActions = getHeroActions(receiverActor)\r\n\r\n const senderActionIndex = senderActions.findIndex(x => x.uuid === sender.uuid)\r\n const receiverActionIndex = receiverActions.findIndex(x => x.uuid === receiver.uuid)\r\n\r\n if (senderActionIndex === -1 || receiverActionIndex === -1) {\r\n sendTradeError(trade)\r\n return\r\n }\r\n\r\n const senderAction = senderActions.splice(senderActionIndex, 1)[0]\r\n const receiverAction = receiverActions.splice(receiverActionIndex, 1)[0]\r\n\r\n senderActions.push(receiverAction)\r\n receiverActions.push(senderAction)\r\n\r\n setHeroActions(senderActor, senderActions)\r\n setHeroActions(receiverActor, receiverActions)\r\n\r\n const sentLink = chatUUID(senderAction.uuid)\r\n const receivedLink = chatUUID(receiverAction.uuid)\r\n\r\n const localize = subLocalize('hero.trade-success')\r\n\r\n let content = `
${localize('offer', { offer: sentLink })}
`\r\n content += `
${localize('receive', { receive: receivedLink })}
`\r\n\r\n ChatMessage.create({\r\n flavor: `

${localize('header', { name: receiverActor.name })}

`,\r\n content,\r\n speaker: ChatMessage.getSpeaker({ actor: senderActor }),\r\n })\r\n}\r\n\r\nfunction sendTradeError({ sender, receiver }, error = 'trade-error') {\r\n const users = new Set([sender.id, receiver.id])\r\n\r\n if (users.has(game.user.id)) {\r\n users.delete(game.user.id)\r\n onTradeError(error)\r\n }\r\n\r\n if (!users.size) return\r\n\r\n socketEmit({\r\n type: 'hero.trade-error',\r\n users: Array.from(users),\r\n error,\r\n })\r\n}\r\n\r\nfunction onTradeError(err) {\r\n error('hero.trade-error')\r\n}\r\n\r\nasync function onTradeRequest(trade) {\r\n const { sender, receiver } = trade\r\n const senderActor = game.actors.get(sender.cid)\r\n const receiverActor = game.actors.get(receiver.cid)\r\n\r\n if (!senderActor || !receiverActor) {\r\n sendTradeError(trade)\r\n return\r\n }\r\n\r\n const localize = subLocalize('hero.trade-request')\r\n\r\n let content = `

${localize('header', { sender: senderActor.name, receiver: receiverActor.name })}

`\r\n content += `

${localize('give', { give: chatUUID(sender.uuid) })}

`\r\n content += `

${localize('want', { want: chatUUID(receiver.uuid) })}

`\r\n content += `

${localize('accept')}

`\r\n\r\n const accept = await Dialog.confirm({\r\n title: localize('title'),\r\n content: await TextEditor.enrichHTML(content, { async: true }),\r\n })\r\n\r\n if (accept) acceptRequest(trade)\r\n else rejectRequest(trade)\r\n}\r\n\r\nfunction rejectRequest(trade) {\r\n if (trade.sender.id === game.user.id) {\r\n onTradeRejected(trade)\r\n return\r\n }\r\n\r\n socketEmit({\r\n ...trade,\r\n type: 'hero.trade-reject',\r\n })\r\n}\r\n\r\nasync function onTradeRejected({ receiver }) {\r\n const actor = game.actors.get(receiver.cid)\r\n warn('hero.trade-rejected', { name: actor.name }, true)\r\n}\r\n\r\nasync function createTable() {\r\n if (!game.user.isGM) {\r\n warn('hero.notGM')\r\n return\r\n }\r\n\r\n const localize = subLocalize('hero.templates.createTable.choice')\r\n const template = templatePath('hero/dialogs/create-table')\r\n\r\n const buttons = {\r\n yes: {\r\n label: localize('create'),\r\n icon: '',\r\n callback: html => {\r\n const type = html.find('.window-content input[name=\"type\"]:checked').val()\r\n const unique = html.find('.window-content input[name=\"draw\"]:checked').val() === 'unique'\r\n return { type, unique }\r\n },\r\n },\r\n no: {\r\n label: localize('cancel'),\r\n icon: '',\r\n callback: () => null,\r\n },\r\n }\r\n\r\n const data = {\r\n content: await renderTemplate(template, { i18n: localize }),\r\n title: localize('title'),\r\n buttons,\r\n default: 'yes',\r\n close: () => null,\r\n }\r\n\r\n const result = await Dialog.wait(data, undefined, { id: 'pf2e-hero-actions-create-table' })\r\n if (!result) return\r\n\r\n if (result.type === 'default') createDefaultTable(result.unique)\r\n else createCustomTable(result.unique)\r\n}\r\n\r\nasync function createCustomTable(unique) {\r\n const table = await createCustomActionsTable(unique)\r\n await setTable(table)\r\n table.sheet?.render(true)\r\n}\r\n\r\nfunction createCustomActionsTable(unique = true) {\r\n const source = getTableSource(unique)\r\n return RollTable.create(source, { temporary: false })\r\n}\r\n\r\nasync function createDefaultTable(unique) {\r\n const localize = subLocalize('templates.createTable.default.confirm')\r\n let table = await getDefaultWorldTable()\r\n\r\n if (table) {\r\n const override = await Dialog.confirm({\r\n title: localize('title'),\r\n content: localize('content'),\r\n })\r\n\r\n if (override) {\r\n const update = getTableSource(unique)\r\n await table.update(update)\r\n return setTable(table, true)\r\n }\r\n }\r\n\r\n table = await createDefautActionsTable(unique)\r\n await setTable(table)\r\n}\r\n\r\nasync function createDefautActionsTable(unique = true) {\r\n const table = await fromUuid(TABLE_UUID)\r\n const source = getTableSource(unique, table)\r\n return RollTable.create(source, { temporary: false })\r\n}\r\n\r\nasync function setTable(table, normalize = false) {\r\n if (normalize) await table.normalize()\r\n await setSetting('hero-table', table.uuid)\r\n}\r\n\r\nfunction getTableSource(unique = true, table) {\r\n const source = {\r\n name: localize('hero.table.name'),\r\n replacement: !unique,\r\n img: TABLE_ICON,\r\n description: localize('hero.table.description'),\r\n flags: {\r\n core: {\r\n sourceId: TABLE_UUID,\r\n },\r\n },\r\n }\r\n if (!table) return source\r\n return mergeObject(deepClone(table._source), source)\r\n}\r\n\r\nasync function removeHeroActions() {\r\n if (!game.user.isGM) {\r\n warn('hero.notGM')\r\n return\r\n }\r\n\r\n const localize = subLocalize('hero.templates.removeActions')\r\n const template = templatePath('hero/dialogs/remove-actions')\r\n\r\n const buttons = {\r\n yes: {\r\n label: localize('remove'),\r\n icon: '',\r\n callback: html =>\r\n html\r\n .find('input[name=\"actor\"]:checked')\r\n .toArray()\r\n .map(x => game.actors.get(x.value))\r\n .filter(x => x),\r\n },\r\n no: {\r\n label: localize('cancel'),\r\n icon: '',\r\n callback: () => null,\r\n },\r\n }\r\n\r\n const data = {\r\n content: await renderTemplate(template, {\r\n actors: game.actors.filter(x => x.type === 'character'),\r\n i18n: localize,\r\n }),\r\n title: localize('title'),\r\n buttons,\r\n default: 'yes',\r\n render: html => {\r\n html.on('change', 'input[name=\"all\"]', () => removeActionsToggleAll(html))\r\n html.on('change', 'input[name=\"actor\"]', () => removeActionsToggleActor(html))\r\n },\r\n close: () => null,\r\n }\r\n\r\n const actors = await Dialog.wait(data, undefined, { id: 'pf2e-hero-actions-remove-actions' })\r\n\r\n if (!actors) return\r\n\r\n if (!actors.length) {\r\n localize.warn('noSelection')\r\n return\r\n }\r\n\r\n for (const actor of actors) {\r\n setHeroActions(actor, [])\r\n }\r\n\r\n localize.info('removed')\r\n}\r\n\r\nfunction removeActionsToggleAll(html) {\r\n const state = html.find('input[name=\"all\"]')[0].checked\r\n html.find('input[name=\"actor\"]').prop('checked', state)\r\n}\r\n\r\nfunction removeActionsToggleActor(html) {\r\n const actors = html.find('input[name=\"actor\"]')\r\n const checked = actors.filter(':checked')\r\n const all = html.find('input[name=\"all\"]')\r\n\r\n if (actors.length === checked.length) {\r\n all.prop('checked', true).prop('indeterminate', false)\r\n actors.prop('checked', true)\r\n } else if (!checked.length) {\r\n all.prop('checked', false).prop('indeterminate', false)\r\n actors.prop('checked', false)\r\n } else {\r\n all.prop('checked', false).prop('indeterminate', true)\r\n }\r\n}\r\n\r\nfunction documentUuidFromTableResult(result) {\r\n if (result.type === CONST.TABLE_RESULT_TYPES.TEXT) return /@UUID\\[([\\w\\.]+)\\]/.exec(result.text)?.[1]\r\n if (result.type === CONST.TABLE_RESULT_TYPES.DOCUMENT) return `${result.documentCollection}.${result.documentId}`\r\n if (result.type === CONST.TABLE_RESULT_TYPES.COMPENDIUM) return `Compendium.${result.documentCollection}.${result.documentId}`\r\n return undefined\r\n}\r\n\r\nasync function giveHeroActions(actor) {\r\n if (!game.user.isGM) {\r\n warn('hero.notGM')\r\n return\r\n }\r\n\r\n const templateLocalize = subLocalize('hero.templates.giveAction')\r\n\r\n if (!actor?.isOfType('character')) {\r\n templateLocalize.warn('noCharacter')\r\n return null\r\n }\r\n\r\n const table = await getDeckTable()\r\n if (!table) {\r\n error('hero.table.drawError', true)\r\n return null\r\n }\r\n\r\n const isUnique = table.replacement === false\r\n\r\n const actionsList = (\r\n await Promise.all(\r\n table.results.map(async result => {\r\n const uuid = documentUuidFromTableResult(result)\r\n if (!uuid) return\r\n\r\n return {\r\n key: result.id,\r\n uuid,\r\n name: await getLabelfromTableResult(result, uuid),\r\n drawn: result.drawn,\r\n }\r\n })\r\n )\r\n ).filter(Boolean)\r\n\r\n const template = templatePath('hero/dialogs/give-action')\r\n const content = await renderTemplate(template, {\r\n actions: actionsList,\r\n isUnique,\r\n i18n: templateLocalize,\r\n })\r\n\r\n const buttons = {\r\n yes: {\r\n label: templateLocalize('give'),\r\n icon: '',\r\n callback: html => ({\r\n selected: html\r\n .find('[name=action]:checked')\r\n .closest('.action')\r\n .toArray()\r\n .map(el => el.dataset),\r\n asDrawn: html.find('[name=drawn]').prop('checked') ?? false,\r\n withMessage: html.find('[name=message]').prop('checked'),\r\n }),\r\n },\r\n no: {\r\n label: templateLocalize('cancel'),\r\n icon: '',\r\n callback: () => null,\r\n },\r\n }\r\n\r\n const data = {\r\n title: templateLocalize('title'),\r\n content,\r\n buttons,\r\n render: html => {\r\n html.find('[data-action=expand]').on('click', onClickHeroActionExpand)\r\n },\r\n close: () => null,\r\n }\r\n\r\n const result = await Dialog.wait(data, undefined, { id: 'pf2e-hero-actions-give-action' })\r\n if (!result) return\r\n\r\n const { selected, asDrawn, withMessage } = result\r\n const actions = getHeroActions(actor)\r\n const tableUpdates = []\r\n\r\n for (const { uuid, name, key } of selected) {\r\n actions.push({ uuid, name })\r\n if (!asDrawn) continue\r\n\r\n const result = table.results.get(key)\r\n if (result && !result.drawn) tableUpdates.push(key)\r\n }\r\n\r\n if (tableUpdates.length) {\r\n await table.updateEmbeddedDocuments(\r\n 'TableResult',\r\n tableUpdates.map(key => ({ _id: key, drawn: true }))\r\n )\r\n }\r\n\r\n setHeroActions(actor, actions)\r\n\r\n if (withMessage) {\r\n createChatMessage({ actor, actions: selected, label: nb => localize('hero.actions-give.header', { nb }), secret: true })\r\n }\r\n}\r\n", "import { getFlag, setFlag } from '../../shared/flags'\r\nimport { subLocalize } from '../../shared/localize'\r\nimport { templatePath } from '../../shared/path'\r\n\r\nconst localize = subLocalize('knowledges.editLore')\r\n\r\nexport class EditLores extends FormApplication {\r\n get actor() {\r\n return this.object\r\n }\r\n\r\n get id() {\r\n return `npc-edit-lores-${this.actor.id}`\r\n }\r\n\r\n get title() {\r\n return localize('title', this.actor)\r\n }\r\n\r\n get template() {\r\n return templatePath('knowledges/lores')\r\n }\r\n\r\n getData(options) {\r\n const actor = this.actor\r\n\r\n return mergeObject(super.getData(options), {\r\n unspecified: getFlag(actor, 'knowledges.unspecified') ?? '',\r\n specific: getFlag(actor, 'knowledges.specific') ?? '',\r\n i18n: localize,\r\n })\r\n }\r\n\r\n async _updateObject(event, { unspecified, specific }) {\r\n const actor = this.object\r\n setFlag(actor, 'knowledges.unspecified', unspecified.trim())\r\n setFlag(actor, 'knowledges.specific', specific.trim())\r\n }\r\n\r\n activateListeners(html) {\r\n html.find('button.cancel').on('click', this.#onCancel.bind(this))\r\n }\r\n\r\n #onCancel(event) {\r\n event.preventDefault()\r\n this.close()\r\n }\r\n}\r\n", "import { EditLores } from '../apps/knowledges/lores'\r\nimport { isPlayedActor } from '../shared/actor'\r\nimport { getFlag } from '../shared/flags'\r\nimport { createHook } from '../shared/hook'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst setHook = createHook('renderNPCSheetPF2e', renderNPCSheetPF2e)\r\n\r\nexport function registerKnowledges() {\r\n return {\r\n settings: [\r\n {\r\n name: 'knowledges',\r\n type: Boolean,\r\n default: false,\r\n onChange: value => setHook(value),\r\n },\r\n ],\r\n conflicts: ['pf2e-npc-knowledges'],\r\n ready: isGM => {\r\n if (isGM && getSetting('knowledges')) setHook(true)\r\n },\r\n }\r\n}\r\n\r\nfunction renderNPCSheetPF2e(sheet, $html) {\r\n const actor = sheet.actor\r\n if (!isPlayedActor(actor)) return\r\n\r\n replaceLores(actor, $html)\r\n addEditButton($html)\r\n addEvents(actor, $html)\r\n}\r\n\r\nfunction knowledgeSelector(html, section, selector) {\r\n return html.find(\r\n `[data-tab=\"main\"] .recall-knowledge ${section === 'header' ? '.section-header' : '.section-body'} ${selector}`\r\n )\r\n}\r\n\r\nfunction editLores(actor) {\r\n new EditLores(actor).render(true)\r\n}\r\n\r\nfunction replaceLores(actor, html) {\r\n const unspecifics = getFlag(actor, 'knowledges.unspecified')\r\n const specifics = getFlag(actor, 'knowledges.specific')\r\n if (!unspecifics && !specifics) return\r\n\r\n const lores = actor.identificationDCs.lore\r\n const body = knowledgeSelector(html, 'body', '')\r\n body.find('.identification-skills').last().remove()\r\n\r\n function tag(skills, dc, adjustment) {\r\n const content = game.i18n.format('PF2E.Actor.NPC.Identification.Skills.Label', { skills, dc, adjustment })\r\n return `
${content}
`\r\n }\r\n\r\n function addTags(lores, { dc, start }) {\r\n const tags = lores\r\n .split(',')\r\n .filter(lore => lore.trim())\r\n .map(lore => tag(lore, dc, start))\r\n .join('')\r\n body.append(tags)\r\n }\r\n\r\n addTags(unspecifics || 'Unspecific', lores[0])\r\n addTags(specifics || 'Specific', lores[1])\r\n}\r\n\r\nfunction addEvents(actor, html) {\r\n const edit = knowledgeSelector(html, 'header', 'button.edit')\r\n edit.on('click', () => editLores(actor))\r\n}\r\n\r\nfunction addEditButton(html) {\r\n const attempts = knowledgeSelector(html, 'header', 'button')\r\n const edit = ''\r\n attempts.before(edit)\r\n}\r\n", "import { bindOnPreCreateSpellDamageChatMessage } from '../../shared/chat'\r\nimport { subLocalize } from '../../shared/localize'\r\nimport { templatePath } from '../../shared/path'\r\n\r\nconst localize = subLocalize('merge.multi')\r\n\r\nexport class MultiCast extends Application {\r\n #message\r\n #event\r\n\r\n constructor(event, message, options) {\r\n super(options)\r\n this.#event = event\r\n this.#message = message\r\n }\r\n\r\n get title() {\r\n return localize('title', this.spell)\r\n }\r\n\r\n get template() {\r\n return templatePath('merge/multi')\r\n }\r\n\r\n getData(options) {\r\n return mergeObject(super.getData(options), {\r\n i18n: localize,\r\n })\r\n }\r\n\r\n activateListeners(html) {\r\n html.find('[data-action=cast]').on('click', this.#onCast.bind(this))\r\n html.find('[data-action=cancel]').on('click', this.#onCancel.bind(this))\r\n }\r\n\r\n async #onCast(event) {\r\n event.preventDefault()\r\n\r\n const nb = this.element.find('[name=multi]').val()\r\n if (nb < 1) {\r\n localize.error('zero')\r\n this.close()\r\n return\r\n }\r\n\r\n const message = this.#message\r\n if (!message) return\r\n\r\n const spell = message.item\r\n const actor = message.actor\r\n if (!actor || !spell) return\r\n\r\n const updateSource = (damages, heightening) => {\r\n for (const [id, damage] of Object.entries(damages)) {\r\n for (let i = 0; i < nb - 1; i++) {\r\n const newId = randomID()\r\n\r\n damages[newId] = damage\r\n\r\n if (heightening.type === 'interval') {\r\n const damage = heightening.damage[id]\r\n if (damage) heightening.damage[newId] = damage\r\n } else if (heightening.type === 'fixed') {\r\n for (const [level, data] of Object.entries(heightening.levels)) {\r\n const damage = data.damage.value[id]\r\n if (damage) heightening.levels[level].damage.value[newId] = damage\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n const embeddedSource = deepClone(message.flags.pf2e.casting?.embeddedSpell)\r\n\r\n if (embeddedSource) {\r\n const damages = embeddedSource.system.damage\r\n const heightening = (embeddedSource.system.heightening ??= {})\r\n\r\n updateSource(damages, heightening)\r\n\r\n const newSpell = new CONFIG.Item.documentClass(embeddedSource, { parent: actor })\r\n newSpell.trickMagicEntry = spell.trickMagicEntry\r\n\r\n const overlayIds = message.getFlag('pf2e', 'origin.variant.overlays')\r\n const castLevel = message.getFlag('pf2e', 'origin.castLevel') ?? spell.rank\r\n const modifiedSpell = newSpell.loadVariant({ overlayIds, castLevel })\r\n const castSpell = modifiedSpell ?? newSpell\r\n\r\n castSpell.rollDamage(this.#event)\r\n } else {\r\n const spellSource = spell.toObject()\r\n const damages = spellSource.system.damage\r\n const heightening = spellSource.system.heightening ?? {}\r\n\r\n updateSource(damages, heightening)\r\n const newSpell = spell.clone({ 'system.damage': damages, 'system.heightening': heightening })\r\n newSpell.rollDamage(this.#event)\r\n }\r\n\r\n if (spell.damageKinds.size) {\r\n bindOnPreCreateSpellDamageChatMessage(message)\r\n }\r\n\r\n this.close()\r\n }\r\n\r\n #onCancel(event) {\r\n event.preventDefault()\r\n this.close()\r\n }\r\n}\r\n", "export function getDamageRollClass() {\r\n return CONFIG.Dice.rolls.find(Roll => Roll.name === 'DamageRoll')\r\n}\r\n", "import { MultiCast } from '../apps/merge/multi'\r\nimport { MODULE_ID } from '../module'\r\nimport { getChatMessageClass, latestChatMessages } from '../shared/chat'\r\nimport { getFlag } from '../shared/flags'\r\nimport { createHook } from '../shared/hook'\r\nimport { localize } from '../shared/localize'\r\nimport { compareArrays } from '../shared/misc'\r\nimport { warn } from '../shared/notification'\r\nimport { templatePath } from '../shared/path'\r\nimport { getDamageRollClass } from '../shared/pf2e/classes'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst setHook = createHook('renderChatMessage', renderChatMessage, updateMessages)\r\n\r\nexport function registerMerge() {\r\n return {\r\n settings: [\r\n {\r\n name: 'merge-damage',\r\n type: Boolean,\r\n default: false,\r\n scope: 'client',\r\n onChange: value => setHook(value, 'multi-cast'),\r\n },\r\n {\r\n name: 'multi-cast',\r\n type: Boolean,\r\n default: false,\r\n scope: 'client',\r\n onChange: value => setHook(value, 'merge-damage'),\r\n },\r\n ],\r\n init: isGm => {\r\n setHook(false, ['multi-cast', 'merge-damage'], true)\r\n },\r\n }\r\n}\r\n\r\nfunction updateMessages() {\r\n const chat = ui.chat?.element\r\n if (!chat) return\r\n\r\n for (const message of latestChatMessages(10)) {\r\n const html = chat.find(`[data-message-id=${message.id}]`)\r\n if (!html.length) continue\r\n\r\n html.find('[data-action=multi-cast]').remove()\r\n html.find('[data-action=merge-damage]').remove()\r\n\r\n renderChatMessage(message, html)\r\n }\r\n}\r\n\r\nfunction renderChatMessage(message, html) {\r\n if (!game.user.isGM && !message.isAuthor) return\r\n if (getSetting('merge-damage') && isDamageRoll(message)) renderDamage(message, html)\r\n else if (getSetting('multi-cast') && message.getFlag('pf2e', 'origin.type') === 'spell') renderSpell(message, html)\r\n}\r\n\r\nfunction renderSpell(message, html) {\r\n const item = message.item\r\n if (!item) return\r\n\r\n const spellBtn = html.find('.message-content .chat-card .owner-buttons .spell-button')\r\n\r\n spellBtn\r\n .find('[data-action=spell-damage]')\r\n .after(``)\r\n\r\n spellBtn.find('[data-action=multi-cast]').on('click', event => {\r\n new MultiCast(event, message).render(true)\r\n })\r\n}\r\n\r\nfunction renderDamage(message, html) {\r\n let buttons = ''\r\n\r\n if (getFlag(message, 'merge.merged')) {\r\n const tooltip = localize('merge.damage.split-tooltip')\r\n buttons += `'\r\n\r\n buttons += ''\r\n\r\n const actorUUID = getActorUUID(message)\r\n const targetUUIDs = getTargetUUIDs(message)\r\n\r\n html.find('.dice-result .dice-total').append(buttons)\r\n html.find('.pf2e-toolbelt-merge [data-action=merge-damage]').on('click', event => {\r\n event.stopPropagation()\r\n\r\n for (const otherMessage of latestChatMessages(5, message)) {\r\n const otherTargetsUUIDS = getTargetUUIDs(otherMessage)\r\n\r\n if (\r\n !isDamageRoll(otherMessage) ||\r\n getActorUUID(otherMessage) !== actorUUID ||\r\n !compareArrays(\r\n targetUUIDs?.map(t => t.actor).filter(Boolean),\r\n otherTargetsUUIDS?.map(t => t.actor).filter(Boolean)\r\n )\r\n )\r\n continue\r\n\r\n mergeDamages(event, message, otherMessage, { actorUUID, targetUUIDs })\r\n return\r\n }\r\n\r\n warn('merge.damage.none')\r\n })\r\n\r\n html.find('.pf2e-toolbelt-merge [data-action=split-damage]').on('click', event => {\r\n event.stopPropagation()\r\n splitDamages(event, message)\r\n })\r\n}\r\n\r\nasync function splitDamages(event, message) {\r\n const sources = getFlag(message, 'merge.data').flatMap(data => data.source)\r\n await removeChatMessages(message.id)\r\n await getChatMessageClass().createDocuments(sources)\r\n}\r\n\r\nasync function mergeDamages(event, origin, other, { actorUUID, targetUUIDs }) {\r\n const dataGroups = {}\r\n\r\n const data = getMessageData(other).concat(getMessageData(origin))\r\n for (const { name, notes, outcome, modifiers, tags } of data) {\r\n dataGroups[name] ??= {\r\n name,\r\n tags,\r\n notes: new Set(),\r\n results: [],\r\n }\r\n\r\n notes.forEach(dataGroups[name].notes.add, dataGroups[name].notes)\r\n\r\n const exists = dataGroups[name].results.some(\r\n result => result.outcome === outcome && compareArrays(result.modifiers, modifiers)\r\n )\r\n\r\n if (!exists) dataGroups[name].results.push({ outcome, modifiers })\r\n }\r\n\r\n const groups = Object.values(dataGroups).map(group => {\r\n group.label = group.name\r\n group.results.forEach(result => {\r\n if (!result.outcome) return\r\n result.label = game.i18n.localize(`PF2E.Check.Result.Degree.Attack.${result.outcome}`)\r\n })\r\n return group\r\n })\r\n\r\n groups.at(-1).isLastGroup = true\r\n\r\n const flavor = await renderTemplate(templatePath('merge/merged'), {\r\n groups,\r\n hasMultipleGroups: groups.length > 1,\r\n })\r\n\r\n const originRolls = getMessageRolls(origin)\r\n const otherRolls = getMessageRolls(other)\r\n const groupedRolls = []\r\n\r\n for (const roll of [].concat(otherRolls, originRolls)) {\r\n const { options, total, terms } = roll\r\n const term = terms[0]\r\n const formula = roll.formula\r\n .replaceAll(/(\\[[\\w,]+\\])/g, '')\r\n .replace(/^\\(/, '')\r\n .replace(/\\)$/, '')\r\n const group = groupedRolls.find(\r\n ({ options: { flavor, critRule } }) => flavor === options.flavor && critRule === options.critRule\r\n )\r\n\r\n if (group) {\r\n group.terms.push(term)\r\n group.total += total\r\n group.formulas.push(formula)\r\n } else {\r\n groupedRolls.push({\r\n options,\r\n formulas: [formula],\r\n total,\r\n terms: [term],\r\n })\r\n }\r\n }\r\n\r\n const DamageRoll = getDamageRollClass()\r\n for (const group of groupedRolls) {\r\n if (group.options.flavor.includes('persistent')) {\r\n const { index } = group.formulas.reduce(\r\n (acc, curr, index) => {\r\n const value = new DamageRoll(curr).expectedValue\r\n if (value > acc.value) acc = { value, index }\r\n return acc\r\n },\r\n { value: 0, index: -1 }\r\n )\r\n\r\n group.formulas = [group.formulas[index]]\r\n group.terms = [group.terms[index]]\r\n }\r\n\r\n group.formula = `(${group.formulas.join(' + ')})[${group.options.flavor}]`\r\n group.term = group.terms.length < 2 ? group.terms[0] : createTermGroup(group.terms)\r\n }\r\n\r\n const roll = {\r\n class: 'DamageRoll',\r\n options: {},\r\n dice: [],\r\n formula: `{${groupedRolls.map(({ formula }) => formula).join(', ')}}`,\r\n total: groupedRolls.reduce((acc, { total }) => acc + total, 0),\r\n evaluated: true,\r\n terms: [\r\n {\r\n class: 'InstancePool',\r\n options: {},\r\n evaluated: true,\r\n terms: groupedRolls.map(({ formula }) => formula),\r\n modifiers: [],\r\n rolls: groupedRolls.map(({ options, formula, total, term }) => ({\r\n class: 'DamageInstance',\r\n options,\r\n dice: [],\r\n formula,\r\n total,\r\n terms: [term],\r\n evaluated: true,\r\n })),\r\n results: groupedRolls.map(({ total }) => ({ result: total, active: true })),\r\n },\r\n ],\r\n }\r\n\r\n if (game.modules.get('dice-so-nice')?.active) {\r\n const setHidden = term => {\r\n if ('results' in term) {\r\n term.results.forEach(result => (result.hidden = true))\r\n } else {\r\n ;(term.term ?? term).operands?.forEach(operand => setHidden(operand))\r\n }\r\n }\r\n\r\n roll.terms[0].rolls.forEach(roll => roll.terms.forEach(term => setHidden(term)))\r\n }\r\n\r\n await removeChatMessages(origin.id, other.id)\r\n\r\n await getChatMessageClass().create({\r\n flavor,\r\n type: CONST.CHAT_MESSAGE_TYPES.ROLL,\r\n speaker: origin.speaker,\r\n flags: {\r\n [MODULE_ID]: {\r\n merge: {\r\n actor: actorUUID,\r\n targets: targetUUIDs,\r\n merged: true,\r\n type: 'damage-roll',\r\n data,\r\n },\r\n target: {\r\n targets: targetUUIDs,\r\n },\r\n },\r\n pf2e: {\r\n context: {\r\n options: Array.from(new Set(data.flatMap(entry => entry.itemTraits))),\r\n },\r\n },\r\n },\r\n rolls: [roll],\r\n })\r\n}\r\n\r\nfunction getMessageData(message) {\r\n const flags = getFlag(message, 'merge.data')\r\n if (flags) return flags\r\n\r\n const source = message.toObject()\r\n delete source._id\r\n delete source.timestamp\r\n\r\n const html = $(`
${message.flavor}
`)\r\n const tags = html.find('h4.action + .tags').prop('outerHTML')\r\n\r\n const modifiers = []\r\n html.find('.tag.tag_transparent').each(function () {\r\n modifiers.push(this.innerHTML)\r\n })\r\n\r\n const notes = source.flags.pf2e.context.notes.map(\r\n ({ title, text }) => `${game.i18n.localize(title)} ${game.i18n.localize(text)}`\r\n )\r\n\r\n return [\r\n {\r\n source,\r\n name: source.flags.pf2e.strike?.name ?? message.item.name,\r\n outcome: source.flags.pf2e.context.outcome,\r\n itemTraits: source.flags.pf2e.context.options.filter(option => option.startsWith('item:')),\r\n modifiers,\r\n tags,\r\n notes,\r\n },\r\n ]\r\n}\r\n\r\nfunction removeChatMessages(...ids) {\r\n const joinedIds = ids.map(id => `[data-message-id=${id}]`).join(', ')\r\n ui.chat.element.find(joinedIds).remove()\r\n return ChatMessage.deleteDocuments(ids)\r\n}\r\n\r\nfunction createTermGroup(terms) {\r\n const options = deepClone(terms[0].options)\r\n terms.map(term => ((term.options = {}), term))\r\n\r\n return {\r\n class: 'Grouping',\r\n options,\r\n evaluated: true,\r\n term: {\r\n class: 'ArithmeticExpression',\r\n options: {},\r\n evaluated: true,\r\n operator: '+',\r\n operands: [terms.shift(), terms.length > 1 ? createTermGroup(terms) : terms[0]],\r\n },\r\n }\r\n}\r\n\r\nfunction getMessageRolls(message) {\r\n return getFlag(message, 'merge.rolls') ?? JSON.parse(message._source.rolls[0]).terms[0].rolls\r\n}\r\n\r\nfunction getActorUUID(message) {\r\n return getFlag(message, 'merge.actor') ?? message.actor?.uuid\r\n}\r\n\r\nfunction getTargetUUIDs(message) {\r\n const targetTargets = getFlag(message, 'target.targets')\r\n if (targetTargets) return targetTargets\r\n\r\n const mergeTargets = getFlag(message, 'merge.targets') ?? message.getFlag('pf2e', 'target')\r\n if (Array.isArray(mergeTargets)) return mergeTargets\r\n return mergeTargets ? [mergeTargets] : []\r\n}\r\n\r\nfunction isDamageRoll(message) {\r\n return getFlag(message, 'merge.type') === 'damage-roll' || message.getFlag('pf2e', 'context.type') === 'damage-roll'\r\n}\r\n", "import { latestChatMessages } from '../shared/chat'\r\nimport { createChoicesHook } from '../shared/hook'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst setHook = createChoicesHook('renderChatMessage', renderChatMessage, updateMessages)\r\n\r\nexport function registerHideModifiers() {\r\n return {\r\n settings: [\r\n {\r\n name: 'modifiers',\r\n type: String,\r\n default: 'disabled',\r\n choices: ['disabled', 'enabled', 'traits'],\r\n onChange: value => setHook(value),\r\n },\r\n ],\r\n init: isGM => {\r\n if (!isGM && getSetting('modifiers') !== 'disabled') setHook(true, true)\r\n },\r\n }\r\n}\r\n\r\nfunction updateMessages() {\r\n if (game.user.isGM) return\r\n\r\n const chat = ui.chat?.element\r\n if (!chat) return\r\n\r\n for (const message of latestChatMessages(20)) {\r\n const html = chat.find(`[data-message-id=${message.id}]`)\r\n if (!html.length) continue\r\n\r\n html.find('.message-header').removeClass('pf2e-toolbelt-modifiers pf2e-toolbelt-modifiers-traits')\r\n renderChatMessage(message, html)\r\n }\r\n}\r\n\r\nfunction renderChatMessage(message, html) {\r\n const speaker = message.speaker\r\n const actor = ChatMessage.getSpeakerActor(speaker)\r\n if (!actor || actor.hasPlayerOwner) return\r\n\r\n const header = html.find('.message-header')\r\n\r\n if (getSetting('modifiers') === 'traits') {\r\n header.addClass('pf2e-toolbelt-modifiers-traits')\r\n }\r\n\r\n if (getSetting('modifiers') !== 'disabled') {\r\n header.addClass('pf2e-toolbelt-modifiers')\r\n }\r\n}\r\n", "import { registerWrapper } from '../shared/libwrapper'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst ACTOR_PREPARE_EMBEDDED_DOCUMENTS = 'CONFIG.Actor.documentClass.prototype.prepareEmbeddedDocuments'\r\nconst TREASURE_PREPARE_BASE_DATA = 'CONFIG.PF2E.Item.documentClasses.treasure.prototype.prepareBaseData'\r\n\r\nexport function registerNobulk() {\r\n return {\r\n settings: [\r\n {\r\n name: 'nobulk',\r\n type: Boolean,\r\n default: false,\r\n requiresReload: true,\r\n },\r\n {\r\n name: 'nobulk-coins',\r\n type: Boolean,\r\n default: false,\r\n requiresReload: true,\r\n },\r\n ],\r\n init: () => {\r\n if (getSetting('nobulk')) registerWrapper(ACTOR_PREPARE_EMBEDDED_DOCUMENTS, actorPrepareEmbeddedDocuments, 'WRAPPER')\r\n if (getSetting('nobulk-coins')) registerWrapper(TREASURE_PREPARE_BASE_DATA, treasurePrepareBaseData, 'WRAPPER')\r\n },\r\n }\r\n}\r\n\r\nfunction treasurePrepareBaseData(wrapped) {\r\n wrapped()\r\n if (this.isCoinage) this.system.bulk.value = 0\r\n}\r\n\r\nfunction actorPrepareEmbeddedDocuments(wrapped, ...args) {\r\n wrapped(...args)\r\n\r\n const actor = this\r\n const InventoryBulk = actor.inventory.bulk.constructor\r\n\r\n let _value = null\r\n\r\n Object.defineProperty(actor.inventory.bulk, 'value', {\r\n get() {\r\n if (_value) return _value\r\n _value = InventoryBulk.computeTotalBulk(\r\n this.actor.inventory.filter(item => !item.isInContainer && item.system.equipped.carryType !== 'dropped'),\r\n this.actor.size\r\n )\r\n return _value\r\n },\r\n })\r\n}\r\n", "import { MODULE_ID } from '../module'\r\nimport { isPlayedActor } from '../shared/actor'\r\nimport { getFlag, setFlag, unsetFlag } from '../shared/flags'\r\nimport { registerWrapper } from '../shared/libwrapper'\r\nimport { subLocalize } from '../shared/localize'\r\nimport { isInstanceOf } from '../shared/misc'\r\nimport { templatePath } from '../shared/path'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst ACTOR_PREPARE_DATA = 'CONFIG.Actor.documentClass.prototype.prepareData'\r\nconst DOCUMENT_SHEET_RENDER_INNER = 'DocumentSheet.prototype._renderInner'\r\n\r\nexport function registerShare() {\r\n return {\r\n settings: [\r\n {\r\n name: 'share',\r\n type: String,\r\n default: 'disabled',\r\n choices: ['disabled', 'enabled', 'force'],\r\n requiresReload: true,\r\n },\r\n ],\r\n init: () => {\r\n const share = getSetting('share')\r\n if (share === 'disabled') return\r\n\r\n registerWrapper(ACTOR_PREPARE_DATA, prepareData, 'WRAPPER')\r\n registerWrapper(DOCUMENT_SHEET_RENDER_INNER, documentSheetRenderInner, 'WRAPPER')\r\n\r\n Hooks.on('preUpdateActor', preUpdateActor)\r\n Hooks.on('deleteActor', deleteActor)\r\n Hooks.on('updateActor', updateActor)\r\n },\r\n }\r\n}\r\n\r\nasync function documentSheetRenderInner(wrapped, ...args) {\r\n const inner = await wrapped(...args)\r\n if (!isInstanceOf(this, 'CreatureConfig')) return inner\r\n\r\n const actor = this.actor\r\n if (!isPlayedActor(actor) || !actor.isOfType('character', 'npc') || getSlaves(actor).size) return inner\r\n\r\n const masters = game.actors\r\n .filter(a => a.id !== actor.id && a.isOwner && isValidMaster(a))\r\n .map(actor => ({\r\n key: actor.id,\r\n label: actor.name,\r\n }))\r\n\r\n const group = await renderTemplate(templatePath('share/master'), {\r\n masters,\r\n master: getFlag(actor, 'share.master'),\r\n selectPath: `flags.${MODULE_ID}.share.master`,\r\n i18n: subLocalize('share.templates.master'),\r\n })\r\n\r\n inner.children().last().before(group)\r\n\r\n return inner\r\n}\r\n\r\nfunction deleteActor(actor) {\r\n removeSlaveFromMaster(actor)\r\n\r\n const slaves = getSlaves(actor)\r\n Promise.all(\r\n slaves.map(async slave => {\r\n unsetMaster(slave)\r\n await unsetFlag(slave, 'share.master')\r\n })\r\n )\r\n}\r\n\r\nfunction preUpdateActor(actor, updates) {\r\n const shareFlag = getProperty(updates, `flags.${MODULE_ID}.share`)\r\n if (shareFlag?.master) {\r\n const master = game.actors.get(shareFlag.master)\r\n if (isValidMaster(master)) {\r\n const hpSource = deepClone(master._source.system.attributes.hp)\r\n setProperty(updates, 'system.attributes.hp', hpSource)\r\n }\r\n } else {\r\n const master = getMaster(actor)\r\n const hpUpdate = getProperty(updates, 'system.attributes.hp')\r\n if (master && hpUpdate) {\r\n master.update({ system: { attributes: { hp: hpUpdate } } }, { noHook: true })\r\n delete updates.system.attributes.hp\r\n }\r\n }\r\n}\r\n\r\nfunction updateActor(actor, updates, options, userId) {\r\n const isOriginalUser = game.user.id === userId\r\n\r\n const shareFlag = getShareFlag(updates)\r\n if (shareFlag?.master !== undefined) {\r\n const slave = actor\r\n\r\n removeSlaveFromMaster(slave)\r\n\r\n if (shareFlag.master) {\r\n const master = game.actors.get(shareFlag.master)\r\n if (isValidMaster(master)) {\r\n setMaster(slave, master)\r\n addSlaveToMaster(master, slave)\r\n }\r\n } else {\r\n unsetMaster(slave)\r\n }\r\n }\r\n\r\n if (!isOriginalUser) return\r\n\r\n const slaves = getSlaves(actor)\r\n if (slaves.size) {\r\n const hpUpdate = getProperty(updates, 'system.attributes.hp')\r\n if (hpUpdate) {\r\n const data = { system: { attributes: { hp: hpUpdate } } }\r\n Promise.all(slaves.map(async slave => await slave.update(data, { noHook: true })))\r\n } else {\r\n Promise.all(slaves.map(async slave => await refreshActor(slave, updates)))\r\n }\r\n }\r\n}\r\n\r\nasync function refreshActor(actor, data) {\r\n const share = getSetting('share')\r\n if (share === 'force') {\r\n await setFlag(actor, 'toggle', !getFlag(actor, 'toggle'))\r\n } else {\r\n actor.render(false, { action: 'update' })\r\n actor._updateDependentTokens(data)\r\n }\r\n}\r\n\r\nfunction prepareData(wrapped) {\r\n wrapped()\r\n\r\n const actor = this\r\n const masterId = getFlag(actor, 'share.master')\r\n const master = masterId ? game.actors.get(masterId) : undefined\r\n\r\n if (!isValidMaster(master)) return\r\n\r\n if (!getMaster(this)) {\r\n setMaster(this, master)\r\n addSlaveToMaster(master, this)\r\n }\r\n\r\n const hp = this.system.attributes.hp\r\n Object.defineProperty(actor.system.attributes, 'hp', {\r\n get() {\r\n const masterHp = master.system.attributes.hp\r\n transfertHpData(masterHp, hp)\r\n return hp\r\n },\r\n enumerable: true,\r\n })\r\n}\r\n\r\nfunction transfertHpData(from, to) {\r\n to.breakdown = from.breakdown\r\n to.max = from.max\r\n to.sp = deepClone(from.sp)\r\n to.temp = from.temp\r\n to.totalModifier = from.totalModifier\r\n to.value = from.value\r\n to._modifiers = from._modifiers.slice()\r\n}\r\n\r\nfunction getShareFlag(doc) {\r\n return getProperty(doc, `flags.${MODULE_ID}.share`)\r\n}\r\n\r\nfunction getSlaves(actor) {\r\n return getModuleProperty(actor, 'slaves') ?? new Collection()\r\n}\r\n\r\nfunction setMaster(actor, master) {\r\n setModuleProperty(actor, 'master', master)\r\n}\r\n\r\nfunction unsetMaster(actor) {\r\n deleteModuleProperty(actor, 'master')\r\n}\r\n\r\nfunction getMaster(actor) {\r\n return getModuleProperty(actor, 'master')\r\n}\r\n\r\nfunction isValidMaster(actor) {\r\n return actor && actor.type === 'character' && !getMaster(actor)\r\n}\r\n\r\nfunction getModuleProperty(doc, path) {\r\n return getProperty(doc, `modules.${MODULE_ID}.share.${path}`)\r\n}\r\n\r\nfunction setModuleProperty(doc, path, value) {\r\n setProperty(doc, `modules.${MODULE_ID}.share.${path}`, value)\r\n}\r\n\r\nfunction deleteModuleProperty(doc, path) {\r\n delete doc.modules?.[MODULE_ID]?.share?.[path]\r\n}\r\n\r\nfunction addSlaveToMaster(master, slave) {\r\n const slaves = getSlaves(master)\r\n setModuleProperty(master, 'slaves', slaves.set(slave.id, slave))\r\n}\r\n\r\nfunction removeSlaveFromMaster(slave) {\r\n const master = getMaster(slave)\r\n if (!master) return\r\n\r\n const slaves = getSlaves(master)\r\n slaves.delete(slave.id)\r\n}\r\n", "function getSourceId(doc) {\r\n return doc.getFlag('core', 'sourceId')\r\n}\r\n\r\nfunction includesSourceId(doc, list) {\r\n const sourceId = getSourceId(doc)\r\n return sourceId ? list.includes(sourceId) : false\r\n}\r\n\r\nfunction getItemSourceIdCondition(sourceId) {\r\n return Array.isArray(sourceId) ? item => includesSourceId(item, sourceId) : item => getSourceId(item) === sourceId\r\n}\r\n\r\nexport function getItems(actor, itemTypes) {\r\n itemTypes = typeof itemTypes === 'string' ? [itemTypes] : itemTypes\r\n return itemTypes ? itemTypes.flatMap(type => actor.itemTypes[type]) : actor.items\r\n}\r\n\r\nexport function hasItemWithSourceId(actor, sourceId, itemTypes) {\r\n return getItems(actor, itemTypes).some(getItemSourceIdCondition(sourceId))\r\n}\r\n\r\nexport function getItemWithSourceId(actor, sourceId, itemTypes) {\r\n return getItems(actor, itemTypes).find(getItemSourceIdCondition(sourceId))\r\n}\r\n", "import { isPlayedActor } from '../shared/actor'\r\nimport { createHook } from '../shared/hook'\r\nimport { getItemWithSourceId, hasItemWithSourceId } from '../shared/item'\r\nimport { subLocalize } from '../shared/localize'\r\nimport { refreshCharacterSheets } from '../shared/misc'\r\nimport { info } from '../shared/notification'\r\nimport { templatePath } from '../shared/path'\r\nimport { getSetting } from '../shared/settings'\r\nimport { isActiveOwner } from '../shared/user'\r\n\r\nconst setSheetHook = createHook('renderCharacterSheetPF2e', renderCharacterSheetPF2e)\r\nconst setDeleteCombatHook = createHook('deleteCombat', deleteCombat)\r\nconst setDeleteCombatantHook = createHook('deleteCombatant', deleteCombatant)\r\nconst setCreateCombatantHook = createHook('createCombatant', createCombatant)\r\n\r\nconst STANCE_SAVANT = ['Compendium.pf2e.feats-srd.Item.yeSyGnYDkl2GUNmu', 'Compendium.pf2e.feats-srd.Item.LI9VtCaL5ZRk0Wo8']\r\n\r\nconst REPLACERS = new Map([\r\n [\r\n 'Compendium.pf2e.feats-srd.Item.nRjyyDulHnP5OewA', // gorilla pound\r\n\r\n {\r\n replace: 'Compendium.pf2e.feats-srd.Item.DqD7htz8Sd1dh3BT', // gorilla stance\r\n effect: 'Compendium.pf2e.feat-effects.Item.UZKIKLuwpQu47feK',\r\n },\r\n ],\r\n])\r\n\r\nconst EXTRAS = new Map([\r\n [\r\n 'Compendium.pf2e.classfeatures.Item.09iL38CZZEa0q0Mt', // arcane cascade\r\n {\r\n effect: 'Compendium.pf2e.feat-effects.Item.fsjO5oTKttsbpaKl',\r\n action: 'Compendium.pf2e.actionspf2e.Item.HbejhIywqIufrmVM',\r\n },\r\n ],\r\n [\r\n 'Compendium.pf2e.feats-srd.Item.xQuNswWB3eg1UM28', // cobra envenom\r\n {\r\n effect: 'Compendium.pf2e.feat-effects.Item.2Qpt0CHuOMeL48rN',\r\n },\r\n ],\r\n [\r\n 'Compendium.pf2e.feats-srd.Item.R7c4PyTNkZb0yvoT', // dread marshal\r\n {\r\n effect: 'Compendium.pf2e.feat-effects.Item.qX62wJzDYtNxDbFv', // the stance aura\r\n },\r\n ],\r\n [\r\n 'Compendium.pf2e.feats-srd.Item.bvOsJNeI0ewvQsFa', // inspiring marshal\r\n {\r\n effect: 'Compendium.pf2e.feat-effects.Item.er5tvDNvpbcnlbHQ', // the stance aura\r\n },\r\n ],\r\n])\r\n\r\nexport function registerStances() {\r\n return {\r\n name: 'stances',\r\n settings: [\r\n {\r\n name: 'stances',\r\n type: Boolean,\r\n default: false,\r\n scope: 'client',\r\n onChange: setup,\r\n },\r\n {\r\n name: 'custom-stances',\r\n type: String,\r\n default: '',\r\n },\r\n ],\r\n conflicts: ['pf2e-stances'],\r\n api: {\r\n getStances,\r\n toggleStance,\r\n isValidStance,\r\n },\r\n ready: isGm => {\r\n if (getSetting('stances')) setup(true)\r\n },\r\n }\r\n}\r\n\r\nfunction setup(value) {\r\n setSheetHook(value)\r\n setDeleteCombatHook(value)\r\n setDeleteCombatantHook(value)\r\n setCreateCombatantHook(value)\r\n}\r\n\r\nfunction isValidStance(stance) {\r\n return stance && stance.system.traits.value.includes('stance') && stance.system.selfEffect?.uuid\r\n}\r\n\r\nfunction getStances(actor) {\r\n const stances = []\r\n const replaced = new Set()\r\n\r\n for (const { replace, sourceId, effectUUID, effect, img, name, itemName, action } of actorStances(actor)) {\r\n if (replace) replaced.add(replace)\r\n\r\n const foundAction = action ? getItemWithSourceId(actor, action, 'action') : getItemWithSourceId(actor, sourceId, 'feat')\r\n\r\n stances.push({\r\n name,\r\n itemName,\r\n uuid: sourceId,\r\n img,\r\n effectUUID,\r\n effectID: effect?.id,\r\n actionUUID: foundAction.sourceId,\r\n actionID: foundAction.id,\r\n })\r\n }\r\n\r\n return stances.filter(({ uuid }) => !replaced.has(uuid))\r\n}\r\n\r\nasync function renderCharacterSheetPF2e(sheet, html) {\r\n const actor = sheet.actor\r\n if (!isPlayedActor(actor)) return\r\n\r\n const stances = getStances(actor)\r\n if (!stances.length) return\r\n\r\n const inCombat = actor.getActiveTokens(true, true).some(token => token.inCombat)\r\n const tab = html.find('.sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter]')\r\n const options = tab.find('.actions-options')\r\n const template = await renderTemplate(templatePath('stances/sheet'), {\r\n stances,\r\n canUseStances: inCombat && !actor.isDead,\r\n i18n: subLocalize('stances'),\r\n })\r\n\r\n if (options.length) options.after(template)\r\n else tab.prepend(template)\r\n\r\n html.find(\r\n '.sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance'\r\n ).on('click', event => onToggleStance(event, actor))\r\n}\r\n\r\nfunction onToggleStance(event, actor) {\r\n const target = event.currentTarget\r\n const canUseStances = target.closest('.pf2e-stances')?.classList.contains('can-use-stances')\r\n if (!event.ctrlKey && !canUseStances) return\r\n\r\n const effectUUID = target.dataset.effectUuid\r\n toggleStance(actor, effectUUID)\r\n}\r\n\r\nfunction* actorStances(actor) {\r\n for (const feat of actor.itemTypes.feat) {\r\n const sourceId = feat.sourceId\r\n\r\n const replacer = REPLACERS.get(sourceId)\r\n const extra = EXTRAS.get(sourceId)\r\n if (!replacer && !extra && !isValidStance(feat)) continue\r\n\r\n const effectUUID = replacer?.effect ?? extra?.effect ?? feat.system.selfEffect.uuid\r\n const effect = fromUuidSync(effectUUID)\r\n if (!effect) continue\r\n\r\n yield {\r\n name: (replacer && fromUuidSync(replacer.replace)?.name) ?? feat.name,\r\n itemName: feat.name,\r\n replace: replacer?.replace,\r\n extra,\r\n sourceId,\r\n effectUUID,\r\n effect: getItemWithSourceId(actor, effectUUID, 'effect'),\r\n action: extra?.action,\r\n img: effect.img,\r\n }\r\n }\r\n}\r\n\r\nfunction getStancesEffects(actor) {\r\n const effects = []\r\n\r\n for (const { effect } of actorStances(actor)) {\r\n if (!effect) continue\r\n effects.push({\r\n uuid: effect.sourceId,\r\n id: effect.id,\r\n })\r\n }\r\n\r\n return effects\r\n}\r\n\r\nasync function toggleStance(actor, effectUUID) {\r\n const effects = getStancesEffects(actor)\r\n const already = effects.findIndex(effect => effect.uuid === effectUUID)\r\n\r\n let create = false\r\n\r\n if (already === -1) {\r\n create = true\r\n } else {\r\n const other = effects.filter(effect => effect.uuid !== effectUUID).length\r\n const more = effects.filter(effect => effect.uuid === effectUUID).length > 1\r\n if (other || more) effects.splice(already, 1)\r\n }\r\n\r\n if (effects.length) {\r\n await actor.deleteEmbeddedDocuments(\r\n 'Item',\r\n effects.map(x => x.id)\r\n )\r\n }\r\n\r\n if (create) addStance(actor, effectUUID)\r\n}\r\n\r\nasync function addStance(actor, uuid) {\r\n const effect = await fromUuid(uuid)\r\n\r\n if (effect) {\r\n const obj = effect.toObject()\r\n if (!getProperty(obj, 'flags.core.sourceId')) setProperty(obj, 'flags.core.sourceId', effect.uuid)\r\n\r\n const items = await actor.createEmbeddedDocuments('Item', [obj])\r\n items[0]?.toMessage()\r\n\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\nfunction deleteCombat(combat) {\r\n for (const combatant of combat.combatants) {\r\n deleteCombatant(combatant)\r\n }\r\n}\r\n\r\nfunction deleteCombatant(combatant) {\r\n const actor = getActorFromCombatant(combatant)\r\n if (!actor) return\r\n\r\n if (!game.user.isGM && isActiveOwner(actor)) {\r\n const effects = getStancesEffects(actor).map(effect => effect.id)\r\n if (effects.length) actor.deleteEmbeddedDocuments('Item', effects)\r\n }\r\n\r\n refreshCharacterSheets(actor)\r\n}\r\n\r\nfunction createCombatant(combatant) {\r\n const actor = getActorFromCombatant(combatant)\r\n if (!actor) return\r\n\r\n if (!game.user.isGM && isActiveOwner(actor)) checkForSavant(actor)\r\n\r\n refreshCharacterSheets(actor)\r\n}\r\n\r\nfunction getActorFromCombatant(combatant) {\r\n const actor = combatant.actor\r\n if (actor && !actor.isToken && actor.isOfType('character')) return actor\r\n}\r\n\r\nasync function checkForSavant(actor) {\r\n const stances = getStances(actor)\r\n if (!stances.length) return\r\n\r\n const hasStancesEffects = stances.filter(({ effectID }) => effectID).length\r\n if (hasStancesEffects) return\r\n\r\n const hasSavantFeat = hasItemWithSourceId(actor, STANCE_SAVANT, ['feat'])\r\n if (!hasSavantFeat) return\r\n\r\n if (stances.length === 1) {\r\n const stance = stances[0]\r\n if (await addStance(actor, stance.effectUUID)) info('stances.useStance', { stance: stance.name })\r\n } else {\r\n openStancesMenu(actor, stances)\r\n }\r\n}\r\n\r\nasync function openStancesMenu(actor, stances) {\r\n const localize = subLocalize('stances.menu')\r\n\r\n new Dialog({\r\n title: localize('title'),\r\n content: await renderTemplate(templatePath('stances/menu'), { stances, i18n: localize }),\r\n buttons: {\r\n yes: {\r\n icon: '',\r\n label: localize('accept'),\r\n callback: html => addStance(actor, html.find('[name=stance]:checked').val()),\r\n },\r\n no: {\r\n icon: '',\r\n label: localize('cancel'),\r\n },\r\n },\r\n }).render(true)\r\n}\r\n", "import { MODULE_ID } from '../module'\r\nimport { isPlayedActor } from '../shared/actor'\r\nimport { createChoicesHook } from '../shared/hook'\r\nimport { setInMemory, localeCompare, ordinalString, refreshCharacterSheets, getInMemory } from '../shared/misc'\r\nimport { templatePath } from '../shared/path'\r\nimport { getSetting } from '../shared/settings'\r\n\r\nconst setHook = createChoicesHook('renderCharacterSheetPF2e', renderCharacterSheetPF2e, () => refreshCharacterSheets())\r\n\r\nexport function registerSpellsSummary() {\r\n return {\r\n settings: [\r\n {\r\n name: 'summary',\r\n type: String,\r\n default: 'disabled',\r\n scope: 'client',\r\n choices: ['disabled', 'enabled', 'sort'],\r\n onChange: value => setHook(value),\r\n },\r\n ],\r\n conflicts: ['pf2e-spells-summary'],\r\n init: isGm => {\r\n if (getSetting('summary') !== 'disabled') setHook(true, true)\r\n },\r\n }\r\n}\r\n\r\nasync function renderCharacterSheetPF2e(sheet, html) {\r\n const actor = sheet.actor\r\n if (!isPlayedActor(actor)) return\r\n\r\n const tab = getSpellcastingTab(html)\r\n\r\n if (getInMemory(sheet, 'toggled')) tab.addClass('toggled')\r\n\r\n getSpellcastingNav(html).on('click', event => onSpellcastingBtnToggle(event, html, sheet))\r\n await addSummaryTab(html, sheet, actor)\r\n\r\n if (tab.hasClass('toggled') && tab.hasClass('active')) {\r\n sheet._restoreScrollPositions(html)\r\n }\r\n}\r\n\r\nasync function addSummaryTab(html, sheet, actor) {\r\n const tab = getSpellcastingTab(html)\r\n const data = await getData(actor)\r\n\r\n const template = await renderTemplate(templatePath('summary/sheet'), data)\r\n\r\n tab.append(template)\r\n addSummaryEvents(html, sheet, actor)\r\n}\r\n\r\nfunction addSummaryEvents(html, sheet, actor) {\r\n const summary = getSpellcastingSummarySection(html)\r\n\r\n const inputs = summary.find('.spell-type .uses .spell-slots-input input')\r\n inputs.on('change', event => onUsesInputChange(event, actor))\r\n inputs.on('focus', onUsesInputFocus)\r\n inputs.on('blur', onUsesInputBlur)\r\n\r\n summary.find('[data-action=cast-spell]').on('click', event => onCastSpell(event, actor))\r\n summary.find('.item-toggle-prepare').on('click', event => onTogglePrepare(event, actor))\r\n summary.find('.focus-pips').on('click contextmenu', event => onToggleFocusPool(event, actor))\r\n summary.find('.spell-slots-increment-reset').on('click', event => onSlotsReset(event, sheet, actor))\r\n summary.find('.item-image').on('click', event => onItemToChat(event, actor))\r\n summary.find('.item-name > h4').on('click', event => onToggleSummary(event, sheet))\r\n}\r\n\r\nasync function onUsesInputChange(event, actor) {\r\n event.preventDefault()\r\n\r\n const { inputPath, entryId } = $(event.currentTarget).data()\r\n const value = event.currentTarget.valueAsNumber\r\n actor.updateEmbeddedDocuments('Item', [{ _id: entryId, [inputPath]: value }])\r\n}\r\n\r\nfunction onUsesInputFocus(event) {\r\n event.preventDefault()\r\n event.currentTarget.closest('.item')?.classList.add('hover')\r\n}\r\n\r\nfunction onUsesInputBlur(event) {\r\n event.preventDefault()\r\n event.currentTarget.closest('.item')?.classList.remove('hover')\r\n}\r\n\r\nfunction onTogglePrepare(event, actor) {\r\n event.preventDefault()\r\n const { slotLevel, slotId, entryId, expended } = $(event.currentTarget).closest('.item').data()\r\n const collection = actor.spellcasting.collections.get(entryId)\r\n collection?.setSlotExpendedState(slotLevel ?? 0, slotId ?? 0, expended !== true)\r\n}\r\n\r\nfunction onToggleFocusPool(event, actor) {\r\n event.preventDefault()\r\n const change = event.type === 'click' ? 1 : -1\r\n const points = (actor.system.resources.focus?.value ?? 0) + change\r\n actor.update({ 'system.resources.focus.value': points })\r\n}\r\n\r\nfunction onChargeReset(sheet, entryId) {\r\n const original = getSpellcastingOriginalSection(sheet.element)\r\n const entry = original.find(`.item-container.spellcasting-entry[data-item-id=${entryId}]`)\r\n const btn = entry.find('.spell-ability-data .statistic-values a.pf2e-staves-charge')\r\n btn[0]?.click()\r\n}\r\n\r\nfunction onSlotsReset(event, sheet, actor) {\r\n event.preventDefault()\r\n\r\n const { itemId, level, isCharge } = $(event.currentTarget).data()\r\n if (!itemId) return\r\n\r\n if (isCharge) {\r\n onChargeReset(sheet, itemId)\r\n return\r\n }\r\n\r\n const item = actor.items.get(itemId)\r\n if (!item) return\r\n\r\n if (item.isOfType('spellcastingEntry')) {\r\n const slotLevel = level >= 0 && level <= 11 ? `slot${level}` : 'slot0'\r\n const slot = item.system.slots?.[slotLevel]\r\n if (slot) item.update({ [`system.slots.${slotLevel}.value`]: slot.max })\r\n } else if (item.isOfType('spell')) {\r\n const max = item.system.location.uses?.max\r\n if (max) item.update({ 'system.location.uses.value': max })\r\n }\r\n}\r\n\r\nfunction onCastSpell(event, actor) {\r\n event.preventDefault()\r\n\r\n const target = $(event.currentTarget)\r\n if (target.prop('disabled')) return\r\n\r\n const { itemId, slotLevel, slotId, entryId } = target.closest('.item').data()\r\n const collection = actor.spellcasting.collections.get(entryId)\r\n if (!collection) return\r\n\r\n const spell = collection.get(itemId)\r\n if (!spell) return\r\n\r\n collection.entry.cast(spell, { slot: slotId, level: slotLevel })\r\n}\r\n\r\nasync function onToggleSummary(event, sheet) {\r\n const item = event.currentTarget.closest('.item')\r\n await sheet.itemRenderer.toggleSummary(item)\r\n}\r\n\r\nasync function onItemToChat(event, actor) {\r\n const itemId = $(event.currentTarget).closest('.item').attr('data-item-id')\r\n const item = actor.items.get(itemId)\r\n if (!item || (item.isOfType('physical') && !item.isIdentified)) return\r\n await item.toMessage(event)\r\n}\r\n\r\nfunction onSpellcastingBtnToggle(event, html, sheet) {\r\n event.preventDefault()\r\n\r\n const tab = getSpellcastingTab(html)\r\n\r\n if (tab.hasClass('active')) {\r\n tab.toggleClass('toggled')\r\n tab.scrollTop(0)\r\n setInMemory(sheet, 'toggled', tab.hasClass('toggled'))\r\n }\r\n}\r\n\r\nfunction getSpellcastingNav(html) {\r\n return html.find('nav.sheet-navigation .item[data-tab=spellcasting]')\r\n}\r\n\r\nfunction getSpellcastingTab(html) {\r\n return html.find('section.sheet-body .sheet-content > .tab[data-tab=spellcasting]')\r\n}\r\n\r\nfunction getSpellcastingOriginalSection(html) {\r\n return getSpellcastingTab(html).find('.directory-list.spellcastingEntry-list')\r\n}\r\n\r\nfunction getSpellcastingSummarySection(html) {\r\n return getSpellcastingTab(html).find('.directory-list.summary')\r\n}\r\n\r\nasync function getData(actor) {\r\n const focusPool = actor.system.resources.focus ?? { value: 0, max: 0 }\r\n const stavesActive = game.modules.get('pf2e-staves')?.active\r\n const spells = []\r\n const focuses = []\r\n\r\n let hasFocusCantrips = false\r\n\r\n await Promise.all(\r\n actor.spellcasting.regular.map(async entry => {\r\n const entryId = entry.id\r\n const entryDc = entry.statistic.dc.value\r\n const entryName = entry.name\r\n const data = await entry.getSheetData()\r\n const isFocus = data.isFocusPool\r\n const isCharge = entry.system?.prepared?.value === 'charge'\r\n const isStaff = getProperty(entry, 'flags.pf2e-staves.staveID') !== undefined\r\n const charges = { value: getProperty(entry, 'flags.pf2e-staves.charges') ?? 0 }\r\n\r\n for (const slot of data.levels) {\r\n if (!slot.active.length || slot.uses?.max === 0) continue\r\n\r\n const slotSpells = []\r\n const isCantrip = slot.isCantrip\r\n const actives = slot.active.filter(x => x && x.uses?.max !== 0)\r\n const isBroken = !isCantrip && isCharge && !stavesActive\r\n\r\n for (let slotId = 0; slotId < actives.length; slotId++) {\r\n const { spell, expended, virtual, uses, castLevel } = actives[slotId]\r\n\r\n slotSpells.push({\r\n name: spell.name,\r\n img: spell.img,\r\n range: spell.system.range.value || '-',\r\n castLevel: castLevel ?? spell.level,\r\n slotId,\r\n entryId,\r\n entryDc,\r\n entryName,\r\n itemId: spell.id,\r\n inputId: data.isInnate ? spell.id : data.id,\r\n inputPath: isCharge\r\n ? 'flags.pf2e-staves.charges'\r\n : data.isInnate\r\n ? 'system.location.uses.value'\r\n : `system.slots.slot${slot.level}.value`,\r\n isCharge,\r\n isActiveCharge: isCharge && stavesActive,\r\n isBroken,\r\n isVirtual: virtual,\r\n isInnate: data.isInnate,\r\n isCantrip: isCantrip,\r\n isFocus,\r\n isPrepared: data.isPrepared,\r\n isSpontaneous: data.isSpontaneous || data.isFlexible,\r\n slotLevel: slot.level,\r\n uses: uses ?? (isCharge ? charges : slot.uses),\r\n expended: expended ?? (isFocus && !isCantrip ? focusPool.value <= 0 : false),\r\n action: spell.system.time.value,\r\n type: isCharge\r\n ? isStaff\r\n ? `${MODULE_ID}.summary.staff`\r\n : `${MODULE_ID}.summary.charges`\r\n : data.isInnate\r\n ? 'PF2E.PreparationTypeInnate'\r\n : data.isSpontaneous\r\n ? 'PF2E.PreparationTypeSpontaneous'\r\n : data.isFlexible\r\n ? 'PF2E.SpellFlexibleLabel'\r\n : isFocus\r\n ? 'PF2E.SpellFocusLabel'\r\n : 'PF2E.SpellPreparedLabel',\r\n order: isCharge ? 0 : data.isPrepared ? 1 : isFocus ? 2 : data.isInnate ? 3 : data.isSpontaneous ? 4 : 5,\r\n noHover: data.isPrepared || isCantrip || isBroken || isFocus,\r\n })\r\n }\r\n\r\n if (slotSpells.length) {\r\n if (isFocus) {\r\n if (isCantrip) hasFocusCantrips = true\r\n else {\r\n focuses.push(...slotSpells)\r\n continue\r\n }\r\n }\r\n\r\n spells[slot.level] ??= []\r\n spells[slot.level].push(...slotSpells)\r\n }\r\n }\r\n })\r\n )\r\n\r\n if (spells.length) {\r\n const sort =\r\n getSetting('summary') === 'sort'\r\n ? (a, b) => (a.order === b.order ? localeCompare(a.name, b.name) : a.order - b.order)\r\n : (a, b) => localeCompare(a.name, b.name)\r\n spells.forEach(entry => entry.sort(sort))\r\n }\r\n\r\n if (focuses.length) {\r\n focuses.sort((a, b) => localeCompare(a.name, b.name))\r\n spells[12] = focuses\r\n hasFocusCantrips = false\r\n }\r\n\r\n const ritualData = await actor.spellcasting.ritual?.getSheetData()\r\n const rituals = ritualData?.levels.flatMap((slot, slotId) =>\r\n slot.active\r\n .map(({ spell }) => ({\r\n name: spell.name,\r\n img: spell.img,\r\n slotId,\r\n itemId: spell.id,\r\n level: spell.level,\r\n time: spell.system.time.value,\r\n }))\r\n .filter(Boolean)\r\n )\r\n\r\n return {\r\n spells,\r\n rituals,\r\n focusPool,\r\n stavesActive,\r\n hasFocusCantrips,\r\n isOwner: actor.isOwner,\r\n entryRank: rank => game.i18n.format('PF2E.Item.Spell.Rank.Ordinal', { rank: ordinalString(rank) }),\r\n }\r\n}\r\n", "export function applyStackingRules(modifiers) {\r\n let total = 0\r\n const highestBonus = {}\r\n const lowestPenalty = {}\r\n\r\n // There are no ability bonuses or penalties, so always take the highest ability modifier.\r\n const abilityModifiers = modifiers.filter(m => m.type === 'ability' && !m.ignored)\r\n const bestAbility = abilityModifiers.reduce((best, modifier) => {\r\n if (best === null) {\r\n return modifier\r\n } else {\r\n return modifier.force ? modifier : best.force ? best : modifier.modifier > best.modifier ? modifier : best\r\n }\r\n }, null)\r\n for (const modifier of abilityModifiers) {\r\n modifier.ignored = modifier !== bestAbility\r\n }\r\n\r\n for (const modifier of modifiers) {\r\n // Always disable ignored modifiers and don't do anything further with them.\r\n if (modifier.ignored) {\r\n modifier.enabled = false\r\n continue\r\n }\r\n\r\n // Untyped modifiers always stack, so enable them and add their modifier.\r\n if (modifier.type === 'untyped') {\r\n modifier.enabled = true\r\n total += modifier.modifier\r\n continue\r\n }\r\n\r\n // Otherwise, apply stacking rules to positive modifiers and negative modifiers separately.\r\n if (modifier.modifier < 0) {\r\n total += applyStacking(lowestPenalty, modifier, LOWER_PENALTY)\r\n } else {\r\n total += applyStacking(highestBonus, modifier, HIGHER_BONUS)\r\n }\r\n }\r\n\r\n return total\r\n}\r\n\r\nfunction applyStacking(best, modifier, isBetter) {\r\n // If there is no existing bonus of this type, then add ourselves.\r\n const existing = best[modifier.type]\r\n if (existing === undefined) {\r\n modifier.enabled = true\r\n best[modifier.type] = modifier\r\n return modifier.modifier\r\n }\r\n\r\n if (isBetter(modifier, existing)) {\r\n // If we are a better modifier according to the comparison, then we become the new 'best'.\r\n existing.enabled = false\r\n modifier.enabled = true\r\n best[modifier.type] = modifier\r\n return modifier.modifier - existing.modifier\r\n } else {\r\n // Otherwise, the existing modifier is better, so do nothing.\r\n modifier.enabled = false\r\n return 0\r\n }\r\n}\r\n", "export function htmlQuery(parent, selectors) {\r\n if (!(parent instanceof Element || parent instanceof Document)) return null\r\n return parent.querySelector(selectors)\r\n}\r\n", "export function ErrorPF2e(message) {\r\n return Error(`PF2e System | ${message}`)\r\n}\r\n", "export async function extractEphemeralEffects({ affects, origin, target, item, domains, options }) {\r\n if (!(origin && target)) return []\r\n\r\n const [effectsFrom, effectsTo] = affects === 'target' ? [origin, target] : [target, origin]\r\n const fullOptions = [...options, effectsFrom.getRollOptions(domains), effectsTo.getSelfRollOptions(affects)].flat()\r\n const resolvables = item ? (item.isOfType('spell') ? { spell: item } : { weapon: item }) : {}\r\n return (\r\n await Promise.all(\r\n domains\r\n .flatMap(s => effectsFrom.synthetics.ephemeralEffects[s]?.[affects] ?? [])\r\n .map(d => d({ test: fullOptions, resolvables }))\r\n )\r\n ).flatMap(e => e ?? [])\r\n}\r\n\r\nexport function extractNotes(rollNotes, selectors) {\r\n return selectors.flatMap(s => (rollNotes[s] ?? []).map(n => n.clone()))\r\n}\r\n\r\nexport function extractDamageDice(deferredDice, selectors, options) {\r\n return selectors.flatMap(s => deferredDice[s] ?? []).flatMap(d => d(options) ?? [])\r\n}\r\n\r\nexport function extractModifiers(synthetics, selectors, options) {\r\n const { modifierAdjustments, modifiers: syntheticModifiers } = synthetics\r\n const modifiers = Array.from(new Set(selectors))\r\n .flatMap(s => syntheticModifiers[s] ?? [])\r\n .flatMap(d => d(options) ?? [])\r\n for (const modifier of modifiers) {\r\n modifier.adjustments = extractModifierAdjustments(modifierAdjustments, selectors, modifier.slug)\r\n }\r\n\r\n return modifiers\r\n}\r\n\r\nfunction extractModifierAdjustments(adjustmentsRecord, selectors, slug) {\r\n const adjustments = Array.from(new Set(selectors.flatMap(s => adjustmentsRecord[s] ?? [])))\r\n return adjustments.filter(a => [slug, null].includes(a.slug))\r\n}\r\n", "import { onDamageApplied } from '../../features/target'\r\nimport { isInstanceOf } from '../misc'\r\nimport { applyStackingRules } from './actor'\r\nimport { htmlQuery } from './dom'\r\nimport { ErrorPF2e } from './misc'\r\nimport { extractDamageDice, extractEphemeralEffects, extractModifiers, extractNotes } from './rules'\r\n\r\nexport async function applyDamageFromMessage(\r\n token,\r\n { message, multiplier = 1, addend = 0, promptModifier = false, rollIndex = 0 }\r\n) {\r\n if (promptModifier) return shiftAdjustDamage(token, { message, multiplier, rollIndex })\r\n\r\n const shieldBlockRequest = CONFIG.PF2E.chatDamageButtonShieldToggle\r\n const roll = message.rolls.at(rollIndex)\r\n if (!isInstanceOf(roll, 'DamageRoll')) throw ErrorPF2e('Unexpected error retrieving damage roll')\r\n\r\n let damage = multiplier < 0 ? multiplier * roll.total + addend : roll.alter(multiplier, addend)\r\n\r\n // Get origin roll options and apply damage to a contextual clone: this may influence condition IWR, for example\r\n const messageRollOptions = [...(message.flags.pf2e.context?.options ?? [])]\r\n const originRollOptions = messageRollOptions.filter(o => o.startsWith('self:')).map(o => o.replace(/^self/, 'origin'))\r\n const messageItem = message.item\r\n\r\n if (!token.actor) return\r\n\r\n // If no target was acquired during a roll, set roll options for it during damage application\r\n if (!messageRollOptions.some(o => o.startsWith('target'))) {\r\n messageRollOptions.push(...token.actor.getSelfRollOptions('target'))\r\n }\r\n const domain = multiplier > 0 ? 'damage-received' : 'healing-received'\r\n const ephemeralEffects =\r\n multiplier > 0\r\n ? await extractEphemeralEffects({\r\n affects: 'target',\r\n origin: message.actor,\r\n target: token.actor,\r\n item: message.item,\r\n domains: [domain],\r\n options: messageRollOptions,\r\n })\r\n : []\r\n const contextClone = token.actor.getContextualClone(originRollOptions, ephemeralEffects)\r\n const applicationRollOptions = new Set([\r\n ...messageRollOptions.filter(o => !/^(?:self|target):/.test(o)),\r\n ...originRollOptions,\r\n ...contextClone.getSelfRollOptions(),\r\n ])\r\n\r\n // Target-specific damage/healing adjustments\r\n const outcome = message.flags.pf2e.context?.outcome\r\n const breakdown = []\r\n const rolls = []\r\n if (typeof damage === 'number' && damage < 0) {\r\n const critical = outcome === 'criticalSuccess'\r\n\r\n const resolvables = (() => {\r\n if (messageItem?.isOfType('spell')) return { spell: messageItem }\r\n if (messageItem?.isOfType('weapon')) return { weapon: messageItem }\r\n return {}\r\n })()\r\n\r\n const damageDice = extractDamageDice(contextClone.synthetics.damageDice, [domain], {\r\n resolvables,\r\n test: applicationRollOptions,\r\n }).filter(d => (d.critical === null || d.critical === critical) && d.predicate.test(applicationRollOptions))\r\n\r\n for (const dice of damageDice) {\r\n const formula = `${dice.diceNumber}${dice.dieSize}[${dice.label}]`\r\n const roll = await new Roll(formula).evaluate({ async: true })\r\n roll._formula = `${dice.diceNumber}${dice.dieSize}` // remove the label from the main formula\r\n await roll.toMessage({\r\n flags: { pf2e: { suppressDamageButtons: true } },\r\n flavor: dice.label,\r\n speaker: ChatMessage.getSpeaker({ token }),\r\n })\r\n breakdown.push(`${dice.label} ${dice.diceNumber}${dice.dieSize}`)\r\n rolls.push(roll)\r\n }\r\n if (rolls.length) {\r\n damage -= rolls.map(roll => roll.total).reduce((previous, current) => previous + current)\r\n }\r\n\r\n const modifiers = extractModifiers(contextClone.synthetics, [domain], { resolvables }).filter(\r\n m => (m.critical === null || m.critical === critical) && m.predicate.test(applicationRollOptions)\r\n )\r\n\r\n // unlikely to have any typed modifiers, but apply stacking rules just in case even though the context of\r\n // previously applied modifiers has been lost\r\n damage -= applyStackingRules(modifiers ?? [])\r\n\r\n // target-specific modifiers breakdown\r\n breakdown.push(...modifiers.filter(m => m.enabled).map(m => `${m.label} ${signedInteger(m.modifier)}`))\r\n }\r\n\r\n const hasDamage = typeof damage === 'number' ? damage !== 0 : damage.total !== 0\r\n const notes = (() => {\r\n if (!hasDamage) return []\r\n return extractNotes(contextClone.synthetics.rollNotes, [domain])\r\n .filter(\r\n n =>\r\n (!outcome || n.outcome.length === 0 || n.outcome.includes(outcome)) &&\r\n n.predicate.test(applicationRollOptions)\r\n )\r\n .map(note => note.text)\r\n })()\r\n\r\n await contextClone.applyDamage({\r\n damage,\r\n token,\r\n item: message.item,\r\n skipIWR: multiplier <= 0,\r\n rollOptions: applicationRollOptions,\r\n shieldBlockRequest,\r\n breakdown,\r\n notes,\r\n })\r\n\r\n toggleOffShieldBlock(message.id)\r\n\r\n /**\r\n * added stuff HERE\r\n */\r\n onDamageApplied(message, token.id, rollIndex)\r\n}\r\n\r\nexport function onClickShieldBlock(target, shieldButton, messageEl) {\r\n const getTokens = () => {\r\n return [target]\r\n }\r\n\r\n const getNonBrokenShields = tokens => {\r\n const actor = tokens[0]?.actor\r\n return actor?.itemTypes.shield.filter(s => s.isEquipped && !s.isBroken && !s.isDestroyed) ?? []\r\n }\r\n\r\n // Add a tooltipster instance to the shield button if needed.\r\n if (!shieldButton.classList.contains('tooltipstered')) {\r\n $(shieldButton)\r\n .tooltipster({\r\n animation: 'fade',\r\n trigger: 'click',\r\n arrow: false,\r\n content: $(messageEl).find('div.hover-content'),\r\n contentAsHTML: true,\r\n contentCloning: true,\r\n debug: false,\r\n interactive: true,\r\n side: ['top'],\r\n theme: 'crb-hover',\r\n functionBefore: () => {\r\n const tokens = getTokens()\r\n if (!tokens.length) return false\r\n\r\n const nonBrokenShields = getNonBrokenShields(tokens)\r\n const hasMultipleShields = tokens.length === 1 && nonBrokenShields.length > 1\r\n const shieldActivated = shieldButton.classList.contains('shield-activated')\r\n\r\n // More than one shield and no selection. Show tooltip.\r\n if (hasMultipleShields && !shieldActivated) {\r\n return true\r\n }\r\n\r\n // More than one shield and one was previously selected. Remove selection and show tooltip.\r\n if (hasMultipleShields && shieldButton.dataset.shieldId) {\r\n shieldButton.attributes.removeNamedItem('data-shield-id')\r\n shieldButton.classList.remove('shield-activated')\r\n CONFIG.PF2E.chatDamageButtonShieldToggle = false\r\n return true\r\n }\r\n\r\n // Normal toggle behaviour. Tooltip is suppressed.\r\n shieldButton.classList.toggle('shield-activated')\r\n CONFIG.PF2E.chatDamageButtonShieldToggle = !CONFIG.PF2E.chatDamageButtonShieldToggle\r\n return false\r\n },\r\n functionFormat: (instance, _helper, $content) => {\r\n const tokens = getTokens()\r\n const nonBrokenShields = getNonBrokenShields(tokens)\r\n const multipleShields = tokens.length === 1 && nonBrokenShields.length > 1\r\n const shieldActivated = shieldButton.classList.contains('shield-activated')\r\n\r\n // If the actor is wielding more than one shield, have the user pick which shield to use for blocking.\r\n if (multipleShields && !shieldActivated) {\r\n const content = $content[0]\r\n // Populate the list with the shield options\r\n const listEl = htmlQuery(content, 'ul.shield-options')\r\n if (!listEl) return $content\r\n const shieldList = []\r\n for (const shield of nonBrokenShields) {\r\n const input = document.createElement('input')\r\n input.classList.add('data')\r\n input.type = 'radio'\r\n input.name = 'shield-id'\r\n input.value = shield.id\r\n input.addEventListener('click', () => {\r\n shieldButton.dataset.shieldId = input.value\r\n shieldButton.classList.add('shield-activated')\r\n CONFIG.PF2E.chatDamageButtonShieldToggle = true\r\n instance.close()\r\n })\r\n const shieldName = document.createElement('span')\r\n shieldName.classList.add('label')\r\n shieldName.innerHTML = shield.name\r\n\r\n const hardness = document.createElement('span')\r\n hardness.classList.add('tag')\r\n const hardnessLabel = game.i18n.localize('PF2E.HardnessLabel')\r\n hardness.innerHTML = `${hardnessLabel}: ${shield.hardness}`\r\n const itemLi = document.createElement('li')\r\n itemLi.classList.add('item')\r\n itemLi.append(input, shieldName, hardness)\r\n shieldList.push(itemLi)\r\n }\r\n listEl.replaceChildren(...shieldList)\r\n }\r\n return $content\r\n },\r\n })\r\n .tooltipster('open')\r\n }\r\n}\r\n\r\nfunction toggleOffShieldBlock(messageId) {\r\n for (const app of ['#chat-log', '#chat-popout']) {\r\n const selector = `${app} > li.chat-message[data-message-id=\"${messageId}\"] button[data-action=shield-block]`\r\n const button = htmlQuery(document.body, selector)\r\n button?.classList.remove('shield-activated')\r\n }\r\n CONFIG.PF2E.chatDamageButtonShieldToggle = false\r\n}\r\n\r\nasync function shiftAdjustDamage(token, { message, multiplier, rollIndex }) {\r\n const content = await renderTemplate('systems/pf2e/templates/chat/damage/adjustment-dialog.hbs')\r\n const AdjustmentDialog = class extends Dialog {\r\n activateListeners($html) {\r\n super.activateListeners($html)\r\n $html[0].querySelector('input')?.focus()\r\n }\r\n }\r\n const isHealing = multiplier < 0\r\n new AdjustmentDialog({\r\n title: game.i18n.localize(isHealing ? 'PF2E.UI.shiftModifyHealingTitle' : 'PF2E.UI.shiftModifyDamageTitle'),\r\n content,\r\n buttons: {\r\n ok: {\r\n label: game.i18n.localize('PF2E.OK'),\r\n callback: async $dialog => {\r\n // In case of healing, multipler will have negative sign. The user will expect that positive\r\n // modifier would increase healing value, while negative would decrease.\r\n const adjustment = (Number($dialog[0].querySelector('input')?.value) || 0) * Math.sign(multiplier)\r\n applyDamageFromMessage(token, {\r\n message,\r\n multiplier,\r\n addend: adjustment,\r\n promptModifier: false,\r\n rollIndex,\r\n })\r\n },\r\n },\r\n cancel: {\r\n label: 'Cancel',\r\n },\r\n },\r\n default: 'ok',\r\n close: () => {\r\n toggleOffShieldBlock(message.id)\r\n },\r\n }).render(true)\r\n}\r\n", "const DEGREE_ADJUSTMENT_AMOUNTS = {\r\n LOWER_BY_TWO: -2,\r\n LOWER: -1,\r\n INCREASE: 1,\r\n INCREASE_BY_TWO: 2,\r\n TO_CRITICAL_FAILURE: 'criticalFailure',\r\n TO_FAILURE: 'failure',\r\n TO_SUCCESS: 'success',\r\n TO_CRITICAL_SUCCESS: 'criticalSuccess',\r\n}\r\n\r\nconst DEGREE_OF_SUCCESS_STRINGS = ['criticalFailure', 'failure', 'success', 'criticalSuccess']\r\n\r\nexport class DegreeOfSuccess {\r\n constructor(roll, dc, dosAdjustments = null) {\r\n if (roll instanceof Roll) {\r\n this.dieResult =\r\n (roll.isDeterministic\r\n ? roll.terms.find(t => t instanceof NumericTerm)\r\n : roll.dice.find(d => d instanceof Die && d.faces === 20)\r\n )?.total ?? 1\r\n this.rollTotal = roll.total\r\n } else {\r\n this.dieResult = roll.dieValue\r\n this.rollTotal = roll.dieValue + roll.modifier\r\n }\r\n\r\n this.dc = typeof dc === 'number' ? { value: dc } : dc\r\n\r\n this.unadjusted = this.#calculateDegreeOfSuccess()\r\n this.adjustment = this.#getDegreeAdjustment(this.unadjusted, dosAdjustments)\r\n this.value = this.adjustment ? this.#adjustDegreeOfSuccess(this.adjustment.amount, this.unadjusted) : this.unadjusted\r\n }\r\n\r\n static CRITICAL_FAILURE = 0\r\n static FAILURE = 1\r\n static SUCCESS = 2\r\n static CRITICAL_SUCCESS = 3\r\n\r\n #getDegreeAdjustment(degree, adjustments) {\r\n if (!adjustments) return null\r\n\r\n for (const outcome of ['all', ...DEGREE_OF_SUCCESS_STRINGS]) {\r\n const { label, amount } = adjustments[outcome] ?? {}\r\n if (\r\n amount &&\r\n label &&\r\n !(degree === DegreeOfSuccess.CRITICAL_SUCCESS && amount === DEGREE_ADJUSTMENT_AMOUNTS.INCREASE) &&\r\n !(degree === DegreeOfSuccess.CRITICAL_FAILURE && amount === DEGREE_ADJUSTMENT_AMOUNTS.LOWER) &&\r\n (outcome === 'all' || DEGREE_OF_SUCCESS_STRINGS.indexOf(outcome) === degree)\r\n ) {\r\n return { label, amount }\r\n }\r\n }\r\n\r\n return null\r\n }\r\n\r\n #adjustDegreeOfSuccess(amount, degreeOfSuccess) {\r\n switch (amount) {\r\n case 'criticalFailure':\r\n return 0\r\n case 'failure':\r\n return 1\r\n case 'success':\r\n return 2\r\n case 'criticalSuccess':\r\n return 3\r\n default:\r\n return Math.clamped(degreeOfSuccess + amount, 0, 3)\r\n }\r\n }\r\n\r\n /**\r\n * @param degree The current success value\r\n * @return The new success value\r\n */\r\n #adjustDegreeByDieValue(degree) {\r\n if (this.dieResult === 20) {\r\n return this.#adjustDegreeOfSuccess(DEGREE_ADJUSTMENT_AMOUNTS.INCREASE, degree)\r\n } else if (this.dieResult === 1) {\r\n return this.#adjustDegreeOfSuccess(DEGREE_ADJUSTMENT_AMOUNTS.LOWER, degree)\r\n }\r\n\r\n return degree\r\n }\r\n\r\n #calculateDegreeOfSuccess() {\r\n const dc = this.dc.value\r\n\r\n if (this.rollTotal - dc >= 10) {\r\n return this.#adjustDegreeByDieValue(DegreeOfSuccess.CRITICAL_SUCCESS)\r\n } else if (dc - this.rollTotal >= 10) {\r\n return this.#adjustDegreeByDieValue(DegreeOfSuccess.CRITICAL_FAILURE)\r\n } else if (this.rollTotal >= dc) {\r\n return this.#adjustDegreeByDieValue(DegreeOfSuccess.SUCCESS)\r\n }\r\n\r\n return this.#adjustDegreeByDieValue(DegreeOfSuccess.FAILURE)\r\n }\r\n}\r\n", "export function getTemplateTokens(template, { collisionOrigin, collisionType = 'move' } = {}) {\r\n template = template instanceof MeasuredTemplateDocument ? template.object : template\r\n\r\n if (!canvas.scene) return []\r\n const { grid, dimensions } = canvas\r\n if (!(grid && dimensions)) return []\r\n\r\n if (!template?.highlightId) return []\r\n\r\n const gridHighlight = grid.getHighlightLayer(template.highlightId)\r\n if (!gridHighlight || grid.type !== CONST.GRID_TYPES.SQUARE) return []\r\n const origin = collisionOrigin ?? template.center\r\n\r\n // Get all the tokens that are inside the highlight bounds\r\n const tokens = canvas.tokens.quadtree.getObjects(gridHighlight.getLocalBounds(undefined, true))\r\n\r\n const gridSize = grid.size\r\n\r\n const containedTokens = []\r\n for (const token of tokens) {\r\n const tokenDoc = token.document\r\n\r\n // Collect the position of all grid squares that this token occupies as \"x.y\"\r\n const tokenPositions = []\r\n for (let h = 0; h < tokenDoc.height; h++) {\r\n const tokenX = Math.floor(token.x / gridSize) * gridSize\r\n const tokenY = Math.floor(token.y / gridSize) * gridSize\r\n\r\n const y = tokenY + h * gridSize\r\n tokenPositions.push(`${tokenX}.${y}`)\r\n if (tokenDoc.width > 1) {\r\n for (let w = 1; w < tokenDoc.width; w++) {\r\n tokenPositions.push(`${tokenX + w * gridSize}.${y}`)\r\n }\r\n }\r\n }\r\n\r\n for (const position of tokenPositions) {\r\n // Check if a position exists within this GridHiglight\r\n if (!gridHighlight.positions.has(position)) {\r\n continue\r\n }\r\n // Position of cell's top-left corner, in pixels\r\n const [gx, gy] = position.split('.').map(s => Number(s))\r\n // Position of cell's center in pixels\r\n const destination = {\r\n x: gx + dimensions.size * 0.5,\r\n y: gy + dimensions.size * 0.5,\r\n }\r\n if (destination.x < 0 || destination.y < 0) continue\r\n\r\n const hasCollision =\r\n canvas.ready &&\r\n collisionType &&\r\n CONFIG.Canvas.polygonBackends[collisionType].testCollision(origin, destination, {\r\n type: collisionType,\r\n mode: 'any',\r\n })\r\n\r\n if (!hasCollision) {\r\n containedTokens.push(token)\r\n break\r\n }\r\n }\r\n }\r\n return containedTokens\r\n}\r\n", "import { bindOnPreCreateSpellDamageChatMessage } from '../shared/chat'\r\nimport { getFlag, moduleFlagUpdate, setFlag, updateSourceFlag } from '../shared/flags'\r\nimport { createChoicesHook, createHook } from '../shared/hook'\r\nimport { localize, subLocalize } from '../shared/localize'\r\nimport { getInMemory, setInMemory } from '../shared/misc'\r\nimport { warn } from '../shared/notification'\r\nimport { templatePath } from '../shared/path'\r\nimport { applyDamageFromMessage, onClickShieldBlock } from '../shared/pf2e/chat'\r\nimport { DegreeOfSuccess } from '../shared/pf2e/success'\r\nimport { getSetting } from '../shared/settings'\r\nimport { socketEmit, socketOff, socketOn } from '../shared/socket'\r\nimport { getTemplateTokens } from '../shared/template'\r\nimport { isActiveGM, isUserGM } from '../shared/user'\r\n\r\nconst SAVES = {\r\n fortitude: { icon: 'fa-solid fa-chess-rook', label: 'PF2E.SavesFortitude' },\r\n reflex: { icon: 'fa-solid fa-person-running', label: 'PF2E.SavesReflex' },\r\n will: { icon: 'fa-solid fa-brain', label: 'PF2E.SavesWill' },\r\n}\r\n\r\nconst REROLL = {\r\n hero: {\r\n icon: 'fa-solid fa-hospital-symbol',\r\n reroll: 'PF2E.RerollMenu.HeroPoint',\r\n rerolled: 'PF2E.RerollMenu.MessageHeroPoint',\r\n },\r\n new: {\r\n icon: 'fa-solid fa-dice',\r\n reroll: 'PF2E.RerollMenu.KeepNew',\r\n rerolled: 'PF2E.RerollMenu.MessageKeep.new',\r\n },\r\n lower: {\r\n icon: 'fa-solid fa-dice-one',\r\n reroll: 'PF2E.RerollMenu.KeepLower',\r\n rerolled: 'PF2E.RerollMenu.MessageKeep.lower',\r\n },\r\n higher: {\r\n icon: 'fa-solid fa-dice-six',\r\n reroll: 'PF2E.RerollMenu.KeepHigher',\r\n rerolled: 'PF2E.RerollMenu.MessageKeep.higher',\r\n },\r\n}\r\n\r\nconst DEGREE_OF_SUCCESS = ['criticalFailure', 'failure', 'success', 'criticalSuccess']\r\n\r\nconst setPrecreateMessageHook = createHook('preCreateChatMessage', preCreateChatMessage)\r\nconst setRenderMessageHook = createChoicesHook('renderChatMessage', renderChatMessage)\r\nconst setCreateTemplateHook = createHook('createMeasuredTemplate', createMeasuredTemplate)\r\n\r\nlet SOCKET = false\r\n\r\nexport function registerTargetTokenHelper() {\r\n return {\r\n settings: [\r\n {\r\n name: 'target',\r\n type: Boolean,\r\n default: false,\r\n onChange: setHooks,\r\n },\r\n {\r\n name: 'target-chat',\r\n type: String,\r\n default: 'disabled',\r\n choices: ['disabled', 'small', 'big'],\r\n scope: 'client',\r\n onChange: value => setRenderMessageHook(value && getSetting('target')),\r\n migrate: {\r\n 1: value => (value === 'true' ? 'small' : value === 'false' ? 'disabled' : undefined),\r\n },\r\n },\r\n {\r\n name: 'target-template',\r\n type: Boolean,\r\n default: false,\r\n scope: 'client',\r\n onChange: value => setCreateTemplateHook(value && getSetting('target')),\r\n },\r\n ],\r\n conflicts: [],\r\n init: () => {\r\n if (getSetting('target')) setHooks(true)\r\n },\r\n }\r\n}\r\n\r\nfunction setHooks(value) {\r\n setPrecreateMessageHook(value)\r\n setRenderMessageHook(value)\r\n setCreateTemplateHook(value && getSetting('target-template'))\r\n\r\n if (isUserGM()) {\r\n if (value && !SOCKET) {\r\n socketOn(onSocket)\r\n SOCKET = true\r\n } else if (!value && SOCKET) {\r\n socketOff(onSocket)\r\n SOCKET = false\r\n }\r\n }\r\n}\r\n\r\nfunction onSocket(packet) {\r\n if (!isActiveGM()) return\r\n switch (packet.type) {\r\n case 'target.update-save':\r\n updateMessageSave(packet)\r\n break\r\n case 'target.update-applied':\r\n updateMessageApplied(packet)\r\n break\r\n }\r\n}\r\n\r\nasync function createMeasuredTemplate(template, _, userId) {\r\n const user = game.user\r\n if (user.id !== userId) return\r\n\r\n const localize = subLocalize('target.menu')\r\n const item = template.item\r\n const actor = item?.actor\r\n const self = !actor ? undefined : actor.token ?? actor.getActiveTokens()[0]\r\n\r\n const data = {\r\n title: item?.name || localize('title'),\r\n content: await renderTemplate(templatePath('target/template-menu'), { i18n: localize, noSelf: !self }),\r\n buttons: {\r\n select: {\r\n icon: '',\r\n label: localize('target'),\r\n callback: html => ({\r\n targets: html.find('[name=targets]:checked').val(),\r\n self: html.find('[name=self]').prop('checked'),\r\n neutral: html.find('[name=neutral]').prop('checked'),\r\n }),\r\n },\r\n },\r\n close: () => null,\r\n }\r\n\r\n const result = await Dialog.wait(data, undefined, { id: `pf2e-toolbelt-target-template`, width: 260 })\r\n if (!result) return\r\n\r\n const alliance = actor ? actor.alliance : user.isGM ? 'opposition' : 'party'\r\n const opposition = alliance === 'party' ? 'opposition' : alliance === 'opposition' ? 'party' : null\r\n\r\n const tokens = getTemplateTokens(template)\r\n const targets = tokens.filter(token => {\r\n const validActor = token.actor?.isOfType('creature', 'hazard', 'vehicle')\r\n if (!validActor) return false\r\n\r\n if (token.document.hidden) return false\r\n\r\n if (self && token === self) return result.self\r\n\r\n const targetAlliance = token.actor ? token.actor.alliance : token.alliance\r\n\r\n if (targetAlliance === null) return result.neutral\r\n\r\n return (\r\n result.targets === 'all' ||\r\n (result.targets === 'allies' && targetAlliance === alliance) ||\r\n (result.targets === 'enemies' && targetAlliance === opposition)\r\n )\r\n })\r\n\r\n const targetsIds = targets.map(token => token.id)\r\n user.updateTokenTargets(targetsIds)\r\n user.broadcastActivity({ targets: targetsIds })\r\n}\r\n\r\nlet HEALINGS_REGEX\r\nfunction isValidDamageMessage(message) {\r\n if (message.rolls[0].options.evaluatePersistent) return false\r\n\r\n const healingsRegex = (HEALINGS_REGEX ??= (() => {\r\n const healings = [\r\n game.i18n.localize('PF2E.Encounter.Broadcast.FastHealing.fast-healing.ReceivedMessage'),\r\n game.i18n.localize('PF2E.Encounter.Broadcast.FastHealing.regeneration.ReceivedMessage'),\r\n ]\r\n return new RegExp(`^
(${healings.join('|')})
`)\r\n })())\r\n\r\n return !healingsRegex.test(message.flavor)\r\n}\r\n\r\nfunction preCreateChatMessage(message) {\r\n const isDamageRoll = message.isDamageRoll\r\n\r\n if (isDamageRoll) {\r\n if (!isValidDamageMessage(message)) return\r\n\r\n if (!getFlag(message, 'target.targets')) {\r\n const targets = game.user.targets\r\n if (targets.size) {\r\n updateSourceFlag(\r\n message,\r\n 'target.targets',\r\n Array.from(targets.map(target => ({ token: target.document.uuid, actor: target.actor.uuid })))\r\n )\r\n }\r\n }\r\n\r\n if (message.rolls.length === 2) {\r\n const splashRollIndex = message.rolls.findIndex(roll => roll.options?.splashOnly)\r\n const regularRollIndex = message.rolls.findIndex(\r\n roll =>\r\n !roll.options?.splashOnly &&\r\n roll.options?.damage?.modifiers.some(modifier => modifier.damageCategory === 'splash')\r\n )\r\n\r\n if (splashRollIndex !== -1 && regularRollIndex !== -1) {\r\n updateSourceFlag(message, 'target.splashIndex', splashRollIndex)\r\n }\r\n }\r\n }\r\n\r\n if (!isDamageRoll && message.getFlag('pf2e', 'context.type') !== 'spell-cast') return\r\n\r\n const item = message.item\r\n if (item?.type !== 'spell') return\r\n\r\n const save = item.system.defense?.save\r\n if (!save) return\r\n\r\n const dc = (() => {\r\n if (!item.trickMagicEntry) return item.spellcasting?.statistic.dc.value\r\n return $(message.content).find('[data-action=spell-save]').data()?.dc\r\n })()\r\n if (typeof dc !== 'number') return\r\n\r\n updateSourceFlag(message, 'target.save', {\r\n ...save,\r\n dc,\r\n })\r\n}\r\n\r\nasync function renderChatMessage(message, html) {\r\n const clientEnabled = getSetting('target-chat') !== 'disabled'\r\n\r\n if (clientEnabled && message.isDamageRoll) {\r\n if (!isValidDamageMessage(message)) return\r\n await renderDamageChatMessage(message, html)\r\n refreshMessage(message)\r\n return\r\n }\r\n\r\n const item = message.item\r\n if (!item || item.type !== 'spell') return\r\n\r\n if (clientEnabled && !item.damageKinds.size) {\r\n await renderSpellChatMessage(message, html, item)\r\n refreshMessage(message)\r\n return\r\n }\r\n\r\n if (item.trickMagicEntry && item.system.defense?.save) {\r\n html.find('[data-action=spell-damage]').on('click', () => {\r\n bindOnPreCreateSpellDamageChatMessage(message)\r\n })\r\n }\r\n}\r\n\r\nfunction refreshMessage(message) {\r\n Promise.all(\r\n [ui.chat, ui.chat._popout].map(async chat => {\r\n const el = chat?.element[0]?.querySelector('#chat-log')\r\n if (!el || (!chat.isAtBottom && message.user._id !== game.user._id)) return\r\n\r\n await chat._waitForImages()\r\n el.scrollTop = el.scrollHeight\r\n })\r\n )\r\n\r\n for (const app of Object.values(message.apps)) {\r\n if (!(app instanceof ChatPopout)) continue\r\n if (!app.rendered) continue\r\n\r\n app.setPosition()\r\n }\r\n}\r\n\r\nasync function renderSpellChatMessage(message, html, spell) {\r\n const data = await getMessageData(message)\r\n if (!data) return\r\n\r\n const { targets, save } = data\r\n const msgContent = html.find('.message-content')\r\n const cardBtns = msgContent.find('.card-buttons')\r\n\r\n if (game.user.isGM || message.isAuthor) {\r\n const saveBtn = cardBtns.find('[data-action=spell-save]')\r\n const wrapper = $('
')\r\n const targetsTooltip = localize('target.chat.targets.tooltip')\r\n\r\n const targetsBtn = $(``)\r\n\r\n targetsBtn.on('click', event => addTargets(event, message))\r\n\r\n wrapper.append(targetsBtn)\r\n wrapper.append(saveBtn)\r\n cardBtns.prepend(wrapper)\r\n }\r\n\r\n if (spell && spell.area && !spell.traits.has('aura')) {\r\n const template = canvas.scene?.templates.some(template => template.message === message && template.isOwner)\r\n if (template) cardBtns.find('.owner-buttons .hidden.small').removeClass('hidden')\r\n }\r\n\r\n if (!targets.length) return\r\n\r\n const rowsTemplate = $('
')\r\n\r\n targets.forEach(({ template }) => {\r\n rowsTemplate.append('
')\r\n rowsTemplate.append(template)\r\n })\r\n\r\n msgContent.after(rowsTemplate)\r\n\r\n addHeaderListeners(message, rowsTemplate, save)\r\n}\r\n\r\nfunction addTargets(event, message) {\r\n event.stopPropagation()\r\n const targets = game.user.targets\r\n\r\n setFlag(\r\n message,\r\n 'target.targets',\r\n Array.from(targets.map(target => ({ token: target.document.uuid, actor: target.actor.uuid })))\r\n )\r\n}\r\n\r\nasync function renderDamageChatMessage(message, html) {\r\n const data = await getMessageData(message)\r\n const msgContent = html.find('.message-content')\r\n const damageRows = msgContent.find('.damage-application')\r\n const clonedRows = damageRows.clone()\r\n\r\n const buttons = $('
')\r\n\r\n if (data?.targets.length && damageRows.length) {\r\n const toggleDamageRow = () => {\r\n const expanded = !!getInMemory(message, 'target.expanded')\r\n toggleBtn.toggleClass('collapse', expanded)\r\n damageRows.toggleClass('hidden', !expanded)\r\n }\r\n\r\n const toggleTooltip = localize('target.chat.toggle.tooltip')\r\n const toggleBtn = $(``)\r\n\r\n toggleDamageRow()\r\n\r\n toggleBtn.on('click', event => {\r\n event.stopPropagation()\r\n setInMemory(message, 'target.expanded', !getInMemory(message, 'target.expanded'))\r\n toggleDamageRow()\r\n })\r\n\r\n buttons.append(toggleBtn)\r\n }\r\n\r\n if (game.user.isGM || message.isAuthor) {\r\n const targetsTooltip = localize('target.chat.targets.tooltip')\r\n const targetsBtn = $(``)\r\n\r\n targetsBtn.on('click', event => addTargets(event, message))\r\n\r\n buttons.append(targetsBtn)\r\n }\r\n\r\n html.find('.dice-result .dice-total').append(buttons)\r\n\r\n if (!data?.targets.length) return\r\n\r\n const { targets, save } = data\r\n if (!clonedRows.length) return\r\n\r\n clonedRows.removeClass('damage-application').addClass('target-damage-application')\r\n\r\n if (getSetting('target-chat') !== 'big') clonedRows.find('button').addClass('small')\r\n\r\n clonedRows.find('[data-action]').each(function () {\r\n const action = this.dataset.action\r\n this.dataset.action = `target-${action}`\r\n })\r\n\r\n const rowsTemplate = $('
')\r\n\r\n targets.forEach(({ uuid, template, save, applied = {} }) => {\r\n const isBasicSave = !!(save && save.result && save.basic)\r\n const clones = clonedRows.clone()\r\n\r\n rowsTemplate.append('
')\r\n rowsTemplate.append(template)\r\n\r\n clones.each((index, el) => {\r\n el.dataset.rollIndex = index\r\n el.dataset.targetUuid = uuid\r\n\r\n el.classList.toggle('applied', !!applied[index] || (isBasicSave && save.result.success === 'criticalSuccess'))\r\n if (isBasicSave) el.classList.add(save.result.success)\r\n })\r\n\r\n rowsTemplate.append(clones)\r\n })\r\n\r\n msgContent.after(rowsTemplate)\r\n\r\n addHeaderListeners(message, rowsTemplate, save)\r\n rowsTemplate.find('button[data-action^=target-]').on('click', event => onTargetButton(event, message))\r\n}\r\n\r\nfunction addHeaderListeners(message, html, save) {\r\n html.find('[data-action=ping-target]').on('click', pingTarget)\r\n html.find('[data-action=open-target-sheet]').on('click', openTargetSheet)\r\n html.find('[data-action=roll-save]').on('click', event => rollSave(event, message, save))\r\n html.find('[data-action=reroll-save]').on('click', event => rerollSave(event, message, save))\r\n}\r\n\r\nasync function getMessageData(message) {\r\n const targetsFlag = getFlag(message, 'target.targets') ?? []\r\n const showDC = game.user.isGM || game.settings.get('pf2e', 'metagame_showDC')\r\n\r\n const save = (() => {\r\n const flag = getFlag(message, 'target.save')\r\n if (!flag) return\r\n return {\r\n ...flag,\r\n ...SAVES[flag.statistic],\r\n }\r\n })()\r\n\r\n if (!targetsFlag.length && !save) return\r\n\r\n if (save) {\r\n const saveLabel = game.i18n.format('PF2E.SavingThrowWithName', { saveName: game.i18n.localize(save.label) })\r\n const saveDC = showDC ? localize('target.chat.save.dcWithValue', { dc: save.dc }) : ''\r\n save.tooltipLabel = `${saveLabel} ${saveDC}`\r\n save.tooltip = await renderTemplate(templatePath('target/save-tooltip'), {\r\n check: save.tooltipLabel,\r\n })\r\n }\r\n\r\n const targets = (\r\n await Promise.all(\r\n targetsFlag.map(async ({ token }) => {\r\n const target = await fromUuid(token)\r\n if (!target?.isOwner) return\r\n\r\n const targetId = target.id\r\n const actor = target.actor\r\n const hasSave = save && !!actor?.saves[save.statistic]\r\n\r\n const targetSave = await (async () => {\r\n if (!hasSave) return\r\n\r\n const flag = getFlag(message, `target.saves.${targetId}`)\r\n if (!flag) return\r\n\r\n const rerolled = flag.rerolled\r\n const canReroll = hasSave && !rerolled\r\n const successLabel = game.i18n.localize(`PF2E.Check.Result.Degree.Check.${flag.success}`)\r\n const offset = flag.value - save.dc\r\n\r\n return {\r\n ...flag,\r\n canReroll,\r\n tooltip: await renderTemplate(templatePath('target/save-tooltip'), {\r\n i18n: subLocalize('target.chat.save'),\r\n check: save.tooltipLabel,\r\n result: localize(`target.chat.save.result.${showDC ? 'withOffset' : 'withoutOffset'}`, {\r\n success: successLabel,\r\n offset: offset >= 0 ? `+${offset}` : offset,\r\n die: ` ${flag.die}`,\r\n }),\r\n modifiers: flag.modifiers,\r\n canReroll,\r\n rerolled: REROLL[rerolled],\r\n }),\r\n }\r\n })()\r\n\r\n const templateSave = save && {\r\n ...save,\r\n result: targetSave,\r\n }\r\n\r\n return {\r\n uuid: token,\r\n target: target,\r\n save: templateSave,\r\n applied: getFlag(message, `target.applied.${targetId}`),\r\n template: await renderTemplate(templatePath('target/row-header'), {\r\n name: target.name,\r\n uuid: token,\r\n save: hasSave && templateSave,\r\n canReroll: targetSave?.canReroll,\r\n rerolled: REROLL[targetSave?.rerolled],\r\n }),\r\n }\r\n })\r\n )\r\n ).filter(Boolean)\r\n\r\n return { targets, save }\r\n}\r\n\r\nasync function getTargetFromEvent(event) {\r\n const { targetUuid } = event.currentTarget.closest('[data-target-uuid]').dataset\r\n return fromUuid(targetUuid)\r\n}\r\n\r\nasync function rerollSave(event, message, { dc }) {\r\n const target = await getTargetFromEvent(event)\r\n const actor = target?.actor\r\n if (!actor) return\r\n\r\n const flag = getFlag(message, `target.saves.${target.id}`)\r\n if (!flag?.roll || flag.rerolled) return\r\n\r\n const heroPoints = actor.isOfType('character') ? actor.heroPoints.value : 0\r\n\r\n const template = Object.entries(REROLL)\r\n .map(([type, { icon, reroll }]) => {\r\n if (type === 'hero' && !heroPoints) return\r\n const label = game.i18n.localize(reroll)\r\n return ``\r\n })\r\n .filter(Boolean)\r\n .join('')\r\n\r\n const buttons = {\r\n yes: {\r\n icon: '',\r\n label: 'reroll',\r\n callback: html => html.find('[name=reroll]:checked').val() ?? null,\r\n },\r\n no: {\r\n icon: '',\r\n label: 'cancel',\r\n callback: () => null,\r\n },\r\n }\r\n\r\n const reroll = await Dialog.wait(\r\n {\r\n title: `${target.name} - ${localize('target.chat.save.reroll.confirm.title')}`,\r\n content: template,\r\n buttons,\r\n close: () => null,\r\n },\r\n {\r\n id: `pf2e-toolbelt-target-save-reroll-dialog-${target.id}`,\r\n }\r\n )\r\n\r\n if (!reroll) return\r\n\r\n const isHeroReroll = reroll === 'hero'\r\n const keep = isHeroReroll ? 'new' : reroll\r\n\r\n if (isHeroReroll) {\r\n const { value, max } = actor.heroPoints\r\n\r\n if (value < 1) {\r\n warn('target.chat.save.reroll.noPoints')\r\n return\r\n }\r\n\r\n await actor.update({\r\n 'system.resources.heroPoints.value': Math.clamped(value - 1, 0, max),\r\n })\r\n }\r\n\r\n const oldRoll = Roll.fromJSON(flag.roll)\r\n const unevaluatedNewRoll = oldRoll.clone()\r\n unevaluatedNewRoll.options.isReroll = true\r\n Hooks.callAll('pf2e.preReroll', Roll.fromJSON(flag.roll), unevaluatedNewRoll, isHeroReroll, keep)\r\n\r\n const newRoll = await unevaluatedNewRoll.evaluate({ async: true })\r\n Hooks.callAll('pf2e.reroll', Roll.fromJSON(flag.roll), newRoll, isHeroReroll, keep)\r\n\r\n const keptRoll =\r\n (keep === 'higher' && oldRoll.total > newRoll.total) || (keep === 'lower' && oldRoll.total < newRoll.total)\r\n ? oldRoll\r\n : newRoll\r\n\r\n if (keptRoll === newRoll) {\r\n const success = new DegreeOfSuccess(newRoll, dc, flag.dosAdjustments)\r\n keptRoll.options.degreeOfSuccess = success.value\r\n }\r\n\r\n const packet = {\r\n type: 'target.update-save',\r\n target: target.id,\r\n data: {\r\n value: keptRoll.total,\r\n die: keptRoll.dice[0].total,\r\n success: keptRoll.degreeOfSuccess,\r\n roll: JSON.stringify(keptRoll.toJSON()),\r\n dosAdjustments: deepClone(flag.dosAdjustments),\r\n modifiers: deepClone(flag.modifiers),\r\n rerolled: reroll,\r\n },\r\n }\r\n\r\n if (keptRoll.options.keeleyAdd10) {\r\n packet.data.modifiers.push({\r\n label: localize('target.chat.save.reroll.keeley'),\r\n modifier: 10,\r\n })\r\n }\r\n\r\n if (game.user.isGM || message.isAuthor) {\r\n packet.message = message\r\n updateMessageSave(packet)\r\n } else {\r\n packet.message = message.id\r\n socketEmit(packet)\r\n }\r\n}\r\n\r\nasync function rollSave(event, message, { dc, statistic }) {\r\n const target = await getTargetFromEvent(event)\r\n const actor = target?.actor\r\n if (!actor) return\r\n\r\n const save = actor.saves[statistic]\r\n if (!save) return\r\n\r\n const item = (() => {\r\n const item = message.item\r\n if (item) return item\r\n\r\n const messageId = getFlag(message, 'target.messageId')\r\n if (!messageId) return\r\n\r\n const otherMessage = game.messages.get(messageId)\r\n if (!otherMessage) return\r\n\r\n return otherMessage.item\r\n })()\r\n\r\n const skipDefault = !game.user.settings.showCheckDialogs\r\n\r\n const packet = {\r\n type: 'target.update-save',\r\n target: target.id,\r\n }\r\n\r\n save.check.roll({\r\n dc: { value: dc },\r\n item,\r\n origin: actor,\r\n skipDialog: event.shiftKey ? !skipDefault : skipDefault,\r\n createMessage: false,\r\n callback: (roll, __, msg) => {\r\n packet.data = {\r\n value: roll.total,\r\n die: roll.dice[0].total,\r\n success: roll.degreeOfSuccess,\r\n roll: JSON.stringify(roll.toJSON()),\r\n dosAdjustments: msg.getFlag('pf2e', 'context.dosAdjustments'),\r\n modifiers: msg\r\n .getFlag('pf2e', 'modifiers')\r\n .filter(modifier => modifier.enabled)\r\n .map(({ label, modifier }) => ({ label, modifier })),\r\n }\r\n\r\n if (game.user.isGM || message.isAuthor) {\r\n packet.message = message\r\n updateMessageSave(packet)\r\n } else {\r\n packet.message = message.id\r\n socketEmit(packet)\r\n }\r\n },\r\n })\r\n}\r\n\r\nfunction updateMessageSave({ message, target, data }) {\r\n if (typeof message === 'string') {\r\n message = game.messages.get(message)\r\n if (!message) return\r\n }\r\n\r\n if (typeof data.success === 'number') data.success = DEGREE_OF_SUCCESS[data.success]\r\n\r\n setFlag(message, `target.saves.${target}`, deepClone(data))\r\n}\r\n\r\nasync function openTargetSheet(event) {\r\n const target = await getTargetFromEvent(event)\r\n if (!target) return\r\n\r\n target.actor?.sheet.render(true)\r\n}\r\n\r\nasync function pingTarget(event) {\r\n if (!canvas.ready) return\r\n\r\n const target = await getTargetFromEvent(event)\r\n if (!target) return\r\n\r\n canvas.ping(target.center)\r\n}\r\n\r\nasync function onTargetButton(event, message) {\r\n const btn = event.currentTarget\r\n const { rollIndex, targetUuid } = btn.closest('[data-target-uuid]').dataset\r\n const target = await fromUuid(targetUuid)\r\n if (!target) return\r\n\r\n const type = btn.dataset.action\r\n\r\n if (type === 'target-shield-block') {\r\n onClickShieldBlock(target, btn, message.element)\r\n return\r\n }\r\n\r\n const multiplier =\r\n type === 'target-apply-healing'\r\n ? -1\r\n : type === 'target-half-damage'\r\n ? 0.5\r\n : type === 'target-apply-damage'\r\n ? 1\r\n : type === 'target-double-damage'\r\n ? 2\r\n : 3\r\n\r\n applyDamageFromMessage(target, {\r\n message,\r\n multiplier,\r\n addend: 0,\r\n promptModifier: event.shiftKey,\r\n rollIndex: Number(rollIndex),\r\n })\r\n}\r\n\r\nexport function onDamageApplied(message, tokenId, rollIndex) {\r\n let updates = {}\r\n moduleFlagUpdate(updates, `target.applied.${tokenId}.${rollIndex}`, true)\r\n\r\n const splashRollIndex = getFlag(message, 'target.splashIndex')\r\n if (splashRollIndex !== undefined) {\r\n const regularRollIndex = splashRollIndex === 0 ? 1 : 0\r\n\r\n if (rollIndex === splashRollIndex) {\r\n moduleFlagUpdate(updates, `target.applied.${tokenId}.${regularRollIndex}`, true)\r\n } else {\r\n moduleFlagUpdate(updates, `target.applied.${tokenId}.${splashRollIndex}`, true)\r\n\r\n const targetsFlag = getFlag(message, 'target.targets') ?? []\r\n for (const target of targetsFlag) {\r\n const targetId = target.token?.split('.').at(-1)\r\n if (targetId === tokenId) continue\r\n\r\n moduleFlagUpdate(updates, `target.applied.${targetId}.${regularRollIndex}`, true)\r\n }\r\n }\r\n }\r\n\r\n if (game.user.isGM || message.isAuthor) {\r\n updateMessageApplied({ message, updates })\r\n } else {\r\n socketEmit({\r\n type: 'target.update-applied',\r\n message: message.id,\r\n updates,\r\n })\r\n }\r\n}\r\n\r\nfunction updateMessageApplied({ message, updates }) {\r\n if (typeof message === 'string') {\r\n message = game.messages.get(message)\r\n if (!message) return\r\n }\r\n message.update(updates)\r\n}\r\n", "import { getSetting } from '../shared/settings'\r\n\r\nlet CREATE_HOOK = null\r\nlet UPDATE_HOOK = null\r\n\r\nexport function registerUnided() {\r\n return {\r\n settings: [\r\n {\r\n name: 'unided',\r\n type: String,\r\n default: 'disabled',\r\n choices: ['disabled', 'create', 'all'],\r\n onChange: setHooks,\r\n },\r\n ],\r\n conflicts: ['pf2e-unided'],\r\n init: () => {\r\n setHooks()\r\n },\r\n }\r\n}\r\n\r\nfunction setHooks(value) {\r\n value ??= getSetting('unided')\r\n\r\n if (value === 'disabled') {\r\n if (CREATE_HOOK) {\r\n Hooks.off('preCreateItem', CREATE_HOOK)\r\n CREATE_HOOK = null\r\n }\r\n if (UPDATE_HOOK) {\r\n Hooks.off('preUpdateItem', UPDATE_HOOK)\r\n UPDATE_HOOK = null\r\n }\r\n } else {\r\n if (!CREATE_HOOK) {\r\n CREATE_HOOK = Hooks.on('preCreateItem', preCreateItem)\r\n }\r\n if (value === 'all' && !UPDATE_HOOK) {\r\n UPDATE_HOOK = Hooks.on('preUpdateItem', preUpdateItem)\r\n } else if (value !== 'all' && UPDATE_HOOK) {\r\n Hooks.off('preUpdateItem', UPDATE_HOOK)\r\n UPDATE_HOOK = null\r\n }\r\n }\r\n}\r\n\r\nfunction preCreateItem(item) {\r\n if (!item.img || !item.isOfType('physical')) return\r\n item._source.system.identification.unidentified.img = item.img\r\n}\r\n\r\nfunction preUpdateItem(item, changes) {\r\n if (!item.isOfType('physical') || !('img' in changes)) return\r\n setProperty(changes, 'system.identification.unidentified.img', changes.img)\r\n}\r\n", "import { subLocalize } from '../shared/localize'\r\nimport { templatePath } from '../shared/path'\r\n\r\nconst localize = subLocalize('macros.condition')\r\n\r\nexport async function permaConditionEffect(actor) {\r\n const callback = (html, type) => {\r\n const condition = html.find('[name=condition]')\r\n const { name, slug, img } = condition.find(':selected').data()\r\n\r\n return {\r\n type,\r\n slug,\r\n img,\r\n name: html.find('[name=name]').val().trim() || localize('effect-name', { condition: name }),\r\n uuid: condition.val(),\r\n badge: Number(html.find('[name=badge]').val() || 1),\r\n unidentified: html.find('[name=unidentified]').prop('checked'),\r\n }\r\n }\r\n\r\n const buttons = {\r\n generate: {\r\n icon: '',\r\n label: localize('generate'),\r\n callback: html => callback(html, 'generate'),\r\n },\r\n add: {\r\n icon: '',\r\n label: localize('add'),\r\n callback: html => callback(html, 'add'),\r\n },\r\n }\r\n\r\n const conditions = Array.from(game.pf2e.ConditionManager.conditions.values())\r\n const withBadge = new Set(conditions.filter(condition => !!condition.badge).map(condition => condition.slug))\r\n\r\n const content = await renderTemplate(templatePath('macros/condition'), {\r\n i18n: localize,\r\n conditions: Array.from(new Set(conditions.sort((a, b) => a.name.localeCompare(b.name)))),\r\n })\r\n\r\n const setInputs = html => {\r\n const { name, slug } = html.find('[name=condition] :selected').data()\r\n html.find('[name=name]').prop('placeholder', localize('effect-name', { condition: name }))\r\n\r\n const hasBadge = withBadge.has(slug)\r\n const badge = html.find('[name=badge]')\r\n badge.prop('disabled', !hasBadge)\r\n if (!hasBadge) badge.val(1)\r\n }\r\n\r\n const result = await Dialog.wait(\r\n {\r\n buttons,\r\n content,\r\n title: localize('title'),\r\n close: () => null,\r\n render: html => {\r\n setInputs(html)\r\n html.find('[name=condition]').on('change', () => setInputs(html))\r\n },\r\n },\r\n {\r\n id: 'pf2e-toolbelt-macros-condition',\r\n width: 320,\r\n }\r\n )\r\n\r\n if (!result) return\r\n\r\n const rule = {\r\n inMemoryOnly: true,\r\n key: 'GrantItem',\r\n uuid: result.uuid,\r\n }\r\n\r\n if (result.badge > 1 && withBadge.has(result.slug)) {\r\n rule.alterations = [\r\n {\r\n mode: 'override',\r\n property: 'badge-value',\r\n value: result.badge,\r\n },\r\n ]\r\n }\r\n\r\n const source = {\r\n name: result.name,\r\n type: 'effect',\r\n img: result.img,\r\n system: {\r\n rules: [rule],\r\n unidentified: result.unidentified,\r\n },\r\n }\r\n\r\n if (result.type === 'generate' || !actor) await Item.create(source)\r\n else await actor.createEmbeddedDocuments('Item', [source])\r\n}\r\n", "import { registerArp } from './features/arp'\r\nimport { registerEffectsPanelHelper } from './features/effects'\r\nimport { registerGiveth } from './features/giveth'\r\nimport { registerHeroActions } from './features/hero'\r\nimport { registerKnowledges } from './features/knowledges'\r\nimport { registerMerge } from './features/merge'\r\nimport { registerHideModifiers } from './features/modifiers'\r\nimport { registerNobulk } from './features/nobulk'\r\nimport { registerShare } from './features/share'\r\nimport { registerStances } from './features/stances'\r\nimport { registerSpellsSummary } from './features/summary'\r\nimport { registerTargetTokenHelper } from './features/target'\r\nimport { registerUnided } from './features/unided'\r\nimport { permaConditionEffect } from './macros/condition'\r\nimport { MODULE_ID } from './module'\r\nimport { localize } from './shared/localize'\r\nimport { warn } from './shared/notification'\r\nimport { getSetting, setSetting } from './shared/settings'\r\nimport { isUserGM } from './shared/user'\r\n\r\nconst FEATURES = [\r\n registerArp(),\r\n registerNobulk(),\r\n registerGiveth(),\r\n registerKnowledges(),\r\n registerUnided(),\r\n registerMerge(),\r\n registerEffectsPanelHelper(),\r\n registerSpellsSummary(),\r\n registerStances(),\r\n registerHeroActions(),\r\n registerHideModifiers(),\r\n registerShare(),\r\n registerTargetTokenHelper(),\r\n]\r\n\r\nconst CONFLICTS = new Set()\r\n\r\nconst SETTINGS_MIGRATION_VERSION = 1\r\n\r\nlet firstClientSetting = null\r\n\r\nHooks.once('init', () => {\r\n const isGM = isUserGM()\r\n\r\n game.settings.register(MODULE_ID, 'settings-min-migration-version', {\r\n scope: 'world',\r\n config: false,\r\n key: 'settings-min-migration-version',\r\n type: Number,\r\n default: 0,\r\n })\r\n\r\n const settings = FEATURES.flatMap(({ settings = [] }) =>\r\n settings.map(setting => {\r\n const key = setting.name\r\n\r\n if (setting.choices) {\r\n setting.choices = setting.choices.reduce((choices, choice) => {\r\n choices[choice] = settingPath(key, `choices.${choice}`)\r\n return choices\r\n }, {})\r\n }\r\n\r\n setting.key = key\r\n setting.scope ??= 'world'\r\n setting.config ??= true\r\n setting.name = settingPath(key, 'name')\r\n setting.hint = settingPath(key, 'hint')\r\n\r\n return setting\r\n })\r\n )\r\n\r\n const [worldSettings, clientSettings] = ['world', 'client'].map(scope =>\r\n settings.filter(settings => settings.scope === scope)\r\n )\r\n\r\n ;[worldSettings, clientSettings].forEach(settings =>\r\n settings.forEach(setting => game.settings.register(MODULE_ID, setting.key, setting))\r\n )\r\n\r\n if (isGM) {\r\n firstClientSetting = clientSettings[0].key\r\n Hooks.on('renderSettingsConfig', renderSettingsConfig)\r\n }\r\n\r\n const module = game.modules.get(MODULE_ID)\r\n module.api = {\r\n macros: {\r\n permaConditionEffect,\r\n },\r\n }\r\n\r\n FEATURES.forEach(feature => {\r\n const { init, conflicts = [], api, name } = feature\r\n\r\n if (isGM) {\r\n for (const id of conflicts) {\r\n const conflictingModule = game.modules.get(id)\r\n if (conflictingModule?.active) {\r\n feature.conflicting = true\r\n CONFLICTS.add(conflictingModule.title)\r\n }\r\n }\r\n }\r\n\r\n if (api && name) module.api[name] = api\r\n\r\n if (!feature.conflicting && init) init(isGM)\r\n })\r\n})\r\n\r\nHooks.once('ready', () => {\r\n const isGM = game.user.isGM\r\n\r\n for (const { conflicting, ready } of FEATURES) {\r\n if (!conflicting && ready) ready(isGM)\r\n }\r\n\r\n if (!isGM) return\r\n\r\n for (const conflict of CONFLICTS) {\r\n warn('module-conflict', { name: conflict }, true)\r\n }\r\n\r\n const settingsMinMigrationVersion = getSetting('settings-min-migration-version')\r\n if (settingsMinMigrationVersion < SETTINGS_MIGRATION_VERSION) {\r\n FEATURES.forEach(({ settings }) => {\r\n settings.forEach(({ migrate, key }) => {\r\n if (!migrate) return\r\n\r\n const originalValue = getSetting(key)\r\n let migratedValue = originalValue\r\n\r\n for (let version = settingsMinMigrationVersion + 1; version <= SETTINGS_MIGRATION_VERSION; version++) {\r\n const migration = migrate[version]\r\n if (typeof migration !== 'function') continue\r\n\r\n migratedValue = migration(migratedValue)\r\n }\r\n\r\n if (migratedValue != null && migratedValue !== originalValue) setSetting(key, migratedValue)\r\n })\r\n })\r\n\r\n setSetting('settings-min-migration-version', SETTINGS_MIGRATION_VERSION)\r\n }\r\n})\r\n\r\nfunction settingPath(setting, key) {\r\n return `${MODULE_ID}.settings.${setting}.${key}`\r\n}\r\n\r\nfunction renderSettingsConfig(_, html) {\r\n if (!firstClientSetting) return\r\n\r\n const group = html.find(`.tab[data-tab=${MODULE_ID}] [data-setting-id=\"${MODULE_ID}.${firstClientSetting}\"]`)\r\n group.before(`

${localize('settings.client')}

`)\r\n}\r\n"], + "mappings": "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", + "names": ["MODULE_ID", "registerWrapper", "path", "callback", "type", "MODULE_ID", "__name", "localize", "args", "key", "data", "MODULE_ID", "__name", "hasLocalization", "localizePath", "subLocalize", "subKey", "fn", "warn", "info", "error", "hash", "notify", "str", "arg1", "arg2", "arg3", "type", "data", "permanent", "localize", "__name", "warn", "args", "info", "error", "getSetting", "setting", "MODULE_ID", "__name", "setSetting", "key", "value", "PREPARE_WEAPON_DATA", "PREPARE_WEAPON_DERIVED_DATA", "PREPARE_ARMOR_DATA", "PREPARE_ARMOR_DERIVED_DATA", "registerArp", "getSetting", "registerWrapper", "PREPARE_WEAPON_DATA", "onPrepareWeaponData", "PREPARE_WEAPON_DERIVED_DATA", "onPrepareWeaponDerivedData", "onPrepareArmorData", "onPrepareArmorDerivedData", "isGM", "info", "__name", "isValidActor", "actor", "isCharacter", "WEAPON_POTENCY_PRICE", "WEAPON_STRIKING_PRICE", "isValidWeapon", "weapon", "traits", "group", "category", "slug", "wrapped", "level", "coins", "potency", "striking", "ARMOR_POTENCY_PRICE", "ARMOR_RESILIENCY_PRICE", "isValidArmor", "armor", "__name", "onPrepareArmorData", "wrapped", "actor", "isValidActor", "level", "onPrepareArmorDerivedData", "coins", "potency", "resiliency", "createHook", "event", "listener", "callback", "HOOK", "value", "otherSettings", "skipCallback", "s", "getSetting", "__name", "createChoicesHook", "registerUpstreamHook", "hook", "fn", "id", "index", "x", "hooked", "setHook", "createHook", "renderEffectsPanel", "refreshEffectsPanel", "registerEffectsPanelHelper", "value", "__name", "panel", "html", "removeRow", "localize", "editIcon", "effectPanels", "effectPanel", "id", "effect", "getSetting", "event", "onRemoveEffect", "h1", "onConditionSheet", "getEffect", "MoveLootPopup", "object", "options", "callback", "prompt", "buttonLabel", "_event", "formData", "__name", "isPlayedActor", "actor", "__name", "getFlag", "doc", "key", "fallback", "MODULE_ID", "__name", "setFlag", "value", "unsetFlag", "updateSourceFlag", "doc", "key", "value", "MODULE_ID", "__name", "moduleFlagUpdate", "update", "getChatMessageClass", "__name", "latestChatMessages", "nb", "fromMessage", "messages", "start", "m", "i", "message", "chatUUID", "uuid", "label", "fake", "bindOnPreCreateSpellDamageChatMessage", "originalMessage", "messageId", "save", "getFlag", "updateSourceFlag", "socketOn", "callback", "MODULE_ID", "__name", "socketOff", "socketEmit", "packet", "isActiveGM", "__name", "isUserGM", "user", "x", "isGMOnline", "getCharacterOwner", "actor", "connected", "getActiveOwner", "doc", "activeOwners", "a", "b", "isActiveOwner", "getOwner", "enabled", "CANVAS_HOOK", "registerGiveth", "setup", "isGM", "getSetting", "__name", "value", "socketOff", "onSocket", "socketOn", "registerUpstreamHook", "onDropCanvasData", "packet", "isActiveGM", "takethCondition", "takethEffect", "takethPhysical", "canvas", "data", "isGMOnline", "details", "getDetailsFromData", "target", "token", "isValidActor", "maximumX", "maximumY", "a", "b", "giveth", "origin", "item", "ownerId", "targetId", "isIndex", "qty", "warn", "sendPhysicalRequest", "MoveLootPopup", "stack", "uuid", "socketEmit", "itemId", "actor", "id", "isPlayedActor", "actorUUID", "source", "owner", "newQty", "newItem", "content", "chatUUID", "localize", "templatePath", "path", "x", "MODULE_ID", "__name", "localize", "subLocalize", "Trade", "actor", "templatePath", "value", "options", "x", "getHeroActions", "html", "#onChangeTarget", "#onDescription", "#onSendTrade", "force", "action", "target", "user", "getCharacterOwner", "getOwner", "sendTradeRequest", "event", "uuid", "id", "__name", "localeCompare", "a", "b", "__name", "refreshCharacterSheets", "actor", "win", "winActor", "compareArrays", "arr1", "arr2", "clonedArr2", "arr1Value", "index", "arr2Value", "ordinalString", "value", "pluralRules", "suffix", "isInstanceOf", "obj", "name", "setInMemory", "doc", "key", "MODULE_ID", "getInMemory", "MODULE_ID", "setHook", "createHook", "renderCharacterSheetPF2e", "setupSocket", "JOURNAL_UUID", "TABLE_UUID", "TABLE_ICON", "SOCKET", "registerHeroActions", "value", "refreshCharacterSheets", "createTable", "removeHeroActions", "getHeroActions", "useHeroAction", "getHeroActionDetails", "drawHeroAction", "drawHeroActions", "sendActionToChat", "discardHeroActions", "tradeHeroAction", "getDeckTable", "giveHeroActions", "createChatMessage", "__name", "socketOn", "onSocket", "socketOff", "packet", "onTradeRejected", "isActiveGM", "onTradeAccepted", "onTradeRequest", "onTradeError", "sheet", "html", "actor", "isPlayedActor", "addActionsToSheet", "addSheetEvents", "actions", "diff", "isOwner", "localize", "subLocalize", "template", "templatePath", "getSetting", "key", "hash", "list", "event", "onClickHeroActionsDraw", "onClickHeroActionExpand", "onClickHeroActionUse", "onClickHeroActionDisplay", "onClickHeroActionDiscard", "onClickHeroActionsDiscard", "uuids", "x", "action", "toDiscard", "$discarded", "uuid", "setHeroActions", "summary", "details", "text", "document", "parent", "page", "warn", "nb", "drawn", "i", "label", "secret", "content", "size", "chatActions", "data", "links", "name", "chatUUID", "Trade", "table", "r", "draw", "documentUuidFromTableResult", "getLabelfromTableResult", "points", "index", "error", "removed", "result", "getTableFromUuid", "getDefaultCompendiumTable", "getDefaultWorldTable", "getCustomTable", "sendTradeRequest", "trade", "acceptRequest", "socketEmit", "sender", "receiver", "senderActor", "receiverActor", "sendTradeError", "senderActions", "receiverActions", "senderActionIndex", "receiverActionIndex", "senderAction", "receiverAction", "sentLink", "receivedLink", "users", "err", "rejectRequest", "buttons", "type", "unique", "createDefaultTable", "createCustomTable", "createCustomActionsTable", "setTable", "source", "getTableSource", "update", "createDefautActionsTable", "normalize", "setSetting", "removeActionsToggleAll", "removeActionsToggleActor", "actors", "state", "checked", "all", "templateLocalize", "isUnique", "actionsList", "el", "selected", "asDrawn", "withMessage", "tableUpdates", "localize", "subLocalize", "EditLores", "templatePath", "options", "actor", "getFlag", "event", "unspecified", "specific", "setFlag", "html", "#onCancel", "__name", "setHook", "createHook", "renderNPCSheetPF2e", "registerKnowledges", "value", "isGM", "getSetting", "__name", "sheet", "$html", "actor", "isPlayedActor", "replaceLores", "addEditButton", "addEvents", "knowledgeSelector", "html", "section", "selector", "editLores", "EditLores", "unspecifics", "getFlag", "specifics", "lores", "body", "tag", "skills", "dc", "adjustment", "addTags", "start", "tags", "lore", "attempts", "edit", "localize", "subLocalize", "MultiCast", "#message", "#event", "event", "message", "options", "templatePath", "html", "#onCast", "#onCancel", "nb", "spell", "actor", "updateSource", "__name", "damages", "heightening", "id", "damage", "i", "newId", "level", "data", "embeddedSource", "newSpell", "overlayIds", "castLevel", "spellSource", "bindOnPreCreateSpellDamageChatMessage", "getDamageRollClass", "Roll", "__name", "setHook", "createHook", "renderChatMessage", "updateMessages", "registerMerge", "value", "isGm", "__name", "chat", "message", "latestChatMessages", "html", "getSetting", "isDamageRoll", "renderDamage", "renderSpell", "spellBtn", "localize", "event", "MultiCast", "buttons", "getFlag", "tooltip", "actorUUID", "getActorUUID", "targetUUIDs", "getTargetUUIDs", "otherMessage", "otherTargetsUUIDS", "compareArrays", "t", "mergeDamages", "warn", "splitDamages", "sources", "data", "removeChatMessages", "getChatMessageClass", "origin", "other", "dataGroups", "getMessageData", "name", "notes", "outcome", "modifiers", "tags", "result", "groups", "group", "flavor", "templatePath", "originRolls", "getMessageRolls", "otherRolls", "groupedRolls", "roll", "options", "total", "terms", "term", "formula", "critRule", "DamageRoll", "getDamageRollClass", "index", "acc", "curr", "createTermGroup", "setHidden", "operand", "MODULE_ID", "entry", "flags", "source", "title", "text", "option", "ids", "joinedIds", "id", "targetTargets", "mergeTargets", "setHook", "createChoicesHook", "renderChatMessage", "updateMessages", "registerHideModifiers", "value", "isGM", "getSetting", "__name", "chat", "message", "latestChatMessages", "html", "speaker", "actor", "header", "ACTOR_PREPARE_EMBEDDED_DOCUMENTS", "TREASURE_PREPARE_BASE_DATA", "registerNobulk", "getSetting", "registerWrapper", "actorPrepareEmbeddedDocuments", "treasurePrepareBaseData", "__name", "wrapped", "args", "actor", "InventoryBulk", "_value", "item", "ACTOR_PREPARE_DATA", "DOCUMENT_SHEET_RENDER_INNER", "registerShare", "getSetting", "registerWrapper", "prepareData", "documentSheetRenderInner", "preUpdateActor", "deleteActor", "updateActor", "__name", "wrapped", "args", "inner", "isInstanceOf", "actor", "isPlayedActor", "getSlaves", "masters", "a", "isValidMaster", "group", "templatePath", "getFlag", "MODULE_ID", "subLocalize", "removeSlaveFromMaster", "slaves", "slave", "unsetMaster", "unsetFlag", "updates", "shareFlag", "master", "hpSource", "getMaster", "hpUpdate", "options", "userId", "isOriginalUser", "getShareFlag", "setMaster", "addSlaveToMaster", "data", "refreshActor", "setFlag", "masterId", "hp", "masterHp", "transfertHpData", "from", "to", "doc", "getModuleProperty", "setModuleProperty", "deleteModuleProperty", "path", "value", "getSourceId", "doc", "__name", "includesSourceId", "list", "sourceId", "getItemSourceIdCondition", "item", "getItems", "actor", "itemTypes", "type", "hasItemWithSourceId", "getItemWithSourceId", "setSheetHook", "createHook", "renderCharacterSheetPF2e", "setDeleteCombatHook", "deleteCombat", "setDeleteCombatantHook", "deleteCombatant", "setCreateCombatantHook", "createCombatant", "STANCE_SAVANT", "REPLACERS", "EXTRAS", "registerStances", "setup", "getStances", "toggleStance", "isValidStance", "isGm", "getSetting", "__name", "value", "stance", "actor", "stances", "replaced", "replace", "sourceId", "effectUUID", "effect", "img", "name", "itemName", "action", "actorStances", "foundAction", "getItemWithSourceId", "uuid", "sheet", "html", "isPlayedActor", "inCombat", "token", "tab", "options", "template", "templatePath", "subLocalize", "event", "onToggleStance", "target", "canUseStances", "feat", "replacer", "extra", "getStancesEffects", "effects", "already", "create", "other", "more", "x", "addStance", "obj", "combat", "combatant", "getActorFromCombatant", "isActiveOwner", "refreshCharacterSheets", "checkForSavant", "effectID", "hasItemWithSourceId", "info", "openStancesMenu", "localize", "setHook", "createChoicesHook", "renderCharacterSheetPF2e", "refreshCharacterSheets", "registerSpellsSummary", "value", "isGm", "getSetting", "__name", "sheet", "html", "actor", "isPlayedActor", "tab", "getSpellcastingTab", "getInMemory", "getSpellcastingNav", "event", "onSpellcastingBtnToggle", "addSummaryTab", "data", "getData", "template", "templatePath", "addSummaryEvents", "summary", "getSpellcastingSummarySection", "inputs", "onUsesInputChange", "onUsesInputFocus", "onUsesInputBlur", "onCastSpell", "onTogglePrepare", "onToggleFocusPool", "onSlotsReset", "onItemToChat", "onToggleSummary", "inputPath", "entryId", "slotLevel", "slotId", "expended", "change", "points", "onChargeReset", "getSpellcastingOriginalSection", "itemId", "level", "isCharge", "item", "slot", "max", "target", "collection", "spell", "setInMemory", "focusPool", "stavesActive", "spells", "focuses", "hasFocusCantrips", "entry", "entryDc", "entryName", "isFocus", "isStaff", "charges", "slotSpells", "isCantrip", "actives", "isBroken", "virtual", "uses", "castLevel", "MODULE_ID", "sort", "a", "b", "localeCompare", "rituals", "rank", "ordinalString", "applyStackingRules", "modifiers", "total", "highestBonus", "lowestPenalty", "abilityModifiers", "m", "bestAbility", "best", "modifier", "applyStacking", "__name", "isBetter", "existing", "htmlQuery", "parent", "selectors", "__name", "ErrorPF2e", "message", "__name", "extractEphemeralEffects", "affects", "origin", "target", "item", "domains", "options", "effectsFrom", "effectsTo", "fullOptions", "resolvables", "s", "d", "e", "__name", "extractNotes", "rollNotes", "selectors", "n", "extractDamageDice", "deferredDice", "extractModifiers", "synthetics", "modifierAdjustments", "syntheticModifiers", "modifiers", "modifier", "extractModifierAdjustments", "adjustmentsRecord", "slug", "a", "applyDamageFromMessage", "token", "message", "multiplier", "addend", "promptModifier", "rollIndex", "shiftAdjustDamage", "shieldBlockRequest", "roll", "isInstanceOf", "ErrorPF2e", "damage", "messageRollOptions", "originRollOptions", "o", "messageItem", "domain", "ephemeralEffects", "extractEphemeralEffects", "contextClone", "applicationRollOptions", "outcome", "breakdown", "rolls", "critical", "resolvables", "damageDice", "extractDamageDice", "d", "dice", "formula", "previous", "current", "modifiers", "extractModifiers", "m", "applyStackingRules", "hasDamage", "notes", "extractNotes", "n", "note", "toggleOffShieldBlock", "onDamageApplied", "__name", "onClickShieldBlock", "target", "shieldButton", "messageEl", "getTokens", "getNonBrokenShields", "tokens", "s", "nonBrokenShields", "hasMultipleShields", "shieldActivated", "instance", "_helper", "$content", "multipleShields", "content", "listEl", "htmlQuery", "shieldList", "shield", "input", "shieldName", "hardness", "hardnessLabel", "itemLi", "messageId", "app", "selector", "AdjustmentDialog", "$html", "isHealing", "$dialog", "adjustment", "DEGREE_ADJUSTMENT_AMOUNTS", "DEGREE_OF_SUCCESS_STRINGS", "_getDegreeAdjustment", "getDegreeAdjustment_fn", "_adjustDegreeOfSuccess", "adjustDegreeOfSuccess_fn", "_adjustDegreeByDieValue", "adjustDegreeByDieValue_fn", "_calculateDegreeOfSuccess", "calculateDegreeOfSuccess_fn", "_DegreeOfSuccess", "roll", "dc", "dosAdjustments", "__privateAdd", "t", "d", "__privateMethod", "DegreeOfSuccess", "__name", "degree", "adjustments", "outcome", "label", "amount", "degreeOfSuccess", "__publicField", "getTemplateTokens", "template", "collisionOrigin", "collisionType", "grid", "dimensions", "gridHighlight", "origin", "tokens", "gridSize", "containedTokens", "token", "tokenDoc", "tokenPositions", "h", "tokenX", "y", "w", "position", "gx", "gy", "s", "destination", "__name", "SAVES", "REROLL", "DEGREE_OF_SUCCESS", "setPrecreateMessageHook", "createHook", "preCreateChatMessage", "setRenderMessageHook", "createChoicesHook", "renderChatMessage", "setCreateTemplateHook", "createMeasuredTemplate", "SOCKET", "registerTargetTokenHelper", "setHooks", "value", "getSetting", "__name", "isUserGM", "socketOn", "onSocket", "socketOff", "packet", "isActiveGM", "updateMessageSave", "updateMessageApplied", "template", "_", "userId", "user", "localize", "subLocalize", "item", "actor", "self", "data", "templatePath", "html", "result", "alliance", "opposition", "targetsIds", "getTemplateTokens", "token", "targetAlliance", "HEALINGS_REGEX", "isValidDamageMessage", "message", "healings", "isDamageRoll", "getFlag", "targets", "updateSourceFlag", "target", "splashRollIndex", "roll", "regularRollIndex", "modifier", "save", "dc", "clientEnabled", "renderDamageChatMessage", "refreshMessage", "renderSpellChatMessage", "bindOnPreCreateSpellDamageChatMessage", "chat", "el", "app", "spell", "getMessageData", "msgContent", "cardBtns", "saveBtn", "wrapper", "targetsTooltip", "targetsBtn", "event", "addTargets", "rowsTemplate", "addHeaderListeners", "setFlag", "damageRows", "clonedRows", "buttons", "toggleDamageRow", "expanded", "getInMemory", "toggleBtn", "toggleTooltip", "setInMemory", "action", "uuid", "applied", "isBasicSave", "clones", "index", "onTargetButton", "pingTarget", "openTargetSheet", "rollSave", "rerollSave", "targetsFlag", "showDC", "flag", "saveLabel", "saveDC", "targetId", "hasSave", "targetSave", "rerolled", "canReroll", "successLabel", "offset", "templateSave", "getTargetFromEvent", "targetUuid", "heroPoints", "type", "icon", "reroll", "label", "isHeroReroll", "keep", "max", "warn", "oldRoll", "unevaluatedNewRoll", "newRoll", "keptRoll", "success", "DegreeOfSuccess", "socketEmit", "statistic", "messageId", "otherMessage", "skipDefault", "__", "msg", "btn", "rollIndex", "onClickShieldBlock", "applyDamageFromMessage", "onDamageApplied", "tokenId", "updates", "moduleFlagUpdate", "CREATE_HOOK", "UPDATE_HOOK", "registerUnided", "setHooks", "__name", "value", "getSetting", "preCreateItem", "preUpdateItem", "item", "changes", "localize", "subLocalize", "permaConditionEffect", "actor", "callback", "__name", "html", "type", "condition", "name", "slug", "img", "buttons", "conditions", "withBadge", "content", "templatePath", "a", "b", "setInputs", "hasBadge", "badge", "result", "rule", "source", "FEATURES", "registerArp", "registerNobulk", "registerGiveth", "registerKnowledges", "registerUnided", "registerMerge", "registerEffectsPanelHelper", "registerSpellsSummary", "registerStances", "registerHeroActions", "registerHideModifiers", "registerShare", "registerTargetTokenHelper", "CONFLICTS", "SETTINGS_MIGRATION_VERSION", "firstClientSetting", "isGM", "isUserGM", "MODULE_ID", "settings", "setting", "key", "choices", "choice", "settingPath", "worldSettings", "clientSettings", "scope", "renderSettingsConfig", "module", "permaConditionEffect", "feature", "init", "conflicts", "api", "name", "id", "conflictingModule", "conflicting", "ready", "conflict", "warn", "settingsMinMigrationVersion", "getSetting", "migrate", "originalValue", "migratedValue", "version", "migration", "setSetting", "__name", "_", "html", "localize"] } diff --git a/styles/_target.scss b/styles/_target.scss index 65c3b02..933a435 100644 --- a/styles/_target.scss +++ b/styles/_target.scss @@ -145,6 +145,8 @@ } .degree { + font-size: 1.1em; + &.criticalSuccess { color: var(--criticalSuccess); } diff --git a/styles/toolbelt.css b/styles/toolbelt.css index 2d58a35..ec3d556 100644 --- a/styles/toolbelt.css +++ b/styles/toolbelt.css @@ -1 +1 @@ -.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action{grid:"icon-name controls" auto "summary summary" auto}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action .item-name h4{white-space:nowrap}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action .item-image{height:20px;width:20px;background-position:center}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action .item-controls>button{text-rendering:optimizeLegibility;border:none;border-radius:2px;box-shadow:inset 0 0 0 2px #bfbebe;color:var(--text-dark);flex:0;font-family:var(--sans-serif);font-size:var(--font-size-10);font-weight:500;letter-spacing:.05em;line-height:14px;margin:0;padding:3px 8px;text-transform:uppercase;white-space:nowrap;background:var(--bg-dark)}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action .item-controls>button:hover{text-shadow:0 0 1px var(--text-dark)}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action:not(.expanded) .item-summary{display:none}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action.discarded{background-color:rgba(0,0,0,.1294117647)}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action.discarded .item-name h4{text-decoration:line-through}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .error{margin:auto;color:#990404;font-weight:900;padding-block:8px}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list:not(.discardable) [data-action=discard-selected]{display:none}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list.discardable .error{display:none}[id^=pf2e-hero-actions-trade-]{--action-height: 24px}[id^=pf2e-hero-actions-trade-] .header{display:flex;justify-content:center;align-items:center;gap:.5em}[id^=pf2e-hero-actions-trade-] .actions{--padding: 6px;display:grid;grid-template-columns:1fr 40px 1fr;flex-basis:93px;gap:6px;border-top:1px solid var(--color-border-light-primary);border-bottom:1px solid var(--color-border-light-highlight);padding-block:var(--padding);margin-block:.5em}[id^=pf2e-hero-actions-trade-] .action{display:flex;align-items:baseline;padding-block:4px}[id^=pf2e-hero-actions-trade-] .action label{cursor:pointer}[id^=pf2e-hero-actions-trade-] .action input{margin-inline:.3em}[id^=pf2e-hero-actions-trade-] .right .action{justify-content:end}[id^=pf2e-hero-actions-trade-] .exchange{display:flex;align-items:center;justify-content:center;font-size:2em;border-left:1px solid var(--color-border-light-primary);border-right:1px solid var(--color-border-light-highlight)}[id^=pf2e-hero-actions-trade-] .buttons{display:flex;justify-content:center;gap:1em}[id^=pf2e-hero-actions-trade-] button{flex:0 0 180px}[id^=pf2e-hero-actions-trade-] hr{width:100%;flex:0}#pf2e-hero-actions-create-table .window-content .dialog-buttons{margin-top:.8em}#pf2e-hero-actions-remove-actions .window-content .actor{margin-left:1em}#pf2e-hero-actions-remove-actions .window-content .dialog-buttons{margin-top:.8em}#pf2e-hero-actions-remove-actions .window-content label{display:flex;align-items:center}#pf2e-hero-actions-give-action{--padding: 8px;max-height:98%}#pf2e-hero-actions-give-action .window-content{padding:0}#pf2e-hero-actions-give-action .window-content .dialog-content{display:flex;flex-direction:column;overflow:hidden}#pf2e-hero-actions-give-action .window-content .dialog-buttons{flex:0;padding:var(--padding);padding-top:0}#pf2e-hero-actions-give-action .window-content .actions{overflow-y:auto;padding-inline:var(--padding);margin-block:var(--padding)}#pf2e-hero-actions-give-action .window-content .action{padding-block:3px;display:grid;grid-template-areas:"item-select item-name item-drawn" "item-summary item-summary item-summary";grid-template-rows:auto auto;grid-template-columns:auto 1fr auto}#pf2e-hero-actions-give-action .window-content .action .item-select{margin-right:.5em;grid-area:item-select;align-self:baseline}#pf2e-hero-actions-give-action .window-content .action .item-name{cursor:pointer;grid-area:item-name}#pf2e-hero-actions-give-action .window-content .action .item-name:hover{color:var(--color-text-dark-improved)}#pf2e-hero-actions-give-action .window-content .action .item-drawn{grid-area:item-drawn}#pf2e-hero-actions-give-action .window-content .action .item-drawn .greyed{color:var(--color-text-light-primary)}#pf2e-hero-actions-give-action .window-content .action .item-name,#pf2e-hero-actions-give-action .window-content .action .item-drawn{display:flex;align-items:center}#pf2e-hero-actions-give-action .window-content .action .item-summary{grid-area:item-summary;box-shadow:inset 0 0 4px 0px #000;padding:1px 6px;margin-bottom:.5em}#pf2e-hero-actions-give-action .window-content .action:not(.expanded) .item-summary{display:none}#pf2e-hero-actions-give-action .window-content hr{width:100%;margin:0}#pf2e-hero-actions-give-action .window-content .buttons{padding-inline:var(--padding)}#pf2e-hero-actions-give-action .window-content .buttons>div{display:flex;align-items:center;flex-direction:row-reverse}#pf2e-hero-actions-give-action .window-content .buttons>div span{font-weight:bold}[id^=npc-edit-lores-]{width:400px}[id^=npc-edit-lores-] .hint{font-size:.9em;text-align:center;width:80%;margin:auto}[id^=npc-edit-lores-] .lores{display:grid;grid-template-columns:auto 1fr;gap:.5em;align-items:center}[id^=npc-edit-lores-] .lores label{text-align:end}[id^=npc-edit-lores-] .buttons{display:flex;margin-top:.6em}.multi-cast-dialog .hint{display:grid;align-items:center;-moz-column-gap:.5em;column-gap:.5em;grid-template-columns:30px auto;padding-inline:.5em .7em;font-size:1.05em;white-space:nowrap}.multi-cast-dialog .hint input{text-align:center}.multi-cast-dialog .buttons{display:flex;margin-top:.6em}.chat-message .pf2e-toolbelt-merged-group{padding-inline:3px;margin-bottom:4px;box-shadow:0 0 4px 0px #000;border-radius:2px}.chat-message .pf2e-toolbelt-merged-group .notes{min-height:2px}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-merge{position:absolute;right:0px;top:1px;display:flex;gap:1px}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-merge button{width:22px;height:22px;font-size:10px;line-height:1px}.chat-message .message-content .dice-result .dice-total .pf2e-td.hide-button+.pf2e-toolbelt-merge,.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-merge:has(+.pf2e-td.hide-button){right:22px}#pf2e-toolbelt-macros-condition .window-content .dialog-content{display:grid;grid-template-columns:auto 1fr;-moz-column-gap:1em;column-gap:1em;row-gap:2px;align-items:center;margin-bottom:.5em;padding-left:.2em}#pf2e-toolbelt-macros-condition .window-content .dialog-content select{margin-right:2px}#pf2e-toolbelt-macros-condition .window-content .dialog-content input[type=number]{width:4ch;text-align:end;justify-self:end;margin-right:2px}#pf2e-toolbelt-macros-condition .window-content .dialog-content input[type=number]:disabled{border:1px solid #a3a3a3;color:#8f8d8d;cursor:not-allowed}#pf2e-toolbelt-macros-condition .window-content .dialog-content div{display:flex;align-items:center}#pf2e-toolbelt-macros-condition .window-content .dialog-content div span{flex:1;text-align:end}#pf2e-toolbelt-macros-condition .window-content .dialog-content div input[type=checkbox]{margin-right:2px}.chat-message .message-header.pf2e-toolbelt-modifiers .action+.tags+hr+.tags{display:none}.chat-message .message-header.pf2e-toolbelt-modifiers.pf2e-toolbelt-modifiers-traits .action+.tags,.chat-message .message-header.pf2e-toolbelt-modifiers.pf2e-toolbelt-modifiers-traits .action+.tags+hr{display:none}.actor.sheet header.char-header .char-details [data-action=select-master]{padding-block:2px 0px;margin-top:4px}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances{display:flex;flex-wrap:wrap;gap:.5em 1em;justify-content:center}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances:first-child{margin-top:.5em}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance{display:flex;align-items:center;gap:.5em;box-shadow:0 0 4px #000;padding-right:.5em;cursor:pointer}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance .pf2e-stances__img{flex:0 0 32px;height:32px;width:32px;background-position:center;background-repeat:no-repeat;background-size:cover}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance .pf2e-stances__name{flex:1;white-space:nowrap}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance.active{box-shadow:inset 0 0 4px #000}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance.active .pf2e-stances__img{border:1px solid rgba(0,0,0,0)}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance.active .pf2e-stances__name{color:var(--primary)}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances:not(.can-use-stances) .pf2e-stances__stance{box-shadow:0 0 1px #000;cursor:not-allowed}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances:not(.can-use-stances) .pf2e-stances__stance>*{filter:grayscale(1) blur(1px)}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances:not(.can-use-stances) .pf2e-stances__stance .pf2e-stances__img{border:0}.app.window-app.dialog .window-content .dialog-content .pf2e-stances-menu{margin-bottom:.5em}.app.window-app.dialog .window-content .dialog-content .pf2e-stances-menu label{height:24px;display:block}.app.window-app.dialog .window-content .dialog-content .pf2e-stances-menu input{margin-right:.5em}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting].toggled>.directory-list:not(.summary){display:none}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]:not(.toggled)>.directory-list.summary{display:none}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .spellbook-header .item-controls{padding:0}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .virtual{position:relative}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .virtual:before{background-color:rgba(0,5,255,.114);content:"";height:100%;mix-blend-mode:saturation;pointer-events:none;position:absolute;width:100%}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .focus-pips{cursor:pointer;margin-left:.3em;margin-top:1px}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item{display:grid;grid:"name type cast-spell range" auto "content content content content" auto/10fr 6fr 2fr 4fr}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .item-name{grid-area:name}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .spell-type{grid-area:type}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .cast-spell{grid-area:cast-spell}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .spell-range{grid-area:range;text-align:end}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .item-summary{grid-area:content}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .item-controls{padding-right:0;white-space:nowrap}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .uses-label .broken{margin-left:.3em}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item.ritual:not(.spell-level-header) .spell-range{padding-right:1em}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item:not(.no-hover):not(:hover):not(.hover) .spell-type .uses,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item.amped:not(:hover):not(.hover) .spell-type .uses{display:none}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item:not(.no-hover):hover .spell-type .uses-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item:not(.no-hover):hover .spell-type .focus-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item:not(.no-hover).hover .spell-type .uses-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item:not(.no-hover).hover .spell-type .focus-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item.amped:hover .spell-type .uses-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item.amped:hover .spell-type .focus-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item.amped.hover .spell-type .uses-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item.amped.hover .spell-type .focus-label{display:none}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .expended .item-name,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .expended .uses-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .expended .spell-range{color:var(--color-disabled);text-decoration:line-through}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .cast-spell:disabled{background:var(--color-disabled);box-shadow:inset 0 0 0 1px rgba(255,255,255,.5);cursor:not-allowed}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .spell-type .item-toggle-prepare{margin-left:.25em;color:var(--body)}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content{display:flex;justify-content:space-between;margin-right:5px}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content .left,#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content .right{display:flex;flex-direction:column;justify-content:center}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content label{display:flex;align-items:center;white-space:nowrap}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content label input{flex:0 0 20px;width:20px;margin-inline:5px}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content label input[type=radio]{inset:0}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content label input[type=checkbox]{height:1.2em}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-buttons{margin-top:.5em}.chat-message .message-content>.damage-application.hidden{display:none}.chat-message .message-content .card-buttons .pf2e-toolbelt-target-wrapper{display:flex}.chat-message .message-content .card-buttons .pf2e-toolbelt-target-wrapper .pf2e-toolbelt-target-targets{display:flex;align-items:center;justify-content:center;flex:0}.chat-message .message-content .card-buttons .pf2e-toolbelt-target-wrapper .pf2e-toolbelt-target-targets i{margin:0}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons{position:absolute;left:0px;top:1px;display:flex}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .targets,.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .toggle{width:22px;height:22px;line-height:1px;display:flex;align-items:center;justify-content:center}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .targets i,.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .toggle i{margin:0}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .toggle{font-size:.8em}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .toggle.collapse .expand{display:none}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .toggle:not(.collapse) .collapse{display:none}.chat-message .message-content+.pf2e-toolbelt-target-damage,.chat-message .message-content+.pf2e-toolbelt-target-spell{--criticalSuccess: rgb(0, 128, 0);--success: rgb(0, 0, 255);--failure: rgb(255 106 0);--criticalFailure: rgb(255, 0, 0)}.chat-message .message-content+.pf2e-toolbelt-target-damage hr,.chat-message .message-content+.pf2e-toolbelt-target-spell hr{width:100%}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header{display:flex;align-items:center;justify-content:space-between;padding-inline:.3em .5em;font-size:.9em;gap:.5em}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .name,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .name{font-weight:bold;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls{display:flex;gap:.5em}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls hr,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls hr{width:0;border:none;border-left:1px solid var(--color-border-light-primary);border-right:1px solid var(--color-border-light-highlight);margin:2px 0}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls .degree.criticalSuccess,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls .degree.criticalSuccess{color:var(--criticalSuccess)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls .degree.success,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls .degree.success{color:var(--success)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls .degree.failure,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls .degree.failure{color:var(--failure)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls .degree.criticalFailure,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls .degree.criticalFailure{text-shadow:0 0 #000;color:var(--criticalFailure)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls i.die,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls i.die{font-size:.95em}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls i.rotate,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls i.rotate{font-size:.9em;margin-left:1px}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls i.small,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls i.small{font-size:.9em;opacity:.8}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application{display:flex;justify-content:center;margin-top:3px}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button{position:relative;align-items:center;display:flex;flex-direction:column;font-size:var(--font-size-18);height:2em;justify-content:space-around;line-height:unset;padding:0}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button img{border:none;height:var(--font-size-18)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button span{font-size:.5em;font-weight:500;text-transform:uppercase}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button.half-damage i{-moz-background-clip:text;-moz-text-fill-color:rgba(0,0,0,0);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text;background-image:linear-gradient(to right, var(--text-dark) 50%, var(--color-text-light-6) 50%)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button.small{padding-block:.3em calc(.3em - 1px);height:1em}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button.small img,.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button.small i{display:none}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button::after{position:absolute;content:"";inset:0;border-radius:2px}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application.success [data-action=target-half-damage]::after{box-shadow:inset 0 0 6px var(--success)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application.failure [data-action=target-apply-damage]::after{box-shadow:inset 0 0 6px var(--failure)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application.criticalFailure [data-action=target-double-damage]::after{box-shadow:inset 0 0 6px var(--criticalFailure)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application.applied button{filter:blur(1px)}.chat-message .message-content:has(>.damage-application.hidden)+.pf2e-toolbelt-target-damage hr:first-child{display:none}.chat-message .message-content:has(>.damage-application.hidden)+.pf2e-toolbelt-target-damage hr:first-child+.target-header{margin-top:.5em}[id^=pf2e-toolbelt-target-save-reroll-dialog-] .dialog-content{display:flex;flex-direction:column;gap:.5em}[id^=pf2e-toolbelt-target-save-reroll-dialog-] .dialog-content label input{margin-right:.3em}[id^=pf2e-toolbelt-target-save-reroll-dialog-] .dialog-content label i{width:20px;text-align:center}[id^=pf2e-toolbelt-target-save-reroll-dialog-] .dialog-buttons{margin-top:.5em}[role=tooltip] .pf2e-toolbelt-target-save{font-size:.9em;display:flex;flex-direction:column;align-items:start;gap:.2em}[role=tooltip] .pf2e-toolbelt-target-save .result i{font-size:.8em}[role=tooltip] .pf2e-toolbelt-target-save .note{font-style:italic;font-size:.8em;align-self:flex-end}[role=tooltip] .pf2e-toolbelt-target-save .note i{font-size:.95em}[role=tooltip] .pf2e-toolbelt-target-save .note i:not(.rotate){opacity:.8}[role=tooltip] i.pf2e-toolbelt-die{font-size:.9em}/*# sourceMappingURL=toolbelt.css.map */ \ No newline at end of file +.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action{grid:"icon-name controls" auto "summary summary" auto}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action .item-name h4{white-space:nowrap}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action .item-image{height:20px;width:20px;background-position:center}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action .item-controls>button{text-rendering:optimizeLegibility;border:none;border-radius:2px;box-shadow:inset 0 0 0 2px #bfbebe;color:var(--text-dark);flex:0;font-family:var(--sans-serif);font-size:var(--font-size-10);font-weight:500;letter-spacing:.05em;line-height:14px;margin:0;padding:3px 8px;text-transform:uppercase;white-space:nowrap;background:var(--bg-dark)}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action .item-controls>button:hover{text-shadow:0 0 1px var(--text-dark)}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action:not(.expanded) .item-summary{display:none}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action.discarded{background-color:rgba(0,0,0,.1294117647)}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .action.discarded .item-name h4{text-decoration:line-through}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list .error{margin:auto;color:#990404;font-weight:900;padding-block:8px}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list:not(.discardable) [data-action=discard-selected]{display:none}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] ol.actions-list.heroActions-list.discardable .error{display:none}[id^=pf2e-hero-actions-trade-]{--action-height: 24px}[id^=pf2e-hero-actions-trade-] .header{display:flex;justify-content:center;align-items:center;gap:.5em}[id^=pf2e-hero-actions-trade-] .actions{--padding: 6px;display:grid;grid-template-columns:1fr 40px 1fr;flex-basis:93px;gap:6px;border-top:1px solid var(--color-border-light-primary);border-bottom:1px solid var(--color-border-light-highlight);padding-block:var(--padding);margin-block:.5em}[id^=pf2e-hero-actions-trade-] .action{display:flex;align-items:baseline;padding-block:4px}[id^=pf2e-hero-actions-trade-] .action label{cursor:pointer}[id^=pf2e-hero-actions-trade-] .action input{margin-inline:.3em}[id^=pf2e-hero-actions-trade-] .right .action{justify-content:end}[id^=pf2e-hero-actions-trade-] .exchange{display:flex;align-items:center;justify-content:center;font-size:2em;border-left:1px solid var(--color-border-light-primary);border-right:1px solid var(--color-border-light-highlight)}[id^=pf2e-hero-actions-trade-] .buttons{display:flex;justify-content:center;gap:1em}[id^=pf2e-hero-actions-trade-] button{flex:0 0 180px}[id^=pf2e-hero-actions-trade-] hr{width:100%;flex:0}#pf2e-hero-actions-create-table .window-content .dialog-buttons{margin-top:.8em}#pf2e-hero-actions-remove-actions .window-content .actor{margin-left:1em}#pf2e-hero-actions-remove-actions .window-content .dialog-buttons{margin-top:.8em}#pf2e-hero-actions-remove-actions .window-content label{display:flex;align-items:center}#pf2e-hero-actions-give-action{--padding: 8px;max-height:98%}#pf2e-hero-actions-give-action .window-content{padding:0}#pf2e-hero-actions-give-action .window-content .dialog-content{display:flex;flex-direction:column;overflow:hidden}#pf2e-hero-actions-give-action .window-content .dialog-buttons{flex:0;padding:var(--padding);padding-top:0}#pf2e-hero-actions-give-action .window-content .actions{overflow-y:auto;padding-inline:var(--padding);margin-block:var(--padding)}#pf2e-hero-actions-give-action .window-content .action{padding-block:3px;display:grid;grid-template-areas:"item-select item-name item-drawn" "item-summary item-summary item-summary";grid-template-rows:auto auto;grid-template-columns:auto 1fr auto}#pf2e-hero-actions-give-action .window-content .action .item-select{margin-right:.5em;grid-area:item-select;align-self:baseline}#pf2e-hero-actions-give-action .window-content .action .item-name{cursor:pointer;grid-area:item-name}#pf2e-hero-actions-give-action .window-content .action .item-name:hover{color:var(--color-text-dark-improved)}#pf2e-hero-actions-give-action .window-content .action .item-drawn{grid-area:item-drawn}#pf2e-hero-actions-give-action .window-content .action .item-drawn .greyed{color:var(--color-text-light-primary)}#pf2e-hero-actions-give-action .window-content .action .item-name,#pf2e-hero-actions-give-action .window-content .action .item-drawn{display:flex;align-items:center}#pf2e-hero-actions-give-action .window-content .action .item-summary{grid-area:item-summary;box-shadow:inset 0 0 4px 0px #000;padding:1px 6px;margin-bottom:.5em}#pf2e-hero-actions-give-action .window-content .action:not(.expanded) .item-summary{display:none}#pf2e-hero-actions-give-action .window-content hr{width:100%;margin:0}#pf2e-hero-actions-give-action .window-content .buttons{padding-inline:var(--padding)}#pf2e-hero-actions-give-action .window-content .buttons>div{display:flex;align-items:center;flex-direction:row-reverse}#pf2e-hero-actions-give-action .window-content .buttons>div span{font-weight:bold}[id^=npc-edit-lores-]{width:400px}[id^=npc-edit-lores-] .hint{font-size:.9em;text-align:center;width:80%;margin:auto}[id^=npc-edit-lores-] .lores{display:grid;grid-template-columns:auto 1fr;gap:.5em;align-items:center}[id^=npc-edit-lores-] .lores label{text-align:end}[id^=npc-edit-lores-] .buttons{display:flex;margin-top:.6em}.multi-cast-dialog .hint{display:grid;align-items:center;-moz-column-gap:.5em;column-gap:.5em;grid-template-columns:30px auto;padding-inline:.5em .7em;font-size:1.05em;white-space:nowrap}.multi-cast-dialog .hint input{text-align:center}.multi-cast-dialog .buttons{display:flex;margin-top:.6em}.chat-message .pf2e-toolbelt-merged-group{padding-inline:3px;margin-bottom:4px;box-shadow:0 0 4px 0px #000;border-radius:2px}.chat-message .pf2e-toolbelt-merged-group .notes{min-height:2px}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-merge{position:absolute;right:0px;top:1px;display:flex;gap:1px}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-merge button{width:22px;height:22px;font-size:10px;line-height:1px}.chat-message .message-content .dice-result .dice-total .pf2e-td.hide-button+.pf2e-toolbelt-merge,.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-merge:has(+.pf2e-td.hide-button){right:22px}#pf2e-toolbelt-macros-condition .window-content .dialog-content{display:grid;grid-template-columns:auto 1fr;-moz-column-gap:1em;column-gap:1em;row-gap:2px;align-items:center;margin-bottom:.5em;padding-left:.2em}#pf2e-toolbelt-macros-condition .window-content .dialog-content select{margin-right:2px}#pf2e-toolbelt-macros-condition .window-content .dialog-content input[type=number]{width:4ch;text-align:end;justify-self:end;margin-right:2px}#pf2e-toolbelt-macros-condition .window-content .dialog-content input[type=number]:disabled{border:1px solid #a3a3a3;color:#8f8d8d;cursor:not-allowed}#pf2e-toolbelt-macros-condition .window-content .dialog-content div{display:flex;align-items:center}#pf2e-toolbelt-macros-condition .window-content .dialog-content div span{flex:1;text-align:end}#pf2e-toolbelt-macros-condition .window-content .dialog-content div input[type=checkbox]{margin-right:2px}.chat-message .message-header.pf2e-toolbelt-modifiers .action+.tags+hr+.tags{display:none}.chat-message .message-header.pf2e-toolbelt-modifiers.pf2e-toolbelt-modifiers-traits .action+.tags,.chat-message .message-header.pf2e-toolbelt-modifiers.pf2e-toolbelt-modifiers-traits .action+.tags+hr{display:none}.actor.sheet header.char-header .char-details [data-action=select-master]{padding-block:2px 0px;margin-top:4px}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances{display:flex;flex-wrap:wrap;gap:.5em 1em;justify-content:center}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances:first-child{margin-top:.5em}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance{display:flex;align-items:center;gap:.5em;box-shadow:0 0 4px #000;padding-right:.5em;cursor:pointer}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance .pf2e-stances__img{flex:0 0 32px;height:32px;width:32px;background-position:center;background-repeat:no-repeat;background-size:cover}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance .pf2e-stances__name{flex:1;white-space:nowrap}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance.active{box-shadow:inset 0 0 4px #000}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance.active .pf2e-stances__img{border:1px solid rgba(0,0,0,0)}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances .pf2e-stances__stance.active .pf2e-stances__name{color:var(--primary)}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances:not(.can-use-stances) .pf2e-stances__stance{box-shadow:0 0 1px #000;cursor:not-allowed}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances:not(.can-use-stances) .pf2e-stances__stance>*{filter:grayscale(1) blur(1px)}.sheet.actor.character .sheet-body .sheet-content [data-tab=actions] .tab-content .actions-panels [data-tab=encounter] .pf2e-stances:not(.can-use-stances) .pf2e-stances__stance .pf2e-stances__img{border:0}.app.window-app.dialog .window-content .dialog-content .pf2e-stances-menu{margin-bottom:.5em}.app.window-app.dialog .window-content .dialog-content .pf2e-stances-menu label{height:24px;display:block}.app.window-app.dialog .window-content .dialog-content .pf2e-stances-menu input{margin-right:.5em}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting].toggled>.directory-list:not(.summary){display:none}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]:not(.toggled)>.directory-list.summary{display:none}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .spellbook-header .item-controls{padding:0}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .virtual{position:relative}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .virtual:before{background-color:rgba(0,5,255,.114);content:"";height:100%;mix-blend-mode:saturation;pointer-events:none;position:absolute;width:100%}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .focus-pips{cursor:pointer;margin-left:.3em;margin-top:1px}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item{display:grid;grid:"name type cast-spell range" auto "content content content content" auto/10fr 6fr 2fr 4fr}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .item-name{grid-area:name}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .spell-type{grid-area:type}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .cast-spell{grid-area:cast-spell}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .spell-range{grid-area:range;text-align:end}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .item-summary{grid-area:content}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .item-controls{padding-right:0;white-space:nowrap}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item .uses-label .broken{margin-left:.3em}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item.ritual:not(.spell-level-header) .spell-range{padding-right:1em}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item:not(.no-hover):not(:hover):not(.hover) .spell-type .uses,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item.amped:not(:hover):not(.hover) .spell-type .uses{display:none}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item:not(.no-hover):hover .spell-type .uses-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item:not(.no-hover):hover .spell-type .focus-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item:not(.no-hover).hover .spell-type .uses-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item:not(.no-hover).hover .spell-type .focus-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item.amped:hover .spell-type .uses-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item.amped:hover .spell-type .focus-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item.amped.hover .spell-type .uses-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .item.amped.hover .spell-type .focus-label{display:none}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .expended .item-name,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .expended .uses-label,.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .expended .spell-range{color:var(--color-disabled);text-decoration:line-through}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .cast-spell:disabled{background:var(--color-disabled);box-shadow:inset 0 0 0 1px rgba(255,255,255,.5);cursor:not-allowed}.app.sheet.actor.character .sheet-content>.tab[data-tab=spellcasting]>.directory-list.summary .spell-type .item-toggle-prepare{margin-left:.25em;color:var(--body)}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content{display:flex;justify-content:space-between;margin-right:5px}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content .left,#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content .right{display:flex;flex-direction:column;justify-content:center}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content label{display:flex;align-items:center;white-space:nowrap}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content label input{flex:0 0 20px;width:20px;margin-inline:5px}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content label input[type=radio]{inset:0}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-content label input[type=checkbox]{height:1.2em}#pf2e-toolbelt-target-template.app.dialog .window-content .dialog-buttons{margin-top:.5em}.chat-message .message-content>.damage-application.hidden{display:none}.chat-message .message-content .card-buttons .pf2e-toolbelt-target-wrapper{display:flex}.chat-message .message-content .card-buttons .pf2e-toolbelt-target-wrapper .pf2e-toolbelt-target-targets{display:flex;align-items:center;justify-content:center;flex:0}.chat-message .message-content .card-buttons .pf2e-toolbelt-target-wrapper .pf2e-toolbelt-target-targets i{margin:0}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons{position:absolute;left:0px;top:1px;display:flex}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .targets,.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .toggle{width:22px;height:22px;line-height:1px;display:flex;align-items:center;justify-content:center}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .targets i,.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .toggle i{margin:0}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .toggle{font-size:.8em}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .toggle.collapse .expand{display:none}.chat-message .message-content .dice-result .dice-total .pf2e-toolbelt-target-buttons .toggle:not(.collapse) .collapse{display:none}.chat-message .message-content+.pf2e-toolbelt-target-damage,.chat-message .message-content+.pf2e-toolbelt-target-spell{--criticalSuccess: rgb(0, 128, 0);--success: rgb(0, 0, 255);--failure: rgb(255 106 0);--criticalFailure: rgb(255, 0, 0)}.chat-message .message-content+.pf2e-toolbelt-target-damage hr,.chat-message .message-content+.pf2e-toolbelt-target-spell hr{width:100%}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header{display:flex;align-items:center;justify-content:space-between;padding-inline:.3em .5em;font-size:.9em;gap:.5em}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .name,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .name{font-weight:bold;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls{display:flex;gap:.5em}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls hr,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls hr{width:0;border:none;border-left:1px solid var(--color-border-light-primary);border-right:1px solid var(--color-border-light-highlight);margin:2px 0}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls .degree,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls .degree{font-size:1.1em}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls .degree.criticalSuccess,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls .degree.criticalSuccess{color:var(--criticalSuccess)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls .degree.success,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls .degree.success{color:var(--success)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls .degree.failure,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls .degree.failure{color:var(--failure)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls .degree.criticalFailure,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls .degree.criticalFailure{text-shadow:0 0 #000;color:var(--criticalFailure)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls i.die,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls i.die{font-size:.95em}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls i.rotate,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls i.rotate{font-size:.9em;margin-left:1px}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-header .controls i.small,.chat-message .message-content+.pf2e-toolbelt-target-spell .target-header .controls i.small{font-size:.9em;opacity:.8}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application{display:flex;justify-content:center;margin-top:3px}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button{position:relative;align-items:center;display:flex;flex-direction:column;font-size:var(--font-size-18);height:2em;justify-content:space-around;line-height:unset;padding:0}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button img{border:none;height:var(--font-size-18)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button span{font-size:.5em;font-weight:500;text-transform:uppercase}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button.half-damage i{-moz-background-clip:text;-moz-text-fill-color:rgba(0,0,0,0);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text;background-image:linear-gradient(to right, var(--text-dark) 50%, var(--color-text-light-6) 50%)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button.small{padding-block:.3em calc(.3em - 1px);height:1em}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button.small img,.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button.small i{display:none}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application button::after{position:absolute;content:"";inset:0;border-radius:2px}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application.success [data-action=target-half-damage]::after{box-shadow:inset 0 0 6px var(--success)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application.failure [data-action=target-apply-damage]::after{box-shadow:inset 0 0 6px var(--failure)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application.criticalFailure [data-action=target-double-damage]::after{box-shadow:inset 0 0 6px var(--criticalFailure)}.chat-message .message-content+.pf2e-toolbelt-target-damage .target-damage-application.applied button{filter:blur(1px)}.chat-message .message-content:has(>.damage-application.hidden)+.pf2e-toolbelt-target-damage hr:first-child{display:none}.chat-message .message-content:has(>.damage-application.hidden)+.pf2e-toolbelt-target-damage hr:first-child+.target-header{margin-top:.5em}[id^=pf2e-toolbelt-target-save-reroll-dialog-] .dialog-content{display:flex;flex-direction:column;gap:.5em}[id^=pf2e-toolbelt-target-save-reroll-dialog-] .dialog-content label input{margin-right:.3em}[id^=pf2e-toolbelt-target-save-reroll-dialog-] .dialog-content label i{width:20px;text-align:center}[id^=pf2e-toolbelt-target-save-reroll-dialog-] .dialog-buttons{margin-top:.5em}[role=tooltip] .pf2e-toolbelt-target-save{font-size:.9em;display:flex;flex-direction:column;align-items:start;gap:.2em}[role=tooltip] .pf2e-toolbelt-target-save .result i{font-size:.8em}[role=tooltip] .pf2e-toolbelt-target-save .note{font-style:italic;font-size:.8em;align-self:flex-end}[role=tooltip] .pf2e-toolbelt-target-save .note i{font-size:.95em}[role=tooltip] .pf2e-toolbelt-target-save .note i:not(.rotate){opacity:.8}[role=tooltip] i.pf2e-toolbelt-die{font-size:.9em}/*# sourceMappingURL=toolbelt.css.map */ \ No newline at end of file diff --git a/styles/toolbelt.css.map b/styles/toolbelt.css.map index 6e5e088..52657e1 100644 --- a/styles/toolbelt.css.map +++ b/styles/toolbelt.css.map @@ -1 +1 @@ -{"version":3,"sources":["_hero.scss","_knowledges.scss","_merge.scss","_macros.scss","_modifiers.scss","_share.scss","_stances.scss","_summary.scss","_target.scss","toolbelt.scss"],"names":[],"mappings":"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","file":"toolbelt.css"} \ No newline at end of file +{"version":3,"sources":["_hero.scss","_knowledges.scss","_merge.scss","_macros.scss","_modifiers.scss","_share.scss","_stances.scss","_summary.scss","_target.scss","toolbelt.scss"],"names":[],"mappings":"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","file":"toolbelt.css"} \ No newline at end of file